← Back to team overview

kicad-developers team mailing list archive

[PATCH 1/1] Remove tautological casts

 

These casts have the same source and destination type, and are therefore
useless.

Also, enable warnings for tautological casts, with an exception for the
SWIG wrapper code.
---
 3d-viewer/3d_cache/dialogs/panel_prev_model.cpp    |  2 +-
 3d-viewer/3d_cache/sg/sg_helpers.h                 |  4 ++--
 3d-viewer/3d_canvas/create_layer_items.cpp         | 10 ++++-----
 3d-viewer/3d_model_viewer/c3d_model_viewer.cpp     |  2 +-
 .../3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp |  2 +-
 .../3d_render_ogl_legacy/clayer_triangles.h        |  4 ++--
 .../accelerators/cbvh_pbrt.cpp                     |  2 +-
 .../c3d_render_createscene.cpp                     |  8 ++++----
 .../3d_render_raytracing/c3d_render_raytracing.cpp | 12 +++++------
 .../shapes2D/citemlayercsg2d.cpp                   |  6 ++----
 .../3d_render_raytracing/shapes2D/cpolygon2d.cpp   |  2 +-
 .../3d_render_raytracing/shapes3D/clayeritem.cpp   |  4 ++--
 3d-viewer/3d_rendering/cimage.cpp                  |  4 ++--
 3d-viewer/3d_rendering/cpostshader.h               |  2 +-
 3d-viewer/3d_rendering/trackball.cpp               | 12 +++++------
 CMakeLists.txt                                     |  6 ++++++
 bitmap2component/bitmap2cmp_gui.cpp                |  2 +-
 common/base_struct.cpp                             |  2 +-
 common/bezier_curves.cpp                           |  4 ++--
 common/draw_frame.cpp                              |  4 ++--
 common/draw_panel_gal.cpp                          |  2 +-
 common/gal/cairo/cairo_gal.cpp                     |  6 +++---
 common/gal/opengl/opengl_compositor.cpp            |  6 +++---
 common/gal/opengl/opengl_gal.cpp                   |  2 +-
 common/gal/opengl/shader.cpp                       |  2 +-
 common/lib_table_base.cpp                          |  2 +-
 common/page_layout/worksheet_dataitem.cpp          |  2 +-
 common/preview_items/ruler_item.cpp                |  2 +-
 common/utf8.cpp                                    |  2 +-
 common/view/view.cpp                               |  4 ++--
 common/widgets/footprint_preview_widget.cpp        |  4 ++--
 common/worksheet_viewitem.cpp                      | 10 ++++-----
 common/xnode.cpp                                   |  4 ++--
 cvpcb/cvpcb.cpp                                    |  2 +-
 eeschema/dialogs/dialog_edit_one_field.cpp         |  2 +-
 eeschema/dialogs/dialog_erc.cpp                    |  2 +-
 eeschema/eeschema_config.cpp                       |  4 ++--
 eeschema/generate_alias_info.cpp                   |  2 +-
 eeschema/hierarch.cpp                              |  2 +-
 .../netlist_exporters/netlist_exporter_pspice.cpp  |  2 +-
 eeschema/sch_eagle_plugin.cpp                      |  4 ++--
 eeschema/sch_line.cpp                              |  6 +++---
 eeschema/sch_sheet_path.h                          |  2 +-
 .../gerbview_dialog_display_options_frame.cpp      |  2 +-
 gerbview/gerbview_frame.cpp                        |  2 +-
 gerbview/select_layers_to_pcb.h                    |  4 ++--
 gerbview/tools/selection_tool.cpp                  |  4 ++--
 include/gal/graphics_abstraction_layer.h           |  4 ++--
 include/layers_id_colors_and_visibility.h          |  6 +++---
 include/utf8.h                                     |  6 +++---
 pagelayout_editor/block.cpp                        |  2 +-
 pagelayout_editor/pl_editor.cpp                    |  2 +-
 pagelayout_editor/pl_editor_frame.cpp              |  4 ++--
 pcb_calculator/pcb_calculator.cpp                  |  2 +-
 pcbnew/CMakeLists.txt                              |  7 +++++++
 pcbnew/board_items_to_polygon_shape_transform.cpp  |  2 +-
 pcbnew/class_dimension.cpp                         |  2 +-
 pcbnew/class_drawsegment.cpp                       |  2 +-
 pcbnew/class_module.cpp                            |  4 ++--
 pcbnew/class_module.h                              |  4 ++--
 pcbnew/class_pcb_target.cpp                        |  2 +-
 pcbnew/class_pcb_text.cpp                          |  2 +-
 pcbnew/class_track.cpp                             |  4 ++--
 pcbnew/class_track.h                               |  2 +-
 pcbnew/class_zone.cpp                              |  2 +-
 pcbnew/connectivity_algo.cpp                       | 10 ++++-----
 pcbnew/convert_drawsegment_list_to_polygon.cpp     |  7 +++----
 pcbnew/dialogs/dialog_display_options.cpp          |  3 +--
 pcbnew/files.cpp                                   |  4 ++--
 pcbnew/footprint_info_impl.cpp                     |  2 +-
 pcbnew/import_dxf/dxf2brd_items.cpp                |  4 ++--
 pcbnew/legacy_plugin.cpp                           |  2 +-
 pcbnew/pad_draw_functions.cpp                      |  2 +-
 pcbnew/pcb_base_frame.cpp                          |  2 +-
 pcbnew/pcb_draw_panel_gal.cpp                      |  2 +-
 pcbnew/pcb_view.cpp                                |  2 +-
 pcbnew/ratsnest.cpp                                |  2 +-
 pcbnew/router/pns_diff_pair_placer.cpp             |  4 ++--
 pcbnew/router/pns_kicad_iface.cpp                  |  2 +-
 pcbnew/router/pns_line_placer.cpp                  |  2 +-
 pcbnew/router/pns_meander.cpp                      |  4 ++--
 pcbnew/router/pns_sizes_settings.cpp               |  2 +-
 pcbnew/router/router_tool.cpp                      |  2 +-
 pcbnew/specctra_import_export/specctra.cpp         |  4 ++--
 pcbnew/specctra_import_export/specctra.h           |  8 ++++----
 pcbnew/tools/drawing_tool.cpp                      |  2 +-
 pcbnew/tools/edit_tool.cpp                         |  2 +-
 pcbnew/tools/pcbnew_control.cpp                    |  2 +-
 pcbnew/tools/selection_tool.cpp                    |  2 +-
 plugins/3d/idf/s3d_plugin_idf.cpp                  |  2 +-
 polygon/clipper.cpp                                | 24 +++++++++++-----------
 potrace/trace.cpp                                  |  6 +++---
 utils/idftools/idf2vrml.cpp                        |  4 ++--
 93 files changed, 181 insertions(+), 174 deletions(-)

