diff --git a/modcc/expression.cpp b/modcc/expression.cpp
index 2fcf79e32d5337f1a6b6e913dbe90d4610934dc6..dbd6ae357c363f339425f0937cc8c11dd1da0ee5 100644
--- a/modcc/expression.cpp
+++ b/modcc/expression.cpp
@@ -127,6 +127,16 @@ expression_ptr DerivativeExpression::clone() const {
     return make_expression<DerivativeExpression>(location_, spelling_);
 }
 
+void DerivativeExpression::semantic(scope_ptr scp) {
+    IdentifierExpression::semantic(scp);
+    auto v = symbol_->is_variable();
+    if (!v || !v->is_state()) {
+        error( pprintf("the variable '%' must be a state variable to be differentiated",
+                        yellow(spelling_), location_));
+        return;
+    }
+}
+
 /*******************************************************************************
   NumberExpression
 ********************************************************************************/
diff --git a/modcc/expression.hpp b/modcc/expression.hpp
index 84eb7d09f86e786bc2646f4c96993cb2a9a2564b..704f361859ab2094d23b3f0e62bd4819f3aba758 100644
--- a/modcc/expression.hpp
+++ b/modcc/expression.hpp
@@ -315,6 +315,8 @@ public:
 
     expression_ptr clone() const override;
 
+    void semantic(scope_ptr scp) override;
+
     DerivativeExpression* is_derivative() override { return this; }
 
     ~DerivativeExpression() {}