diff --git a/OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo b/OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo index 1736b02646..006a93c4f7 100644 --- a/OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo +++ b/OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo @@ -620,7 +620,7 @@ algorithm then ComponentType.RECORD; case Type.COMPLEX() then ComponentType.COMPLEX; case Type.ARRAY() then getComponentType(ty.elementType, settings); - else ComponentType.NORMAL; + else ComponentType.NORMAL; end match; end getComponentType; @@ -669,7 +669,8 @@ algorithm // variability, and scalarization is enabled, move the binding into an equation. // This avoids having to scalarize the binding. if not settings.nfAPI and settings.scalarize then - if Type.isArray(ty) and Binding.isBound(binding) and var >= Variability.DISCRETE then + if var >= Variability.DISCRETE and Type.isArray(ty) and + not Type.isExternalObject(Type.arrayElementType(ty)) and Binding.isBound(binding) then name := ComponentRef.prefixCref(comp_node, ty, {}, Prefix.prefix(prefix)); eq := Equation.ARRAY_EQUALITY(Expression.CREF(ty, name), Binding.getTypedExp(binding), ty, InstNode.EMPTY_NODE(), ElementSource.createElementSource(info)); diff --git a/testsuite/flattening/modelica/scodeinst/ExternalObject6.mo b/testsuite/flattening/modelica/scodeinst/ExternalObject6.mo new file mode 100644 index 0000000000..76768d89f9 --- /dev/null +++ b/testsuite/flattening/modelica/scodeinst/ExternalObject6.mo @@ -0,0 +1,45 @@ +// name: ExternalObject6 +// keywords: +// status: correct +// cflags: -d=newInst +// +// + +model ExternalObject6 + class EO + extends ExternalObject; + + function constructor + output EO e; + external "C" e = init(); + end constructor; + + function destructor + input EO e; + external "C" deinit(e); + end destructor; + end EO; + + parameter Integer N = 2; + EO e[N] = {EO() for i in 1:N}; +end ExternalObject6; + +// Result: +// impure function ExternalObject6.EO.constructor +// output ExternalObject6.EO e; +// +// external "C" e = init(); +// end ExternalObject6.EO.constructor; +// +// impure function ExternalObject6.EO.destructor +// input ExternalObject6.EO e; +// +// external "C" deinit(e); +// end ExternalObject6.EO.destructor; +// +// class ExternalObject6 +// final parameter Integer N = 2; +// ExternalObject6.EO e[1] = ExternalObject6.EO.constructor(); +// ExternalObject6.EO e[2] = ExternalObject6.EO.constructor(); +// end ExternalObject6; +// endResult diff --git a/testsuite/flattening/modelica/scodeinst/Makefile b/testsuite/flattening/modelica/scodeinst/Makefile index 82efab78aa..c5cf2c4f9d 100644 --- a/testsuite/flattening/modelica/scodeinst/Makefile +++ b/testsuite/flattening/modelica/scodeinst/Makefile @@ -504,6 +504,7 @@ ExternalObject2.mo \ ExternalObject3.mo \ ExternalObject4.mo \ ExternalObject5.mo \ +ExternalObject6.mo \ ExternalObjectInvalidElement1.mo \ ExternalObjectInvalidStructor1.mo \ ExternalObjectMissingStructor1.mo \