2002-09-18 Miguel de Icaza <miguel@ximian.com>
[mono.git] / mcs / mcs / ChangeLog
index 191f0758843b5d3d2e7bda31533f7390158e4a70..f0f215e0b29361a80ad450fa87eda798648775ed 100755 (executable)
@@ -1,3 +1,729 @@
+2002-09-18  Miguel de Icaza  <miguel@ximian.com>
+
+       * ecore.cs (SimpleName.DoResolveType): During the initial type
+       resolution process, when we define types recursively, we must
+       check first for types in our current scope before we perform
+       lookups in the enclosing scopes.
+
+       * expression.cs (MakeByteBlob): Handle Decimal blobs.
+
+       (Invocation.VerifyArgumentsCompat): Call
+       TypeManager.TypeToCoreType on the parameter_type.GetElementType.
+       I thought we were supposed to always call this, but there are a
+       few places in the code where we dont do it.
+
+2002-09-17  Miguel de Icaza  <miguel@ximian.com>
+
+       * driver.cs: Add support in -linkres and -resource to specify the
+       name of the identifier.
+
+2002-09-16  Miguel de Icaza  <miguel@ximian.com>
+
+       * ecore.cs (StandardConversionExists): Sync with the conversion
+       code: allow anything-* to void* conversions.
+
+       (FindMostSpecificSource): Use an Expression argument
+       instead of a Type, because we might be handed over a Literal which
+       gets a few more implicit conversions that plain types do not.  So
+       this information was being lost.
+
+       Also, we drop the temporary type-holder expression when not
+       required.
+
+2002-09-17  Martin Baulig  <martin@gnome.org>
+
+       * class.cs (PropertyBase.CheckBase): Don't check the base class if
+       this is an explicit interface implementation.
+
+2002-09-17  Martin Baulig  <martin@gnome.org>
+
+       * class.cs (PropertyBase.CheckBase): Make this work for indexers with
+       different `IndexerName' attributes.
+
+       * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
+       (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
+       virtual CommonResolve().
+
+2002-09-16  Miguel de Icaza  <miguel@ximian.com>
+
+       * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
+       and convert that to the UnderlyingType.
+
+       * statement.cs (Foreach.Resolve): Indexers are just like variables
+       or PropertyAccesses.
+
+       * cs-tokenizer.cs (consume_string): Track line numbers and columns
+       inside quoted strings, we were not doing this before.
+
+2002-09-16  Martin Baulig  <martin@gnome.org>
+
+       * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
+       resolve it.  This is needed for the definite assignment check of the
+       instance expression, fixes bug #29846.
+       (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
+
+2002-09-16  Nick Drochak  <ndrochak@gol.com>
+
+       * parameter.cs: Fix compile error.  Cannot reference static member
+       from an instance object.  Is this an mcs bug?
+
+2002-09-14  Martin Baulig  <martin@gnome.org>
+
+       * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
+       multiple times.  Fixes bug #30295, added test-166.cs.
+
+2002-09-14  Martin Baulig  <martin@gnome.org>
+
+       * statement.cs (Block.Emit): Don't emit unreachable code.
+       (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
+       `break' statements.
+       (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
+
+2002-09-14  Martin Baulig  <martin@gnome.org>
+
+       * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
+       is set.
+
+2002-09-14  Martin Baulig  <martin@gnome.org>
+
+       * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
+       if `type == parent' since in this case `type.IsSubclassOf (parent)' will
+       be false on the ms runtime.
+
+2002-09-13  Martin Baulig  <martin@gnome.org>
+
+       * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
+       the CS0038 error message.
+
+2002-09-12  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
+       constant inside, return it.
+
+2002-09-12  Martin Baulig  <martin@gnome.org>
+
+       * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
+       implicit conversion can be done between enum types.
+
+       * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
+       check whether an implicit conversion to the current enum's UnderlyingType
+       exists and report an error if not.
+
+       * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
+       without debugging support.
+
+       * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
+       Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
+
+2002-09-12  Martin Baulig  <martin@gnome.org>
+
+       * typemanager.cs (TypeManager.IsNestedChildOf): New method.
+
+       * ecore.cs (IMemberExpr.DeclaringType): New property.
+       (SimpleName.SimpleNameResolve): Check whether we're accessing a
+       nonstatic member of an outer type (CS0038).
+
+2002-09-11  Miguel de Icaza  <miguel@ximian.com>
+
+       * driver.cs: Activate the using-error detector at warning level
+       4 (at least for MS-compatible APIs).
+
+       * namespace.cs (VerifyUsing): Small buglett fix.
+
+       * pending.cs (PendingImplementation): pass the container pointer. 
+
+       * interface.cs (GetMethods): Allow for recursive definition.  Long
+       term, I would like to move every type to support recursive
+       definitions, not the current ordering mechanism that we have right
+       now.
+
+       The situation is this: Attributes are handled before interfaces,
+       so we can apply attributes to interfaces.  But some attributes
+       implement interfaces, we will now handle the simple cases
+       (recursive definitions will just get an error).  
+
+       * parameter.cs: Only invalidate types at the end if we fail to
+       lookup all types.  
+
+2002-09-09  Martin Baulig  <martin@gnome.org>
+
+       * ecore.cs (PropertyExpr.Emit): Also check for
+       TypeManager.system_int_array_get_length so this'll also work when
+       compiling corlib.  Fixes #30003.
+
+2002-09-09  Martin Baulig  <martin@gnome.org>
+
+       * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
+       and throw an exception if we can't get the type's size.  Fixed #30040,
+       added test-165.cs.
+
+2002-09-09  Martin Baulig  <martin@gnome.org>
+
+       * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
+
+       * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
+       context.  Fixes bug #30027.
+
+       * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
+       virtual functions.  Fixes bug #30043, added test-164.cs.
+
+2002-09-08  Ravi Pratap  <ravi@ximian.com>
+
+       * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
+
+2002-09-08  Nick Drochak  <ndrochak@gol.com>
+
+       * driver.cs: Use an object to get the windows codepage since it's not a
+       static property.
+
+2002-09-08  Miguel de Icaza  <miguel@ximian.com>
+
+       * statement.cs (For.Emit): for infinite loops (test == null)
+       return whether there is a break inside, not always "true".
+
+       * namespace.cs (UsingEntry): New struct to hold the name of the
+       using definition, the location where it is defined, and whether it
+       has been used in a successful type lookup.
+       
+       * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
+       strings.
+
+       * decl.cs: ditto.
+
+2002-09-06  Ravi Pratap  <ravi@ximian.com>
+
+       * attribute.cs : Fix incorrect code which relied on catching
+       a NullReferenceException to detect a null being passed in
+       where an object was expected.
+
+2002-09-06  Miguel de Icaza  <miguel@ximian.com>
+
+       * statement.cs (Try): flag the catch variable as assigned
+
+       * expression.cs (Cast): Simplified by using ResolveType instead of
+       manually resolving.
+
+       * statement.cs (Catch): Fix bug by using ResolveType.
+
+2002-09-06  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (BetterConversion): Special case for when we have
+       a NullLiteral as the argument and we have to choose between string
+       and object types - we choose string the way csc does.
+
+       * attribute.cs (Attribute.Resolve): Catch the
+       NullReferenceException and report error #182 since the Mono
+       runtime no more has the bug and having this exception raised means
+       we tried to select a constructor which takes an object and is
+       passed a null.
+
+2002-09-05  Ravi Pratap  <ravi@ximian.com>
+
+       * expression.cs (Invocation.OverloadResolve): Flag a nicer error
+       message (1502, 1503) when we can't locate a method after overload
+       resolution. This is much more informative and closes the bug
+       Miguel reported.
+
+       * interface.cs (PopulateMethod): Return if there are no argument
+       types. Fixes a NullReferenceException bug.
+
+       * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
+       expressions too. Previously we were checking only in one place for
+       positional arguments leaving out named arguments.
+
+       * ecore.cs (ImplicitNumericConversion): Conversion from underlying
+       type to the enum type is not allowed. Remove code corresponding to
+       that.
+
+       (ConvertNumericExplicit): Allow explicit conversions from
+       the underlying type to enum type. This precisely follows the spec
+       and closes a bug filed by Gonzalo.
+       
+2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * compiler.csproj:
+       * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
+
+2002-09-03  Miguel de Icaza  <miguel@ximian.com>
+
+       * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
+       it was important that we stored the right value after the
+       reduction in `converted'.
+
+2002-09-04  Martin Baulig  <martin@gnome.org>
+
+       * location.cs (Location.SymbolDocument): Use full pathnames for the
+       source files.
+
+2002-08-30  Miguel de Icaza  <miguel@ximian.com>
+
+       * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
+       of the expression resolve mechanism, because that will catch the
+       SimpleName error failures.
+
+       (Conditional): If we can not resolve the
+       expression, return, do not crash.
+
+2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * cs-tokenizer.cs:
+       (location): display token name instead of its number.
+
+2002-08-28  Martin Baulig  <martin@gnome.org>
+
+       * expression.cs (Binary.ResolveOperator): Don't silently return
+       but return an error if an operator cannot be applied between two
+       enum types.
+
+2002-08-28  Martin Baulig  <martin@gnome.org>
+
+       * class.cs (Constructor.Define): Set the permission attributes
+       correctly instead of making all constructors public.
+
+2002-08-28  Martin Baulig  <martin@gnome.org>
+
+       * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
+       for private members before reporting a CS0103; if we find anything,
+       it's a CS0122.
+
+2002-08-28  Martin Baulig  <martin@gnome.org>
+
+       * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
+       to check whether `closure_start_type == closure_invocation_type',
+       we also need to check whether `m.DeclaringType == closure_invocation_type'
+       before bypassing the permission checks.  We might be accessing
+       protected/private members from the base class.
+       (TypeManager.RealMemberLookup): Only set private_ok if private
+       members were requested via BindingFlags.NonPublic.
+
+       * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
+
+       * expression.cs (MemberAccess.ResolveMemberAccess): Set
+       MethodGroupExpr.IsExplicitImpl if appropriate.
+       (Invocation.DoResolve): Don't report the CS0120 for explicit
+       interface implementations.
+
+2002-08-27  Martin Baulig  <martin@gnome.org>
+
+       * expression.cs (Invocation.DoResolve): If this is a static
+       method and we don't have an InstanceExpression, we must report
+       a CS0120.
+
+2002-08-25  Martin Baulig  <martin@gnome.org>
+
+       * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
+       `==' between a valuetype and an object.
+
+2002-08-25  Miguel de Icaza  <miguel@ximian.com>
+
+       * ecore.cs (TypeExpr): Provide a ToString method.
+
+2002-08-24  Martin Baulig  <martin@gnome.org>
+
+       * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
+       now called proggie.dbg and it's a binary file.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * struct.cs (MyStructInfo.ctor): Make this work with empty
+       structs; it's not allowed to use foreach() on null.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
+       writer the full pathname of the generated assembly.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * statements.cs (FlowBranching.UsageVector.MergeChildren):
+       A `finally' block never returns or breaks; improved handling of
+       unreachable code.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * statement.cs (Throw.Resolve): Allow `throw null'.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
+       EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
+       `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
+       MemberLookup would return a wrong event if this is an explicit
+       interface implementation and the class has an event with the same
+       name.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * statement.cs (Block.AddChildVariableNames): New public method.
+       (Block.AddChildVariableName): Likewise.
+       (Block.IsVariableNameUsedInChildBlock): Likewise.
+       (Block.AddVariable): Check whether a variable name has already
+       been used in a child block.
+
+       * cs-parser.jay (declare_local_variables): Mark all variable names
+       from the current block as being used in a child block in the
+       implicit block.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
+       find the symbol writer.
+
+       * driver.cs: csc also allows the arguments to /define being
+       separated by commas, not only by semicolons.
+
+2002-08-23  Martin Baulig  <martin@gnome.org>
+
+       * interface.cs (Interface.GetMembers): Added static check for events.
+
+2002-08-15  Martin Baulig  <martin@gnome.org>
+
+       * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
+       call, use ec.ContainerType.BaseType as queried_type and invocation_type.
+
+       * ecore.cs (Expression.MemberLookup): Added documentation and explained
+       why the MethodData.EmitDestructor() change was necessary.
+
+2002-08-20  Martin Baulig  <martin@gnome.org>
+
+       * class.cs (TypeContainer.FindMembers): Added static check for events.
+
+       * decl.cs (MemberCache.AddMembers): Handle events like normal members.
+
+       * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
+       use Type.GetEvents(), not Type.FindMembers().
+
+2002-08-20  Martin Baulig  <martin@gnome.org>
+
+       * decl.cs (MemberCache): Added a special method cache which will
+       be used for method-only searched.  This ensures that a method
+       search will return a MethodInfo with the correct ReflectedType for
+       inherited methods.      
+
+2002-08-20  Martin Baulig  <martin@gnome.org>
+
+       * decl.cs (DeclSpace.FindMembers): Made this public.
+
+2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * delegate.cs: fixed build on windows.
+       [FIXME:  Filed as bug #29150: MCS must report these errors.]
+
+2002-08-19  Ravi Pratap  <ravi@ximian.com>
+
+       * ecore.cs (StandardConversionExists): Return a false
+       if we are trying to convert the void type to anything else
+       since that is not allowed.
+
+       * delegate.cs (DelegateInvocation.DoResolve): Ensure that
+       we flag error 70 in the event an event is trying to be accessed
+       directly from outside the declaring type.
+
+2002-08-20  Martin Baulig  <martin@gnome.org>
+
+       * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
+       MemberCache from typemanager.cs to decl.cs.
+
+2002-08-19  Martin Baulig  <martin@gnome.org>
+
+       * class.cs (TypeContainer): Implement IMemberContainer.
+       (TypeContainer.DefineMembers): Create the MemberCache.
+       (TypeContainer.FindMembers): Do better BindingFlags checking; only
+       return public members if BindingFlags.Public was given, check
+       whether members are static.
+
+2002-08-16  Martin Baulig  <martin@gnome.org>
+
+       * decl.cs (DeclSpace.Define): Splitted this in Define and
+       DefineMembers.  DefineMembers is called first and initializes the
+       MemberCache.
+
+       * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
+       DefineMembers() on all our DeclSpaces.
+
+       * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
+       but call DefineMembers() on all nested interfaces.  We call their
+       Define() in our new Define() function.
+
+       * interface.cs (Interface): Implement IMemberContainer.
+       (Interface.Define): Moved all code except the attribute stuf to
+       DefineMembers().
+       (Interface.DefineMembers): Initialize the member cache.
+
+       * typemanager.cs (IMemberFinder): Removed this interface, we don't
+       need this anymore since we can use MemberCache.FindMembers directly.
+
+2002-08-19  Martin Baulig  <martin@gnome.org>
+
+       * typemanager.cs (MemberCache): When creating the cache for an
+       interface type, add all inherited members.
+       (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
+       to `out bool used_cache' and documented it.
+       (TypeManager.MemberLookup): If we already used the cache in the first
+       iteration, we don't need to do the interfaces check.
+
+2002-08-19  Martin Baulig  <martin@gnome.org>
+
+       * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
+       here from IMemberFinder and don't implement this interface anymore.
+       (DeclSpace.MemberCache): Moved here from IMemberFinder.
+
+       * typemanager.cs (IMemberFinder): This interface is now only used by
+       classes which actually support the member cache.
+       (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
+       since we only put DeclSpaces into this Hashtable.
+       (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
+       a dynamic type and TypeHandle.GetTypeHandle() otherwise.
+
+2002-08-16  Martin Baulig  <martin@gnome.org>
+
+       * typemanager.cs (ICachingMemberFinder): Removed.
+       (IMemberFinder.MemberCache): New property.
+       (TypeManager.FindMembers): Merged this with RealFindMembers().
+       This function will never be called from TypeManager.MemberLookup()
+       so we can't use the cache here, just the IMemberFinder.
+       (TypeManager.MemberLookup_FindMembers): Check whether the
+       IMemberFinder has a MemberCache and call the cache's FindMembers
+       function.
+       (MemberCache): Rewrote larger parts of this yet another time and
+       cleaned it up a bit.
+
+2002-08-15  Miguel de Icaza  <miguel@ximian.com>
+
+       * driver.cs (LoadArgs): Support quoting.
+
+       (Usage): Show the CSC-like command line arguments.
+
+       Improved a few error messages.
+
+2002-08-15  Martin Baulig  <martin@gnome.org>
+
+       * typemanager.cs (IMemberContainer.Type): New property.
+       (IMemberContainer.IsInterface): New property.
+
+       The following changes are conditional to BROKEN_RUNTIME, which is
+       defined at the top of the file.
+
+       * typemanager.cs (MemberCache.MemberCache): Don't add the base
+       class'es members, but add all members from TypeHandle.ObjectType
+       if we're an interface.
+       (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
+       is the current type.
+       (MemberCache.CacheEntry.Container): Removed this field.
+       (TypeHandle.GetMembers): Include inherited members.
+
+2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * typemanager.cs: fixed compilation and added a comment on a field that
+       is never used.
+
+2002-08-15  Martin Baulig  <martin@gnome.org>
+
+       * class.cs (ConstructorInitializer.Resolve): In the
+       Expression.MemberLookup call, use the queried_type as
+       invocation_type.
+
+       * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
+       declared' attribute, it's always true.
+       (IMemberContainer.Parent, IMemberContainer.Name): New properties.
+       (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
+       temporary wrapper for FindMembers which tells MemberLookup whether
+       members from the base classes are included in the return value.
+       This will go away soon.
+       (TypeManager.MemberLookup): Use this temporary hack here; once the
+       new MemberCache is completed, we don't need to do the DeclaredOnly
+       looping here anymore since the MemberCache will take care of this.
+       (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
+       (MemberCache): When creating the MemberCache for a class, get
+       members from the current class and all its base classes.
+       (MemberCache.CacheEntry.Container): New field.  This is a
+       temporary hack until the Mono runtime is fixed to distinguish
+       between ReflectedType and DeclaringType.  It allows us to use MCS
+       with both the MS runtime and the unfixed Mono runtime without
+       problems and without accecting performance.
+       (MemberCache.SearchMembers): The DeclaredOnly looping from
+       TypeManager.MemberLookup is now done here.      
+
+2002-08-14  Martin Baulig  <martin@gnome.org>
+
+       * statement.cs (MyStructInfo.MyStructInfo): Don't call
+       Type.GetFields on dynamic types but get the fields from the
+       corresponding TypeContainer.
+       (MyStructInfo.GetStructInfo): Added check for enum types.
+
+       * typemanager.cs (MemberList.IsSynchronized): Implemented.
+       (MemberList.SyncRoot): Implemented.
+       (TypeManager.FilterWithClosure): No need to check permissions if
+       closure_start_type == closure_invocation_type, don't crash if
+       closure_invocation_type is null.
+
+2002-08-13  Martin Baulig  <martin@gnome.org>
+
+       Rewrote TypeContainer.FindMembers to use a member cache.  This
+       gives us a speed increase of about 35% for the self-hosting MCS
+       build and of about 15-20% for the class libs (both on GNU/Linux).
+
+       * report.cs (Timer): New class to get enhanced profiling.  This
+       whole class is "TIMER" conditional since it remarkably slows down
+       compilation speed.
+
+       * class.cs (MemberList): New class.  This is an IList wrapper
+       which we're now using instead of passing MemberInfo[]'s around to
+       avoid copying this array unnecessarily.
+       (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
+       (ICachingMemberFinder, IMemberContainer): New interface.
+       (TypeManager.FilterWithClosure): If `criteria' is null, the name
+       has already been checked, otherwise use it for the name comparision.
+       (TypeManager.FindMembers): Renamed to RealMemberFinder and
+       provided wrapper which tries to use ICachingMemberFinder.FindMembers
+       if possible.  Returns a MemberList, not a MemberInfo [].
+       (TypeHandle): New class, implements IMemberContainer.  We create
+       one instance of this class per type, it contains a MemberCache
+       which is used to do the member lookups.
+       (MemberCache): New class.  Each instance of this class contains
+       all members of a type and a name-based hash table.
+       (MemberCache.FindMembers): This is our new member lookup
+       function.  First, it looks up all members of the requested name in
+       the hash table.  Then, it walks this list and sorts out all
+       applicable members and returns them.
+
+2002-08-13  Martin Baulig  <martin@gnome.org>
+
+       In addition to a nice code cleanup, this gives us a performance
+       increase of about 1.4% on GNU/Linux - not much, but it's already
+       half a second for the self-hosting MCS compilation.
+
+       * typemanager.cs (IMemberFinder): New interface.  It is used by
+       TypeManager.FindMembers to call FindMembers on a TypeContainer,
+       Enum, Delegate or Interface.
+       (TypeManager.finder_to_member_finder): New PtrHashtable.
+       (TypeManager.finder_to_container): Removed.
+       (TypeManager.finder_to_delegate): Removed.
+       (TypeManager.finder_to_interface): Removed.
+       (TypeManager.finder_to_enum): Removed.
+
+       * interface.cs (Interface): Implement IMemberFinder.
+
+       * delegate.cs (Delegate): Implement IMemberFinder.
+
+       * enum.cs (Enum): Implement IMemberFinder.
+
+       * class.cs (TypeContainer): Implement IMemberFinder.
+
+2002-08-12  Martin Baulig  <martin@gnome.org>
+
+       * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
+
+2002-08-12  Martin Baulig  <martin@gnome.org>
+
+       * ecore.cs (ITypeExpression): New interface for expressions which
+       resolve to a type.
+       (TypeExpression): Renamed to TypeLookupExpression.
+       (Expression.DoResolve): If we're doing a types-only lookup, the
+       expression must implement the ITypeExpression interface and we
+       call DoResolveType() on it.
+       (SimpleName): Implement the new ITypeExpression interface.
+       (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
+       hack, the situation that we're only looking up types can't happen
+       anymore when this method is called.  Moved the type lookup code to
+       DoResolveType() and call it.
+       (SimpleName.DoResolveType): This ITypeExpression interface method
+       is now doing the types-only lookup.
+       (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
+       (ResolveFlags): Added MaskExprClass.
+
+       * expression.cs (MemberAccess): Implement the ITypeExpression
+       interface.
+       (MemberAccess.DoResolve): Added support for a types-only lookup
+       when we're called via ITypeExpression.DoResolveType().
+       (ComposedCast): Implement the ITypeExpression interface.
+
+       * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
+       Expression.Resolve() with ResolveFlags.Type instead.
+
+2002-08-12  Martin Baulig  <martin@gnome.org>
+
+       * interface.cs (Interface.Define): Apply attributes.
+
+       * attribute.cs (Attribute.ApplyAttributes): Added support for
+       interface attributes.
+
+2002-08-11  Martin Baulig  <martin@gnome.org>
+
+       * statement.cs (Block.Emit): Only check the "this" variable if we
+       do not always throw an exception.
+
+       * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
+       whether the property has a set accessor.
+
+2002-08-11  Martin Baulig  <martin@gnome.org>
+
+       Added control flow analysis support for structs.
+
+       * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
+       with control flow analysis turned off.
+       (IVariable): New interface.
+       (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
+       returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
+       (FieldExpr.DoResolve): Resolve the instance expression with flow
+       analysis turned off and do the definite assignment check after the
+       resolving when we know what the expression will resolve to.
+
+       * expression.cs (LocalVariableReference, ParameterReference):
+       Implement the new IVariable interface, only call the flow analysis
+       code if ec.DoFlowAnalysis is true.
+       (This): Added constructor which takes a Block argument.  Implement
+       the new IVariable interface.
+       (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
+       DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
+       This does the definite assignment checks for struct members.
+
+       * class.cs (Constructor.Emit): If this is a non-static `struct'
+       constructor which doesn't have any initializer, call
+       Block.AddThisVariable() to tell the flow analysis code that all
+       struct elements must be initialized before control returns from
+       the constructor.
+
+       * statement.cs (MyStructInfo): New public class.
+       (UsageVector.this [VariableInfo vi]): Added `int field_idx'
+       argument to this indexer.  If non-zero, check an individual struct
+       member, not the whole struct.
+       (FlowBranching.CheckOutParameters): Check struct members.
+       (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
+       overloaded versions of these methods which take an additional
+       `int field_idx' argument to check struct members.
+       (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
+       overloaded versions of these methods which take an additional
+       `string field_name' argument to check struct member.s
+       (VariableInfo): Implement the IVariable interface.
+       (VariableInfo.StructInfo): New public property.  Returns the
+       MyStructInfo instance of the variable if it's a struct or null.
+       (Block.AddThisVariable): New public method.  This is called from
+       Constructor.Emit() for non-static `struct' constructor which do
+       not have any initializer.  It creates a special variable for the
+       "this" instance variable which will be checked by the flow
+       analysis code to ensure that all of the struct's fields are
+       initialized before control returns from the constructor.
+       (UsageVector): Added support for struct members.  If a
+       variable/parameter is a struct with N members, we reserve a slot
+       in the usage vector for each member.  A struct is considered fully
+       initialized if either the struct itself (slot 0) or all its
+       members are initialized.
+
+2002-08-08  Martin Baulig  <martin@gnome.org>
+
+       * driver.cs (Driver.MainDriver): Only report an error CS5001
+       if there were no compilation errors.
+
+       * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
+       `UnsafeContext' property to determine whether the parent is in
+       unsafe context rather than checking the parent's ModFlags:
+       classes nested in an unsafe class are unsafe as well.
+
 2002-08-08  Martin Baulig  <martin@gnome.org>
 
        * statement.cs (UsageVector.MergeChildren): Distinguish between