private void CheckMoveStructLiteral(Core.InstructionMoveLiteralStruct inst) { for (var i = 0; i < inst.fieldSources.Length; i++) { if (!TypeResolver.ValidateDataAccess(this.session, this.funct, inst.fieldSources[i])) { this.foundErrors = true; return; } var fieldDestType = TypeResolver.GetFieldType(this.session, Core.TypeStruct.Of(inst.structIndex), i); var fieldSrcType = TypeResolver.GetDataAccessType(this.session, this.funct, inst.fieldSources[i]); if (!fieldSrcType.IsConvertibleTo(fieldDestType) && ShouldDiagnose(fieldSrcType)) { this.foundErrors = true; this.session.AddMessage( Diagnostics.MessageKind.Error, Diagnostics.MessageCode.IncompatibleTypes, "moving '" + fieldSrcType.GetString(this.session) + "' " + "into '" + fieldDestType.GetString(this.session) + "' field", inst.fieldSources[i].span, inst.fieldDestSpans[i]); } } var destType = TypeResolver.GetDataAccessType(this.session, this.funct, inst.destination); CheckMove(inst.destination, Core.TypeStruct.Of(inst.structIndex), inst.span); }
private void CheckMoveStructLiteral(List <InitStatus> statusList, Core.InstructionMoveLiteralStruct inst) { for (var i = 0; i < inst.fieldSources.Length; i++) { ValidateSource(statusList, inst.fieldSources[i]); } CheckAndInitDestination(statusList, inst.destination); }
private void ApplyRuleForMoveStructLiteral(ref bool appliedRule, Core.InstructionMoveLiteralStruct inst) { var destType = TypeResolver.GetDataAccessType(session, funct, inst.destination); var srcStruct = Core.TypeStruct.Of(inst.structIndex); var srcType = (Core.Type)srcStruct; var inferredDest = TypeInferencer.Try(session, srcType, ref destType); if (inferredDest) { appliedRule = ApplyToDataAccess(inst.destination, destType); } }