PLCgen crashes on compatible enum values being used in assignments
The following CIF model:
enum A = B, C, D;
group g:
enum E = B, C, D;
end
uncontrollable u;
plant p:
disc A v;
location:
initial;
edge u do v := g.B;
end
Crashes PLCgen, when using default settings. Note that with default settings, we generate PLCopen XML, but the same holds for all targets that support enums (they are thus not eliminated to constants like we do for S7). The crash is:
java.lang.AssertionError: Values are not equal: 'PlcEnumType("A")' and 'PlcEnumType("g_E")'
at org.eclipse.escet.common.java.Assert.areEqual(Assert.java:70)
at org.eclipse.escet.cif.plcgen.model.statements.PlcAssignmentStatement.<init>(PlcAssignmentStatement.java:49)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.genAssignExpr(DefaultTransitionGenerator.java:1573)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.genUpdateAssignment(DefaultTransitionGenerator.java:1452)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generateUpdates(DefaultTransitionGenerator.java:1394)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generateEdgeUpdates(DefaultTransitionGenerator.java:1376)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generateEdgeUpdates(DefaultTransitionGenerator.java:1329)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.lambda$8(DefaultTransitionGenerator.java:1304)
at org.eclipse.escet.cif.plcgen.conversion.expressions.ExprGenerator.addPlcBranch(ExprGenerator.java:861)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generateSelectedEdgePerformCode(DefaultTransitionGenerator.java:1311)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generateSyncCode(DefaultTransitionGenerator.java:878)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generateEventTransitionCode(DefaultTransitionGenerator.java:467)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generateCode(DefaultTransitionGenerator.java:289)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.lambda$3(DefaultTransitionGenerator.java:191)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575)
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616)
at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622)
at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627)
at org.eclipse.escet.cif.plcgen.generators.DefaultTransitionGenerator.generate(DefaultTransitionGenerator.java:191)
at org.eclipse.escet.cif.plcgen.targets.PlcBaseTarget.generateTransCode(PlcBaseTarget.java:320)
at org.eclipse.escet.cif.plcgen.targets.PlcBaseTarget.generate(PlcBaseTarget.java:285)
at org.eclipse.escet.cif.plcgen.CifPlcGenApp.runInternal(CifPlcGenApp.java:167)
at org.eclipse.escet.common.app.framework.Application.runApplication(Application.java:315)
at org.eclipse.escet.common.app.framework.Application.run(Application.java:180)
at org.eclipse.escet.common.eclipse.ui.BaseFileCommandHandler.run(BaseFileCommandHandler.java:261)
at org.eclipse.escet.common.eclipse.ui.BaseFileCommandHandler$1.run(BaseFileCommandHandler.java:102)
at java.base/java.lang.Thread.run(Thread.java:840)
It seems we completely lost the support for compatible enums, by handling representatives.
I encountered this while checking if we can generate TwinCAT code for the self-certification test set.
Addresses #679