예제 #1
0
        public override Expression DoResolve(ResolveContext rc)
        {
            if (_resolved)
            {
                return(this);
            }

            count = count.DoResolve(rc);
            if (count == null)
            {
                return(null);
            }

            if (!count.Type.IsKnownType(KnownTypeCode.UInt32))
            {
                count = new CastExpression(KnownTypeReference.UInt32.Resolve(rc), count).DoResolve(rc);
                if (count == null)
                {
                    return(null);
                }
            }

            Constant c = count as Constant;

            if (c != null && c.IsNegative)
            {
                rc.Report.Error(0, loc, "Cannot use a negative size with stackalloc");
            }


            if (rc.HasAny(ResolveContext.Options.CatchScope | ResolveContext.Options.FinallyScope))
            {
                rc.Report.Error(0, loc, "Cannot use stackalloc in finally or catch");
            }


            otype = texpr.ResolveAsType(rc);
            if (otype == null)
            {
                return(null);
            }

            ResolvedType = new PointerTypeSpec(otype);
            _resolved    = true;
            eclass       = ExprClass.Value;

            return(this);
        }
예제 #2
0
        public static bool IsSelfOrSuperAvailable(ResolveContext rc, bool ignoreAnonymous)
        {
            if (rc.IsStatic || rc.HasAny(ResolveContext.Options.FieldInitializerScope | ResolveContext.Options.BaseInitializer | ResolveContext.Options.ConstantScope))
            {
                return(false);
            }

            if (ignoreAnonymous || rc.CurrentAnonymousMethod == null)
            {
                return(true);
            }

            if (rc.CurrentTypeDefinition.Kind == TypeKind.Struct) /*&& !(rc.CurrentAnonymousMethod is StateMachineInitializer))*/ //TODO:Anonymous+Iterators
            {
                return(false);
            }

            return(true);
        }