Begin addressing clang warnings on windows

Diffs=
d8fcaec01 Begin addressing clang warnings on windows
diff --git a/.rive_head b/.rive_head
index 5fbc7e8..84fc2dd 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-7003092f363cde9c61c4ad30d8cccbfe58bba73d
+d8fcaec0186f40bd93b19dbc310915d0c616fc23
diff --git a/build/premake5.lua b/build/premake5.lua
index cf92cf3..dcd92fd 100644
--- a/build/premake5.lua
+++ b/build/premake5.lua
@@ -4,55 +4,23 @@
 WINDOWS_CLANG_CL_SUPPRESSED_WARNINGS = {
     "-Wno-c++98-compat",
     "-Wno-c++98-compat-pedantic",
-    "-Wno-reserved-macro-identifier",
-    "-Wno-newline-eof",
-    "-Wno-old-style-cast",
-    "-Wno-unused-parameter",
-    "-Wno-float-equal",
-    "-Wno-implicit-float-conversion",
-    "-Wno-shadow",
-    "-Wno-sign-conversion",
-    "-Wno-inconsistent-missing-destructor-override",
-    "-Wno-nested-anon-types",
-    "-Wno-suggest-destructor-override",
-    "-Wno-non-virtual-dtor",
-    "-Wno-unknown-argument",
-    "-Wno-gnu-anonymous-struct",
-    "-Wno-extra-semi",
-    "-Wno-cast-qual",
-    "-Wno-ignored-qualifiers",
-    "-Wno-double-promotion",
-    "-Wno-tautological-unsigned-zero-compare",
-    "-Wno-unreachable-code-break",
-    "-Wno-global-constructors",
-    "-Wno-switch-enum",
-    "-Wno-shorten-64-to-32",
-    "-Wno-missing-prototypes",
-    "-Wno-implicit-int-conversion",
-    "-Wno-unused-macros",
     "-Wno-deprecated-copy-with-user-provided-dtor",
-    "-Wno-missing-variable-declarations",
-    "-Wno-ctad-maybe-unsupported",
-    "-Wno-vla-extension",
-    "-Wno-float-conversion",
-    "-Wno-gnu-zero-variadic-macro-arguments",
-    "-Wno-undef",
     "-Wno-documentation",
     "-Wno-documentation-pedantic",
     "-Wno-documentation-unknown-command",
-    "-Wno-suggest-override",
-    "-Wno-unused-exception-parameter",
-    "-Wno-cast-align",
-    "-Wno-deprecated-declarations",
-    "-Wno-shadow-field",
-    "-Wno-nonportable-system-include-path",
-    "-Wno-reserved-identifier",
-    "-Wno-thread-safety-negative",
+    "-Wno-double-promotion",
     "-Wno-exit-time-destructors",
-    "-Wno-unreachable-code",
-    "-Wno-zero-as-null-pointer-constant",
-    "-Wno-pedantic",
+    "-Wno-float-equal",
+    "-Wno-global-constructors",
+    "-Wno-implicit-float-conversion",
+    "-Wno-newline-eof",
+    "-Wno-old-style-cast",
+    "-Wno-reserved-identifier",
+    "-Wno-shadow",
     "-Wno-sign-compare",
+    "-Wno-sign-conversion",
+    "-Wno-unused-macros",
+    "-Wno-unused-parameter",
 }
 
 project "rive"
@@ -89,9 +57,14 @@
     filter "system:windows"
         architecture "x64"
         defines {"_USE_MATH_DEFINES"}
+        flags { "FatalCompileWarnings" }
         buildoptions {WINDOWS_CLANG_CL_SUPPRESSED_WARNINGS}
         staticruntime "on"  -- Match Skia's /MT flag for link compatibility
         runtime "Release"  -- Use /MT even in debug (/MTd is incompatible with Skia)
