Merge pull request #1991 from esdrubal/seq_test_fix
[mono.git] / mcs / mcs / ecore.cs
index 14d69f65acd341fb010d3d8bb0c9463847ed425b..ce055dcbc3139d9fc071da68dd444b936968d027 100644 (file)
@@ -1338,8 +1338,14 @@ namespace Mono.CSharp {
                                return null;
 
                        ExpressionStatement es = e as ExpressionStatement;
-                       if (es == null || e is AnonymousMethodBody)
+                       if (es == null || e is AnonymousMethodBody) {
+                               var reduced = e as IReducedExpressionStatement;
+                               if (reduced != null) {
+                                       return EmptyExpressionStatement.Instance;
+                               }
+
                                Error_InvalidExpressionStatement (ec);
+                       }
 
                        //
                        // This is quite expensive warning, try to limit the damage
@@ -1406,6 +1412,10 @@ namespace Mono.CSharp {
                }
        }
 
+       interface IReducedExpressionStatement
+       {
+       }
+
        /// <summary>
        ///   This kind of cast is used to encapsulate the child
        ///   whose type is child.Type into an expression that is
@@ -2213,7 +2223,7 @@ namespace Mono.CSharp {
        //
        public class ReducedExpression : Expression
        {
-               public sealed class ReducedConstantExpression : EmptyConstantCast
+               public class ReducedConstantExpression : EmptyConstantCast
                {
                        readonly Expression orig_expr;
 
@@ -2263,6 +2273,14 @@ namespace Mono.CSharp {
                        }
                }
 
+               sealed class ReducedConstantStatement : ReducedConstantExpression, IReducedExpressionStatement
+               {
+                       public ReducedConstantStatement (Constant expr, Expression origExpr)
+                               : base (expr, origExpr)
+                       {
+                       }
+               }
+
                sealed class ReducedExpressionStatement : ExpressionStatement
                {
                        readonly Expression orig_expr;
@@ -2344,12 +2362,15 @@ namespace Mono.CSharp {
                //
                // Creates fully resolved expression switcher
                //
-               public static Constant Create (Constant expr, Expression original_expr)
+               public static Constant Create (Constant expr, Expression originalExpr)
                {
                        if (expr.eclass == ExprClass.Unresolved)
                                throw new ArgumentException ("Unresolved expression");
 
-                       return new ReducedConstantExpression (expr, original_expr);
+                       if (originalExpr is ExpressionStatement)
+                               return new ReducedConstantStatement (expr, originalExpr);
+
+                       return new ReducedConstantExpression (expr, originalExpr);
                }
 
                public static ExpressionStatement Create (ExpressionStatement s, Expression orig)
@@ -2864,8 +2885,16 @@ namespace Mono.CSharp {
 
                                                                pe.Getter = pe.PropertyInfo.Get;
                                                        } else {
-                                                               if (!pe.PropertyInfo.HasSet || !pe.PropertyInfo.Set.IsAccessible (rc))
+                                                               if (rc.HasSet (ResolveContext.Options.ConstructorScope) && pe.IsAutoPropertyAccess &&
+                                                                       pe.PropertyInfo.DeclaringType == rc.CurrentType && pe.IsStatic == rc.IsStatic) {
+                                                                       var p = (Property) pe.PropertyInfo.MemberDefinition;
+                                                                       return new FieldExpr (p.BackingField, loc);
+                                                               }
+
+                                                               if (!pe.PropertyInfo.HasSet || !pe.PropertyInfo.Set.IsAccessible (rc)) {
+                                                                       variable_found = true;
                                                                        break;
+                                                               }
 
                                                                pe.Setter = pe.PropertyInfo.Set;
                                                        }
@@ -3070,11 +3099,10 @@ namespace Mono.CSharp {
                        // Obsolete checks cannot be done when resolving base context as they
                        // require type dependencies to be set but we are in process of resolving them
                        //
-                       if (!(mc is TypeDefinition.BaseContext) && !(mc is UsingAliasNamespace.AliasContext)) {
-                               ObsoleteAttribute obsolete_attr = type.GetAttributeObsolete ();
-                               if (obsolete_attr != null && !mc.IsObsolete) {
-                                       AttributeTester.Report_ObsoleteMessage (obsolete_attr, te.GetSignatureForError (), Location, mc.Module.Compiler.Report);
-                               }
+                       if (mc is ResolveContext) {
+                               var oa = type.GetAttributeObsolete ();
+                               if (oa != null && !mc.IsObsolete)
+                                       AttributeTester.Report_ObsoleteMessage (oa, type.GetSignatureForError (), fne.Location, mc.Module.Compiler.Report);
                        }
 
                        return type;
@@ -3472,11 +3500,7 @@ namespace Mono.CSharp {
                                ImportedTypeDefinition.Error_MissingDependency (rc, dep, loc);
                        }
 
-                       if (!rc.IsObsolete) {
-                               ObsoleteAttribute oa = member.GetAttributeObsolete ();
-                               if (oa != null)
-                                       AttributeTester.Report_ObsoleteMessage (oa, member.GetSignatureForError (), loc, rc.Report);
-                       }
+                       member.CheckObsoleteness (rc, loc);
 
                        if (!(member is FieldSpec))
                                member.MemberDefinition.SetIsUsed ();
@@ -3575,10 +3599,7 @@ namespace Mono.CSharp {
                                        if (InstanceExpression is TypeExpr) {
                                                var t = InstanceExpression.Type;
                                                do {
-                                                       ObsoleteAttribute oa = t.GetAttributeObsolete ();
-                                                       if (oa != null && !rc.IsObsolete) {
-                                                               AttributeTester.Report_ObsoleteMessage (oa, t.GetSignatureForError (), loc, rc.Report);
-                                                       }
+                                                       t.CheckObsoleteness (rc, loc);
 
                                                        t = t.DeclaringType;
                                                } while (t != null);
@@ -5615,9 +5636,7 @@ namespace Mono.CSharp {
                                //
                                // Check ObsoleteAttribute on the best method
                                //
-                               ObsoleteAttribute oa = best_candidate.GetAttributeObsolete ();
-                               if (oa != null && !rc.IsObsolete)
-                                       AttributeTester.Report_ObsoleteMessage (oa, best_candidate.GetSignatureForError (), loc, rc.Report);
+                               best_candidate.CheckObsoleteness (rc, loc);
 
                                best_candidate.MemberDefinition.SetIsUsed ();
                        }
@@ -6377,7 +6396,7 @@ namespace Mono.CSharp {
 
                public override Expression DoResolveLValue (ResolveContext ec, Expression right_side)
                {
-                       if (ConditionalAccess)
+                       if (HasConditionalAccess ())
                                Error_NullPropagatingLValue (ec);
 
                        if (spec is FixedFieldSpec) {
@@ -6439,8 +6458,13 @@ namespace Mono.CSharp {
                                        return;
                                }
 
-                               if (TypeSpec.IsValueType (InstanceExpression.Type) && InstanceExpression is VariableReference)
+                               if (TypeSpec.IsValueType (InstanceExpression.Type)) {
+                                       var le = SkipLeftValueTypeAccess (InstanceExpression);
+                                       if (le != null)
+                                               le.FlowAnalysis (fc);
+
                                        return;
+                               }
                        }
 
                        base.FlowAnalysis (fc);
@@ -6449,6 +6473,24 @@ namespace Mono.CSharp {
                                fc.ConditionalAccessEnd ();
                }
 
+               static Expression SkipLeftValueTypeAccess (Expression expr)
+               {
+                       if (!TypeSpec.IsValueType (expr.Type))
+                               return expr;
+
+                       if (expr is VariableReference)
+                               return null;
+
+                       var fe = expr as FieldExpr;
+                       if (fe == null)
+                               return expr;
+
+                       if (fe.InstanceExpression == null)
+                               return expr;
+
+                       return SkipLeftValueTypeAccess (fe.InstanceExpression);
+               }
+
                public override int GetHashCode ()
                {
                        return spec.GetHashCode ();
@@ -7005,6 +7047,14 @@ namespace Mono.CSharp {
                        if (!rc.HasSet (ResolveContext.Options.ConstructorScope))
                                return false;
 
+                       if (prop.Parent.PartialContainer != rc.CurrentMemberDefinition.Parent.PartialContainer) {
+                               var ps = MemberCache.FindMember (rc.CurrentType, MemberFilter.Property (prop.ShortName, prop.MemberType), BindingRestriction.DeclaredOnly) as PropertySpec;
+                               if (ps == null)
+                                       return false;
+
+                               prop = (Property) ps.MemberDefinition;
+                       }
+
                        var spec = prop.BackingField;
                        if (spec == null)
                                return false;
@@ -7113,7 +7163,7 @@ namespace Mono.CSharp {
 
                public override Expression DoResolveLValue (ResolveContext rc, Expression right_side)
                {
-                       if (ConditionalAccess)
+                       if (HasConditionalAccess ())
                                Error_NullPropagatingLValue (rc);
 
                        if (right_side == EmptyExpression.OutAccess) {
@@ -7321,11 +7371,7 @@ namespace Mono.CSharp {
 
                                        spec.MemberDefinition.SetIsUsed ();
 
-                                       if (!ec.IsObsolete) {
-                                               ObsoleteAttribute oa = spec.GetAttributeObsolete ();
-                                               if (oa != null)
-                                                       AttributeTester.Report_ObsoleteMessage (oa, spec.GetSignatureForError (), loc, ec.Report);
-                                       }
+                                       spec.CheckObsoleteness (ec, loc);
 
                                        if ((spec.Modifiers & (Modifiers.ABSTRACT | Modifiers.EXTERN)) != 0)
                                                Error_AssignmentEventOnly (ec);
@@ -7359,7 +7405,7 @@ namespace Mono.CSharp {
                                return null;
                        }
 
-                       if (ConditionalAccess)
+                       if (HasConditionalAccess ())
                                Error_NullPropagatingLValue (ec);
 
                        op = CandidateToBaseOverride (ec, op);
@@ -7505,9 +7551,9 @@ namespace Mono.CSharp {
                    }
                }
 
-               public static TemporaryVariableReference Create (TypeSpec type, Block block, Location loc)
+               public static TemporaryVariableReference Create (TypeSpec type, Block block, Location loc, bool writeToSymbolFile = false)
                {
-                       var li = LocalVariable.CreateCompilerGenerated (type, block, loc);
+                       var li = LocalVariable.CreateCompilerGenerated (type, block, loc, writeToSymbolFile);
                        return new TemporaryVariableReference (li, loc);
                }