2008-09-17 Marek Safar <marek.safar@gmail.com>
[mono.git] / mcs / mcs / statement.cs
index 9fc8e84710f14b41421c6b1c5fcbd6cc21ac12b4..1f42cbdabd0b1873671e424bea8dd1ff3c90fa00 100644 (file)
@@ -1149,20 +1149,12 @@ namespace Mono.CSharp {
                                return ec.CurrentBranching.CheckRethrow (loc);
                        }
 
-                       expr = expr.Resolve (ec);
+                       expr = expr.Resolve (ec, ResolveFlags.Type | ResolveFlags.VariableOrValue);
                        ec.CurrentBranching.CurrentUsageVector.Goto ();
 
                        if (expr == null)
                                return false;
 
-                       ExprClass eclass = expr.eclass;
-
-                       if (!(eclass == ExprClass.Variable || eclass == ExprClass.PropertyAccess ||
-                             eclass == ExprClass.Value || eclass == ExprClass.IndexerAccess)) {
-                               expr.Error_UnexpectedKind (ec.DeclContainer, "value, variable, property or indexer access ", loc);
-                               return false;
-                       }
-
                        Type t = expr.Type;
 
                        if ((t != TypeManager.exception_type) &&
@@ -1397,11 +1389,6 @@ namespace Mono.CSharp {
                        if (TypeManager.IsGenericParameter (VariableType))
                                return true;
 
-                       if (VariableType == TypeManager.void_type) {
-                               Expression.Error_VoidInvalidInTheContext (Location);
-                               return false;
-                       }
-
                        if (VariableType.IsAbstract && VariableType.IsSealed) {
                                FieldBase.Error_VariableOfStaticClass (Location, Name, VariableType);
                                return false;
@@ -2086,7 +2073,7 @@ namespace Mono.CSharp {
 
                                e = ce.ConvertImplicitly (variable_type);
                                if (e == null) {
-                                       if (!variable_type.IsValueType && variable_type != TypeManager.string_type && !ce.IsDefaultValue)
+                                       if (TypeManager.IsReferenceType (variable_type))
                                                Const.Error_ConstantCanBeInitializedWithNullOnly (vi.Location, vi.Name);
                                        else
                                                ce.Error_ValueCannotBeConverted (ec, vi.Location, variable_type, false);
@@ -2530,14 +2517,6 @@ namespace Mono.CSharp {
                        base.EmitMeta (ec);
                }
 
-               protected override void EmitSymbolInfo (EmitContext ec)
-               {
-                       if (am_storey != null)
-                               SymbolWriter.DefineScopeVariable (am_storey.ID);
-
-                       base.EmitSymbolInfo (ec);
-               }
-
                internal IKnownVariable GetKnownVariable (string name)
                {
                        return known_variables == null ? null : (IKnownVariable) known_variables [name];
@@ -2587,6 +2566,11 @@ namespace Mono.CSharp {
                public Parameter Parameter {
                        get { return Block.Parameters [Index]; }
                }
+
+               public Type ParameterType {
+                       get { return Block.Parameters.Types [Index]; }
+               }
+
                public Location Location {
                        get { return Parameter.Location; }
                }
@@ -2668,7 +2652,7 @@ namespace Mono.CSharp {
                        if (parent != null)
                                parent.AddAnonymousChild (this);
 
-                       if (!this.parameters.Empty)
+                       if (!this.parameters.IsEmpty)
                                ProcessParameters ();
                }
 
@@ -2757,7 +2741,10 @@ namespace Mono.CSharp {
 
                public override Expression CreateExpressionTree (EmitContext ec)
                {
-                       return ((Statement) statements [0]).CreateExpressionTree (ec);
+                       if (statements.Count == 1)
+                               return ((Statement) statements [0]).CreateExpressionTree (ec);
+
+                       return base.CreateExpressionTree (ec);
                }
 
                //
@@ -2866,7 +2853,7 @@ namespace Mono.CSharp {
                        int offset = Parent == null ? 0 : Parent.AssignableSlots;
 
                        for (int i = 0; i < orig_count; ++i) {
-                               Parameter.Modifier mod = parameters.ParameterModifier (i);
+                               Parameter.Modifier mod = parameters.FixedParameters [i].ModFlags;
 
                                if ((mod & Parameter.Modifier.OUT) != Parameter.Modifier.OUT)
                                        continue;
@@ -2918,6 +2905,15 @@ namespace Mono.CSharp {
                        base.EmitMeta (ec);
                }
 
+               protected override void EmitSymbolInfo (EmitContext ec)
+               {
+                       AnonymousExpression ae = ec.CurrentAnonymousMethod;
+                       if ((ae != null) && (ae.Storey != null))
+                               SymbolWriter.DefineScopeVariable (ae.Storey.ID);
+
+                       base.EmitSymbolInfo (ec);
+               }
+
                public override void Emit (EmitContext ec)
                {
                        base.Emit (ec);
@@ -3022,8 +3018,6 @@ namespace Mono.CSharp {
                                label = "default";
                        else if (converted == NullStringCase)
                                label = "null";
-                       else if (TypeManager.IsEnumType (switch_type)) 
-                               label = TypeManager.CSharpEnumValue (switch_type, converted);
                        else
                                label = converted.ToString ();
                        
@@ -4423,7 +4417,7 @@ namespace Mono.CSharp {
                                        converted = new Conditional (new Binary (Binary.Operator.LogicalOr,
                                                new Binary (Binary.Operator.Equality, e, new NullLiteral (loc)),
                                                new Binary (Binary.Operator.Equality, new MemberAccess (e, "Length"), new IntConstant (0, loc))),
-                                                       NullPointer.Null,
+                                                       new NullPointer (loc),
                                                        converted);
 
                                        converted = converted.Resolve (ec);