+        removebuildoptions {
+            "-fno-exceptions",
+            "-fno-rtti",
+        }
 
     filter {"system:ios", "options:variant=system" }
         buildoptions {"-mios-version-min=10.0 -fembed-bitcode -arch armv7 -arch arm64 -arch arm64e -isysroot " .. (os.getenv("IOS_SYSROOT") or "")}
diff --git a/include/rive/animation/blend_state.hpp b/include/rive/animation/blend_state.hpp
index 4673d6b..67f62de 100644
--- a/include/rive/animation/blend_state.hpp
+++ b/include/rive/animation/blend_state.hpp
@@ -17,7 +17,7 @@
         void addAnimation(BlendAnimation* animation);
 
     public:
-        ~BlendState();
+        ~BlendState() override;
         inline const std::vector<BlendAnimation*>& animations() const { return m_Animations; }
 
 #ifdef TESTING
diff --git a/include/rive/animation/keyed_object.hpp b/include/rive/animation/keyed_object.hpp
index 39fab61..407b4bc 100644
--- a/include/rive/animation/keyed_object.hpp
+++ b/include/rive/animation/keyed_object.hpp
@@ -11,7 +11,7 @@
 
     public:
         KeyedObject();
-        ~KeyedObject();
+        ~KeyedObject() override;
         void addKeyedProperty(std::unique_ptr<KeyedProperty>);
 
         StatusCode onAddedDirty(CoreContext* context) override;
diff --git a/include/rive/animation/keyed_property.hpp b/include/rive/animation/keyed_property.hpp
index 29aaebd..805277b 100644
--- a/include/rive/animation/keyed_property.hpp
+++ b/include/rive/animation/keyed_property.hpp
@@ -10,7 +10,7 @@
 
     public:
         KeyedProperty();
-        ~KeyedProperty();
+        ~KeyedProperty() override;
         void addKeyFrame(std::unique_ptr<KeyFrame>);
         StatusCode onAddedClean(CoreContext* context) override;
         StatusCode onAddedDirty(CoreContext* context) override;
diff --git a/include/rive/animation/layer_state.hpp b/include/rive/animation/layer_state.hpp
index 6e9b20b..dc174de 100644
--- a/include/rive/animation/layer_state.hpp
+++ b/include/rive/animation/layer_state.hpp
@@ -20,7 +20,7 @@
         void addTransition(StateTransition* transition);
 
     public:
-        ~LayerState();
+        ~LayerState() override;
         StatusCode onAddedDirty(CoreContext* context) override;
         StatusCode onAddedClean(CoreContext* context) override;
 
diff --git a/include/rive/animation/state_machine.hpp b/include/rive/animation/state_machine.hpp
index ca6b5eb..cebef92 100644
--- a/include/rive/animation/state_machine.hpp
+++ b/include/rive/animation/state_machine.hpp
@@ -23,7 +23,7 @@
 
     public:
         StateMachine();
-        ~StateMachine();
+        ~StateMachine() override;
 
         StatusCode import(ImportStack& importStack) override;
 
diff --git a/include/rive/animation/state_machine_instance.hpp b/include/rive/animation/state_machine_instance.hpp
index a2c6a20..ea74871 100644
--- a/include/rive/animation/state_machine_instance.hpp
+++ b/include/rive/animation/state_machine_instance.hpp
@@ -65,7 +65,7 @@
         SMINumber* getNumber(const std::string& name) const override;
         SMITrigger* getTrigger(const std::string& name) const override;
 
-        const size_t currentAnimationCount() const;
+        size_t currentAnimationCount() const;
         const LinearAnimationInstance* currentAnimationByIndex(size_t index) const;
 
         // The number of state changes that occurred across all layers on the
diff --git a/include/rive/animation/state_machine_layer.hpp b/include/rive/animation/state_machine_layer.hpp
index 8de9443..e7c4d49 100644
--- a/include/rive/animation/state_machine_layer.hpp
+++ b/include/rive/animation/state_machine_layer.hpp
@@ -22,7 +22,7 @@
         void addState(LayerState* state);
 
     public:
