From 69526c6c1c1aca47f5d8d40644afae2b0716a9a4 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Thu, 19 Aug 2010 15:44:17 +0100
Subject: [PATCH] BUG: various reinterpret_cast to enable strict-aliasing

---
 .../surface/surfaceInertia/surfaceInertia.C   | 11 +++--
 src/OpenFOAM/fields/Fields/Field/Field.C      | 20 ++++----
 src/OpenFOAM/fields/Fields/Field/Field.H      | 20 ++++----
 src/OpenFOAM/primitives/Tensor/Tensor.H       | 23 ++++++----
 src/OpenFOAM/primitives/Tensor/TensorI.H      | 46 +++++++++----------
 .../primitives/Tensor/tensor/tensor.C         | 20 ++++----
 src/OpenFOAM/primitives/Tensor2D/Tensor2D.H   | 20 +++++---
 src/OpenFOAM/primitives/Tensor2D/Tensor2DI.H  | 41 ++++++++---------
 .../primitives/Tensor2D/tensor2D/tensor2D.C   |  8 ++--
 .../cfdTools/general/porousMedia/porousZone.H |  2 +-
 .../constraint/wedge/wedgeFvPatchField.C      |  6 ++-
 .../cellLimitedGrad/cellLimitedGrads.C        |  9 ++--
 .../coordinateRotation/coordinateRotation.C   | 14 ++----
 .../coordinateRotation/coordinateRotation.H   |  6 +--
 .../coordinateSystems/coordinateSystem.H      | 10 ++--
 .../kinematicSingleLayer.C                    |  4 +-
 .../surfaceFilmModel/noFilm/noFilm.C          | 12 ++---
 wmake/rules/SiCortex64Gcc/c++                 |  2 +-
 wmake/rules/SunOS64Gcc/c++                    |  2 +-
 wmake/rules/linux64Gcc/c++                    |  2 +-
 wmake/rules/linux64Gcc43/c++                  |  2 +-
 wmake/rules/linux64Gcc44/c++                  |  2 +-
 wmake/rules/linux64Gcc45/c++                  |  2 +-
 wmake/rules/linuxGcc/c++                      |  2 +-
 wmake/rules/linuxGcc43/c++                    |  2 +-
 wmake/rules/linuxGcc44/c++                    |  2 +-
 wmake/rules/linuxGcc45/c++                    |  2 +-
 wmake/rules/linuxIA64Gcc/c++                  |  2 +-
 wmake/rules/linuxPPC64Gcc/c++                 |  2 +-
 wmake/rules/linuxmingw32/c++                  |  2 +-
 wmake/rules/solarisGcc/c++                    |  2 +-
 31 files changed, 159 insertions(+), 141 deletions(-)

diff --git a/applications/utilities/surface/surfaceInertia/surfaceInertia.C b/applications/utilities/surface/surfaceInertia/surfaceInertia.C
index 380f7fb9316..5c39ebd5037 100644
--- a/applications/utilities/surface/surfaceInertia/surfaceInertia.C
+++ b/applications/utilities/surface/surfaceInertia/surfaceInertia.C
@@ -398,7 +398,12 @@ int main(int argc, char *argv[])
     )
     {
         // Make the eigenvectors a right handed orthogonal triplet
-        eVec.z() *= sign((eVec.x() ^ eVec.y()) & eVec.z());
+        eVec = tensor
+        (
+            eVec.x(),
+            eVec.y(),
+            eVec.z() * sign((eVec.x() ^ eVec.y()) & eVec.z())
+        );
 
         // Finding the most natural transformation.  Using Lists
         // rather than tensors to allow indexed permutation.
@@ -557,9 +562,7 @@ int main(int argc, char *argv[])
             eVal = tEVal;
         }
 
-        eVec.x() = principal[0];
-        eVec.y() = principal[1];
-        eVec.z() = principal[2];
+        eVec = tensor(principal[0], principal[1], principal[2]);
 
         // {
         //     tensor R = rotationTensor(vector(1, 0, 0), eVec.x());
diff --git a/src/OpenFOAM/fields/Fields/Field/Field.C b/src/OpenFOAM/fields/Fields/Field/Field.C
index 531ae0443ac..e5c5a7cced0 100644
--- a/src/OpenFOAM/fields/Fields/Field/Field.C
+++ b/src/OpenFOAM/fields/Fields/Field/Field.C
@@ -66,7 +66,7 @@ template<class Type>
 Field<Type>::Field
 (
     const UList<Type>& mapF,
-    const labelList& mapAddressing
+    const UList<label>& mapAddressing
 )
 :
     List<Type>(mapAddressing.size())
