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() {}