diff --git a/3d-viewer/3d_cache/dialogs/panel_prev_model.cpp b/3d-viewer/3d_cache/dialogs/panel_prev_model.cpp
index 3544f37c8..37f597288 100644
--- a/3d-viewer/3d_cache/dialogs/panel_prev_model.cpp
+++ b/3d-viewer/3d_cache/dialogs/panel_prev_model.cpp
@@ -64,7 +64,7 @@ PANEL_PREV_3D::PANEL_PREV_3D( wxWindow* aParent, S3D_CACHE* aCacheManager,
 
     m_parentInfoList = aParentInfoList;
 
-    m_dummyBoard->Add( (MODULE*)aModuleCopy );
+    m_dummyBoard->Add( aModuleCopy );
     m_copyModule = aModuleCopy;
 
     // Set 3d viewer configuration for preview
diff --git a/3d-viewer/3d_cache/sg/sg_helpers.h b/3d-viewer/3d_cache/sg/sg_helpers.h
index 34de4eb1b..80f3452b7 100644
--- a/3d-viewer/3d_cache/sg/sg_helpers.h
+++ b/3d-viewer/3d_cache/sg/sg_helpers.h
@@ -118,7 +118,7 @@ class SGCOORDINDEX;
         sL = std::find( aRefList.begin(), aRefList.end(), aNode ); \
         if( sL != aRefList.end() ) return true; \
         if( isChild ) { \
-            SGNODE* ppn = (SGNODE*)aNode->GetParent(); \
+            SGNODE* ppn = aNode->GetParent(); \
             if( NULL != ppn ) { \
                 if( this != ppn ) { \
                     std::cerr << __FILE__ << ": " << __FUNCTION__ << ": " << __LINE__ << "\n"; \
@@ -152,7 +152,7 @@ class SGCOORDINDEX;
     SGNODE* psg = NULL; \
     while( sLA != eLA ) { \
         if( (SGNODE*)*sLA != aCallingNode ) { \
-            psg = (SGNODE*) (*sLA)->FindNode( aName, this ); \
+            psg = (*sLA)->FindNode( aName, this ); \
             if( NULL != psg) \
                 return psg; \
         } \
diff --git a/3d-viewer/3d_canvas/create_layer_items.cpp b/3d-viewer/3d_canvas/create_layer_items.cpp
index 888925c24..09ea35e5e 100644
--- a/3d-viewer/3d_canvas/create_layer_items.cpp
+++ b/3d-viewer/3d_canvas/create_layer_items.cpp
@@ -1178,17 +1178,17 @@ void CINFO3D_VISU::createLayers( REPORTER *aStatusTextReporter )
              ii != m_layers_holes2D.end();
              ++ii )
         {
-            ((CBVHCONTAINER2D *)(ii->second))->BuildBVH();
+            ii->second->BuildBVH();
         }
     }
 
     // We only need the Solder mask to initialize the BVH
     // because..?
-    if( (CBVHCONTAINER2D *)m_layers_container2D[B_Mask] )
-        ((CBVHCONTAINER2D *)m_layers_container2D[B_Mask])->BuildBVH();
+    if( m_layers_container2D[B_Mask] )
+        m_layers_container2D[B_Mask]->BuildBVH();
 
-    if( (CBVHCONTAINER2D *)m_layers_container2D[F_Mask] )
-        ((CBVHCONTAINER2D *)m_layers_container2D[F_Mask])->BuildBVH();
+    if( m_layers_container2D[F_Mask] )
+        m_layers_container2D[F_Mask]->BuildBVH();
 
 #ifdef PRINT_STATISTICS_3D_VIEWER
     unsigned stats_endHolesBVHTime = GetRunningMicroSecs();
diff --git a/3d-viewer/3d_model_viewer/c3d_model_viewer.cpp b/3d-viewer/3d_model_viewer/c3d_model_viewer.cpp
index e00a772f7..39672936c 100644
--- a/3d-viewer/3d_model_viewer/c3d_model_viewer.cpp
+++ b/3d-viewer/3d_model_viewer/c3d_model_viewer.cpp
@@ -157,7 +157,7 @@ void C3D_MODEL_VIEWER::Set3DModel(const wxString &aModelPathName)
         const S3DMODEL* model = m_cacheManager->GetModel( aModelPathName );
 
         if( model )
-            Set3DModel( (const S3DMODEL &)*model );
+            Set3DModel( *model );
         else
             Clear3DModel();
     }
diff --git a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp
index 6498d0f9b..5e554f41d 100644
--- a/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp
+++ b/3d-viewer/3d_rendering/3d_render_ogl_legacy/c3d_render_ogl_legacy.cpp
@@ -1013,7 +1013,7 @@ void C3D_RENDER_OGL_LEGACY::render_3D_module( const MODULE* module,
                        zpos );
 
         if( module->GetOrientation() )
-            glRotated( (double) module->GetOrientation() / 10.0, 0.0, 0.0, 1.0 );
+            glRotated( module->GetOrientation() / 10.0, 0.0, 0.0, 1.0 );
 
         if( module->IsFlipped() )
         {
diff --git a/3d-viewer/3d_rendering/3d_render_ogl_legacy/clayer_triangles.h b/3d-viewer/3d_rendering/3d_render_ogl_legacy/clayer_triangles.h
index 4a4f08c12..ffd0dfdcb 100644
--- a/3d-viewer/3d_rendering/3d_render_ogl_legacy/clayer_triangles.h
+++ b/3d-viewer/3d_rendering/3d_render_ogl_legacy/clayer_triangles.h
@@ -105,13 +105,13 @@ public:
      * @brief GetVertexPointer - Get the array of vertexes
      * @return The pointer to the start of array vertex
      */
-    const float *GetVertexPointer() const { return (const float *)&m_vertexs[0].x; }
+    const float *GetVertexPointer() const { return &m_vertexs[0].x; }
 
     /**
      * @brief GetNormalsPointer - Get the array of normals
      * @return The pointer to start of array of normals
      */
-    const float *GetNormalsPointer() const { return (const float *)&m_normals[0].x; }
+    const float *GetNormalsPointer() const { return &m_normals[0].x; }
 
     /**
      * @brief GetVertexSize
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/accelerators/cbvh_pbrt.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/accelerators/cbvh_pbrt.cpp
index 8291fb82a..2c6a46ae6 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/accelerators/cbvh_pbrt.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/accelerators/cbvh_pbrt.cpp
@@ -519,7 +519,7 @@ BVHBuildNode *CBVH_PBRT::recursiveBuild ( std::vector<BVHPrimitiveInfo> &primiti
                 wxASSERT( (primitiveNr >= 0) &&
                           (primitiveNr < (int)m_primitives.size()) );
 
-                const COBJECT *obj = static_cast<const COBJECT *>( m_primitives[ primitiveNr ] );
+                const COBJECT *obj = m_primitives[ primitiveNr ];
 
                 wxASSERT( obj != NULL );
 
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp
index e37bb1041..0062bc4d1 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp
@@ -286,7 +286,7 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER *aStatusTextReporter )
 
     m_outlineBoard2dObjects = new CCONTAINER2D;
 
-    if( ((const SHAPE_POLY_SET &)m_settings.GetBoardPoly()).OutlineCount() == 1 )
+    if( m_settings.GetBoardPoly().OutlineCount() == 1 )
     {
         float divFactor = 0.0f;
 
@@ -1500,9 +1500,9 @@ void C3D_RENDER_RAYTRACING::add_3D_models( const S3DMODEL *a3DModel,
                         const SFVEC3F vt1 = SFVEC3F( aModelMatrix * glm::vec4( v1, 1.0f) );
                         const SFVEC3F vt2 = SFVEC3F( aModelMatrix * glm::vec4( v2, 1.0f) );
 
-                        const SFVEC3F nt0 = glm::normalize( SFVEC3F( normalMatrix * n0 ) );
-                        const SFVEC3F nt1 = glm::normalize( SFVEC3F( normalMatrix * n1 ) );
-                        const SFVEC3F nt2 = glm::normalize( SFVEC3F( normalMatrix * n2 ) );
+                        const SFVEC3F nt0 = glm::normalize( normalMatrix * n0 );
+                        const SFVEC3F nt1 = glm::normalize( normalMatrix * n1 );
+                        const SFVEC3F nt2 = glm::normalize( normalMatrix * n2 );
 
                         CTRIANGLE *newTriangle = new  CTRIANGLE( vt0, vt2, vt1,
                                                                  nt0, nt2, nt1 );
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
index 474ac7b9b..b2a61e899 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_raytracing.cpp
@@ -966,16 +966,16 @@ void C3D_RENDER_RAYTRACING::rt_render_post_process_blur_finish( GLubyte *ptrPBO,
             GLubyte *ptr = &ptrPBO[ y * m_realBufferSize.x * 4 ];
 
             const SFVEC3F *ptrShaderY0 =
-                    &m_shaderBuffer[ glm::max((int)y - 2, 0) * m_realBufferSize.x ];
+                    &m_shaderBuffer[ glm::max(y - 2, 0) * m_realBufferSize.x ];
             const SFVEC3F *ptrShaderY1 =
-                    &m_shaderBuffer[ glm::max((int)y - 1, 0) * m_realBufferSize.x ];
+                    &m_shaderBuffer[ glm::max(y - 1, 0) * m_realBufferSize.x ];
             const SFVEC3F *ptrShaderY2 =
                     &m_shaderBuffer[ y * m_realBufferSize.x ];
             const SFVEC3F *ptrShaderY3 =
-                    &m_shaderBuffer[ glm::min((int)y + 1, (int)(m_realBufferSize.y - 1)) *
+                    &m_shaderBuffer[ glm::min(y + 1, (int)(m_realBufferSize.y - 1)) *
                                      m_realBufferSize.x ];
             const SFVEC3F *ptrShaderY4 =
-                    &m_shaderBuffer[ glm::min((int)y + 2, (int)(m_realBufferSize.y - 1)) *
+                    &m_shaderBuffer[ glm::min(y + 2, (int)(m_realBufferSize.y - 1)) *
                                      m_realBufferSize.x ];
 
             for( signed int x = 0; x < (int)m_realBufferSize.x; ++x )
@@ -1090,7 +1090,7 @@ void C3D_RENDER_RAYTRACING::render_preview( GLubyte *ptrPBO )
 
         for( unsigned int y = 0; y < RAYPACKET_DIM; ++y )
         {
-            const float posYfactor = (float)(windowsPos.y + y * 4.0f) / (float)m_windowSize.y;
+            const float posYfactor = windowsPos.y + y * 4.0f / m_windowSize.y;
 
             bgColor[y] = (SFVEC3F)m_settings.m_BgColorTop * SFVEC3F(posYfactor) +
                          (SFVEC3F)m_settings.m_BgColorBot * ( SFVEC3F(1.0f) - SFVEC3F(posYfactor) );
@@ -1834,7 +1834,7 @@ SFVEC3F C3D_RENDER_RAYTRACING::shadeHit( const SFVEC3F &aBgColor,
     if( nr_lights_that_can_cast_shadows > 0 )
     {
         aHitInfo.m_ShadowFactor = glm::max( shadow_att_factor_sum /
-                                  (float)(nr_lights_that_can_cast_shadows * 1.0f), 0.0f );
+                                  (nr_lights_that_can_cast_shadows * 1.0f), 0.0f );
     }
     else
     {
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/citemlayercsg2d.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/citemlayercsg2d.cpp
index b419c6e0c..12de0304a 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/citemlayercsg2d.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/citemlayercsg2d.cpp
@@ -122,16 +122,14 @@ bool CITEMLAYERCSG2D::Intersect( const RAYSEG2D &aSegRay,
             //check against all subbed objects
             for( unsigned int i = 0; i < m_objectB->size(); ++i )
             {
-                if( ((const COBJECT2D *)(*m_objectB)[i])->IsPointInside( currentRayPos ) )
+                if( (*m_objectB)[i]->IsPointInside( currentRayPos ) )
                 {
                     hitSubRegion = true;
 
                     // ray point is inside a subtracted region,  so move it to the end of the
                     // subtracted region
                     float hitDist;
-                    if( !((const COBJECT2D *)(*m_objectB)[i])->Intersect( aSegRay,
-                                                                          &hitDist,
-                                                                          &currentNormal ) )
+                    if( !(*m_objectB)[i]->Intersect( aSegRay, &hitDist, &currentNormal ) )
                         return false; // ray hit main object but did not leave subtracted volume
 
                     wxASSERT( hitDist <= 1.0f );
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp
index e5cc03799..1ad75e4e7 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/shapes2D/cpolygon2d.cpp
@@ -89,7 +89,7 @@ CPOLYGONBLOCK2D::CPOLYGONBLOCK2D( const SEGMENTS_WIDTH_NORMALS &aOpenSegmentList
     for( unsigned int i = 0; i < m_outers_and_holes.m_Outers.size(); i++ )
     {
         for( unsigned int j = 0; j < m_outers_and_holes.m_Outers[i].size(); j++ )
-            m_bbox.Union( ((SEGMENTS)m_outers_and_holes.m_Outers[i])[j].m_Start );
+            m_bbox.Union( (m_outers_and_holes.m_Outers[i])[j].m_Start );
     }
 
     m_bbox.ScaleNextUp();
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/shapes3D/clayeritem.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/shapes3D/clayeritem.cpp
index ee51d4448..0a38ea08f 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/shapes3D/clayeritem.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/shapes3D/clayeritem.cpp
@@ -75,7 +75,7 @@ bool CLAYERITEM::Intersect( const RAY &aRay, HITINFO &aHitInfo ) const
         bool hit_top = false;
         bool hit_bot = false;
 
-        if( (float)fabs(aRay.m_Dir.z) > FLT_EPSILON )
+        if( fabs(aRay.m_Dir.z) > FLT_EPSILON )
         {
             tBot    = (m_bbox.Min().z - aRay.m_Origin.z) * aRay.m_InvDir.z;
             tTop    = (m_bbox.Max().z - aRay.m_Origin.z) * aRay.m_InvDir.z;
@@ -342,7 +342,7 @@ bool CLAYERITEM::IntersectP( const RAY &aRay , float aMaxDistance ) const
     bool hit_top = false;
     bool hit_bot = false;
 
-    if( (float)fabs(aRay.m_Dir.z) > FLT_EPSILON )
+    if( fabs(aRay.m_Dir.z) > FLT_EPSILON )
     {
         tBot = (m_bbox.Min().z - aRay.m_Origin.z) * aRay.m_InvDir.z;
         tTop = (m_bbox.Max().z - aRay.m_Origin.z) * aRay.m_InvDir.z;
diff --git a/3d-viewer/3d_rendering/cimage.cpp b/3d-viewer/3d_rendering/cimage.cpp
index 78622970b..7991413ae 100644
--- a/3d-viewer/3d_rendering/cimage.cpp
+++ b/3d-viewer/3d_rendering/cimage.cpp
@@ -43,7 +43,7 @@ CIMAGE::CIMAGE( unsigned int aXsize, unsigned int aYsize )
     memset( m_pixels, 0, m_wxh );
     m_width   = aXsize;
     m_height  = aYsize;
-    m_wraping = (E_WRAP)WRAP_CLAMP;
+    m_wraping = WRAP_CLAMP;
 }
 
 
@@ -54,7 +54,7 @@ CIMAGE::CIMAGE( const CIMAGE &aSrcImage )
     memcpy( m_pixels, aSrcImage.GetBuffer(), m_wxh );
     m_width   = aSrcImage.GetWidth();
     m_height  = aSrcImage.GetHeight();
-    m_wraping = (E_WRAP)WRAP_CLAMP;
+    m_wraping = WRAP_CLAMP;
 }
 
 
diff --git a/3d-viewer/3d_rendering/cpostshader.h b/3d-viewer/3d_rendering/cpostshader.h
index fa5950517..ed4bf46c5 100644
--- a/3d-viewer/3d_rendering/cpostshader.h
+++ b/3d-viewer/3d_rendering/cpostshader.h
@@ -103,7 +103,7 @@ private:
         clampPos.x = glm::clamp( aPos.x, 0, (int)m_size.x - 1 );
         clampPos.y = glm::clamp( aPos.y, 0, (int)m_size.y - 1 );
 
-        return (unsigned int)( clampPos.x + m_size.x * clampPos.y );
+        return clampPos.x + m_size.x * clampPos.y;
     }
 
 protected:
diff --git a/3d-viewer/3d_rendering/trackball.cpp b/3d-viewer/3d_rendering/trackball.cpp
index 5037de9bd..d07e67350 100644
--- a/3d-viewer/3d_rendering/trackball.cpp
+++ b/3d-viewer/3d_rendering/trackball.cpp
@@ -113,7 +113,7 @@ void vcross( const double *v1, const double *v2, double *cross )
 
 double vlength( const double *v )
 {
-    return (double) sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] );
+    return sqrt( v[0] * v[0] + v[1] * v[1] + v[2] * v[2] );
 }
 
 void vscale( double *v, double div )
@@ -194,7 +194,7 @@ void trackball( double q[4], double p1x, double p1y, double p2x, double p2y )
     if( t < -1.0 )
         t = -1.0;
 
-    phi = 2.0f * (double) asin( t );
+    phi = 2.0f * asin( t );
 
     axis_to_quat( a, phi, q );
 }
@@ -206,8 +206,8 @@ void axis_to_quat( double a[3], double phi, double q[4] )
 {
     vnormal( a );
     vcopy( a, q );
-    vscale( q, (double) sin( phi / 2.0) );
-    q[3] = (double) cos( phi / 2.0 );
+    vscale( q, sin( phi / 2.0) );
+    q[3] = cos( phi / 2.0 );
 }
 
 /*
@@ -218,11 +218,11 @@ static double tb_project_to_sphere( double r, double x, double y )
 {
     double d, z;
 
-    d = (double) sqrt( x*x + y*y );
+    d = sqrt( x*x + y*y );
 
     if( d < r * 0.70710678118654752440 )
     {    /* Inside sphere */
-        z = (double) sqrt( r*r - d*d );
+        z = sqrt( r*r - d*d );
     }
     else
     {           /* On hyperbola */
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f2ea761f9..4c716a2f5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -197,6 +197,12 @@ if( CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
     if(COMPILER_SUPPORTS_WSUGGEST_OVERRIDE)
         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override")
     endif()
+
+    CHECK_CXX_COMPILER_FLAG("-Wuseless-cast" COMPILER_SUPPORTS_WUSELESS_CAST)
+
+    if(COMPILER_SUPPORTS_WUSELESS_CAST)
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wuseless-cast")
+    endif()
 endif()
 
 
diff --git a/bitmap2component/bitmap2cmp_gui.cpp b/bitmap2component/bitmap2cmp_gui.cpp
index 19969b16d..b60417726 100644
--- a/bitmap2component/bitmap2cmp_gui.cpp
+++ b/bitmap2component/bitmap2cmp_gui.cpp
@@ -717,7 +717,7 @@ KIFACE_I& Kiface()
 // KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
 KIFACE* KIFACE_GETTER( int* aKIFACEversion, int aKIWAYversion, PGM_BASE* aProgram )
 {
-    process = (PGM_BASE*) aProgram;
+    process = aProgram;
     return &kiface;
 }
 
diff --git a/common/base_struct.cpp b/common/base_struct.cpp
index ca8876a96..dbb1ed83c 100644
--- a/common/base_struct.cpp
+++ b/common/base_struct.cpp
@@ -176,7 +176,7 @@ wxString EDA_ITEM::GetSelectMenuText() const
     wxFAIL_MSG( wxT( "GetSelectMenuText() was not overridden for schematic item type " ) +
                 GetClass() );
 
-    return wxString( wxT( "Undefined menu text for " ) + GetClass() );
+    return wxT( "Undefined menu text for " ) + GetClass();
 }
 
 
diff --git a/common/bezier_curves.cpp b/common/bezier_curves.cpp
index 8b66185b7..77f172b71 100644
--- a/common/bezier_curves.cpp
+++ b/common/bezier_curves.cpp
@@ -50,7 +50,7 @@ void BEZIER_POLY::GetPoly( std::vector<wxPoint>& aOutput )
     wxCHECK( !m_ctrlPts.empty(), /* void */ );
     m_output = &aOutput;
     m_output->clear();
-    m_output->push_back( wxPoint( m_ctrlPts.front() ) );
+    m_output->push_back( m_ctrlPts.front() );
 
     // Only quadratic and cubic Bezier curves are handled
     if( m_ctrlPts.size() == 3 )
@@ -64,7 +64,7 @@ void BEZIER_POLY::GetPoly( std::vector<wxPoint>& aOutput )
                 m_ctrlPts[2].x, m_ctrlPts[2].y,
                 m_ctrlPts[3].x, m_ctrlPts[3].y, 0 );
 
-    m_output->push_back( wxPoint( m_ctrlPts.back() ) );
+    m_output->push_back( m_ctrlPts.back() );
 }
 
 
diff --git a/common/draw_frame.cpp b/common/draw_frame.cpp
index 1d9a1225c..db6f8eb43 100644
--- a/common/draw_frame.cpp
+++ b/common/draw_frame.cpp
@@ -746,7 +746,7 @@ const wxString EDA_DRAW_FRAME::GetZoomLevelIndicator() const
     }
     else if( BASE_SCREEN* screen = GetScreen() )
     {
-        level = m_zoomLevelCoeff / (double) screen->GetZoom();
+        level = m_zoomLevelCoeff / screen->GetZoom();
     }
 
     // returns a human readable value which can be displayed as zoom