-        ~StateMachineLayer();
+        ~StateMachineLayer() override;
         StatusCode onAddedDirty(CoreContext* context) override;
         StatusCode onAddedClean(CoreContext* context) override;
 
diff --git a/include/rive/animation/state_transition.hpp b/include/rive/animation/state_transition.hpp
index 90fa07f..57c82f5 100644
--- a/include/rive/animation/state_transition.hpp
+++ b/include/rive/animation/state_transition.hpp
@@ -31,7 +31,7 @@
         void addCondition(TransitionCondition* condition);
 
     public:
-        ~StateTransition();
+        ~StateTransition() override;
         const LayerState* stateTo() const { return m_StateTo; }
 
         StatusCode onAddedDirty(CoreContext* context) override;
diff --git a/include/rive/artboard.hpp b/include/rive/artboard.hpp
index d466c81..3aa40d9 100644
--- a/include/rive/artboard.hpp
+++ b/include/rive/artboard.hpp
@@ -64,7 +64,7 @@
 
     public:
         Artboard() {}
-        ~Artboard();
+        ~Artboard() override;
         StatusCode initialize();
 
         Core* resolve(uint32_t id) const override;
diff --git a/include/rive/assets/file_asset_referencer.hpp b/include/rive/assets/file_asset_referencer.hpp
index 7fc02d5..c7c285f 100644
--- a/include/rive/assets/file_asset_referencer.hpp
+++ b/include/rive/assets/file_asset_referencer.hpp
@@ -5,6 +5,7 @@
     class FileAsset;
     class FileAssetReferencer {
     public:
+        virtual ~FileAssetReferencer() {}
         virtual void assets(const std::vector<FileAsset*>& assets) = 0;
     };
 } // namespace rive
diff --git a/include/rive/assets/image_asset.hpp b/include/rive/assets/image_asset.hpp
index 9386fcf..4e03568 100644
--- a/include/rive/assets/image_asset.hpp
+++ b/include/rive/assets/image_asset.hpp
@@ -12,7 +12,7 @@
 
     public:
         ImageAsset() {}
-        ~ImageAsset();
+        ~ImageAsset() override;
 
 #ifdef TESTING
         std::size_t decodedByteSize = 0;
diff --git a/include/rive/bones/skin.hpp b/include/rive/bones/skin.hpp
index 1ad264d..8d947d5 100644
--- a/include/rive/bones/skin.hpp
+++ b/include/rive/bones/skin.hpp
@@ -15,7 +15,7 @@
         friend class Tendon;
 
     public:
-        ~Skin();
+        ~Skin() override;
 
     private:
         Mat2D m_WorldTransform;
diff --git a/include/rive/bones/skinnable.hpp b/include/rive/bones/skinnable.hpp
index d71aa38..136ba08 100644
--- a/include/rive/bones/skinnable.hpp
+++ b/include/rive/bones/skinnable.hpp
@@ -17,6 +17,8 @@
         void skin(Skin* skin);
 
     public:
+        virtual ~Skinnable() {}
+
         Skin* skin() const { return m_Skin; }
         virtual void markSkinDirty() = 0;
 
diff --git a/include/rive/core_context.hpp b/include/rive/core_context.hpp
index 76ed0b2..1183d2e 100644
--- a/include/rive/core_context.hpp
+++ b/include/rive/core_context.hpp
@@ -8,6 +8,7 @@
     class Core;
     class CoreContext {
     public:
+        virtual ~CoreContext() {}
         virtual Core* resolve(uint32_t id) const = 0;
     };
 } // namespace rive
diff --git a/include/rive/drawable.hpp b/include/rive/drawable.hpp
index 99fde46..783154e 100644
--- a/include/rive/drawable.hpp
+++ b/include/rive/drawable.hpp
@@ -31,7 +31,7 @@
             return m_ClippingShapes;
         }
 