@@ -78,7 +78,7 @@ template<class Type>
 Field<Type>::Field
 (
     const tmp<Field<Type> >& tmapF,
-    const labelList& mapAddressing
+    const UList<label>& mapAddressing
 )
 :
     List<Type>(mapAddressing.size())
@@ -297,7 +297,7 @@ template<class Type>
 void Field<Type>::map
 (
     const UList<Type>& mapF,
-    const labelList& mapAddressing
+    const UList<label>& mapAddressing
 )
 {
     Field<Type>& f = *this;
@@ -326,7 +326,7 @@ template<class Type>
 void Field<Type>::map
 (
     const tmp<Field<Type> >& tmapF,
-    const labelList& mapAddressing
+    const UList<label>& mapAddressing
 )
 {
     map(tmapF(), mapAddressing);
@@ -455,7 +455,7 @@ template<class Type>
 void Field<Type>::rmap
 (
     const UList<Type>& mapF,
-    const labelList& mapAddressing
+    const UList<label>& mapAddressing
 )
 {
     Field<Type>& f = *this;
@@ -475,7 +475,7 @@ template<class Type>
 void Field<Type>::rmap
 (
     const tmp<Field<Type> >& tmapF,
-    const labelList& mapAddressing
+    const UList<label>& mapAddressing
 )
 {
     rmap(tmapF(), mapAddressing);
@@ -487,8 +487,8 @@ template<class Type>
 void Field<Type>::rmap
 (
     const UList<Type>& mapF,
-    const labelList& mapAddressing,
-    const scalarList& mapWeights
+    const UList<label>& mapAddressing,
+    const UList<scalar>& mapWeights
 )
 {
     Field<Type>& f = *this;
@@ -505,8 +505,8 @@ template<class Type>
 void Field<Type>::rmap
 (
     const tmp<Field<Type> >& tmapF,
-    const labelList& mapAddressing,
-    const scalarList& mapWeights
+    const UList<label>& mapAddressing,
+    const UList<scalar>& mapWeights
 )
 {
     rmap(tmapF(), mapAddressing, mapWeights);
diff --git a/src/OpenFOAM/fields/Fields/Field/Field.H b/src/OpenFOAM/fields/Fields/Field/Field.H
index 5708526c265..0682366211b 100644
--- a/src/OpenFOAM/fields/Fields/Field/Field.H
+++ b/src/OpenFOAM/fields/Fields/Field/Field.H
@@ -127,14 +127,14 @@ public:
         Field
         (
             const UList<Type>& mapF,
-            const labelList& mapAddressing
+            const UList<label>& mapAddressing
         );
 
         //- Construct by 1 to 1 mapping from the given tmp field
         Field
         (
             const tmp<Field<Type> >& tmapF,
-            const labelList& mapAddressing
+            const UList<label>& mapAddressing
         );
 
         //- Construct by interpolative mapping from the given field
@@ -208,14 +208,14 @@ public:
         void map
         (
             const UList<Type>& mapF,
-            const labelList& mapAddressing
+            const UList<label>& mapAddressing
         );
 
         //- 1 to 1 map from the given tmp field
         void map
         (
             const tmp<Field<Type> >& tmapF,
-            const labelList& mapAddressing
+            const UList<label>& mapAddressing
         );
 
         //- Interpolative map from the given field
@@ -258,30 +258,30 @@ public:
         void rmap
         (
             const UList<Type>& mapF,
-            const labelList& mapAddressing
+            const UList<label>& mapAddressing
         );
 
         //- 1 to 1 reverse-map from the given tmp field
         void rmap
         (
             const tmp<Field<Type> >& tmapF,
-            const labelList& mapAddressing
+            const UList<label>& mapAddressing
         );
 
         //- Interpolative reverse map from the given field
         void rmap
         (
             const UList<Type>& mapF,
-            const labelList& mapAddressing,
-            const scalarList& weights
+            const UList<label>& mapAddressing,
+            const UList<scalar>& weights
         );
 
         //- Interpolative reverse map from the given tmp field
         void rmap
         (
             const tmp<Field<Type> >& tmapF,
-            const labelList& mapAddressing,
-            const scalarList& weights
+            const UList<label>& mapAddressing,
+            const UList<scalar>& weights
         );
 
         //- Negate this field
diff --git a/src/OpenFOAM/primitives/Tensor/Tensor.H b/src/OpenFOAM/primitives/Tensor/Tensor.H
index 520af13cece..c04c62264c1 100644
--- a/src/OpenFOAM/primitives/Tensor/Tensor.H
+++ b/src/OpenFOAM/primitives/Tensor/Tensor.H
@@ -100,6 +100,14 @@ public:
         //- Construct given SymmTensor
         inline Tensor(const SymmTensor<Cmpt>&);
 
+        //- Construct given the three vector components
+        inline Tensor
+        (
+            const Vector<Cmpt>& x,
+            const Vector<Cmpt>& y,
+            const Vector<Cmpt>& z
+        );
+
         //- Construct given the nine components
         inline Tensor
         (
@@ -116,14 +124,6 @@ public:
 
         // Access
 
-            inline const Vector<Cmpt>& x() const;
-            inline const Vector<Cmpt>& y() const;
-            inline const Vector<Cmpt>& z() const;
-
-            inline Vector<Cmpt>& x();
-            inline Vector<Cmpt>& y();
-            inline Vector<Cmpt>& z();
-
             inline const Cmpt& xx() const;
             inline const Cmpt& xy() const;
             inline const Cmpt& xz() const;
@@ -144,6 +144,13 @@ public:
             inline Cmpt& zy();
             inline Cmpt& zz();
 
+            // Access vector components.
+            // Note: returning const only to find out lhs usage
+
+            inline const Vector<Cmpt> x() const;
+            inline const Vector<Cmpt> y() const;
+            inline const Vector<Cmpt> z() const;
+
         //- Transpose
         inline Tensor<Cmpt> T() const;
 
diff --git a/src/OpenFOAM/primitives/Tensor/TensorI.H b/src/OpenFOAM/primitives/Tensor/TensorI.H
index 18ce724ca30..8ca4f601693 100644
--- a/src/OpenFOAM/primitives/Tensor/TensorI.H
+++ b/src/OpenFOAM/primitives/Tensor/TensorI.H
@@ -64,6 +64,21 @@ inline Tensor<Cmpt>::Tensor(const SymmTensor<Cmpt>& st)
 }
 
 
+//- Construct given the three vector components
+template <class Cmpt>
+inline Tensor<Cmpt>::Tensor
+(
+    const Vector<Cmpt>& x,
+    const Vector<Cmpt>& y,
+    const Vector<Cmpt>& z
+)
+{
+    this->v_[XX] = x.x(); this->v_[XY] = x.y(); this->v_[XZ] = x.z();
+    this->v_[YX] = y.x(); this->v_[YY] = y.y(); this->v_[YZ] = y.z();
+    this->v_[ZX] = z.x(); this->v_[ZY] = z.y(); this->v_[ZZ] = z.z();
+}
+
+
 //- Construct from components
 template <class Cmpt>
 inline Tensor<Cmpt>::Tensor
@@ -90,40 +105,21 @@ inline Tensor<Cmpt>::Tensor(Istream& is)
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template <class Cmpt>
-inline const Vector<Cmpt>&  Tensor<Cmpt>::x() const
-{
-    return reinterpret_cast<const Vector<Cmpt>&>(this->v_[XX]);
-}
-
-template <class Cmpt>
-inline const Vector<Cmpt>&  Tensor<Cmpt>::y() const
-{
-    return reinterpret_cast<const Vector<Cmpt>&>(this->v_[YX]);
-}
-
-template <class Cmpt>
-inline const Vector<Cmpt>&  Tensor<Cmpt>::z() const
-{
-    return reinterpret_cast<const Vector<Cmpt>&>(this->v_[ZX]);
-}
-
-
-template <class Cmpt>
-inline Vector<Cmpt>&  Tensor<Cmpt>::x()
+inline const Vector<Cmpt> Tensor<Cmpt>::x() const
 {
-    return reinterpret_cast<Vector<Cmpt>&>(this->v_[XX]);
+    return Vector<Cmpt>(this->v_[XX], this->v_[XY], this->v_[XZ]);
 }
 
 template <class Cmpt>
-inline Vector<Cmpt>&  Tensor<Cmpt>::y()
+inline const Vector<Cmpt> Tensor<Cmpt>::y() const
 {
-    return reinterpret_cast<Vector<Cmpt>&>(this->v_[YX]);
+    return Vector<Cmpt>(this->v_[YX], this->v_[YY], this->v_[YZ]);
 }
 
 template <class Cmpt>
-inline Vector<Cmpt>&  Tensor<Cmpt>::z()
+inline const Vector<Cmpt>  Tensor<Cmpt>::z() const
 {
-    return reinterpret_cast<Vector<Cmpt>&>(this->v_[ZX]);
+    return Vector<Cmpt>(this->v_[ZX], this->v_[ZY], this->v_[ZZ]);
 }
 
 
diff --git a/src/OpenFOAM/primitives/Tensor/tensor/tensor.C b/src/OpenFOAM/primitives/Tensor/tensor/tensor.C
index 4585a0d462c..60504534b5c 100644
--- a/src/OpenFOAM/primitives/Tensor/tensor/tensor.C
+++ b/src/OpenFOAM/primitives/Tensor/tensor/tensor.C
@@ -269,10 +269,12 @@ tensor eigenVectors(const tensor& t)
 {
     vector evals(eigenValues(t));
 
-    tensor evs;
-    evs.x() = eigenVector(t, evals.x());
-    evs.y() = eigenVector(t, evals.y());
-    evs.z() = eigenVector(t, evals.z());
+    tensor evs
+    (
+        eigenVector(t, evals.x()),
+        eigenVector(t, evals.y()),
+        eigenVector(t, evals.z())
+    );
 
     return evs;
 }
@@ -468,10 +470,12 @@ tensor eigenVectors(const symmTensor& t)
 {
     vector evals(eigenValues(t));
 
-    tensor evs;
-    evs.x() = eigenVector(t, evals.x());
-    evs.y() = eigenVector(t, evals.y());
-    evs.z() = eigenVector(t, evals.z());
+    tensor evs
+    (
+        eigenVector(t, evals.x()),
+        eigenVector(t, evals.y()),
+        eigenVector(t, evals.z())
+    );
 
     return evs;
 }
diff --git a/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H b/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H
index ae7d84b8b24..4e322296c5a 100644
--- a/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H
+++ b/src/OpenFOAM/primitives/Tensor2D/Tensor2D.H
@@ -92,7 +92,14 @@ public:
         //- Construct given SphericalTensor2D
         inline Tensor2D(const SphericalTensor2D<Cmpt>&);
 
-        //- Construct given the nine components
+        //- Construct given the two vectors
+        inline Tensor2D
+        (
+            const Vector2D<Cmpt>& x,
+            const Vector2D<Cmpt>& y
+        );
+
+        //- Construct given the four components
         inline Tensor2D
         (
             const Cmpt txx, const Cmpt txy,
@@ -107,12 +114,6 @@ public:
 
         // Access
 
-            inline const Vector2D<Cmpt>& x() const;
-            inline const Vector2D<Cmpt>& y() const;
-
-            inline Vector2D<Cmpt>& x();
-            inline Vector2D<Cmpt>& y();
-
             inline const Cmpt& xx() const;
             inline const Cmpt& xy() const;
             inline const Cmpt& yx() const;
@@ -123,6 +124,11 @@ public:
             inline Cmpt& yx();
             inline Cmpt& yy();
 
+            // Access vector components.
+
+            inline Vector2D<Cmpt> x() const;
+            inline Vector2D<Cmpt> y() const;
+
         //- Transpose
         inline Tensor2D<Cmpt> T() const;
 
diff --git a/src/OpenFOAM/primitives/Tensor2D/Tensor2DI.H b/src/OpenFOAM/primitives/Tensor2D/Tensor2DI.H
index 95851782360..2920983eb0b 100644
--- a/src/OpenFOAM/primitives/Tensor2D/Tensor2DI.H
+++ b/src/OpenFOAM/primitives/Tensor2D/Tensor2DI.H
@@ -50,6 +50,18 @@ inline Tensor2D<Cmpt>::Tensor2D(const SphericalTensor2D<Cmpt>& st)
 }
 
 
+template <class Cmpt>
+inline Tensor2D<Cmpt>::Tensor2D
+(
+    const Vector2D<Cmpt>& x,
+    const Vector2D<Cmpt>& y
+)
+{
+    this->v_[XX] = x.x(); this->v_[XY] = x.y();
+    this->v_[YX] = y.x(); this->v_[YY] = y.y();
+}
+
+
 template <class Cmpt>
 inline Tensor2D<Cmpt>::Tensor2D
 (
@@ -72,51 +84,38 @@ inline Tensor2D<Cmpt>::Tensor2D(Istream& is)
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template <class Cmpt>
-inline const Vector2D<Cmpt>&  Tensor2D<Cmpt>::x() const
-{
-    return reinterpret_cast<const Vector2D<Cmpt>&>(this->v_[XX]);
-}
-
-template <class Cmpt>
-inline const Vector2D<Cmpt>&  Tensor2D<Cmpt>::y() const
-{
-    return reinterpret_cast<const Vector2D<Cmpt>&>(this->v_[YX]);
-}
-
-
-template <class Cmpt>
-inline Vector2D<Cmpt>&  Tensor2D<Cmpt>::x()
+inline Vector2D<Cmpt> Tensor2D<Cmpt>::x() const
 {
-    return reinterpret_cast<Vector2D<Cmpt>&>(this->v_[XX]);
+    return Vector2D<Cmpt>(this->v_[XX], this->v_[XY]);
 }
 
 template <class Cmpt>
-inline Vector2D<Cmpt>&  Tensor2D<Cmpt>::y()
+inline Vector2D<Cmpt> Tensor2D<Cmpt>::y() const
 {
-    return reinterpret_cast<Vector2D<Cmpt>&>(this->v_[YX]);
+    return Vector2D<Cmpt>(this->v_[YX], this->v_[YY]);
 }
 
 
 template <class Cmpt>
-inline const Cmpt&  Tensor2D<Cmpt>::xx() const
+inline const Cmpt& Tensor2D<Cmpt>::xx() const
 {
     return this->v_[XX];
 }
 
 template <class Cmpt>
-inline const Cmpt&  Tensor2D<Cmpt>::xy() const
+inline const Cmpt& Tensor2D<Cmpt>::xy() const
 {
     return this->v_[XY];
 }
 
 template <class Cmpt>
-inline const Cmpt&  Tensor2D<Cmpt>::yx() const
+inline const Cmpt& Tensor2D<Cmpt>::yx() const
 {
     return this->v_[YX];
 }
 
 template <class Cmpt>
-inline const Cmpt&  Tensor2D<Cmpt>::yy() const
+inline const Cmpt& Tensor2D<Cmpt>::yy() const
 {
     return this->v_[YY];
 }
diff --git a/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.C b/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.C
index 8cf7d3c9ad1..e7fc58d7a16 100644
--- a/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.C
+++ b/src/OpenFOAM/primitives/Tensor2D/tensor2D/tensor2D.C
@@ -158,9 +158,11 @@ tensor2D eigenVectors(const tensor2D& t)
 {
     vector2D evals(eigenValues(t));
 
-    tensor2D evs;
-    evs.x() = eigenVector(t, evals.x());
-    evs.y() = eigenVector(t, evals.y());
+    tensor2D evs
+    (
+        eigenVector(t, evals.x()),
+        eigenVector(t, evals.y())
+    );
 
     return evs;
 }
diff --git a/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H b/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H
index 6bd909143c2..ef48645d2ba 100644
--- a/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H
+++ b/src/finiteVolume/cfdTools/general/porousMedia/porousZone.H
@@ -287,7 +287,7 @@ public:
             }
 
             //- Return axis
-            const vector& axis() const
+            vector axis() const
             {
                 return coordSys_.axis();
             }
diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C
index 632c985c66a..a8540e30297 100644
--- a/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C
+++ b/src/finiteVolume/fields/fvPatchFields/constraint/wedge/wedgeFvPatchField.C
@@ -168,9 +168,11 @@ void wedgeFvPatchField<Type>::evaluate(const Pstream::commsTypes)
 template<class Type>
 tmp<Field<Type> > wedgeFvPatchField<Type>::snGradTransformDiag() const
 {
-    diagTensor diagT =
+    const diagTensor diagT =
         0.5*diag(I - refCast<const wedgeFvPatch>(this->patch()).cellT());
 
+    const vector diagV(diagT.xx(), diagT.yy(), diagT.zz());
+
     return tmp<Field<Type> >
     (
         new Field<Type>
@@ -180,7 +182,7 @@ tmp<Field<Type> > wedgeFvPatchField<Type>::snGradTransformDiag() const
             (
                 pow
                 (
-                    reinterpret_cast<const vector&>(diagT),
+                    diagV,
                     pTraits<typename powProduct<vector, pTraits<Type>::rank>
                     ::type>::zero
                 )
diff --git a/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrads.C b/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrads.C
index 6db9c0faf0e..d679586bae5 100644
--- a/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrads.C
+++ b/src/finiteVolume/finiteVolume/gradSchemes/limitedGradSchemes/cellLimitedGrad/cellLimitedGrads.C
@@ -346,9 +346,12 @@ Foam::fv::cellLimitedGrad<Foam::vector>::calcGrad
 
     forAll(gIf, celli)
     {
-        gIf[celli].x() = cmptMultiply(limiter[celli], gIf[celli].x());
-        gIf[celli].y() = cmptMultiply(limiter[celli], gIf[celli].y());
-        gIf[celli].z() = cmptMultiply(limiter[celli], gIf[celli].z());
+        gIf[celli] = tensor
+        (
+            cmptMultiply(limiter[celli], gIf[celli].x()),
+            cmptMultiply(limiter[celli], gIf[celli].y()),
+            cmptMultiply(limiter[celli], gIf[celli].z())
+        );
     }
 
     g.correctBoundaryConditions();
diff --git a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C
index b75ccfe47ec..5e4e90837e2 100644
--- a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C
+++ b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.C
@@ -66,27 +66,23 @@ void Foam::coordinateRotation::calcTransform
     switch (order)
     {
         case e1e2:
-            Rtr.x() = a;
-            Rtr.y() = b;
-            Rtr.z() = c;
+            Rtr = tensor(a, b, c);
             break;
 
         case e2e3:
-            Rtr.x() = c;
-            Rtr.y() = a;
-            Rtr.z() = b;
+            Rtr = tensor(c, a, b);
             break;
 
         case e3e1:
-            Rtr.x() = b;
-            Rtr.y() = c;
-            Rtr.z() = a;
+            Rtr = tensor(b, c, a);
             break;
 
         default:
             FatalErrorIn("coordinateRotation::calcTransform()")
                 << "programmer error" << endl
                 << abort(FatalError);
+            // To satisfy compiler warnings
+            Rtr = tensor::zero;
             break;
     }
 
diff --git a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H
index 0c7a679da14..9e5d369cdba 100644
--- a/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H
+++ b/src/meshTools/coordinateSystems/coordinateRotation/coordinateRotation.H
@@ -172,19 +172,19 @@ public:
         }
 
         //- Return local Cartesian x-axis
-        vector& e1() const
+        const vector e1() const
         {
             return tensor::T().x();
         }
 
         //- Return local Cartesian y-axis
-        vector& e2() const
+        const vector e2() const
         {
             return tensor::T().y();
         }
 
         //- Return local Cartesian z-axis
-        vector& e3() const
+        const vector e3() const
         {
             return tensor::T().z();
         }
diff --git a/src/meshTools/coordinateSystems/coordinateSystem.H b/src/meshTools/coordinateSystems/coordinateSystem.H
index 11a48d6eb77..a5a51944e28 100644
--- a/src/meshTools/coordinateSystems/coordinateSystem.H
+++ b/src/meshTools/coordinateSystems/coordinateSystem.H
@@ -346,33 +346,33 @@ public:
             }
 
             //- Return local Cartesian x-axis
-            const vector& e1() const
+            const vector e1() const
             {
                 return Rtr_.x();
             }
 
             //- Return local Cartesian y-axis
-            const vector& e2() const
+            const vector e2() const
             {
                 return Rtr_.y();
             }
 
             //- Return local Cartesian z-axis
-            const vector& e3() const
+            const vector e3() const
             {
                 return Rtr_.z();
             }
 
             //- Return axis (e3: local Cartesian z-axis)
             // @deprecated method e3 is preferred (deprecated Apr 2008)
-            const vector& axis() const
+            const vector axis() const
             {
                 return Rtr_.z();
             }
 
             //- Return direction (e1: local Cartesian x-axis)
             // @deprecated method e1 is preferred (deprecated Apr 2008)
-            const vector& direction() const
+            const vector direction() const
             {
                 return Rtr_.x();
             }
diff --git a/src/surfaceFilmModels/surfaceFilmModel/kinematicSingleLayer/kinematicSingleLayer.C b/src/surfaceFilmModels/surfaceFilmModel/kinematicSingleLayer/kinematicSingleLayer.C
index 1846f579714..36f28993533 100644
--- a/src/surfaceFilmModels/surfaceFilmModel/kinematicSingleLayer/kinematicSingleLayer.C
+++ b/src/surfaceFilmModels/surfaceFilmModel/kinematicSingleLayer/kinematicSingleLayer.C
@@ -1008,7 +1008,7 @@ Foam::surfaceFilmModels::kinematicSingleLayer::T() const
         "const volScalarField& kinematicSingleLayer::T() const"
     )   << "T field not available for " << type() << abort(FatalError);
 
-    return reinterpret_cast<const volScalarField&>(null);
+    return volScalarField::null();
 }
 
 
@@ -1020,7 +1020,7 @@ Foam::surfaceFilmModels::kinematicSingleLayer::cp() const
         "const volScalarField& kinematicSingleLayer::cp() const"
     )   << "cp field not available for " << type() << abort(FatalError);
 
-    return reinterpret_cast<const volScalarField&>(null);
+    return volScalarField::null();
 }
 
 
diff --git a/src/surfaceFilmModels/surfaceFilmModel/noFilm/noFilm.C b/src/surfaceFilmModels/surfaceFilmModel/noFilm/noFilm.C
index 07750f876ee..d8fd74960f9 100644
--- a/src/surfaceFilmModels/surfaceFilmModel/noFilm/noFilm.C
+++ b/src/surfaceFilmModels/surfaceFilmModel/noFilm/noFilm.C
@@ -137,7 +137,7 @@ const Foam::volVectorField& Foam::surfaceFilmModels::noFilm::U() const
         "const volScalarField& noFilm::U() const"
     )   << "U field not available for " << type() << abort(FatalError);
 
-    return reinterpret_cast<const volVectorField&>(null);
+    return volVectorField::null();
 }
 
 
@@ -148,7 +148,7 @@ const Foam::volScalarField& Foam::surfaceFilmModels::noFilm::rho() const
         "const volScalarField& noFilm::rho() const"
     )   << "rho field not available for " << type() << abort(FatalError);
 