@@ -1491,7 +1491,7 @@ bool EDA_DRAW_FRAME::GeneralControlKeyMovement( int aHotKey, wxPoint *aPos,
 
 bool EDA_DRAW_FRAME::isBusy() const
 {
-    const BASE_SCREEN* screen = const_cast< BASE_SCREEN* >( GetScreen() );
+    const BASE_SCREEN* screen = GetScreen();
 
     if( !screen )
         return false;
diff --git a/common/draw_panel_gal.cpp b/common/draw_panel_gal.cpp
index 98fc26517..41914c3f0 100644
--- a/common/draw_panel_gal.cpp
+++ b/common/draw_panel_gal.cpp
@@ -159,7 +159,7 @@ void EDA_DRAW_PANEL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) )
     wxASSERT( m_painter );
 
     m_drawing = true;
-    KIGFX::RENDER_SETTINGS* settings = static_cast<KIGFX::RENDER_SETTINGS*>( m_painter->GetSettings() );
+    KIGFX::RENDER_SETTINGS* settings = m_painter->GetSettings();
 
     m_viewControls->UpdateScrollbars();
 
diff --git a/common/gal/cairo/cairo_gal.cpp b/common/gal/cairo/cairo_gal.cpp
index 0f3efa3fc..2e38da8e2 100644
--- a/common/gal/cairo/cairo_gal.cpp
+++ b/common/gal/cairo/cairo_gal.cpp
@@ -149,9 +149,9 @@ void CAIRO_GAL::EndDrawing()
     // Now translate the raw context data from the format stored
     // by cairo into a format understood by wxImage.
     pixman_image_t* dstImg = pixman_image_create_bits(PIXMAN_r8g8b8,
-            screenSize.x, screenSize.y, (uint32_t*)wxOutput, wxBufferWidth * 3 );
+            screenSize.x, screenSize.y, reinterpret_cast<uint32_t*>(wxOutput), wxBufferWidth * 3 );
     pixman_image_t* srcImg = pixman_image_create_bits(PIXMAN_a8b8g8r8,
-            screenSize.x, screenSize.y, (uint32_t*)bitmapBuffer, wxBufferWidth * 4 );
+            screenSize.x, screenSize.y, bitmapBuffer, wxBufferWidth * 4 );
 
     pixman_image_composite (PIXMAN_OP_SRC, srcImg, NULL, dstImg,
             0, 0, 0, 0, 0, 0, screenSize.x, screenSize.y );
@@ -160,7 +160,7 @@ void CAIRO_GAL::EndDrawing()
     pixman_image_unref( srcImg );
     pixman_image_unref( dstImg );
 
-    wxImage img( wxBufferWidth, screenSize.y, (unsigned char*) wxOutput, true );
+    wxImage img( wxBufferWidth, screenSize.y, wxOutput, true );
     wxBitmap bmp( img );
     wxMemoryDC mdc( bmp );
     wxClientDC clientDC( this );
diff --git a/common/gal/opengl/opengl_compositor.cpp b/common/gal/opengl/opengl_compositor.cpp
index 8b7e3d1a7..bb2234321 100644
--- a/common/gal/opengl/opengl_compositor.cpp
+++ b/common/gal/opengl/opengl_compositor.cpp
@@ -153,10 +153,10 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer( VECTOR2U aDimensions )
 {
     assert( m_initialized );
 
-    int maxBuffers, maxTextureSize;
+    GLint maxBuffers, maxTextureSize;
 
     // Get the maximum number of buffers
-    glGetIntegerv( GL_MAX_COLOR_ATTACHMENTS, (GLint*) &maxBuffers );
+    glGetIntegerv( GL_MAX_COLOR_ATTACHMENTS, &maxBuffers );
 
     if( (int) usedBuffers() >= maxBuffers )
     {
@@ -165,7 +165,7 @@ unsigned int OPENGL_COMPOSITOR::CreateBuffer( VECTOR2U aDimensions )
                         "your graphic drivers." );
     }
 
