From 8a234f06dd73bf1725be11457fefeee9752aad28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=96stlund?= Date: Thu, 25 Oct 2018 14:49:00 +0200 Subject: [PATCH] [NF] Allow invalid bindings on deleted components. Belonging to [master]: - OpenModelica/OMCompiler#2741 - OpenModelica/OpenModelica-testsuite#1062 --- Compiler/NFFrontEnd/NFBinding.mo | 13 ++++++++++ Compiler/NFFrontEnd/NFFlatten.mo | 6 +++++ Compiler/NFFrontEnd/NFTyping.mo | 42 ++++++++++++++++++++------------ 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/Compiler/NFFrontEnd/NFBinding.mo b/Compiler/NFFrontEnd/NFBinding.mo index 34d2dc99e8..59a788e112 100644 --- a/Compiler/NFFrontEnd/NFBinding.mo +++ b/Compiler/NFFrontEnd/NFBinding.mo @@ -37,6 +37,7 @@ public import SCode; import Type = NFType; import NFPrefixes.Variability; + import Error; protected import Dump; @@ -94,6 +95,10 @@ uniontype Binding list parents; end CEVAL_BINDING; + record INVALID_BINDING + Binding binding; + list errors; + end INVALID_BINDING; public function fromAbsyn @@ -449,6 +454,9 @@ public case RAW_BINDING() then prefix + Dump.printExpStr(binding.bindingExp); case UNTYPED_BINDING() then prefix + Expression.toString(binding.bindingExp); case TYPED_BINDING() then prefix + Expression.toString(binding.bindingExp); + case FLAT_BINDING() then prefix + Expression.toString(binding.bindingExp); + case CEVAL_BINDING() then prefix + Expression.toString(binding.bindingExp); + case INVALID_BINDING() then toString(binding.binding, prefix); end match; end toString; @@ -483,6 +491,11 @@ public case TYPED_BINDING() then makeDAEBinding(binding.bindingExp, binding.variability); case FLAT_BINDING() then makeDAEBinding(binding.bindingExp, binding.variability); case CEVAL_BINDING() then DAE.UNBOUND(); + case INVALID_BINDING() + algorithm + Error.addTotalMessages(binding.errors); + then + fail(); else algorithm Error.assertion(false, getInstanceName() + " got untyped binding", sourceInfo()); diff --git a/Compiler/NFFrontEnd/NFFlatten.mo b/Compiler/NFFrontEnd/NFFlatten.mo index ad8cc06568..2ab3e4a2b3 100644 --- a/Compiler/NFFrontEnd/NFFlatten.mo +++ b/Compiler/NFFrontEnd/NFFlatten.mo @@ -796,6 +796,12 @@ algorithm // evaluation and no longer needed after flattening. case Binding.CEVAL_BINDING() then NFBinding.EMPTY_BINDING; + case Binding.INVALID_BINDING() + algorithm + Error.addTotalMessages(binding.errors); + then + fail(); + else algorithm Error.assertion(false, getInstanceName() + " got untyped binding.", sourceInfo()); diff --git a/Compiler/NFFrontEnd/NFTyping.mo b/Compiler/NFFrontEnd/NFTyping.mo index 6b6642895d..96efa3a15d 100644 --- a/Compiler/NFFrontEnd/NFTyping.mo +++ b/Compiler/NFFrontEnd/NFTyping.mo @@ -752,21 +752,33 @@ algorithm case Component.TYPED_COMPONENT(binding = Binding.UNTYPED_BINDING()) algorithm name := InstNode.name(component); - checkBindingEach(c.binding); - binding := typeBinding(c.binding, intBitOr(origin, ExpOrigin.BINDING)); - - binding := TypeCheck.matchBinding(binding, c.ty, name, node); - comp_var := Component.variability(c); - comp_eff_var := Prefixes.effectiveVariability(comp_var); - bind_var := Prefixes.effectiveVariability(Binding.variability(binding)); - - if bind_var > comp_eff_var and intBitAnd(origin, ExpOrigin.FUNCTION) == 0 then - Error.addSourceMessage(Error.HIGHER_VARIABILITY_BINDING, { - name, Prefixes.variabilityString(comp_eff_var), - "'" + Binding.toString(c.binding) + "'", Prefixes.variabilityString(bind_var)}, - Binding.getInfo(binding)); - fail(); - end if; + binding := c.binding; + + ErrorExt.setCheckpoint(getInstanceName()); + try + checkBindingEach(c.binding); + binding := typeBinding(binding, intBitOr(origin, ExpOrigin.BINDING)); + + binding := TypeCheck.matchBinding(binding, c.ty, name, node); + comp_var := Component.variability(c); + comp_eff_var := Prefixes.effectiveVariability(comp_var); + bind_var := Prefixes.effectiveVariability(Binding.variability(binding)); + + if bind_var > comp_eff_var and intBitAnd(origin, ExpOrigin.FUNCTION) == 0 then + Error.addSourceMessage(Error.HIGHER_VARIABILITY_BINDING, { + name, Prefixes.variabilityString(comp_eff_var), + "'" + Binding.toString(c.binding) + "'", Prefixes.variabilityString(bind_var)}, + Binding.getInfo(binding)); + fail(); + end if; + else + if Binding.isBound(c.condition) then + binding := Binding.INVALID_BINDING(binding, ErrorExt.getMessages()); + else + fail(); + end if; + end try; + ErrorExt.delCheckpoint(getInstanceName()); c.binding := binding;