private BoogieAssumeCmd GenerateDynamicTypeAssumes(ContractDefinition contract) { BoogieExpr assumeLhs = new BoogieMapSelect(new BoogieIdentifierExpr("DType"), new BoogieIdentifierExpr("this")); List <ContractDefinition> subtypes = new List <ContractDefinition>(context.GetSubTypesOfContract(contract)); Debug.Assert(subtypes.Count > 0); BoogieExpr assumeExpr0 = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs, new BoogieIdentifierExpr(subtypes[0].Name)); var assumeExpr = assumeExpr0; for (int i = 1; i < subtypes.Count; ++i) { BoogieExpr rhs = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs, new BoogieIdentifierExpr(subtypes[i].Name)); assumeExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, assumeExpr, rhs); } if (context.TranslateFlags.OmitAssumeFalseForDynDispatch) { return(new BoogieAssumeCmd(new BoogieLiteralExpr(true))); //assumeExpr0); } return(new BoogieAssumeCmd(assumeExpr)); }
private BoogieAssumeCmd GenerateDynamicTypeAssumes(ContractDefinition contract) { BoogieExpr assumeLhs = new BoogieMapSelect(new BoogieIdentifierExpr("DType"), new BoogieIdentifierExpr("this")); List <ContractDefinition> subtypes = new List <ContractDefinition>(context.GetSubTypesOfContract(contract)); Debug.Assert(subtypes.Count > 0); BoogieExpr assumeExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs, new BoogieIdentifierExpr(subtypes[0].Name)); for (int i = 1; i < subtypes.Count; ++i) { BoogieExpr rhs = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, assumeLhs, new BoogieIdentifierExpr(subtypes[i].Name)); assumeExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, assumeExpr, rhs); } return(new BoogieAssumeCmd(assumeExpr)); }