-    return reinterpret_cast<const volScalarField&>(null);
+    return volScalarField::null();
 }
 
 
@@ -159,7 +159,7 @@ const Foam::volScalarField& Foam::surfaceFilmModels::noFilm::T() const
         "const Foam::volScalarField& Foam::noFilm::T() const"
     )   << "T field not available for " << type() << abort(FatalError);
 
-    return reinterpret_cast<const volScalarField&>(null);
+    return volScalarField::null();
 }
 
 
@@ -170,7 +170,7 @@ const Foam::volScalarField& Foam::surfaceFilmModels::noFilm::cp() const
         "const volScalarField& noFilm::cp() const"
     )   << "cp field not available for " << type() << abort(FatalError);
 
-    return reinterpret_cast<const volScalarField&>(null);
+    return volScalarField::null();
 }
 
 
@@ -183,7 +183,7 @@ Foam::surfaceFilmModels::noFilm::massForPrimary() const
     )   << "massForPrimary field not available for " << type()
         << abort(FatalError);
 
-    return reinterpret_cast<const volScalarField&>(null);
+    return volScalarField::null();
 }
 
 
@@ -196,7 +196,7 @@ Foam::surfaceFilmModels::noFilm::diametersForPrimary() const
     )   << "diametersForPrimary field not available for " << type()
         << abort(FatalError);
 
