Author: marek
Date: 2008-01-22 10:47:33 -0500 (Tue, 22 Jan 2008)
New Revision: 93539

Modified:
   trunk/mcs/mcs/ChangeLog
   trunk/mcs/mcs/anonymous.cs
   trunk/mcs/mcs/convert.cs
   trunk/mcs/mcs/ecore.cs
   trunk/mcs/mcs/generic.cs
   trunk/mcs/mcs/lambda.cs
Log:
2008-01-22  Marek Safar  <[EMAIL PROTECTED]>

        A fix for bug #355145
        * anonymous.cs, convert.cs, ecore.cs, generic.cs, lambda.cs: Implemented
        expression tree type inference.



Modified: trunk/mcs/mcs/ChangeLog
===================================================================
--- trunk/mcs/mcs/ChangeLog     2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/ChangeLog     2008-01-22 15:47:33 UTC (rev 93539)
@@ -1,3 +1,9 @@
+2008-01-22  Marek Safar  <[EMAIL PROTECTED]>
+
+       A fix for bug #355145
+       * anonymous.cs, convert.cs, ecore.cs, generic.cs, lambda.cs: Implemented
+       expression tree type inference.
+
 2008-01-22  Raja R Harinath  <[EMAIL PROTECTED]>
 
        Fix #354663
@@ -2,3 +8,3 @@
        * expression.cs (Binary.IsUnsignedType): Fix typo.
-
+       
 2008-01-22  Marek Safar  <[EMAIL PROTECTED]>

Modified: trunk/mcs/mcs/anonymous.cs
===================================================================
--- trunk/mcs/mcs/anonymous.cs  2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/anonymous.cs  2008-01-22 15:47:33 UTC (rev 93539)
@@ -1269,9 +1269,15 @@
                        if (!HasExplicitParameters)
                                return false;
 
-                       if (!TypeManager.IsDelegateType (delegate_type))
-                               return false;
+                       if (!TypeManager.IsDelegateType (delegate_type)) {
+                               if (TypeManager.DropGenericTypeArguments 
(delegate_type) != TypeManager.expression_type)
+                                       return false;
 
+                               delegate_type = 
delegate_type.GetGenericArguments () [0];
+                               if (!TypeManager.IsDelegateType (delegate_type))
+                                       return false;
+                       }
+                       
                        ParameterData d_params = 
TypeManager.GetDelegateParameters (delegate_type);
                        if (d_params.Count != Parameters.Count)
                                return false;

Modified: trunk/mcs/mcs/convert.cs
===================================================================
--- trunk/mcs/mcs/convert.cs    2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/convert.cs    2008-01-22 15:47:33 UTC (rev 93539)
@@ -901,9 +901,10 @@
                                return true;
 
                        if (expr_type == TypeManager.anonymous_method_type){
-                               if (!TypeManager.IsDelegateType (target_type))
+                               if (!TypeManager.IsDelegateType (target_type) &&
+                                       TypeManager.DropGenericTypeArguments 
(target_type) != TypeManager.expression_type)
                                        return false;
-
+                               
                                AnonymousMethodExpression ame = 
(AnonymousMethodExpression) expr;
                                return ame.ImplicitStandardConversionExists 
(target_type);
                        }

Modified: trunk/mcs/mcs/ecore.cs
===================================================================
--- trunk/mcs/mcs/ecore.cs      2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/ecore.cs      2008-01-22 15:47:33 UTC (rev 93539)
@@ -4041,7 +4041,7 @@
                                                                return null;
                                                        }
                                                } else {
-                                                       if (type_arguments != 
null) {
+                                                       if (type_arguments != 
null && !TypeManager.IsGenericMethod (best_candidate)) {
                                                                
Namespace.Error_TypeArgumentsCannotBeUsed (best_candidate, loc);
                                                                return null;
                                                        }

Modified: trunk/mcs/mcs/generic.cs
===================================================================
--- trunk/mcs/mcs/generic.cs    2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/generic.cs    2008-01-22 15:47:33 UTC (rev 93539)
@@ -2582,9 +2582,13 @@
                        // an output type inference is made
                        for (int i = 0; i < arg_count; i++) {
                                Type t_i = methodParameters.ParameterType (i);
-                               if (!TypeManager.IsDelegateType (t_i))
-                                       continue;
+                               if (!TypeManager.IsDelegateType (t_i)) {
+                                       if 
(TypeManager.DropGenericTypeArguments (t_i) != TypeManager.expression_type)
+                                               continue;
 
+                                       t_i = t_i.GetGenericArguments () [0];
+                               }
+
                                MethodInfo mi = Delegate.GetInvokeMethod (t_i, 
t_i);
                                Type rtype = mi.ReturnType;
 
@@ -2746,13 +2750,18 @@
                public bool FixIndependentTypeArguments (ParameterData 
methodParameters, ref bool fixed_any)
                {
                        ArrayList types_to_fix = new ArrayList (unfixed_types);
-                       foreach (Type t in methodParameters.Types) {
+                       for (int i = 0; i < methodParameters.Types.Length; ++i) 
{
+                               Type t = methodParameters.Types [i];
                                if (t.IsGenericParameter)
                                        continue;
 
-                               if (!TypeManager.IsDelegateType (t))
-                                       continue;
+                               if (!TypeManager.IsDelegateType (t)) {
+                                       if 
(TypeManager.DropGenericTypeArguments (t) != TypeManager.expression_type)
+                                               continue;
 
+                                       t = t.GetGenericArguments () [0];
+                               }
+
                                MethodInfo invoke = Delegate.GetInvokeMethod 
(t, t);
                                Type rtype = invoke.ReturnType;
                                if (!rtype.IsGenericParameter && 
!rtype.IsGenericType)

Modified: trunk/mcs/mcs/lambda.cs
===================================================================
--- trunk/mcs/mcs/lambda.cs     2008-01-22 15:40:26 UTC (rev 93538)
+++ trunk/mcs/mcs/lambda.cs     2008-01-22 15:47:33 UTC (rev 93539)
@@ -36,6 +36,9 @@
 
                protected override Expression CreateExpressionTree (EmitContext 
ec, Type delegate_type)
                {
+                       if (ec.IsInProbingMode)
+                               return this;
+                       
                        Expression args = Parameters.CreateExpressionTree (ec, 
loc);
                        Expression expr = Block.CreateExpressionTree (ec);
                        if (expr == null)
@@ -187,7 +190,8 @@
                {               
                        if (ec.ReturnType == TypeManager.void_type) {
                                statement_return = true;
-                               return Expr.Resolve (ec) != null;
+                               Expr = Expr.Resolve (ec);
+                               return Expr != null;
                        }
 
                        return base.Resolve (ec);

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to