示例#1
0
        /// <returns>True if a diagnostic was reported</returns>
        internal bool ReportUnsafeIfNotAllowed(Location location, ref HashSet <DiagnosticInfo> useSiteDiagnostics, TypeSymbol sizeOfTypeOpt = null)
        {
            var diagnosticInfo = GetUnsafeDiagnosticInfo(sizeOfTypeOpt: sizeOfTypeOpt);

            if (diagnosticInfo is null)
            {
                return(false);
            }

            HashSetExtensions.InitializeAndAdd(ref useSiteDiagnostics, diagnosticInfo);
            return(true);
        }
示例#2
0
        public override Conversion GetStackAllocConversion(BoundStackAllocArrayCreation sourceExpression, TypeSymbol destination, ref HashSet <DiagnosticInfo> useSiteDiagnostics)
        {
            if (sourceExpression.Syntax.IsVariableDeclarationInitialization())
            {
                Debug.Assert((object)sourceExpression.Type == null);
                Debug.Assert(sourceExpression.ElementType != null);

                var pointerConversion = default(Conversion);
                var sourceAsPointer   = new PointerTypeSymbol(sourceExpression.ElementType);
                pointerConversion = ClassifyImplicitConversionFromType(sourceAsPointer, destination, ref useSiteDiagnostics);

                if (pointerConversion.IsValid)
                {
                    // Report unsafe errors
                    _binder.ReportUnsafeIfNotAllowed(sourceExpression.Syntax.Location, ref useSiteDiagnostics);

                    return(Conversion.MakeStackAllocToPointerType(pointerConversion));
                }
                else
                {
                    var spanType = _binder.GetWellKnownType(WellKnownType.System_Span_T, ref useSiteDiagnostics);
                    if (spanType.TypeKind == TypeKind.Struct && spanType.IsByRefLikeType)
                    {
                        var spanType_T     = spanType.Construct(sourceExpression.ElementType);
                        var spanConversion = ClassifyImplicitConversionFromType(spanType_T, destination, ref useSiteDiagnostics);

                        if (spanConversion.Exists)
                        {
                            // Report errors if Span ctor is missing, or using an older C# version
                            Binder.CheckFeatureAvailability(sourceExpression.Syntax, MessageID.IDS_FeatureRefStructs, ref useSiteDiagnostics);
                            Binder.GetWellKnownTypeMember(_binder.Compilation, WellKnownMember.System_Span_T__ctor, out DiagnosticInfo memberDiagnosticInfo);
                            HashSetExtensions.InitializeAndAdd(ref useSiteDiagnostics, memberDiagnosticInfo);

                            return(Conversion.MakeStackAllocToSpanType(spanConversion));
                        }
                    }
                }
            }

            return(Conversion.NoConversion);
        }
 public void AddReference(EncodedLocation location)
 {
     HashSetExtensions.AddValue(ref References, location);
 }
示例#4
0
 public bool AddAssignment(EncodedLocation location)
 {
     return(HashSetExtensions.AddValue(ref _assignments, location));
 }
示例#5
0
 public bool AddReference(EncodedLocation location)
 {
     return(HashSetExtensions.AddValue(ref _references, location));
 }
示例#6
0
 public void AddReference(SimpleSrcLocation location)
 {
     HashSetExtensions.AddValue(ref References, location);
 }
示例#7
0
 public void AddDependentUnit(AnalysisUnit unit)
 {
     HashSetExtensions.AddValue(ref _dependentUnits, unit);
 }
示例#8
0
 public void AddAssignment(SimpleSrcLocation location)
 {
     HashSetExtensions.AddValue(ref _assignments, location);
 }