-    return reinterpret_cast<const volScalarField&>(null);
+    return volScalarField::null();
 }
 
 
diff --git a/wmake/rules/SiCortex64Gcc/c++ b/wmake/rules/SiCortex64Gcc/c++
index 13e0a3e1fa9..e6672520526 100644
--- a/wmake/rules/SiCortex64Gcc/c++
+++ b/wmake/rules/SiCortex64Gcc/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -mabi=64
 #CC          = scg++ -mabi=64
diff --git a/wmake/rules/SunOS64Gcc/c++ b/wmake/rules/SunOS64Gcc/c++
index 677b1e5bb47..9812a747532 100644
--- a/wmake/rules/SunOS64Gcc/c++
+++ b/wmake/rules/SunOS64Gcc/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m64
 
diff --git a/wmake/rules/linux64Gcc/c++ b/wmake/rules/linux64Gcc/c++
index c96c754aaa3..46cb28746ce 100644
--- a/wmake/rules/linux64Gcc/c++
+++ b/wmake/rules/linux64Gcc/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor
 
 CC          = g++ -m64
 
diff --git a/wmake/rules/linux64Gcc43/c++ b/wmake/rules/linux64Gcc43/c++
index 677b1e5bb47..9812a747532 100644
--- a/wmake/rules/linux64Gcc43/c++
+++ b/wmake/rules/linux64Gcc43/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m64
 
