diff --git a/src/substitution.cc b/src/substitution.cc index 33f316ccc8..6462d8016b 100644 --- a/src/substitution.cc +++ b/src/substitution.cc @@ -48,10 +48,21 @@ void Substitution::Validate() const { SCRAM_THROW( ValidityError("Substitution hypothesis formula cannot be nested.")); } - if (source_.empty()) { + if (source_.empty()) { // Declarative. const bool* constant = boost::get(&target_); if (constant && *constant) SCRAM_THROW(ValidityError("Substitution has no effect.")); + } else { // Non-declarative. + switch (hypothesis_->type()) { + case kNull: + case kAnd: + case kOr: + break; + default: + SCRAM_THROW( + ValidityError("Non-declarative substitution hypotheses only allow " + "AND/OR/NULL connectives.")); + } } } diff --git a/tests/initializer_tests.cc b/tests/initializer_tests.cc index 2d547ba42d..9e743af87a 100644 --- a/tests/initializer_tests.cc +++ b/tests/initializer_tests.cc @@ -371,7 +371,8 @@ TEST(InitializerTest, IncorrectModelInputs) { "substitution_nested_formula.xml", "substitution_non_basic_event_formula.xml", "substitution_type_mismatch.xml", - "substitution_no_effect.xml" + "substitution_no_effect.xml", + "substitution_nondeclarative_complex.xml" }; for (const auto& input : incorrect_inputs) { diff --git a/tests/input/model/substitution_nondeclarative_complex.xml b/tests/input/model/substitution_nondeclarative_complex.xml new file mode 100644 index 0000000000..4f249df556 --- /dev/null +++ b/tests/input/model/substitution_nondeclarative_complex.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + +