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); }
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); }