diff --git a/wmake/rules/linux64Gcc44/c++ b/wmake/rules/linux64Gcc44/c++
index 677b1e5bb47..9812a747532 100644
--- a/wmake/rules/linux64Gcc44/c++
+++ b/wmake/rules/linux64Gcc44/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m64
 
diff --git a/wmake/rules/linux64Gcc45/c++ b/wmake/rules/linux64Gcc45/c++
index 677b1e5bb47..9812a747532 100644
--- a/wmake/rules/linux64Gcc45/c++
+++ b/wmake/rules/linux64Gcc45/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m64
 
diff --git a/wmake/rules/linuxGcc/c++ b/wmake/rules/linuxGcc/c++
index 7a7a46d9a0e..fdcce8f136e 100644
--- a/wmake/rules/linuxGcc/c++
+++ b/wmake/rules/linuxGcc/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m32
 
diff --git a/wmake/rules/linuxGcc43/c++ b/wmake/rules/linuxGcc43/c++
index 7a7a46d9a0e..fdcce8f136e 100644
--- a/wmake/rules/linuxGcc43/c++
+++ b/wmake/rules/linuxGcc43/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m32
 
diff --git a/wmake/rules/linuxGcc44/c++ b/wmake/rules/linuxGcc44/c++
index 7a7a46d9a0e..fdcce8f136e 100644
--- a/wmake/rules/linuxGcc44/c++
+++ b/wmake/rules/linuxGcc44/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m32
 
