Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }