From: abv Date: Thu, 26 Jul 2018 17:41:00 +0000 (+0300) Subject: On Apple with XCode 9.4.1 and onwards, the compiler optimization is disabled for... X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=9f7af82cde6baa89eb44e9f8720c9118f9f4bec7;p=occt-copy.git On Apple with XCode 9.4.1 and onwards, the compiler optimization is disabled for method gp_Mat::Transpose() as optimizer generates invalid code when that method is used. --- diff --git a/src/gp/gp_Mat.lxx b/src/gp/gp_Mat.lxx index 1a604e03fd..f2bb985545 100644 --- a/src/gp/gp_Mat.lxx +++ b/src/gp/gp_Mat.lxx @@ -321,6 +321,14 @@ inline gp_Mat gp_Mat::Subtracted (const gp_Mat& Other) const return NewMat; } +// On macOS 10.13.6 with XCode 9.4.1 the compiler has a bug leading to +// generation of invalid code when method gp_Mat::Transpose() is called +// for a matrix which is when applied to vector; it looks like vector +// is transformed before the matrix is actually transposed; see #29978. +// To avoid this, we disable compiler optimization here. +#if defined(__APPLE__) && (__apple_build_version__ > 9020000) +__attribute__((optnone)) +#endif inline void gp_Mat::Transpose () { Standard_Real Temp; diff --git a/src/gp/gp_Trsf.cxx b/src/gp/gp_Trsf.cxx index 5e5980e20b..6401493575 100644 --- a/src/gp/gp_Trsf.cxx +++ b/src/gp/gp_Trsf.cxx @@ -401,16 +401,12 @@ void gp_Trsf::Invert() if (shape == gp_Identity) { } else if (shape == gp_Translation || shape == gp_PntMirror) loc.Reverse(); else if (shape == gp_Scale) { - Standard_Real As = scale; - if (As < 0) As = - As; - Standard_ConstructionError_Raise_if (As <= gp::Resolution(), "gp_Trsf::Invert() - transformation has zero scale"); + Standard_ConstructionError_Raise_if (Abs(scale) <= gp::Resolution(), "gp_Trsf::Invert() - transformation has zero scale"); scale = 1.0 / scale; loc.Multiply (-scale); } else { - Standard_Real As = scale; - if (As < 0) As = - As; - Standard_ConstructionError_Raise_if (As <= gp::Resolution(), "gp_Trsf::Invert() - transformation has zero scale"); + Standard_ConstructionError_Raise_if (Abs(scale) <= gp::Resolution(), "gp_Trsf::Invert() - transformation has zero scale"); scale = 1.0 / scale; matrix.Transpose (); loc.Multiply (matrix);