Author: martin
Date: 2005-04-15 04:55:44 -0400 (Fri, 15 Apr 2005)
New Revision: 43034
Modified:
trunk/mcs/gmcs/ChangeLog
trunk/mcs/gmcs/ecore.cs
trunk/mcs/gmcs/expression.cs
Log:
**** Merged r41518 from MCS ****
Modified: trunk/mcs/gmcs/ChangeLog
===================================================================
--- trunk/mcs/gmcs/ChangeLog 2005-04-15 08:54:26 UTC (rev 43033)
+++ trunk/mcs/gmcs/ChangeLog 2005-04-15 08:55:44 UTC (rev 43034)
@@ -1,5 +1,16 @@
2005-03-07 Raja R Harinath <[EMAIL PROTECTED]>
+ * ecore.cs (SimpleName.DoResolve): Rename from
+ SimpleName.DoResolveAllowStatic.
+ (SimpleName.DoSimpleNameResolve): Remove 'allow_static' argument.
+ Pass 'intermediate' flag to MemberStaticCheck.
+ (SimpleName.MemberStaticCheck): Skip "static check" only in case
+ of "intermediate" lookups via MemberAccess.
+ (SimpleName.IdenticalNameAndTypeName): New. Carved out of ...
+ * expression.cs (MemberAccess.IdenticalNameAndTypeName): ... this.
+
+2005-03-07 Raja R Harinath <[EMAIL PROTECTED]>
+
Fix #73394.
* ecore.cs (FieldExpr.EmitInstance): Catch cases of CS0120 that
slipped in because of variable names that are identical to a
Modified: trunk/mcs/gmcs/ecore.cs
===================================================================
--- trunk/mcs/gmcs/ecore.cs 2005-04-15 08:54:26 UTC (rev 43033)
+++ trunk/mcs/gmcs/ecore.cs 2005-04-15 08:55:44 UTC (rev 43034)
@@ -365,7 +365,7 @@
Expression e;
bool intermediate = (flags & ResolveFlags.Intermediate)
== ResolveFlags.Intermediate;
if (this is SimpleName)
- e = ((SimpleName) this).DoResolveAllowStatic
(ec, intermediate);
+ e = ((SimpleName) this).DoResolve (ec,
intermediate);
else
e = DoResolve (ec);
@@ -2090,17 +2090,25 @@
"An object reference is required " +
"for the non-static field `"+name+"'");
}
+
+ public bool IdenticalNameAndTypeName (EmitContext ec,
Expression resolved_to, Location loc)
+ {
+ return resolved_to != null && resolved_to.Type != null
&&
+ resolved_to.Type.Name == Name &&
+ (ec.DeclSpace.LookupType (Name, loc, /*
ignore_cs0104 = */ true) != null);
+ }
//
// Checks whether we are trying to access an instance
// property, method or field from a static body.
//
- Expression MemberStaticCheck (EmitContext ec, Expression e)
+ Expression MemberStaticCheck (EmitContext ec, Expression e,
bool intermediate)
{
if (e is IMemberExpr){
IMemberExpr member = (IMemberExpr) e;
- if (!member.IsStatic){
+ if (!member.IsStatic &&
+ (!intermediate || !IdenticalNameAndTypeName
(ec, e, loc))) {
Error_ObjectRefRequired (ec, loc, Name);
return null;
}
@@ -2108,21 +2116,21 @@
return e;
}
-
+
public override Expression DoResolve (EmitContext ec)
{
- return SimpleNameResolve (ec, null, false, false);
+ return SimpleNameResolve (ec, null, false);
}
public override Expression DoResolveLValue (EmitContext ec,
Expression right_side)
{
- return SimpleNameResolve (ec, right_side, false, false);
+ return SimpleNameResolve (ec, right_side, false);
}
- public Expression DoResolveAllowStatic (EmitContext ec, bool
intermediate)
+ public Expression DoResolve (EmitContext ec, bool intermediate)
{
- return SimpleNameResolve (ec, null, true, intermediate);
+ return SimpleNameResolve (ec, null, intermediate);
}
private bool IsNestedChild (Type t, Type parent)
@@ -2205,10 +2213,9 @@
return dt;
}
- Expression SimpleNameResolve (EmitContext ec, Expression
right_side,
- bool allow_static, bool
intermediate)
+ Expression SimpleNameResolve (EmitContext ec, Expression
right_side, bool intermediate)
{
- Expression e = DoSimpleNameResolve (ec, right_side,
allow_static, intermediate);
+ Expression e = DoSimpleNameResolve (ec, right_side,
intermediate);
if (e == null)
return null;
@@ -2235,7 +2242,7 @@
/// Local Variables and Parameters are handled at
/// parse time, so they never occur as SimpleNames.
///
- /// The `allow_static' flag is used by MemberAccess only
+ /// The `intermediate' flag is used by MemberAccess only
/// and it is used to inform us that it is ok for us to
/// avoid the static check, because MemberAccess might end
/// up resolving the Name as a Type name and the access as
@@ -2246,7 +2253,7 @@
/// Type is both an instance variable and a Type;
Type.GetType
/// is the static method not an instance method of type.
/// </remarks>
- Expression DoSimpleNameResolve (EmitContext ec, Expression
right_side, bool allow_static, bool intermediate)
+ Expression DoSimpleNameResolve (EmitContext ec, Expression
right_side, bool intermediate)
{
Expression e = null;
@@ -2349,7 +2356,7 @@
TypeManager.IsNestedFamilyAccessible
(me.InstanceExpression.Type, me.DeclaringType) &&
me.InstanceExpression.Type !=
me.DeclaringType &&
!TypeManager.IsFamilyAccessible
(me.InstanceExpression.Type, me.DeclaringType) &&
- (!intermediate ||
!MemberAccess.IdenticalNameAndTypeName (ec, this, e, loc))) {
+ (!intermediate || !IdenticalNameAndTypeName
(ec, e, loc))) {
Error (38, "Cannot access nonstatic
member `" + me.Name + "' of " +
"outer type `" +
me.DeclaringType + "' via nested type `" +
me.InstanceExpression.Type +
"'");
@@ -2362,10 +2369,7 @@
}
if (ec.IsStatic || ec.IsFieldInitializer){
- if (allow_static)
- return e;
-
- return MemberStaticCheck (ec, e);
+ return MemberStaticCheck (ec, e, intermediate);
} else
return e;
}
Modified: trunk/mcs/gmcs/expression.cs
===================================================================
--- trunk/mcs/gmcs/expression.cs 2005-04-15 08:54:26 UTC (rev 43033)
+++ trunk/mcs/gmcs/expression.cs 2005-04-15 08:55:44 UTC (rev 43034)
@@ -7363,10 +7363,7 @@
public static bool IdenticalNameAndTypeName (EmitContext ec,
Expression left_original, Expression left, Location loc)
{
SimpleName sn = left_original as SimpleName;
- if (sn == null || left == null || left.Type.Name !=
sn.Name)
- return false;
-
- return ec.DeclSpace.LookupType (sn.Name, loc,
/*ignore_cs0104*/ true) != null;
+ return sn != null && sn.IdenticalNameAndTypeName (ec,
left, loc);
}
// TODO: possible optimalization
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches