Skip to content

Commit

Permalink
Don't move external object bindings to equations (#12185)
Browse files Browse the repository at this point in the history
Fixes #12161
  • Loading branch information
perost committed Apr 3, 2024
1 parent 0f1ee9a commit cf069db
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
5 changes: 3 additions & 2 deletions OMCompiler/Compiler/NFFrontEnd/NFFlatten.mo
Expand Up @@ -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;

Expand Down Expand Up @@ -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));
Expand Down
45 changes: 45 additions & 0 deletions 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
1 change: 1 addition & 0 deletions testsuite/flattening/modelica/scodeinst/Makefile
Expand Up @@ -504,6 +504,7 @@ ExternalObject2.mo \
ExternalObject3.mo \
ExternalObject4.mo \
ExternalObject5.mo \
ExternalObject6.mo \
ExternalObjectInvalidElement1.mo \
ExternalObjectInvalidStructor1.mo \
ExternalObjectMissingStructor1.mo \
Expand Down

0 comments on commit cf069db

Please sign in to comment.