]> granicus.if.org Git - postgresql/commitdiff
Still further adjust degree-based trig functions for more portability.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Jan 2016 23:12:54 +0000 (18:12 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 23 Jan 2016 23:12:54 +0000 (18:12 -0500)
Indeed, the non-static declaration foreseen in my previous commit message
is necessary.  Per Noah Misch.

src/backend/utils/adt/float.c

index 099736e519571383e6cbdd65e8fd806084ab57b0..788c17033f2dbb43381b4be553b9d40f220ad97e 100644 (file)
@@ -83,6 +83,10 @@ static int   float8_cmp_internal(float8 a, float8 b);
 static double sind_q1(double x);
 static double cosd_q1(double x);
 
+/* This is INTENTIONALLY NOT STATIC.  Don't "fix" it. */
+void init_degree_constants(float8 thirty, float8 forty_five, float8 sixty,
+                                         float8 one_half, float8 one);
+
 #ifndef HAVE_CBRT
 /*
  * Some machines (in particular, some versions of AIX) have an extern
@@ -1771,11 +1775,16 @@ dtan(PG_FUNCTION_ARGS)
  * want exact results, we must ensure that none of the scaling constants used
  * in the degree-based trig functions are computed that way.
  *
+ * The whole approach fails if init_degree_constants() gets inlined into the
+ * call sites, since then constant-folding can happen anyway.  Currently it
+ * seems sufficient to declare it non-static to prevent that.  We have no
+ * expectation that other files will call this, but don't tell gcc that.
+ *
  * Other hazards we are trying to forestall with this kluge include the
  * possibility that compilers will rearrange the expressions, or compute
  * some intermediate results in registers wider than a standard double.
  */
-static void
+void
 init_degree_constants(float8 thirty, float8 forty_five, float8 sixty,
                                          float8 one_half, float8 one)
 {