-        const inline bool isHidden() const {
+        inline bool isHidden() const {
             // For now we have a single drawable flag, when we have more we can
             // make an actual enum for this.
             return (drawableFlags() & 0x1) == 0x1;
diff --git a/include/rive/file_asset_resolver.hpp b/include/rive/file_asset_resolver.hpp
index 64fdebb..1f9c86c 100644
--- a/include/rive/file_asset_resolver.hpp
+++ b/include/rive/file_asset_resolver.hpp
@@ -8,6 +8,8 @@
     class FileAsset;
     class FileAssetResolver {
     public:
+        virtual ~FileAssetResolver() {}
+
         /// Expected to be overridden to find asset contents when not provided
         /// in band.
         /// @param asset describes the asset that Rive is looking for the
diff --git a/include/rive/importers/linear_animation_importer.hpp b/include/rive/importers/linear_animation_importer.hpp
index 80cb13f..09f0ba3 100644
--- a/include/rive/importers/linear_animation_importer.hpp
+++ b/include/rive/importers/linear_animation_importer.hpp
@@ -12,7 +12,7 @@
         LinearAnimation* m_Animation;
 
     public:
-        LinearAnimation* animation() const { return m_Animation; };
+        LinearAnimation* animation() const { return m_Animation; }
         LinearAnimationImporter(LinearAnimation* animation);
         void addKeyedObject(std::unique_ptr<KeyedObject>);
     };
diff --git a/include/rive/nested_artboard.hpp b/include/rive/nested_artboard.hpp
index 1025d7f..6eeffac 100644
--- a/include/rive/nested_artboard.hpp
+++ b/include/rive/nested_artboard.hpp
@@ -18,7 +18,7 @@
 
     public:
         NestedArtboard();
-        ~NestedArtboard();
+        ~NestedArtboard() override;
         StatusCode onAddedClean(CoreContext* context) override;
         void draw(Renderer* renderer) override;
         Core* hitTest(HitInfo*, const Mat2D&) override;
diff --git a/include/rive/shapes/paint/shape_paint_mutator.hpp b/include/rive/shapes/paint/shape_paint_mutator.hpp
index dea8ae5..7cabfab 100644
--- a/include/rive/shapes/paint/shape_paint_mutator.hpp
+++ b/include/rive/shapes/paint/shape_paint_mutator.hpp
@@ -22,6 +22,8 @@
         virtual bool internalIsTranslucent() const = 0;
 
     public:
+        virtual ~ShapePaintMutator() {}
+
         float renderOpacity() const { return m_RenderOpacity; }
         void renderOpacity(float value);
 
diff --git a/include/rive/shapes/paint/stroke_effect.hpp b/include/rive/shapes/paint/stroke_effect.hpp
index 1db1423..368f4a9 100644
--- a/include/rive/shapes/paint/stroke_effect.hpp
+++ b/include/rive/shapes/paint/stroke_effect.hpp
@@ -10,6 +10,7 @@
 
     class StrokeEffect {
     public:
+        virtual ~StrokeEffect() {}
         virtual RenderPath* effectPath(MetricsPath* source, Factory*) = 0;
         virtual void invalidateEffect() = 0;
     };
diff --git a/include/rive/shapes/polygon.hpp b/include/rive/shapes/polygon.hpp
index 97012bd..41b9a9d 100644
--- a/include/rive/shapes/polygon.hpp
+++ b/include/rive/shapes/polygon.hpp
@@ -11,7 +11,7 @@
 
     public:
         Polygon();
-        ~Polygon();
+        ~Polygon() override;
         void update(ComponentDirt value) override;
 
     protected:
diff --git a/include/rive/shapes/shape.hpp b/include/rive/shapes/shape.hpp
index 8caf7f8..1ffdc40 100644
--- a/include/rive/shapes/shape.hpp
+++ b/include/rive/shapes/shape.hpp
@@ -33,7 +33,8 @@
         Core* hitTest(HitInfo*, const Mat2D&) override;
         bool hitTest(const IAABB& area) const;
 
-        PathComposer* pathComposer() const { return (PathComposer*)&m_PathComposer; }
+        const PathComposer* pathComposer() const { return &m_PathComposer; }
+        PathComposer* pathComposer() { return &m_PathComposer; }
 
         void pathChanged();
         void addDefaultPathSpace(PathSpace space);
diff --git a/include/rive/shapes/shape_paint_container.hpp b/include/rive/shapes/shape_paint_container.hpp
index b9ca453..0404f3f 100644
--- a/include/rive/shapes/shape_paint_container.hpp
+++ b/include/rive/shapes/shape_paint_container.hpp
@@ -27,6 +27,8 @@
     public:
         static ShapePaintContainer* from(Component* component);
 
+        virtual ~ShapePaintContainer() {}
+
         PathSpace pathSpace() const;
 
         void invalidateStrokeEffects();
diff --git a/src/animation/state_machine_instance.cpp b/src/animation/state_machine_instance.cpp
index a956b8c..56ca5a5 100644
--- a/src/animation/state_machine_instance.cpp
+++ b/src/animation/state_machine_instance.cpp
@@ -306,7 +306,8 @@
                     case ListenerType::move:
                         nestedStateMachine->pointerMove(nestedPosition);
                         break;
-                    default:
+                    case ListenerType::enter:
+                    case ListenerType::exit:
                         break;
                 }
             }