diff --git a/wmake/rules/linuxGcc45/c++ b/wmake/rules/linuxGcc45/c++
index 7a7a46d9a0e..fdcce8f136e 100644
--- a/wmake/rules/linuxGcc45/c++
+++ b/wmake/rules/linuxGcc45/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m32
 
diff --git a/wmake/rules/linuxIA64Gcc/c++ b/wmake/rules/linuxIA64Gcc/c++
index a7a2b63cdeb..a3202548997 100644
--- a/wmake/rules/linuxIA64Gcc/c++
+++ b/wmake/rules/linuxIA64Gcc/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++
 
diff --git a/wmake/rules/linuxPPC64Gcc/c++ b/wmake/rules/linuxPPC64Gcc/c++
index 534a3e0d7c7..aab8a92cbbd 100644
--- a/wmake/rules/linuxPPC64Gcc/c++
+++ b/wmake/rules/linuxPPC64Gcc/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter -Wold-style-cast
+c++WARN     = -Wall -Wextra -Wno-unused-parameter -Wold-style-cast
 
 CC          = g++ -m64 -mcpu=power5+
 
diff --git a/wmake/rules/linuxmingw32/c++ b/wmake/rules/linuxmingw32/c++
index 54a941adcd7..a0812a1cbaf 100644
--- a/wmake/rules/linuxmingw32/c++
+++ b/wmake/rules/linuxmingw32/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter
+c++WARN     = -Wall -Wextra -Wno-unused-parameter
 
 CC          = mingw32-g++
 
diff --git a/wmake/rules/solarisGcc/c++ b/wmake/rules/solarisGcc/c++
index 74aab0616ae..387d99fd897 100644
--- a/wmake/rules/solarisGcc/c++
+++ b/wmake/rules/solarisGcc/c++
@@ -1,6 +1,6 @@
 .SUFFIXES: .C .cxx .cc .cpp
 
-c++WARN     = -Wall -Wno-strict-aliasing -Wextra -Wno-unused-parameter
+c++WARN     = -Wall -Wextra -Wno-unused-parameter
 
 CC          = g++
 
-- 
GitLab