Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Safar <marek.safar@gmail.com>2008-09-19 17:58:01 +0400
committerMarek Safar <marek.safar@gmail.com>2008-09-19 17:58:01 +0400
commit35d949cb641f5f227d73efab7bd260ec1794086b (patch)
tree13606ee26b419a4dc86f37b5f2adc3e35555905d
parenta95be129849b0097379ee61355355bf7cfba6631 (diff)
2008-09-19 Marek Safar <marek.safar@gmail.com>
A fix for bug #423791 * generic.cs: Fixed params output type type-inference. svn path=/trunk/mcs/; revision=113526
-rw-r--r--mcs/mcs/ChangeLog5
-rw-r--r--mcs/mcs/generic.cs23
2 files changed, 19 insertions, 9 deletions
diff --git a/mcs/mcs/ChangeLog b/mcs/mcs/ChangeLog
index 0c287550562..131d2f3fe41 100644
--- a/mcs/mcs/ChangeLog
+++ b/mcs/mcs/ChangeLog
@@ -1,5 +1,10 @@
2008-09-19 Marek Safar <marek.safar@gmail.com>
+ A fix for bug #423791
+ * generic.cs: Fixed params output type type-inference.
+
+2008-09-19 Marek Safar <marek.safar@gmail.com>
+
* cs-parser.jay, expression.cs: Fixed few expression crashes.
2008-09-19 Marek Safar <marek.safar@gmail.com>
diff --git a/mcs/mcs/generic.cs b/mcs/mcs/generic.cs
index 25d6484d560..41d74d111e8 100644
--- a/mcs/mcs/generic.cs
+++ b/mcs/mcs/generic.cs
@@ -2341,6 +2341,8 @@ namespace Mono.CSharp {
} else {
params_arguments_start = arg_count;
}
+
+ Type [] ptypes = methodParameters.Types;
//
// The first inference phase
@@ -2356,6 +2358,9 @@ namespace Mono.CSharp {
method_parameter = methodParameters.Types [params_arguments_start];
else
method_parameter = TypeManager.GetElementType (methodParameters.Types [params_arguments_start]);
+
+ ptypes = (Type[]) ptypes.Clone ();
+ ptypes [i] = method_parameter;
}
//
@@ -2383,16 +2388,16 @@ namespace Mono.CSharp {
// we don't need to call it in cycle
//
bool fixed_any = false;
- if (!tic.FixIndependentTypeArguments (methodParameters, ref fixed_any))
+ if (!tic.FixIndependentTypeArguments (ptypes, ref fixed_any))
return false;
- return DoSecondPhase (ec, tic, methodParameters, !fixed_any);
+ return DoSecondPhase (ec, tic, ptypes, !fixed_any);
}
- bool DoSecondPhase (EmitContext ec, TypeInferenceContext tic, AParametersCollection methodParameters, bool fixDependent)
+ bool DoSecondPhase (EmitContext ec, TypeInferenceContext tic, Type[] methodParameters, bool fixDependent)
{
bool fixed_any = false;
- if (fixDependent && !tic.FixDependentTypes (methodParameters, ref fixed_any))
+ if (fixDependent && !tic.FixDependentTypes (ref fixed_any))
return false;
// If no further unfixed type variables exist, type inference succeeds
@@ -2406,7 +2411,7 @@ namespace Mono.CSharp {
// contain unfixed type variables but the input types do not,
// an output type inference is made
for (int i = 0; i < arg_count; i++) {
- Type t_i = methodParameters.Types [i];
+ Type t_i = methodParameters [i];
if (!TypeManager.IsDelegateType (t_i)) {
if (TypeManager.DropGenericTypeArguments (t_i) != TypeManager.expression_type)
continue;
@@ -2566,7 +2571,7 @@ namespace Mono.CSharp {
// a, There is at least one type variable Xj that depends on Xi
// b, Xi has a non-empty set of bounds
//
- public bool FixDependentTypes (AParametersCollection methodParameters, ref bool fixed_any)
+ public bool FixDependentTypes (ref bool fixed_any)
{
for (int i = 0; i < unfixed_types.Length; ++i) {
if (unfixed_types[i] == null)
@@ -2587,11 +2592,11 @@ namespace Mono.CSharp {
//
// All unfixed type variables Xi which depend on no Xj are fixed
//
- public bool FixIndependentTypeArguments (AParametersCollection methodParameters, ref bool fixed_any)
+ public bool FixIndependentTypeArguments (Type[] methodParameters, ref bool fixed_any)
{
ArrayList types_to_fix = new ArrayList (unfixed_types);
- for (int i = 0; i < methodParameters.Types.Length; ++i) {
- Type t = methodParameters.Types [i];
+ for (int i = 0; i < methodParameters.Length; ++i) {
+ Type t = methodParameters[i];
if (t.IsGenericParameter)
continue;