-    glGetIntegerv( GL_MAX_TEXTURE_SIZE, (GLint*) &maxTextureSize );
+    glGetIntegerv( GL_MAX_TEXTURE_SIZE, &maxTextureSize );
 
     if( maxTextureSize < (int) aDimensions.x || maxTextureSize < (int) aDimensions.y )
     {
diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp
index d10bc1a13..67cb51d74 100644
--- a/common/gal/opengl/opengl_gal.cpp
+++ b/common/gal/opengl/opengl_gal.cpp
@@ -239,7 +239,7 @@ void OPENGL_GAL::BeginDrawing()
     glLoadIdentity();
 
     // Create the screen transformation (Do the RH-LH conversion here)
-    glOrtho( 0, (GLint) screenSize.x, (GLsizei) screenSize.y, 0, -depthRange.x, -depthRange.y );
+    glOrtho( 0, screenSize.x, screenSize.y, 0, -depthRange.x, -depthRange.y );
 
     if( !isFramebufferInitialized )
     {
diff --git a/common/gal/opengl/shader.cpp b/common/gal/opengl/shader.cpp
index 5a8fd6817..2a6d631ea 100644
--- a/common/gal/opengl/shader.cpp
+++ b/common/gal/opengl/shader.cpp
@@ -247,7 +247,7 @@ bool SHADER::loadShaderFromStringArray( SHADER_TYPE aShaderType, const char** aA
     programInfo( programNumber );
 
     // Attach the sources
-    glShaderSource( shaderNumber, aSize, (const GLchar**) aArray, NULL );
+    glShaderSource( shaderNumber, aSize, aArray, NULL );
     programInfo( programNumber );
 
     // Compile and attach shader to the program
diff --git a/common/lib_table_base.cpp b/common/lib_table_base.cpp
index 5147d68d8..a44a889f1 100644
--- a/common/lib_table_base.cpp
+++ b/common/lib_table_base.cpp
@@ -312,7 +312,7 @@ LIB_TABLE_ROW* LIB_TABLE::findRow( const wxString& aNickName ) const
 
 LIB_TABLE_ROW* LIB_TABLE::findRow( const wxString& aNickName )
 {
-    LIB_TABLE* cur = (LIB_TABLE*) this;
+    LIB_TABLE* cur = this;
 
     do
     {
diff --git a/common/page_layout/worksheet_dataitem.cpp b/common/page_layout/worksheet_dataitem.cpp
index 22473ba71..d6360893e 100644
--- a/common/page_layout/worksheet_dataitem.cpp
+++ b/common/page_layout/worksheet_dataitem.cpp
@@ -484,7 +484,7 @@ void WORKSHEET_DATAITEM_TEXT::IncrementLabel( int aIncr )
 
     if( lbchar >= '0' &&  lbchar <= '9' )
         // A number is expected:
-        m_FullText << (int)( aIncr + lbchar - '0' );
+        m_FullText << ( aIncr + lbchar - '0' );
     else
         m_FullText << (wxChar) ( aIncr + lbchar );
 }
diff --git a/common/preview_items/ruler_item.cpp b/common/preview_items/ruler_item.cpp
index 18f9ee171..4964dbee9 100644
--- a/common/preview_items/ruler_item.cpp
+++ b/common/preview_items/ruler_item.cpp
@@ -232,7 +232,7 @@ void RULER_ITEM::ViewGetLayers( int aLayers[], int& aCount ) const
 void RULER_ITEM::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const
 {
     auto& gal = *aView->GetGAL();
-    auto rs = static_cast<KIGFX::RENDER_SETTINGS*>( aView->GetPainter()->GetSettings() );
+    auto rs = aView->GetPainter()->GetSettings();
 
     const auto origin = m_geomMgr.GetOrigin();
     const auto end = m_geomMgr.GetEnd();
diff --git a/common/utf8.cpp b/common/utf8.cpp
index 57677ca7c..f88ab5537 100644
--- a/common/utf8.cpp
+++ b/common/utf8.cpp
@@ -231,7 +231,7 @@ UTF8& UTF8::operator+=( unsigned w_ch )
         m_s += substr.m_s;
     }
 
-    return (UTF8&) *this;
+    return *this;
 }
 
 
diff --git a/common/view/view.cpp b/common/view/view.cpp
index 84f848cd4..9ffe56fb2 100644
--- a/common/view/view.cpp
+++ b/common/view/view.cpp
@@ -465,7 +465,7 @@ VECTOR2D VIEW::ToWorld( const VECTOR2D& aCoord, bool aAbsolute ) const
     const MATRIX3x3D& matrix = m_gal->GetScreenWorldMatrix();
 
     if( aAbsolute )
-        return VECTOR2D( matrix * aCoord );
+        return matrix * aCoord;
     else
         return VECTOR2D( matrix.GetScale().x * aCoord.x, matrix.GetScale().y * aCoord.y );
 }
@@ -484,7 +484,7 @@ VECTOR2D VIEW::ToScreen( const VECTOR2D& aCoord, bool aAbsolute ) const
     const MATRIX3x3D& matrix = m_gal->GetWorldScreenMatrix();
 
     if( aAbsolute )
-        return VECTOR2D( matrix * aCoord );
+        return matrix * aCoord;
     else
         return VECTOR2D( matrix.GetScale().x * aCoord.x, matrix.GetScale().y * aCoord.y );
 }
diff --git a/common/widgets/footprint_preview_widget.cpp b/common/widgets/footprint_preview_widget.cpp
index a30520d1c..e6b5135b2 100644
--- a/common/widgets/footprint_preview_widget.cpp
+++ b/common/widgets/footprint_preview_widget.cpp
@@ -77,14 +77,14 @@ void FOOTPRINT_PREVIEW_WIDGET::ClearStatus()
 void FOOTPRINT_PREVIEW_WIDGET::CacheFootprint( const LIB_ID& aFPID )
 {
     if( m_prev_panel )
-        (void) m_prev_panel->CacheFootprint( aFPID );
+        m_prev_panel->CacheFootprint( aFPID );
 }
 
 
 void FOOTPRINT_PREVIEW_WIDGET::DisplayFootprint( const LIB_ID& aFPID )
 {
     if( m_prev_panel )
-        (void) m_prev_panel->DisplayFootprint( aFPID );
+        m_prev_panel->DisplayFootprint( aFPID );
 }
 
 
diff --git a/common/worksheet_viewitem.cpp b/common/worksheet_viewitem.cpp
index 15924033a..bbba9d7be 100644
--- a/common/worksheet_viewitem.cpp
+++ b/common/worksheet_viewitem.cpp
@@ -141,7 +141,7 @@ void WORKSHEET_VIEWITEM::draw( const WS_DRAW_ITEM_LINE* aItem, GAL* aGal ) const
 {
     aGal->SetIsStroke( true );
     aGal->SetIsFill( false );
-    aGal->SetStrokeColor( COLOR4D( aItem->GetColor() ) );
+    aGal->SetStrokeColor( aItem->GetColor() );
     aGal->SetLineWidth( aItem->GetPenWidth() );
     aGal->DrawLine( VECTOR2D( aItem->GetStart() ), VECTOR2D( aItem->GetEnd() ) );
 }
@@ -151,7 +151,7 @@ void WORKSHEET_VIEWITEM::draw( const WS_DRAW_ITEM_RECT* aItem, GAL* aGal ) const
 {
     aGal->SetIsStroke( true );
     aGal->SetIsFill( false );
-    aGal->SetStrokeColor( COLOR4D( aItem->GetColor() ) );
+    aGal->SetStrokeColor( aItem->GetColor() );
     aGal->SetLineWidth( aItem->GetPenWidth() );
     aGal->DrawRectangle( VECTOR2D( aItem->GetStart() ), VECTOR2D( aItem->GetEnd() ) );
 }
@@ -167,14 +167,14 @@ void WORKSHEET_VIEWITEM::draw( const WS_DRAW_ITEM_POLYGON* aItem, GAL* aGal ) co
 
     if( aItem->IsFilled() )
     {
-        aGal->SetFillColor( COLOR4D( aItem->GetColor() ) );
+        aGal->SetFillColor( aItem->GetColor() );
         aGal->SetIsFill( true );
         aGal->SetIsStroke( false );
         aGal->DrawPolygon( corners );
     }
     else
     {
-        aGal->SetStrokeColor( COLOR4D( aItem->GetColor() ) );
+        aGal->SetStrokeColor( aItem->GetColor() );
         aGal->SetIsFill( false );
         aGal->SetIsStroke( true );
         aGal->SetLineWidth( aItem->GetPenWidth() );
@@ -190,7 +190,7 @@ void WORKSHEET_VIEWITEM::draw( const WS_DRAW_ITEM_TEXT* aItem, GAL* aGal ) const
     aGal->Save();
     aGal->Translate( position );
     aGal->Rotate( -aItem->GetTextAngle() * M_PI / 1800.0 );
-    aGal->SetStrokeColor( COLOR4D( aItem->GetColor() ) );
+    aGal->SetStrokeColor( aItem->GetColor() );
     aGal->SetLineWidth( aItem->GetThickness() );
     aGal->SetTextAttributes( aItem );
     aGal->StrokeText( aItem->GetShownText(), VECTOR2D( 0, 0 ), 0.0 );
diff --git a/common/xnode.cpp b/common/xnode.cpp
index 74d31be9b..895581dd8 100644
--- a/common/xnode.cpp
+++ b/common/xnode.cpp
@@ -51,7 +51,7 @@ void XNODE::Format( OUTPUTFORMATTER* out, int nestLevel )
 void XNODE::FormatContents( OUTPUTFORMATTER* out, int nestLevel )
 {
     // output attributes first if they exist
-    for( XATTR* attr = (XATTR*) GetAttributes();  attr;  attr = (XATTR*) attr->GetNext() )
+    for( XATTR* attr = GetAttributes();  attr;  attr = attr->GetNext() )
     {
         out->Print( 0, " (%s %s)",
             // attr names should never need quoting, no spaces, we designed the file.
@@ -66,7 +66,7 @@ void XNODE::FormatContents( OUTPUTFORMATTER* out, int nestLevel )
     case wxXML_ELEMENT_NODE:
 
         // output children if they exist.
-        for( XNODE* kid = (XNODE*) GetChildren();  kid;  kid = (XNODE*) kid->GetNext() )
+        for( XNODE* kid = GetChildren();  kid;  kid = kid->GetNext() )
         {
             if( kid->GetType() != wxXML_TEXT_NODE )
             {
diff --git a/cvpcb/cvpcb.cpp b/cvpcb/cvpcb.cpp
index bc167ebb5..6f552d645 100644
--- a/cvpcb/cvpcb.cpp
+++ b/cvpcb/cvpcb.cpp
@@ -111,7 +111,7 @@ KIFACE_I& Kiface() { return kiface; }
 // KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
 MY_API( KIFACE* ) KIFACE_GETTER(  int* aKIFACEversion, int aKIWAYversion, PGM_BASE* aProgram )
 {
-    process = (PGM_BASE*) aProgram;
+    process = aProgram;
     return &kiface;
 }
 
diff --git a/eeschema/dialogs/dialog_edit_one_field.cpp b/eeschema/dialogs/dialog_edit_one_field.cpp
index e5d0a0a7f..8076ac825 100644
--- a/eeschema/dialogs/dialog_edit_one_field.cpp
+++ b/eeschema/dialogs/dialog_edit_one_field.cpp
@@ -102,7 +102,7 @@ void DIALOG_EDIT_ONE_FIELD::init()
     wxString msg;
 
     m_TextValue->SetFocus();
-    SCH_BASE_FRAME* parent = static_cast<SCH_BASE_FRAME*>( GetParent() );
+    SCH_BASE_FRAME* parent = GetParent();
     m_TextValue->SetValidator( SCH_FIELD_VALIDATOR(
                                     parent->IsType( FRAME_SCH_LIB_EDITOR ),
                                     m_fieldId, &m_text ) );
diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp
index 5b7c7a3a3..aa67ab64c 100644
--- a/eeschema/dialogs/dialog_erc.cpp
+++ b/eeschema/dialogs/dialog_erc.cpp
@@ -212,7 +212,7 @@ void DIALOG_ERC::OnLeftClickMarkersList( wxHtmlLinkEvent& event )
 
     for( i = 0;  i < sheetList.size(); i++ )
     {
-        SCH_ITEM* item = (SCH_ITEM*) sheetList[i].LastDrawList();
+        SCH_ITEM* item = sheetList[i].LastDrawList();
 
         for( ; item; item = item->Next() )
         {
diff --git a/eeschema/eeschema_config.cpp b/eeschema/eeschema_config.cpp
index 24c74fe06..451a3a286 100644
--- a/eeschema/eeschema_config.cpp
+++ b/eeschema/eeschema_config.cpp
@@ -270,8 +270,8 @@ void SCH_EDIT_FRAME::OnPreferencesOptions( wxCommandEvent& event )
     int sep, firstId;
     dlg.GetRefIdSeparator( sep, firstId);
 
-    if( sep != (int)LIB_PART::GetSubpartIdSeparator() ||
-        firstId != (int)LIB_PART::GetSubpartFirstId() )
+    if( sep != LIB_PART::GetSubpartIdSeparator() ||
+        firstId != LIB_PART::GetSubpartFirstId() )
     {
         LIB_PART::SetSubpartIdNotation( sep, firstId );
         saveProjectConfig = true;
diff --git a/eeschema/generate_alias_info.cpp b/eeschema/generate_alias_info.cpp
index 37dc5db16..bc4fd1247 100644
--- a/eeschema/generate_alias_info.cpp
+++ b/eeschema/generate_alias_info.cpp
@@ -74,7 +74,7 @@ public:
 
         try
         {
-            m_alias = const_cast< LIB_ALIAS* >( m_sym_lib_table->LoadSymbol( m_lib_id ) );
+            m_alias = m_sym_lib_table->LoadSymbol( m_lib_id );
         }
         catch( const IO_ERROR& ioe )
         {
diff --git a/eeschema/hierarch.cpp b/eeschema/hierarch.cpp
index d35168134..92535b83f 100644
--- a/eeschema/hierarch.cpp
+++ b/eeschema/hierarch.cpp
@@ -149,7 +149,7 @@ HIERARCHY_NAVIG_DLG::HIERARCHY_NAVIG_DLG( SCH_EDIT_FRAME* aParent, const wxPoint
     DIALOG_SHIM( aParent, wxID_ANY, _( "Navigator" ), wxDefaultPosition, wxDefaultSize,
                  wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
 {
-    wxASSERT( dynamic_cast< SCH_EDIT_FRAME* >( aParent ) );
+    wxASSERT( aParent );
 
     m_SchFrameEditor = aParent;
     m_currSheet = aParent->GetCurrentSheet();
diff --git a/eeschema/netlist_exporters/netlist_exporter_pspice.cpp b/eeschema/netlist_exporters/netlist_exporter_pspice.cpp
index f711cb934..576485c24 100644
--- a/eeschema/netlist_exporters/netlist_exporter_pspice.cpp
+++ b/eeschema/netlist_exporters/netlist_exporter_pspice.cpp
@@ -53,7 +53,7 @@ wxString NETLIST_EXPORTER_PSPICE::GetSpiceDevice( const wxString& aComponent ) c
 
     // Prefix the device type if plain reference would result in a different device type
     return it->m_primitive != it->m_refName[0] ?
-        wxString( it->m_primitive + it->m_refName ) : it->m_refName;
+        it->m_primitive + it->m_refName : it->m_refName;
 }
 
 
diff --git a/eeschema/sch_eagle_plugin.cpp b/eeschema/sch_eagle_plugin.cpp
index 983607b7f..298243df1 100644
--- a/eeschema/sch_eagle_plugin.cpp
+++ b/eeschema/sch_eagle_plugin.cpp
@@ -1062,7 +1062,7 @@ void SCH_EAGLE_PLUGIN::loadInstance( wxXmlNode* aInstanceNode )
 
     wxString libraryname = epart->library;
     wxString gatename = epart->deviceset + epart->device + einstance.gate;
-    wxString symbolname = wxString( epart->deviceset + epart->device );
+    wxString symbolname = epart->deviceset + epart->device;
     symbolname.Replace( "*", "" );
     LIB_ALIAS::ValidateName( symbolname );
 
@@ -1383,7 +1383,7 @@ bool SCH_EAGLE_PLUGIN::loadSymbol( wxXmlNode* aSymbolNode, std::unique_ptr<LIB_P
                 {
                     if( connect.gate == aGateName && pin->GetName() == connect.pin )
                     {
-                        wxArrayString pads = wxSplit( wxString( connect.pad ), ' ');
+                        wxArrayString pads = wxSplit( connect.pad, ' ');
 
                         pin->SetPartNumber( aGateNumber );
                         pin->SetUnit( aGateNumber );
diff --git a/eeschema/sch_line.cpp b/eeschema/sch_line.cpp
index b0d9f1206..5bbd33581 100644
--- a/eeschema/sch_line.cpp
+++ b/eeschema/sch_line.cpp
@@ -410,8 +410,8 @@ EDA_ITEM* SCH_LINE::MergeOverlap( SCH_LINE* aLine )
     if( this == aLine || GetLayer() != aLine->GetLayer() )
         return NULL;
 
-    SCH_LINE leftmost = SCH_LINE( *aLine );
-    SCH_LINE rightmost = SCH_LINE( *this );
+    SCH_LINE leftmost = *aLine;
+    SCH_LINE rightmost = *this;
 
     // We place the start to the left and below the end of both lines
     if( leftmost.m_start != std::min( { leftmost.m_start, leftmost.m_end }, less ) )
@@ -427,7 +427,7 @@ EDA_ITEM* SCH_LINE::MergeOverlap( SCH_LINE* aLine )
     if( less( rightmost.m_start, leftmost.m_start ) )
         std::swap( leftmost, rightmost );
 
-    SCH_LINE other = SCH_LINE( rightmost );
+    SCH_LINE other = rightmost;
 
     if( less( rightmost.m_end, leftmost.m_end ) )
         rightmost = leftmost;
diff --git a/eeschema/sch_sheet_path.h b/eeschema/sch_sheet_path.h
index a8f708ea0..509c1392e 100644
--- a/eeschema/sch_sheet_path.h
+++ b/eeschema/sch_sheet_path.h
@@ -127,7 +127,7 @@ public:
         if( aIndex < size() )
             retv = at( aIndex );
 
-        return const_cast< SCH_SHEET* >( retv );
+        return retv;
     }
 
     SCH_SHEET* GetSheet( unsigned aIndex )
diff --git a/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp b/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp
index bd032e8a1..a7b0aafbe 100644
--- a/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp
+++ b/gerbview/dialogs/gerbview_dialog_display_options_frame.cpp
@@ -192,7 +192,7 @@ void DIALOG_DISPLAY_OPTIONS::OnOKBUttonClick( wxCommandEvent& event )
     // Apply changes to the GAL
     auto view = m_Parent->GetGalCanvas()->GetView();
     auto painter = static_cast<KIGFX::GERBVIEW_PAINTER*>( view->GetPainter() );
-    auto settings = static_cast<KIGFX::GERBVIEW_RENDER_SETTINGS*>( painter->GetSettings() );
+    auto settings = painter->GetSettings();
     settings->LoadDisplayOptions( displayOptions );
     view->MarkTargetDirty( KIGFX::TARGET_NONCACHED );
 
diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp
index 3ddaf9320..7a23f08af 100644
--- a/gerbview/gerbview_frame.cpp
+++ b/gerbview/gerbview_frame.cpp
@@ -538,7 +538,7 @@ void GERBVIEW_FRAME::applyDisplaySettingsToGAL()
 {
     auto view = GetGalCanvas()->GetView();
     auto painter = static_cast<KIGFX::GERBVIEW_PAINTER*>( view->GetPainter() );
-    auto settings = static_cast<KIGFX::GERBVIEW_RENDER_SETTINGS*>( painter->GetSettings() );
+    auto settings = painter->GetSettings();
     settings->LoadDisplayOptions( &m_DisplayOptions );
 
     settings->ImportLegacyColors( m_colorsSettings );
diff --git a/gerbview/select_layers_to_pcb.h b/gerbview/select_layers_to_pcb.h
index 858cc02af..4d736a1d7 100644
--- a/gerbview/select_layers_to_pcb.h
+++ b/gerbview/select_layers_to_pcb.h
@@ -43,8 +43,8 @@ private:
     static int m_exportBoardCopperLayersCount;
     LAYER_NUM m_layersLookUpTable[GERBER_DRAWLAYERS_COUNT]; // Indexes Gerber layers to PCB file layers
                                                     // the last value in table is the number of copper layers
-    int    m_buttonTable[int(GERBER_DRAWLAYERS_COUNT)+1];       // Indexes buttons to Gerber layers
-    wxStaticText* m_layersList[int(GERBER_DRAWLAYERS_COUNT)+1]; // Indexes text strings to buttons
+    int    m_buttonTable[GERBER_DRAWLAYERS_COUNT+1];       // Indexes buttons to Gerber layers
+    wxStaticText* m_layersList[GERBER_DRAWLAYERS_COUNT+1]; // Indexes text strings to buttons
 
 public: LAYERS_MAP_DIALOG( GERBVIEW_FRAME* parent );
     ~LAYERS_MAP_DIALOG() {};
diff --git a/gerbview/tools/selection_tool.cpp b/gerbview/tools/selection_tool.cpp
index f1499cc81..6020bcf2f 100644
--- a/gerbview/tools/selection_tool.cpp
+++ b/gerbview/tools/selection_tool.cpp
@@ -279,7 +279,7 @@ SELECTION& GERBVIEW_SELECTION_TOOL::RequestSelection( int aFlags )
 
     // Now safely remove the items from the selection
     for( auto item : removed_items )
-        unselect( static_cast<EDA_ITEM *>( item ) );
+        unselect( item );
 
     return m_selection;
 }
@@ -608,7 +608,7 @@ void GERBVIEW_SELECTION_TOOL::clearSelection()
         return;
 
     for( auto item : m_selection )
-        unselectVisually( static_cast<EDA_ITEM*>( item ) );
+        unselectVisually( item );
 
     m_selection.Clear();
 
diff --git a/include/gal/graphics_abstraction_layer.h b/include/gal/graphics_abstraction_layer.h
index b3d571a34..4991eafce 100644
--- a/include/gal/graphics_abstraction_layer.h
+++ b/include/gal/graphics_abstraction_layer.h
@@ -906,7 +906,7 @@ public:
      */
     inline VECTOR2D ToWorld( const VECTOR2D& aPoint ) const
     {
-        return VECTOR2D( screenWorldMatrix * aPoint );
+        return screenWorldMatrix * aPoint;
     }
 
     /**
@@ -917,7 +917,7 @@ public:
      */
     inline VECTOR2D ToScreen( const VECTOR2D& aPoint ) const
     {
-        return VECTOR2D( worldScreenMatrix * aPoint );
+        return worldScreenMatrix * aPoint;
     }
 
     /**
diff --git a/include/layers_id_colors_and_visibility.h b/include/layers_id_colors_and_visibility.h
index 2cd5d314f..33465170b 100644
--- a/include/layers_id_colors_and_visibility.h
+++ b/include/layers_id_colors_and_visibility.h
@@ -302,9 +302,9 @@ enum GERBVIEW_LAYER_ID: int
 // from a dialog, but have a visibility control flag.
 // Here is a mask to set them visible, to be sure they are displayed
 // after loading a board for instance
-#define MIN_VISIBILITY_MASK int( ( 1 << GAL_LAYER_INDEX( LAYER_PADS_PLATEDHOLES ) ) +\
-                 ( 1 << GAL_LAYER_INDEX( LAYER_VIAS_HOLES ) ) +\
-                 ( 1 << GAL_LAYER_INDEX( LAYER_DRC ) ) +\
+#define MIN_VISIBILITY_MASK ( ( 1 << GAL_LAYER_INDEX( LAYER_PADS_PLATEDHOLES ) ) |\
+                 ( 1 << GAL_LAYER_INDEX( LAYER_VIAS_HOLES ) ) |\
+                 ( 1 << GAL_LAYER_INDEX( LAYER_DRC ) ) |\
                  ( 1 << GAL_LAYER_INDEX( LAYER_GP_OVERLAY ) ) )
 
 
diff --git a/include/utf8.h b/include/utf8.h
index 3591f1aff..3360bc85e 100644
--- a/include/utf8.h
+++ b/include/utf8.h
@@ -128,21 +128,21 @@ public:
     {
         m_s += str.m_s;
         MAYBE_VERIFY_UTF8( c_str() );
-        return (UTF8&) *this;
+        return *this;
     }
 
     UTF8& operator+=( char ch )
     {
         m_s.operator+=( ch );
         MAYBE_VERIFY_UTF8( c_str() );
-        return (UTF8&) *this;
+        return *this;
     }
 
     UTF8& operator+=( const char* s )
     {
         m_s.operator+=( s );
         MAYBE_VERIFY_UTF8( c_str() );
-        return (UTF8&) *this;
+        return *this;
     }
 
     /// Append a wide (unicode) char to the UTF8 string.
diff --git a/pagelayout_editor/block.cpp b/pagelayout_editor/block.cpp
index d0c34d271..9f5de4d2f 100644
--- a/pagelayout_editor/block.cpp
+++ b/pagelayout_editor/block.cpp
@@ -202,7 +202,7 @@ static void DrawMovingBlockOutlines( EDA_DRAW_PANEL* aPanel, wxDC* aDC, const wx
 
 void PL_EDITOR_FRAME::Block_Move( wxDC* DC )
 {
-    auto screen = static_cast<PL_EDITOR_SCREEN*>( GetScreen() );
+    auto screen = GetScreen();
 
     wxPoint delta;
     wxPoint oldpos;
diff --git a/pagelayout_editor/pl_editor.cpp b/pagelayout_editor/pl_editor.cpp
index 9d1a6b300..e5c8a45a7 100644
--- a/pagelayout_editor/pl_editor.cpp
+++ b/pagelayout_editor/pl_editor.cpp
@@ -104,7 +104,7 @@ KIFACE_I& Kiface() { return kiface; }
 // KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
 MY_API( KIFACE* ) KIFACE_GETTER(  int* aKIFACEversion, int aKiwayVersion, PGM_BASE* aProgram )
 {
-    process = (PGM_BASE*) aProgram;
+    process = aProgram;
     return &kiface;
 }
 
diff --git a/pagelayout_editor/pl_editor_frame.cpp b/pagelayout_editor/pl_editor_frame.cpp
index fe4225422..c251d2d16 100644
--- a/pagelayout_editor/pl_editor_frame.cpp
+++ b/pagelayout_editor/pl_editor_frame.cpp
@@ -386,7 +386,7 @@ void PL_EDITOR_FRAME::SetTitleBlock( const TITLE_BLOCK& aTitleBlock )
 
 void PL_EDITOR_FRAME::UpdateStatusBar()
 {
-    PL_EDITOR_SCREEN* screen = (PL_EDITOR_SCREEN*) GetScreen();
+    PL_EDITOR_SCREEN* screen = GetScreen();
 
     if( !screen )
         return;
@@ -674,7 +674,7 @@ WORKSHEET_DATAITEM* PL_EDITOR_FRAME::Locate( const wxPoint& aPosition )
     const PAGE_INFO&    pageInfo = GetPageSettings();
     TITLE_BLOCK         t_block = GetTitleBlock();
     COLOR4D             color = COLOR4D( RED );    // Needed, not used
-    PL_EDITOR_SCREEN*   screen = (PL_EDITOR_SCREEN*) GetScreen();
+    PL_EDITOR_SCREEN*   screen = GetScreen();
 
     screen-> m_ScreenNumber = GetPageNumberOption() ? 1 : 2;
 
diff --git a/pcb_calculator/pcb_calculator.cpp b/pcb_calculator/pcb_calculator.cpp
index 62937e913..9091fd7fc 100644
--- a/pcb_calculator/pcb_calculator.cpp
+++ b/pcb_calculator/pcb_calculator.cpp
@@ -93,7 +93,7 @@ KIFACE_I& Kiface() { return kiface; }
 // KIFACE_GETTER will not have name mangling due to declaration in kiway.h.
 MY_API( KIFACE* ) KIFACE_GETTER(  int* aKIFACEversion, int aKiwayVersion, PGM_BASE* aProgram )
 {
-    process = (PGM_BASE*) aProgram;
+    process = aProgram;
     return &kiface;
 }
 
diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt
index b690359ab..45920d9d7 100644
--- a/pcbnew/CMakeLists.txt
+++ b/pcbnew/CMakeLists.txt
@@ -377,6 +377,13 @@ if( COMPILER_SUPPORTS_WSHADOW )
 endif()
 
 
+if( COMPILER_SUPPORTS_WUSELESS_CASTS )
+    set_source_files_properties( pcbnew_wrap.cxx pcbnewPYTHON_wrap.cxx
+        PROPERTIES COMPILE_FLAGS -Wno-useless-casts
+    )
+endif()
+
+
 if( KICAD_SCRIPTING )
     set( PCBNEW_SCRIPTING_SRCS
         ${PCBNEW_SCRIPTING_DIALOGS}
diff --git a/pcbnew/board_items_to_polygon_shape_transform.cpp b/pcbnew/board_items_to_polygon_shape_transform.cpp
index 9b94f08c4..b89edf02b 100644
--- a/pcbnew/board_items_to_polygon_shape_transform.cpp
+++ b/pcbnew/board_items_to_polygon_shape_transform.cpp
@@ -1033,7 +1033,7 @@ void    CreateThermalReliefPadPolygon( SHAPE_POLY_SET& aCornerBuffer,
             {
                 corner.x = copper_thickness.x / 2;
                 corner.y = KiROUND( sqrt( ( (double) outer_radius * outer_radius ) -
-                                        ( (double) ( corner.x - delta ) * ( corner.x - deltasize ) ) ) );
+                                        ( ( corner.x - delta ) * ( corner.x - deltasize ) ) ) );
                 corner.x -= deltasize;
 
                 /* creates an intermediate point, to have a > 90 deg angle
diff --git a/pcbnew/class_dimension.cpp b/pcbnew/class_dimension.cpp
index c4f0f1643..a16de5be2 100644
--- a/pcbnew/class_dimension.cpp
+++ b/pcbnew/class_dimension.cpp
@@ -520,5 +520,5 @@ void DIMENSION::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_DIMENSION_T );
 
-    std::swap( *((DIMENSION*) this), *((DIMENSION*) aImage) );
+    std::swap( *this, *((DIMENSION*) aImage) );
 }
diff --git a/pcbnew/class_drawsegment.cpp b/pcbnew/class_drawsegment.cpp
index 462029b0d..accef5759 100644
--- a/pcbnew/class_drawsegment.cpp
+++ b/pcbnew/class_drawsegment.cpp
@@ -894,5 +894,5 @@ void DRAWSEGMENT::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_LINE_T );
 
-    std::swap( *((DRAWSEGMENT*) this), *((DRAWSEGMENT*) aImage) );
+    std::swap( *this, *((DRAWSEGMENT*) aImage) );
 }
diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp
index 327f0a8c0..984de1baa 100644
--- a/pcbnew/class_module.cpp
+++ b/pcbnew/class_module.cpp
@@ -554,7 +554,7 @@ void MODULE::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList )
     aList.push_back( MSG_PANEL_ITEM( m_Reference->GetShownText(), m_Value->GetShownText(), DARKCYAN ) );
 
     // Display last date the component was edited (useful in Module Editor).
-    wxDateTime date( static_cast<time_t>( m_LastEditTime ) );
+    wxDateTime date( m_LastEditTime );
 
     if( m_LastEditTime && date.IsValid() )
     // Date format: see http://www.cplusplus.com/reference/ctime/strftime
@@ -1488,5 +1488,5 @@ void MODULE::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_MODULE_T );
 
-    std::swap( *((MODULE*) this), *((MODULE*) aImage) );
+    std::swap( *this, *((MODULE*) aImage) );
 }
diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h
index 919886213..72051477e 100644
--- a/pcbnew/class_module.h
+++ b/pcbnew/class_module.h
@@ -535,7 +535,7 @@ public:
      *                     non-plated through holes when false.
      * @return the number of pads according to \a aIncludeNPTH.
      */
-    unsigned GetPadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH_T(INCLUDE_NPTH) ) const;
+    unsigned GetPadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH ) const;
 
     /**
      * GetUniquePadCount
@@ -549,7 +549,7 @@ public:
      *                     non-plated through holes when false.
      * @return the number of unique pads according to \a aIncludeNPTH.
      */
-    unsigned GetUniquePadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH_T(INCLUDE_NPTH) ) const;
+    unsigned GetUniquePadCount( INCLUDE_NPTH_T aIncludeNPTH = INCLUDE_NPTH ) const;
 
     /**
      * Function GetNextPadName
diff --git a/pcbnew/class_pcb_target.cpp b/pcbnew/class_pcb_target.cpp
index 69f973a79..e5ebd78a3 100644
--- a/pcbnew/class_pcb_target.cpp
+++ b/pcbnew/class_pcb_target.cpp
@@ -211,5 +211,5 @@ void PCB_TARGET::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_TARGET_T );
 
-    std::swap( *((PCB_TARGET*) this), *((PCB_TARGET*) aImage) );
+    std::swap( *this, *((PCB_TARGET*) aImage) );
 }
diff --git a/pcbnew/class_pcb_text.cpp b/pcbnew/class_pcb_text.cpp
index 21e07d7cf..2171acc86 100644
--- a/pcbnew/class_pcb_text.cpp
+++ b/pcbnew/class_pcb_text.cpp
@@ -204,5 +204,5 @@ void TEXTE_PCB::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_TEXT_T );
 
-    std::swap( *((TEXTE_PCB*) this), *((TEXTE_PCB*) aImage) );
+    std::swap( *this, *((TEXTE_PCB*) aImage) );
 }
diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp
index 54f831b3c..ecf459c05 100644
--- a/pcbnew/class_track.cpp
+++ b/pcbnew/class_track.cpp
@@ -1658,14 +1658,14 @@ void TRACK::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_TRACE_T );
 
-    std::swap( *((TRACK*) this), *((TRACK*) aImage) );
+    std::swap( *this, *((TRACK*) aImage) );
 }
 
 void VIA::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_VIA_T );
 
-    std::swap( *((VIA*) this), *((VIA*) aImage) );
+    std::swap( *this, *((VIA*) aImage) );
 }
 
 #if defined(DEBUG)
diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h
index bf0751e16..1cb71236f 100644
--- a/pcbnew/class_track.h
+++ b/pcbnew/class_track.h
@@ -531,7 +531,7 @@ inline TRACK* GetFirstTrack( TRACK* aTrk, const TRACK* aStopPoint = NULL )
 
     // It could stop because of the stop point, not on a via
     if( aTrk && ( aTrk->Type() == PCB_TRACE_T ) )
-        return static_cast<TRACK*>( aTrk );
+        return aTrk;
     else
         return NULL;
 }
diff --git a/pcbnew/class_zone.cpp b/pcbnew/class_zone.cpp
index 1fd86ce2d..6287ed6f4 100644
--- a/pcbnew/class_zone.cpp
+++ b/pcbnew/class_zone.cpp
@@ -1307,7 +1307,7 @@ void ZONE_CONTAINER::SwapData( BOARD_ITEM* aImage )
 {
     assert( aImage->Type() == PCB_ZONE_AREA_T );
 
-    std::swap( *((ZONE_CONTAINER*) this), *((ZONE_CONTAINER*) aImage) );
+    std::swap( *this, *((ZONE_CONTAINER*) aImage) );
 }
 
 void ZONE_CONTAINER::CacheTriangulation()
diff --git a/pcbnew/connectivity_algo.cpp b/pcbnew/connectivity_algo.cpp
index 9d110ddbf..c6948b2e6 100644
--- a/pcbnew/connectivity_algo.cpp
+++ b/pcbnew/connectivity_algo.cpp
@@ -784,17 +784,15 @@ void CN_CONNECTIVITY_ALGO::MarkNetAsDirty( int aNet )
 
 void CN_VISITOR::checkZoneItemConnection( CN_ZONE* aZone, CN_ITEM* aItem )
 {
-    auto zoneItem = static_cast<CN_ZONE*> ( aZone );
-
-    if( zoneItem->Net() != aItem->Net() && !aItem->CanChangeNet() )
+    if( aZone->Net() != aItem->Net() && !aItem->CanChangeNet() )
         return;
 
-    if( zoneItem->ContainsPoint( aItem->GetAnchor( 0 ) ) ||
+    if( aZone->ContainsPoint( aItem->GetAnchor( 0 ) ) ||
             ( aItem->Parent()->Type() == PCB_TRACE_T &&
-              zoneItem->ContainsPoint( aItem->GetAnchor( 1 ) ) ) )
+              aZone->ContainsPoint( aItem->GetAnchor( 1 ) ) ) )
     {
         std::lock_guard<std::mutex> lock( *m_listLock );
-        CN_ITEM::Connect( zoneItem, aItem );
+        CN_ITEM::Connect( aZone, aItem );
     }
 }
 
diff --git a/pcbnew/convert_drawsegment_list_to_polygon.cpp b/pcbnew/convert_drawsegment_list_to_polygon.cpp
index 1003ddb84..c189012f5 100644
--- a/pcbnew/convert_drawsegment_list_to_polygon.cpp
+++ b/pcbnew/convert_drawsegment_list_to_polygon.cpp
@@ -189,7 +189,6 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
     // Make a working copy of aSegList, because the list is modified during calculations
     std::vector< DRAWSEGMENT* > segList = aSegList;
 
-    DRAWSEGMENT* graphic;
     wxPoint prevPt;
 
     // Find edge point with minimum x, this should be in the outer polygon
@@ -199,7 +198,7 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
 
     for( size_t i = 0; i < segList.size(); i++ )
     {
-        graphic = (DRAWSEGMENT*) segList[i];
+        auto graphic = segList[i];
 
         switch( graphic->GetShape() )
         {
@@ -273,7 +272,7 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
     // can put enough graphics together by matching endpoints to formulate a cohesive
     // polygon.
 
-    graphic = (DRAWSEGMENT*) segList[xmini];
+    auto graphic = segList[xmini];
 
     // The first DRAWSEGMENT is in 'graphic', ok to remove it from 'items'
     segList.erase( segList.begin() + xmini );
@@ -406,7 +405,7 @@ bool ConvertOutlineToPolygon( std::vector<DRAWSEGMENT*>& aSegList, SHAPE_POLY_SE
         // emit a signal layers keepout for every interior polygon left...
         int hole = aPolygons.NewHole();
 
-        graphic = (DRAWSEGMENT*) segList[0];
+        graphic = segList[0];
         segList.erase( segList.begin() );
 
         if( graphic->GetShape() == S_CIRCLE )
diff --git a/pcbnew/dialogs/dialog_display_options.cpp b/pcbnew/dialogs/dialog_display_options.cpp
index 2711f4d11..50bc77cb2 100644
--- a/pcbnew/dialogs/dialog_display_options.cpp
+++ b/pcbnew/dialogs/dialog_display_options.cpp
@@ -119,8 +119,7 @@ bool DIALOG_DISPLAY_OPTIONS::TransferDataFromWindow()
     // Apply changes to the GAL
     KIGFX::VIEW* view = m_parent->GetGalCanvas()->GetView();
     KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
-    KIGFX::PCB_RENDER_SETTINGS* settings =
-            static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
+    KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
     settings->LoadDisplayOptions( displ_opts );
     view->RecacheAllItems();
     view->MarkTargetDirty( KIGFX::TARGET_NONCACHED );
diff --git a/pcbnew/files.cpp b/pcbnew/files.cpp
index 5db8baa56..68640deef 100644
--- a/pcbnew/files.cpp
+++ b/pcbnew/files.cpp
@@ -868,8 +868,8 @@ bool PCB_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType )
                 wxGetEnv( project_env, &env_path );
 
                 wxString result( newLibPath );
-                rel_path =  result.Replace( env_path,
-                                            wxString( "$(" + project_env + ")" ) ) ? result : "" ;
+                auto result_valid = result.Replace( env_path, ( "$(" + project_env + ")" ) );
+                rel_path = result_valid ? result : "" ;
 
                 if( !rel_path.IsEmpty() )
                     newLibPath = rel_path;
diff --git a/pcbnew/footprint_info_impl.cpp b/pcbnew/footprint_info_impl.cpp
index 4d9abff17..e98ebaf5f 100644
--- a/pcbnew/footprint_info_impl.cpp
+++ b/pcbnew/footprint_info_impl.cpp
@@ -291,7 +291,7 @@ bool FOOTPRINT_LIST_IMPL::JoinWorkers()
         } ) );
     }
 
-    while( !m_cancelled && (size_t)m_count_finished.load() < total_count )
+    while( !m_cancelled && m_count_finished.load() < total_count )
     {
         if( m_progress_reporter && !m_progress_reporter->KeepRefreshing() )
             m_cancelled = true;
diff --git a/pcbnew/import_dxf/dxf2brd_items.cpp b/pcbnew/import_dxf/dxf2brd_items.cpp
index b02438630..9241b7dc4 100644
--- a/pcbnew/import_dxf/dxf2brd_items.cpp
+++ b/pcbnew/import_dxf/dxf2brd_items.cpp
@@ -395,7 +395,7 @@ void DXF2BRD_CONVERTER::addText( const DRW_Text& aData )
     textItem->SetThickness( mapWidth( aData.thickness ) );
     textItem->SetText( text );
 
-    m_newItemsList.push_back( static_cast< BOARD_ITEM* >( brdItem ) );
+    m_newItemsList.push_back( brdItem );
 }
 
 
@@ -508,7 +508,7 @@ void DXF2BRD_CONVERTER::addMText( const DRW_MText& aData )
     }
 #endif
 
-    m_newItemsList.push_back( static_cast< BOARD_ITEM* >( brdItem ) );
+    m_newItemsList.push_back( brdItem );
 }
 
 
diff --git a/pcbnew/legacy_plugin.cpp b/pcbnew/legacy_plugin.cpp
index 2876f6bfc..5f2f7dc3e 100644
--- a/pcbnew/legacy_plugin.cpp
+++ b/pcbnew/legacy_plugin.cpp
@@ -288,7 +288,7 @@ PCB_LAYER_ID LEGACY_PLUGIN::leg_layer2new( int cu_count, LAYER_NUM aLayerNum )
 
     // this is a speed critical function, be careful.
 
-    if( unsigned( old ) <= unsigned( LAYER_N_FRONT ) )
+    if( old <= unsigned( LAYER_N_FRONT ) )
     {
         if( old == LAYER_N_FRONT )
             newid = F_Cu;
diff --git a/pcbnew/pad_draw_functions.cpp b/pcbnew/pad_draw_functions.cpp
index a87dac001..9f72f93b5 100644
--- a/pcbnew/pad_draw_functions.cpp
+++ b/pcbnew/pad_draw_functions.cpp
@@ -721,7 +721,7 @@ void D_PAD::DrawShape( EDA_RECT* aClipBox, wxDC* aDC, PAD_DRAWINFO& aDrawInfo )
     if( aDrawInfo.m_Display_padnum )
     {
         int numpad_len = std::max( (int) m_name.Length(), MIN_CHAR_COUNT );
-        tsize = std::min( (int) AreaSize.y, AreaSize.x / numpad_len );
+        tsize = std::min( AreaSize.y, AreaSize.x / numpad_len );
 
         if( aDC->LogicalToDeviceXRel( tsize ) >= MIN_TEXT_SIZE ) // Not drawable when size too small.
         {
diff --git a/pcbnew/pcb_base_frame.cpp b/pcbnew/pcb_base_frame.cpp
index bf697faa0..9e317b752 100644
--- a/pcbnew/pcb_base_frame.cpp
+++ b/pcbnew/pcb_base_frame.cpp
@@ -1022,7 +1022,7 @@ void PCB_BASE_FRAME::updateZoomSelectBox()
     {
         msg = _( "Zoom " );
 
-        double level =  m_zoomLevelCoeff / (double)GetScreen()->m_ZoomList[i];
+        double level =  m_zoomLevelCoeff / GetScreen()->m_ZoomList[i];
         wxString value = wxString::Format( wxT( "%.2f" ), level );
         msg += value;
 
diff --git a/pcbnew/pcb_draw_panel_gal.cpp b/pcbnew/pcb_draw_panel_gal.cpp
index 389fed9e7..2eba01bda 100644
--- a/pcbnew/pcb_draw_panel_gal.cpp
+++ b/pcbnew/pcb_draw_panel_gal.cpp
@@ -149,7 +149,7 @@ void PCB_DRAW_PANEL_GAL::DisplayBoard( BOARD* aBoard )
     }
 
     // Load drawings
-    for( auto drawing : const_cast<BOARD*>(aBoard)->Drawings() )
+    for( auto drawing : aBoard->Drawings() )
         m_view->Add( drawing );
 
     // Load tracks
diff --git a/pcbnew/pcb_view.cpp b/pcbnew/pcb_view.cpp
index f4f913eaf..e65d802e5 100644
--- a/pcbnew/pcb_view.cpp
+++ b/pcbnew/pcb_view.cpp
@@ -103,7 +103,7 @@ void PCB_VIEW::Update( KIGFX::VIEW_ITEM* aItem )
 void PCB_VIEW::UpdateDisplayOptions( PCB_DISPLAY_OPTIONS* aOptions )
 {
     auto    painter     = static_cast<KIGFX::PCB_PAINTER*>( GetPainter() );
-    auto    settings    = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( painter->GetSettings() );
+    auto    settings    = painter->GetSettings();
 
     settings->LoadDisplayOptions( aOptions );
 }
diff --git a/pcbnew/ratsnest.cpp b/pcbnew/ratsnest.cpp
index d3d2ee1d6..783b4ec3f 100644
--- a/pcbnew/ratsnest.cpp
+++ b/pcbnew/ratsnest.cpp
@@ -211,7 +211,7 @@ void PCB_BASE_FRAME::TraceAirWiresToTargets( wxDC* aDC )
 
     GRSetDrawMode( aDC, GR_XOR );
 
-    for( int i = 0; i < std::min( (int) displ_opts->m_MaxLinksShowed, (int) targets.size() ); i++ )
+    for( int i = 0; i < std::min( displ_opts->m_MaxLinksShowed, (int) targets.size() ); i++ )
     {
         auto p = targets[i];
         GRLine( m_canvas->GetClipBox(), aDC, s_CursorPos, wxPoint( p.x, p.y ), 0, YELLOW );
diff --git a/pcbnew/router/pns_diff_pair_placer.cpp b/pcbnew/router/pns_diff_pair_placer.cpp
index 0a344ef75..85962392b 100644
--- a/pcbnew/router/pns_diff_pair_placer.cpp
+++ b/pcbnew/router/pns_diff_pair_placer.cpp
@@ -353,8 +353,8 @@ const ITEM_SET DIFF_PAIR_PLACER::Traces()
 {
       ITEM_SET t;
 
-      t.Add( const_cast<LINE*>( &m_currentTrace.PLine() ) );
-      t.Add( const_cast<LINE*>( &m_currentTrace.NLine() ) );
+      t.Add( &m_currentTrace.PLine() );
+      t.Add( &m_currentTrace.NLine() );
 
       return t;
 }
diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp
index 4e7a5d118..dcb7fa6e5 100644
--- a/pcbnew/router/pns_kicad_iface.cpp
+++ b/pcbnew/router/pns_kicad_iface.cpp
@@ -853,7 +853,7 @@ bool PNS_KICAD_IFACE::syncGraphicalItem( PNS::NODE* aWorld, DRAWSEGMENT* aItem )
     {
         case S_ARC:
         {
-            SHAPE_ARC arc( aItem->GetCenter(), aItem->GetArcStart(), (double) aItem->GetAngle() / 10.0 );
+            SHAPE_ARC arc( aItem->GetCenter(), aItem->GetArcStart(), aItem->GetAngle() / 10.0 );
 
             auto l = arc.ConvertToPolyline();
 
diff --git a/pcbnew/router/pns_line_placer.cpp b/pcbnew/router/pns_line_placer.cpp
index 705a65899..14e535937 100644
--- a/pcbnew/router/pns_line_placer.cpp
+++ b/pcbnew/router/pns_line_placer.cpp
@@ -918,7 +918,7 @@ bool LINE_PLACER::Move( const VECTOR2I& aP, ITEM* aEndItem )
     int eiDepth = -1;
 
     if( aEndItem && aEndItem->Owner() )
-        eiDepth = static_cast<NODE*>( aEndItem->Owner() )->Depth();
+        eiDepth = aEndItem->Owner()->Depth();
 
     if( m_lastNode )
     {
diff --git a/pcbnew/router/pns_meander.cpp b/pcbnew/router/pns_meander.cpp
index 8165b7139..a8b4cb4ae 100644
--- a/pcbnew/router/pns_meander.cpp
+++ b/pcbnew/router/pns_meander.cpp
@@ -209,7 +209,7 @@ SHAPE_LINE_CHAIN MEANDER_SHAPE::makeMiterShape( VECTOR2D aP, VECTOR2D aDir, bool
     {
         const int ArcSegments = Settings().m_cornerArcSegments;
 
-        double radius = (double) aDir.EuclideanNorm();
+        double radius = aDir.EuclideanNorm();
         double angleStep = M_PI / 2.0 / (double) ArcSegments;
 
         double correction = 12.0 * radius * ( 1.0 - cos( angleStep / 2.0 ) );
@@ -234,7 +234,7 @@ SHAPE_LINE_CHAIN MEANDER_SHAPE::makeMiterShape( VECTOR2D aP, VECTOR2D aDir, bool
     break;
     case MEANDER_STYLE_CHAMFER:
     {
-        double radius = (double) aDir.EuclideanNorm();
+        double radius = aDir.EuclideanNorm();
         double correction = 0;
         if( m_dual && radius > m_meanCornerRadius )
             correction = (double)(-2 * abs(m_baselineOffset)) * tan( 22.5 * M_PI / 180.0 );
diff --git a/pcbnew/router/pns_sizes_settings.cpp b/pcbnew/router/pns_sizes_settings.cpp
index 58a158b98..4b70bcfc6 100644
--- a/pcbnew/router/pns_sizes_settings.cpp
+++ b/pcbnew/router/pns_sizes_settings.cpp
@@ -52,7 +52,7 @@ int SIZES_SETTINGS::inheritTrackWidth( ITEM* aItem )
         return 0;
     }
 
-    JOINT* jt = static_cast<NODE*>( aItem->Owner() )->FindJoint( p, aItem );
+    JOINT* jt = aItem->Owner()->FindJoint( p, aItem );
 
     assert( jt != NULL );
 
diff --git a/pcbnew/router/router_tool.cpp b/pcbnew/router/router_tool.cpp
index ca0db2b7a..14a529e8c 100644
--- a/pcbnew/router/router_tool.cpp
+++ b/pcbnew/router/router_tool.cpp
@@ -1012,7 +1012,7 @@ void ROUTER_TOOL::NeighboringSegmentFilter( const VECTOR2I& aPt, GENERAL_COLLECT
     // with the reference, and on the same net.  Ignore markers.
     for( int i = 0; i < aCollector.GetCount(); i++ )
     {
-        BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aCollector[i] );
+        BOARD_ITEM* item = aCollector[i];
 
         if( item->Type() == PCB_MARKER_T )
             continue;
diff --git a/pcbnew/specctra_import_export/specctra.cpp b/pcbnew/specctra_import_export/specctra.cpp
index 7e4eb5bfc..1a78a6ff7 100644
--- a/pcbnew/specctra_import_export/specctra.cpp
+++ b/pcbnew/specctra_import_export/specctra.cpp
@@ -137,7 +137,7 @@ void SPECCTRA_DB::readCOMPnPIN( std::string* component_id, std::string* pin_id )
 
     static const char pin_def[] = "<pin_reference>::=<component_id>-<pin_id>";
 
-    if( !IsSymbol( (T) CurTok() ) )
+    if( !IsSymbol( CurTok() ) )
         Expecting( pin_def );
 
     // case for:  A12-14, i.e. no wrapping quotes.  This should be a single
@@ -2567,7 +2567,7 @@ void SPECCTRA_DB::doCLASS( CLASS* growth )
 
                     if( bracketNesting >= 1 )
                     {
-                        T     previousTok = (T) PrevTok();
+                        T     previousTok = PrevTok();
 
                         if( previousTok!=T_LEFT && previousTok!=T_circuit && tok!=T_RIGHT )
                             builder += ' ';
diff --git a/pcbnew/specctra_import_export/specctra.h b/pcbnew/specctra_import_export/specctra.h
index 1d2a60f58..dd2f847fb 100644
--- a/pcbnew/specctra_import_export/specctra.h
+++ b/pcbnew/specctra_import_export/specctra.h
@@ -1799,7 +1799,7 @@ public:
         ELEM( T_placement, aParent )
     {
         unit = 0;
-        flip_style = DSN_T( T_NONE );
+        flip_style = T_NONE;
     }
 
     ~PLACEMENT()
@@ -1833,7 +1833,7 @@ public:
         if( unit )
             unit->Format( out, nestLevel );
 
-        if( flip_style != DSN_T( T_NONE ) )
+        if( flip_style != T_NONE )
         {
             out->Print( nestLevel, "(place_control (flip_style %s))\n",
                        GetTokenText( flip_style ) );
@@ -2478,7 +2478,7 @@ public:
         ELEM( T_fromto, aParent )
     {
         rules = 0;
-        fromto_type  = DSN_T( T_NONE );
+        fromto_type  = T_NONE;
     }
     ~FROMTO()
     {
@@ -2491,7 +2491,7 @@ public:
         out->Print( nestLevel, "(%s %s %s ",
                  Name(), fromText.c_str(), toText.c_str() );
 
-        if( fromto_type != DSN_T( T_NONE ) )
+        if( fromto_type != T_NONE )
             out->Print( 0, "(type %s)", GetTokenText( fromto_type ) );
 
         if( net_id.size() )
diff --git a/pcbnew/tools/drawing_tool.cpp b/pcbnew/tools/drawing_tool.cpp
index 115485adb..93d9463b8 100644
--- a/pcbnew/tools/drawing_tool.cpp
+++ b/pcbnew/tools/drawing_tool.cpp
@@ -1089,7 +1089,7 @@ bool DRAWING_TOOL::drawSegment( int aShape, DRAWSEGMENT*& aGraphic,
                                          : new DRAWSEGMENT;
 
                         // Copy coordinates, layer, etc.
-                        *static_cast<DRAWSEGMENT*>( l ) = line45;
+                        *l = line45;
                         l->SetEnd( aGraphic->GetStart() );
 
                         BOARD_COMMIT commit( m_frame );
diff --git a/pcbnew/tools/edit_tool.cpp b/pcbnew/tools/edit_tool.cpp
index ad86f0725..e92c37e80 100644
--- a/pcbnew/tools/edit_tool.cpp
+++ b/pcbnew/tools/edit_tool.cpp
@@ -1134,7 +1134,7 @@ void EDIT_TOOL::FootprintFilter( const VECTOR2I&, GENERAL_COLLECTOR& aCollector
 {
     for( int i = aCollector.GetCount() - 1; i >= 0; i-- )
     {
-        BOARD_ITEM* item = static_cast<BOARD_ITEM*>( aCollector[i] );
+        BOARD_ITEM* item = aCollector[i];
 
         if( item->Type() != PCB_MODULE_T )
             aCollector.Remove( i );
diff --git a/pcbnew/tools/pcbnew_control.cpp b/pcbnew/tools/pcbnew_control.cpp
index 6e18bb663..8ed93d1a4 100644
--- a/pcbnew/tools/pcbnew_control.cpp
+++ b/pcbnew/tools/pcbnew_control.cpp
@@ -560,7 +560,7 @@ int PCBNEW_CONTROL::LayerAlphaDec( const TOOL_EVENT& aEvent )
         m_frame->GetGalCanvas()->GetView()->UpdateLayerColor( currentLayer );
 
         wxUpdateUIEvent dummy;
-        static_cast<PCB_BASE_FRAME*>( m_frame )->OnUpdateLayerAlpha( dummy );
+        m_frame->OnUpdateLayerAlpha( dummy );
     }
     else
         wxBell();
diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp
index 7ce4dc76f..29eb48b13 100644
--- a/pcbnew/tools/selection_tool.cpp
+++ b/pcbnew/tools/selection_tool.cpp
@@ -2117,7 +2117,7 @@ void SELECTION_TOOL::guessSelectionCandidates( GENERAL_COLLECTOR& aCollector ) c
                         if( track->GetNetCode() != via->GetNetCode() )
                             continue;
 
-                        double lenRatio = (double) ( track->GetLength() + track->GetWidth() ) /
+                        double lenRatio = ( track->GetLength() + track->GetWidth() ) /
                                           (double) via->GetWidth();
 
                         if( lenRatio > trackViaLengthRatio )
diff --git a/plugins/3d/idf/s3d_plugin_idf.cpp b/plugins/3d/idf/s3d_plugin_idf.cpp
index e45c1f3c4..fd72f301d 100644
--- a/plugins/3d/idf/s3d_plugin_idf.cpp
+++ b/plugins/3d/idf/s3d_plugin_idf.cpp
@@ -796,7 +796,7 @@ static bool makeComponents( IDF3_BOARD& brd, SGNODE* aParent )
             tY += vY;
             tA += vA;
 
-            pout = (IDF3_COMP_OUTLINE*)((*so)->GetOutline());
+            pout = (*so)->GetOutline();
 
             if( NULL == pout  )
             {
diff --git a/polygon/clipper.cpp b/polygon/clipper.cpp
index 448aff485..3a45cc5f1 100644
--- a/polygon/clipper.cpp
+++ b/polygon/clipper.cpp
@@ -387,11 +387,11 @@ public:
 
         if( hi < 0 )
         {
-            if( lo == 0 ) return (double) hi * shift64;
-            else return -(double) (~lo + ~hi * shift64);
+            if( lo == 0 ) return hi * shift64;
+            else return -(~lo + ~hi * shift64);
         }
         else
-            return (double) (lo + hi * shift64);
+            return (lo + hi * shift64);
     }
 };
 // ------------------------------------------------------------------------------
@@ -5221,7 +5221,7 @@ void ClipperOffset::DoOffset( double delta )
         if( node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon )
             m_normals.push_back( GetUnitNormal( m_srcPoly[len - 1], m_srcPoly[0] ) );
         else
-            m_normals.push_back( DoublePoint( m_normals[len - 2] ) );
+            m_normals.push_back( m_normals[len - 2] );
 
         if( node.m_endtype == etClosedPolygon )
         {
@@ -5267,11 +5267,11 @@ void ClipperOffset::DoOffset( double delta )
             if( node.m_endtype == etOpenButt )
             {
                 int j = len - 1;
-                pt1 = IntPoint( (cInt) Round( m_srcPoly[j].X + m_normals[j].X *
-                                delta ), (cInt) Round( m_srcPoly[j].Y + m_normals[j].Y * delta ) );
+                pt1 = IntPoint( Round( m_srcPoly[j].X + m_normals[j].X * delta ),
+                                Round( m_srcPoly[j].Y + m_normals[j].Y * delta ) );
                 m_destPoly.push_back( pt1 );
-                pt1 = IntPoint( (cInt) Round( m_srcPoly[j].X - m_normals[j].X *
-                                delta ), (cInt) Round( m_srcPoly[j].Y - m_normals[j].Y * delta ) );
+                pt1 = IntPoint( Round( m_srcPoly[j].X - m_normals[j].X * delta ),
+                                Round( m_srcPoly[j].Y - m_normals[j].Y * delta ) );
                 m_destPoly.push_back( pt1 );
             }
             else
@@ -5300,11 +5300,11 @@ void ClipperOffset::DoOffset( double delta )
 
             if( node.m_endtype == etOpenButt )
             {
-                pt1 = IntPoint( (cInt) Round( m_srcPoly[0].X - m_normals[0].X * delta ),
-                        (cInt) Round( m_srcPoly[0].Y - m_normals[0].Y * delta ) );
+                pt1 = IntPoint( Round( m_srcPoly[0].X - m_normals[0].X * delta ),
+                                Round( m_srcPoly[0].Y - m_normals[0].Y * delta ) );
                 m_destPoly.push_back( pt1 );
-                pt1 = IntPoint( (cInt) Round( m_srcPoly[0].X + m_normals[0].X * delta ),
-                        (cInt) Round( m_srcPoly[0].Y + m_normals[0].Y * delta ) );
+                pt1 = IntPoint( Round( m_srcPoly[0].X + m_normals[0].X * delta ),
+                                Round( m_srcPoly[0].Y + m_normals[0].Y * delta ) );
                 m_destPoly.push_back( pt1 );
             }
             else
diff --git a/potrace/trace.cpp b/potrace/trace.cpp
index e1168e7e1..8bbab85fe 100644
--- a/potrace/trace.cpp
+++ b/potrace/trace.cpp
@@ -132,9 +132,9 @@ static void pointslope( privpath_t* pp, int i, int j, dpoint_t* ctr, dpoint_t* d
     ctr->x  = x / k;
     ctr->y  = y / k;
 
-    a = ( x2 - (double) x * x / k ) / k;
-    b = ( xy - (double) x * y / k ) / k;
-    c = ( y2 - (double) y * y / k ) / k;
+    a = ( x2 - x * x / k ) / k;
+    b = ( xy - x * y / k ) / k;
+    c = ( y2 - y * y / k ) / k;
 
     lambda2 = ( a + c + sqrt( ( a - c ) * ( a - c ) + 4 * b * b ) ) / 2;    /* larger e.value */
 
diff --git a/utils/idftools/idf2vrml.cpp b/utils/idftools/idf2vrml.cpp
index 4eb34c6d1..0eaa95e5d 100644
--- a/utils/idftools/idf2vrml.cpp
+++ b/utils/idftools/idf2vrml.cpp
@@ -758,7 +758,7 @@ bool MakeComponents( IDF3_BOARD& board, std::ostream& file, bool compact )
             tY += vY;
             tA += vA;
 
-            if( ( pout = (IDF3_COMP_OUTLINE*)((*so)->GetOutline()) ) )
+            if( ( pout = (*so)->GetOutline() ) )
             {
                 vcp = GetColor( cmap, cidx, pout->GetUID() );
             }
@@ -825,7 +825,7 @@ bool MakeComponents( IDF3_BOARD& board, std::ostream& file, bool compact )
                 bot *= scale;
             }
 
-            vcp = GetColor( cmap, cidx, ((IDF3_COMP_OUTLINE*)((*so)->GetOutline()))->GetUID() );
+            vcp = GetColor( cmap, cidx, (*so)->GetOutline()->GetUID() );
             vcp->bottom = bottom;
 
             // note: this can happen because IDF allows some negative heights/thicknesses

References