@@ -480,7 +481,7 @@
     return nullptr;
 }
 
-const size_t StateMachineInstance::currentAnimationCount() const {
+size_t StateMachineInstance::currentAnimationCount() const {
     size_t count = 0;
     for (size_t i = 0; i < m_LayerCount; i++) {
         if (m_Layers[i].currentAnimation() != nullptr) {
diff --git a/src/bones/skinnable.cpp b/src/bones/skinnable.cpp
index 781267b..5725944 100644
--- a/src/bones/skinnable.cpp
+++ b/src/bones/skinnable.cpp
@@ -8,10 +8,8 @@
     switch (component->coreType()) {
         case PointsPath::typeKey:
             return component->as<PointsPath>();
-            break;
         case Mesh::typeKey:
             return component->as<Mesh>();
-            break;
     }
     return nullptr;
 }
diff --git a/src/constraints/distance_constraint.cpp b/src/constraints/distance_constraint.cpp
index a4fb340..0248d9a 100644
--- a/src/constraints/distance_constraint.cpp
+++ b/src/constraints/distance_constraint.cpp
@@ -29,7 +29,7 @@
                 return;
             }
             break;
-        default:
+        case Mode::Exact:
             break;
     }
     if (currentDistance < 0.001f) {
diff --git a/src/shapes/points_path.cpp b/src/shapes/points_path.cpp
index dcdc0a5..a902f5a 100644
--- a/src/shapes/points_path.cpp
+++ b/src/shapes/points_path.cpp
@@ -6,7 +6,6 @@
 
 using namespace rive;
 
-Mat2D identity;
 void PointsPath::buildDependencies() {
     Super::buildDependencies();
     if (skin() != nullptr) {
@@ -16,6 +15,7 @@
 
 const Mat2D& PointsPath::pathTransform() const {
     if (skin() != nullptr) {
+        static Mat2D identity;
         return identity;
     }
     return worldTransform();
diff --git a/src/shapes/shape_paint_container.cpp b/src/shapes/shape_paint_container.cpp
index 8dd83da..f421fbf 100644
--- a/src/shapes/shape_paint_container.cpp
+++ b/src/shapes/shape_paint_container.cpp
@@ -14,10 +14,8 @@
     switch (component->coreType()) {
         case Artboard::typeKey:
             return component->as<Artboard>();
-            break;
         case Shape::typeKey:
             return component->as<Shape>();
-            break;
     }
     return nullptr;
 }