**** Merged r41316 from MCS ****
[mono.git] / mcs / gmcs / ChangeLog
1 2005-03-01  Zoltan Varga  <vargaz@freemail.hu>
2
3         * attribute.cs: Pass -1 to DefineLPArrayInternal if sizeConst or
4         sizeParamIndex is not specified.
5
6 2005-03-01  Marek Safar  <marek.safar@seznam.cz>
7
8         Fix #73117
9         * report.cs (WarningMessage.IsEnabled): Missing null check.
10
11 2005-02-28  Marek Safar  <marek.safar@seznam.cz>
12
13         * attribute.cs (DefinePInvokeMethod): Fix, all data are stored
14         in the fields and not in the properties.
15
16 2005-02-28  Zoltan Varga  <vargaz@freemail.hu>
17
18         * attribute.cs (GetMarshal): Marshal SizeConst and SizeParamIndex 
19         fields as well.
20
21 2005-02-28  Marek Safar  <marek.safar@seznam.cz>
22
23         * attribute.cs: Small refactoring (improved robustness).
24         (ImplOptions, UnmanagedType, UsageAttribute): Removed members.
25         (ValidateGuid): Removed.
26         (Resolve): Removed referenced to above mentioned.
27         (GetAttributeUsage): Made private and changed to work without
28         class assistance.
29         (GetIndexerAttributeValue): Don't crash.
30         (GetConditionalAttributeValue): Ditto.
31         (GetClsCompliantAttributeValue): Ditto.
32         (ExtractSecurityPermissionSet): All attributes exceptions are
33         error 648.
34         (GetPropertyValue): New helper.
35         (GetMethodImplOptions): New method.
36         (DefinePInvokeMethod): Reuse common code. Implemented handling of
37         some missing properties.
38         
39         * class.cs (ClassOrStruct.ApplyAttributeBuilder): Updated.
40         (Method.ApplyAttributeBuilder): Updated.
41         
42         * decl.cs (DeclSpace.ApplyAttributeBuilder): Don't catch shared
43         exception.
44
45 2005-02-28  Raja R Harinath  <rharinath@novell.com>
46
47         Fix #73052.
48         * report.cs (Report.SymbolRelatedToPreviousError): Handle
49         non-simple types (array, pointer, reference).
50
51 2005-02-28  Marek Safar  <marek.safar@seznam.cz>
52
53         * cs-parser.jay: Add errors 1617, 650, 1007, 531, 547, 548
54
55         * class.cs (MethodCore.IsDuplicateImplementation): Special error
56         for operators.
57         (Method.CheckBase): Catch wrong destructor here.
58         (MethodData.Define): Add errors 550, 668.
59
60         * cs-tokenizer.cs (PreProcessPragma): Add warning 1634.
61
62         * ecore.cs (PropertyExpr.DoResolveLValue): Fixed wrong error code.
63
64         * pending.cs (VerifyPendingMethods): Add error 551.
65
66         * typemanager.cs (CSharpName): Next error report helper.
67
68 2005-02-25  Marek Safar  <marek.safar@seznam.cz>
69
70         * attribute.cs (Atttribute.Resolve): Add cache for parameter-less
71         attributes. Removed useless attribute double check.
72         It saves almost 2MBs for corlib.
73
74 2005-02-25  Raja R Harinath  <rharinath@novell.com>
75
76         Fix #72924.
77         * statement.cs (ExpressionStatement.Resolve): Make robust to being
78         called twice in case of error.
79
80 2005-02-23  Chris Toshok  <toshok@ximian.com>
81
82         Fix compiler portions of #72827.
83         * statement.cs (Block.Emit): call Begin/EndScope on the
84         EmitContext instead of the ILGenerator.
85
86         * codegen.cs (EmitContext.BeginScope): new method, call
87         ILGenerator.BeginScope as well as the SymbolWriter's OpenScope (if
88         we have one.)
89         (EmitContext.BeginScope): same, but EndScope and CloseScope
90
91         * symbolwriter.cs (SymbolWriter.OpenScope): get the current il
92         offset and call the superclass's OpenScope(int) with it.
93         (SymbolWriter.CloseScope): get the current il
94         offset and call superclass's CloseScope(int) with it.
95
96 2005-02-23  Marek Safar  <marek.safar@seznam.cz>
97
98         * anonymous.cs (AnonymousMethod.Compatible): Fixed to report
99         CS1677 for out and ref as well.
100
101         * class.cs (Method.Define): Add error CS1599 detection.
102         
103         * cs-parser.jay: Add CS1609, CS1670, CS1627 detection.
104         
105         * cs-tokenizer.cs (xtoken): Add error CS1646 detection.
106         
107         * delegate.cs (Delegate.Define): Add error CS1599 detection.
108         
109         * support.cs.cs (ModifierDesc): New helper method.
110
111 2005-02-23  Raja R Harinath  <rharinath@novell.com>
112             Abin Thomas  <projectmonokochi@rediffmail.com>
113             Anoob V E  <projectmonokochi@rediffmail.com>
114             Harilal P R  <projectmonokochi@rediffmail.com>
115
116         Fix #57851, #72718.
117         * class.cs (ConstructorBuilder.Resolve): Make sure that the second
118         MemberLookup (used for error reporting) actually returns a result.
119         Fix error report number (122, not 112).
120
121 2005-02-22  Abin Thomas  <projectmonokochi@rediffmail.com>
122             Anoob V E  <projectmonokochi@rediffmail.com>
123             Harilal P R  <projectmonokochi@rediffmail.com>
124
125         Fix #71134.
126         * pending.cs (PendingImplementation.GetAbstractMethods):
127         Find NonPublic members too.
128
129 2005-02-22  Marek Safar  <marek.safar@seznam.cz>
130
131         * expression.cs.cs (ConditionalLogicalOperator.DoResolve):
132         Fixed error 217.
133         
134         * class.cs (MethodCore.CheckMethodAgainstBase):
135         Add error 239 report.
136
137 2005-02-21  Marek Safar  <marek.safar@seznam.cz>
138
139         * ecore.cs (PropertyExpr.DoResolve): Add error 214 report.
140         
141         * class.cs (Operator.Define): Add error 217 report.
142         
143 2005-02-21  Raja R Harinath  <rharinath@novell.com>
144
145         Fix #68955.
146         * expression.cs (Invocation.IsApplicable): Make public.
147         (Invocation.IsParamsMethodApplicable): Likewise.
148         * delegate.cs (Delegate.VerifyApplicability): Don't use
149         Invocation.VerifyArgumentCompat for parameter applicability
150         testing.  Use Invocation.IsApplicable and
151         Invocation.IsParamsMethodApplicable.
152
153 2005-02-21  Marek Safar  <marek.safar@seznam.cz>
154
155         * ecore.cs (PropertyExpr.DoResolve): Add error 214 report.
156         
157         * class.cs (Operator.Define): Add error 217 report.
158         
159 2005-02-21  Raja R Harinath  <rharinath@novell.com>
160
161         * namespace.cs (UsingEntry.Resolve): Undo change below.
162
163 2005-02-21  Raja R Harinath  <rharinath@novell.com>
164
165         Fix #72756.
166         * ecore.cs (Expression.MemberLookupFailed): Add argument to
167         disable the error message when the extended MemberLookup also
168         fails.
169         (Expression.MemberLookupFinal): Update.
170         (SimpleName.DoSimpleNameResolve): Update.
171         * expression.cs (MemberAccess.ResolveNamespaceOrType):
172         Don't use MemberLookupFinal.
173         (New.DoResolve): Update.
174         (BaseAccess.CommonResolve): Update.
175
176 2005-02-21  Raja R Harinath  <rharinath@novell.com>
177
178         Fix #72732.
179         * attribute.cs (Attribute.ResolveType): If a 'resolve_error' had
180         occured previously, don't resolve again.
181
182 2005-02-21  Marek Safar  <marek.safar@seznam.cz>
183
184         Fix #69949
185         * attribute.cs (Attribute.GetAttributeUsage): Add EmitContext
186         argument. Call ResolveAttributeUsage for unresolved.
187         when types doesn't match ctor arguments.
188         
189         * class.cs (DoDefineMembers.TypeContainer): Removed safety check
190         for nested attribute classes.
191         (Class.attribute_usage): Removed.
192         (Class.ResolveAttributeUsage): Resolves AttributeUsageAttribute
193         for attribute class.
194         
195         * ecore.cs (IsAttribute): Removed.
196         
197         * namespace.cs (UsingEntry.Resolve): Don't destroy NamespaceEntry.
198         
199         * rootcontext.cs (RegisterAttribute): Removed, attributes are
200         now normal types.
201         (attribute_types): Removed.
202         (EmitCode): Global attributes are emited as the latest.
203
204 2005-02-18  Marek Safar  <marek.safar@seznam.cz>
205
206         * class.cs (EmitFieldInitializers): Don't emit field initializer
207         for default values when optimilization is on.
208         
209         * constant.cs (Constant.IsDefaultValue): New property.
210         
211         * driver.cs: Add /optimize handling.
212         
213         * constant.cs,
214         * ecore.cs,
215         * literal.cs: Implement new IsDefaultValue property.
216         
217         * rootcontext.cs (Optimize): New field, holds /optimize option.
218
219 2005-02-18  Raja R Harinath  <rharinath@novell.com>
220
221         Fix crasher in re-opened #72347.
222         * namespace.cs (Namespace.Lookup): Return null if
223         DeclSpace.DefineType returns null.
224
225         Fix #72678.
226         * expression.cs (Argument.Resolve): Handle a case of CS0120 here.
227
228 2005-02-18  Raja R Harinath  <rharinath@novell.com>
229
230         Fix remainder of #63202.  Change semantics of DoResolveLValue: it
231         now returns null if it cannot resolve to an lvalue.
232         * ecore.cs (Expression.DoResolveLValue): Return 'null' by default.
233         (Expression.ResolveLValue): Emit CS0131 error if DoResolveLValue
234         returned null.  Remove check for SimpleName.
235         (EventExpr.DoResolveLValue): New.
236         * iterators.cs (Iterator.FieldExpression.DoResolveLValue): New.
237         * expression.cs (Argument.Error_LValueRequired): New.  Move CS1510
238         error from ...
239         (Argument.Resolve): ... here.  Use it.  Use DoResolveLValue to
240         avoid CS0131 error.
241         (Unary.ResolveOperator): Move CS0211 check ...
242         (Unary.DoResolve): ... here.  Use DoResolveLValue to avoid
243         CS0131 error.
244         (Unary.DoResolveLValue): Simplify.
245         (AddressOf.DoResolveLValue): New.
246         (ArrayAccess.DoResolveLValue): New.
247
248 2005-02-16  Marek Safar  <marek.safar@seznam.cz>
249
250         * attribute.cs (Attribute.Resolve): Add arguments casting for
251         when types doesn't match ctor arguments.
252
253 2005-02-16  Raja R Harinath  <rharinath@novell.com>
254
255         Fix parts of #63202.
256         * expression.cs (UnaryMutator.ResolveOperator): Remove redundant
257         lookup of operator in base type.  Ensure that all checks happen
258         when the operator resolves to an "op_..." method.
259
260 2005-02-15  Raja R Harinath  <rharinath@novell.com>
261
262         Fix #71992.
263         * namespace.cs (NamespaceEntry.LookupNamespaceOrType): Add
264         'ignore_cs0104' parameter.  Pass it to ...
265         (NamespaceEntry.Lookup): ... this.
266         * decl.cs (DeclSpace.LookupType): Add 'ignore_cs0104' parameter.
267         * ecore.cs (SimpleName.ResolveAsTypeStep): Update.
268         (TypeLookupExpression.DoResolveAsTypeStep): Update.
269         * expression.cs (MemberAccess.IdenticalNameAndTypeName):
270         Update.  Request that cs0104 errors be ignored.
271         (ComposedCast.ResolveAsTypeStep): Update.
272
273 2005-02-14  Raja R Harinath  <rharinath@novell.com>
274
275         Fix #59209.
276         * expression.cs (Invocation.BetterFunction): Remove support for
277         comparing virtual functions and their overrides.
278         (Invocation.IsOverride): New.
279         (Invocation.OverloadResolve): Don't consider 'override' functions
280         during candidate selection.  Store them in a lookaside list.
281         If the selected method is a 'virtual' function, use the list to
282         find any overrides that are closer to the LHS type.
283
284 2005-02-14  Marek Safar  <marek.safar@seznam.cz>
285
286         * expression.cs (New.DoResolve): Add complex core type reduction.
287         (New.Constantify): Converts complex core type syntax like 'new int ()'
288         to simple constant.
289         
290 2005-02-14  Raja R Harinath  <rharinath@novell.com>
291
292         * decl.cs (EntryType.EntryType): New constructor to create an
293         updated copy of a cache entry.
294         (MemberCache.AddMethods): Use it.
295         (MemberCache.ClearDeclaredOnly): Remove.
296         (MemberCache.MemberCache): Update.
297
298 2005-02-11  Miguel de Icaza  <miguel@novell.com>
299
300         * codegen.cs (EmitContext): Introduce the `MethodIsStatic'
301         variable.  This one is represents the actual low-level declaration
302         of the method, as opposed to the semantic level `IsStatic'.   
303
304         An anonymous method which is hosted into a static method might be
305         actually an instance method.  IsStatic would reflect the
306         container, while MethodIsStatic represents the actual code
307         generated.
308
309         * expression.cs (ParameterReference): Use the new MethodIsStatic
310         instead of IsStatic.
311
312         * anonymous.cs (AnonymousMethod.Compatible): Pass the
313         Modifiers.STATIC to the Anonymous' Method EmitContext if static is
314         set on the current EmitContext. 
315
316         * expression.cs (Cast): Overload DoResolveLValue so we can pass
317         resolve our casted expression as an LValue.  This triggers the
318         proper LValue processing that is later required by Assign.
319
320         This fixes 72347.
321
322         * cs-tokenizer.cs (pp_and): recurse on pp_and, fixes #61903.
323
324 2005-02-11  Marek Safar  <marek.safar@seznam.cz>
325
326         C# 2.0 Fixed buffer implementation
327
328         * anonymous.cs: Update after RegisterHelperClass renaming.
329
330         * attribute.cs (AttributeTester.fixed_buffer_cache):
331         Cache of external fixed buffers.
332         (AttributeTester.GetFixedBuffer): Returns IFixedBuffer
333         implementation if field is fixed buffer else null.
334
335         * class.cs
336         (TypeContainer.AddField): Accept FieldMember instead of Field.
337         (FieldBase.IsFieldClsCompliant): Extracted code from
338         VerifyClsCompliance descendant customization.
339         (FixedField): New class handles fixed buffer fields.
340         (FixedFieldExternal): Keeps information about imported fixed
341         buffer.
342         (IFixedField): Make access to internal or external fixed buffer
343         same.
344
345         * cs-parser.jay: Add fixed buffer parsing.
346
347         * ecore.cs (FieldExpr.Emit): Add special emit case for fixed
348         buffer.
349
350         * expression.cs (Indirection): Extended implementation to accept
351         fixed buffer field.
352         (PointerArithmetic.Emit): Get element from fixed buffer as well.
353         (ElementAccess.MakePointerAccess): Get type as parameter.
354         (DoResolve): Add fixed buffer field expression conversion.
355         (DoResolveLValue): Ditto.
356         (FixedBufferPtr): New class. Moved most of original ArrayPtr.
357         (ArrayPtr): Derives from FixedBufferPtr.
358         (ArrayPtr.Emit): Add extra emit for array elements.
359
360         * flowanalysis.cs.cs (StructInfo): Use FieldMember.
361
362         * rootcontext.cs (CloseTypes): Emit CompilerGenerated attribute
363         for compiler generated types.
364         (RegisterCompilerGeneratedType): Renamed from RegisterHelperClass.
365
366         * statement.cs (Fixed): Refactored to be easier add fixed buffer
367         and consume less memory.
368         (Fixed.Resolve): Add fixed buffer case.
369
370         * typemanager.cs (compiler_generated_attr_ctor,
371         fixed_buffer_attr_ctor): Add new 2.0 compiler attributes.
372         (HasElementType): Add our own implementation to work on every
373         runtime.
374
375 2005-02-11  Miguel de Icaza  <miguel@novell.com>
376
377         * anonymous.cs (CaptureContext): Track whether `this' has been
378         referenced.   
379
380         * expression.cs (This.ResolveBase): Call CaptureThis.  Before we
381         only captured `this' if it was implicitly done (instance
382         methods/variables were used). 
383
384         * codegen.cs (EmitContext.CaptureThis): New method to flag that
385         `this' must be captured.
386
387 2005-01-30  Miguel de Icaza  <miguel@novell.com>
388  
389         * anonymous.cs (CreateMethodHost): If there Scope.ScopeTypeBuilder
390         is null it means that there has been no need to capture anything,
391         so we just create a sibling.
392
393         Renamed `EmitHelperClasses' to `EmitAnonymousHelperClasses'
394
395         Just a partial fix.  The other half is fairly elusive.
396         
397 2005-02-10  Raja R Harinath  <rharinath@novell.com>
398
399         Fix #52586, cs0121-4.cs.
400         * decl.cs (MemberCache.DeepCopy): Rename from SetupCache.  Take
401         and return a hashtable.
402         (MemberCache.ClearDeclaredOnly): New.
403         (MemberCache.MemberCache): Update to change.  Make a deep copy of
404         the method_hash of a base type too.
405         (MemberCache.AddMethods): Adapt to having a deep copy of the base
406         type methods.  Overwrite entries with the same MethodHandle so
407         that the ReflectedType is correct.  The process leaves in base
408         virtual functions and their overrides as distinct entries.
409         (CacheEntry): Now a class instead of a struct.  It shouldn't alter
410         matters since it was boxed in a ArrayList before.
411         (CacheEntry.Member, CacheEntry.EntryType): Remove 'readonly'
412         modifier.
413         * expression.cs (Invocation.BetterFunction): Simplify.  Handle the
414         case of a virtual function and its override (choose the overload
415         as better).
416         (Invocation.OverloadResolve): Avoid 'override' members during
417         'applicable_type' calculation.
418
419 2005-03-28  Raja R Harinath  <rharinath@novell.com>
420
421         * typemanager.cs (TypeHandle.BaseType): Make into an IMemberContainer.
422         (TypeHandle.TypeHandle): Use LookupMemberCache rather than
423         GetTypeHandle.  It is possible for a reflected type to derive from
424         a TypeBuilder (e.g., int[] derives from the TypeBuilder
425         System.Array during mscorlib compilation).
426         * decl.cs (MemberCache.MemberCache): If the base cache doesn't
427         contain a method_hash, don't create one either.  Don't create a
428         deep copy of the base cache's method_hash.
429         (MemberCache.SetupCache): Rename back from DeepCopy.
430         (MemberCache.AddMethods): Rewrite, now that method_hash isn't
431         already initialized.  If we see an override function, add its
432         underlying base virtual function to the member_hash too.
433
434 2005-02-09  Raja R Harinath  <rharinath@novell.com>
435
436         Combine two near-redundant caches.
437         * typemanager.cs (method_params): Rename from method_internal_params.
438         (TypeManager.GetParameterData): New.  Replace
439         Invocation.GetParameterData.
440         (TypeManager.LookupParametersByBuilder): Remove.
441         * expression.cs (Invocation.method_parameter_cache): Remove.
442         (Invocation.GetParameterData): Remove.
443         Update to changes.
444         * anonymous.cs, attribute.cs, convert.cs, delegate.cs:
445         Update to changes.
446
447 2005-02-08  Raja R Harinath  <rharinath@novell.com>
448
449         Fix #72015.
450         * delegate.cs (Delegate.DefineType): When bootstrapping corlib, if
451         TypeManager.multicast_delegate_type is null, resolve it by looking
452         up "System.MulticastDelegate".
453         * rootcontext.cs (RootContext.ResolveCore): Simplify.
454
455 2005-02-07  Abin Thomas (NOSIP)  <projectmonokochi@rediffmail.com>
456             Anoob V.E (NOSIP)  <projectmonokochi@rediffmail.com>
457             Harilal P.R (NOSIP)  <projectmonokochi@rediffmail.com>
458
459         Fix cs0164.cs.
460         * statement.cs (LabeledStatement.Resolve): Don't set 'referenced'.
461         (LabeledStatement.AddReference): New.  Set 'referenced'.
462         (Goto.Resolve): Use it.
463
464 2005-02-05  John Luke  <john.luke@gmail.com>
465
466         * driver.cs: remove duplicate -doc line in Usage ()
467
468 2005-02-04  Raja R Harinath  <rharinath@novell.com>
469
470         * location.cs (Location.AddFile): Fix CS2002 error report.
471
472 2005-02-02  Martin Baulig  <martin@ximian.com>
473
474         * delegate.cs (Delegate.DefineType): Report an internal error if
475         TypeManager.multicast_delegate_type is null.  See bug #72015 for
476         details.        
477
478 2005-02-02  Raja R Harinath  <rharinath@novell.com>
479
480         Fix a crasher in a variant of #31984.
481         * const.cs (Constant.CheckBase): New override that defers the
482         new-or-override check in case the base type hasn't been populated
483         yet.
484         (Constant.Define): Ensure the new-or-override check is performed.
485
486 2005-02-01  Duncan Mak  <duncan@ximian.com>
487
488         * const.cs (LookupConstantValue): Check that `ce' is not null
489         before calling GetValue ().
490
491 2005-02-01  Raja R Harinath  <rharinath@novell.com>
492
493         Fix test-334.cs (#69519).
494         * cs-parser.jay (using_alias_directive): Pass in an expression to
495         NamespaceEntry.UsingAlias.
496         (using_namespace_directive): Pass in an expression to
497         NamespaceEntry.Using.
498         (namespace_name): Don't flatten to a string.
499         * namespace.cs (NamespaceEntry.AliasEntry): Store an expression.
500         (NamespaceEntry.AliasEntry.Resolve): Lookup using
501         ResolveAsTypeStep.
502         (NamespaceEntry.UsingEntry): Likewise.
503         (NamespaceEntry.Using,NamespaceEntry.UsingAlias): Update to
504         changes.
505         (NamespaceEntry.LookupForUsing): Remove.
506         (NamespaceEntry.LookupNamespaceOrType): Add support for dotted
507         names.
508         (NamespaceEntry.Lookup): Remove support for dotted names.
509
510 2005-02-01  Raja R Harinath  <rharinath@novell.com>
511
512         * namespace.cs (NamespaceEntry.NamespaceEntry): Simplify, and
513         split into two.
514         (NamespaceEntry.ImplicitParent): Compute on demand.
515         (NamespaceEntry.Doppelganger): New implicit namespace-entry that
516         parallels the current.
517         (NamespaceEntry.LookupForUsing): Use it.
518         (NamespaceEntry.Lookup): If the current namespace-entry is
519         implicit, don't search aliases and using tables.
520
521 2005-02-01  Raja R Harinath  <rharinath@novell.com>
522
523         Fix #31984.
524         * class.cs (TypeContainer.DoDefineMembers): Don't initialize
525         BaseCache here.
526         (TypeContainer.BaseCache): Compute on demand.
527         (TypeContainer.FindMembers): Define constants and types if they're
528         not already created.
529         (FieldMember.Define): Move resetting of ec.InUnsafe before error
530         check.
531         * const.cs (Constant.Define): Make idempotent.
532
533 2005-01-29  Miguel de Icaza  <miguel@novell.com>
534
535         * pending.cs: Produce better code (no nops produced by using Ldarg
536         + value).
537         
538         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
539         i - 1' it should be arg + 1.
540
541         Fixes bug #71819.
542
543 2005-01-28  Raja R Harinath  <rharinath@novell.com>
544
545         * attribute.cs (Attribute.CheckAttributeType): Make private
546         non-virtual.
547         (Attribute.ResolveType): Make virtual.
548         (GlobalAttribute.ResolveType,GlobalAttribute.Resolve): Simplify
549         handling of RootContext.Tree.Types.
550
551 2005-01-27  Raja R Harinath  <rharinath@novell.com>
552
553         Update attribute-handling to use the SimpleName/MemberAccess
554         mechanisms.
555         * cs-parser.jay (attribute): Pass in an expression to the
556         constructors of Attribute and GlobalAttribute.
557         * attribute.cs (Attribute): Take an expression for the name.
558         (Attribute.ResolvePossibleAttributeTypes): New.  Resolves the
559         passed in attribute name expression.
560         (Attribute.CheckAttributeType): Use it.
561         * ecore.cs (FullNamedExpression.ResolveAsTypeStep): New.
562         * expression.cs (MemberAccess.ResolveAsTypeStep): Move body to ...
563         (MemberAccess.ResolveNamespaceOrType): ... here.  Add 'silent'
564         argument to prevent error messages if the lookup fails.
565
566 2005-01-27  Marek Safar  <marek.safar@seznam.cz>
567
568         * expression.cs (Indirection): Implemented IVariable interface
569         to support indirection in AddressOf operator.
570         (PointerArithmetic.Emit): Add optimalization for case where
571         result can be precomputed.
572
573 2005-01-26  Martin Baulig  <martin@ximian.com>
574
575         * class.cs (TypeContainer.AttributeTargets): Return the correct
576         AttributeTargets depending on our `Kind' instead of throwing an
577         exception; fixes #71632.
578
579 2005-01-26  Marek Safar  <marek.safar@seznam.cz>
580
581         Fix #71257
582         * expression.cs (MemberAccess.ResolveMemberAccess): Add CS0176 test for
583         constant members.
584
585 2005-03-17  Martin Baulig  <martin@ximian.com>
586
587         * anonymous.cs (AnonymousMethod.method_modifiers): Change default
588         from `Modifiers.INTERNAL' to `Modifiers.PRIVATE'.  Fixes #73260.
589
590 2005-03-17  Martin Baulig  <martin@ximian.com>
591
592         * anonymous.cs (AnonymousMethod.EmitMethod): Changed return type
593         to bool so we can return an error condition.
594         (AnonymousDelegate.Emit): Check whether AnonymousMethod.EmitMethod()
595         returned an error.
596
597 2005-03-17  Martin Baulig  <martin@ximian.com>
598
599         * generic.cs (TypeMananager.IsIEnumerable): New public method.
600
601         * convert.cs (Convert.ImplicitReferenceConversion(Exists)): Allow
602         converting from an array-type of T to `IEnumerable<T>'.
603
604 2005-03-16  Martin Baulig  <martin@ximian.com>
605
606         * generic.cs (Nullable.Unwrap): Implement IAssignMethod.
607         (Nullable.LiftedUnaryMutator): New public class.
608
609         * expression.cs (UnaryMutator.DoResolve): Added support for
610         Nullable Types.
611
612 2005-03-14  Martin Baulig  <martin@ximian.com>
613
614         * generic.cs (Nullable.NullCoalescingOperator): Implemented.
615
616 2005-03-14  Martin Baulig  <martin@ximian.com>
617
618         * generic.cs (Nullable.LiftedBinaryOperator): Added support for
619         the comparision operators `<', `>', `<=' and `>='.
620
621 2005-03-13  Martin Baulig  <martin@ximian.com>
622
623         * generic.cs
624         (Nullable.NullLiteral): Renamed to `Nullable.NullableLiteral' to
625         avoid confusion with the `NullLiteral'.
626         (Nullable.LiftedBinaryOperator): Correctly implement `==' and '!='.
627
628 2005-03-13  Martin Baulig  <martin@ximian.com>
629
630         * expression.cs (Binary.ResolveOperator): For `==' and `!=', allow
631         comparing arbitrary types with the null literal.
632
633 2005-03-13  Martin Baulig  <martin@ximian.com>
634
635         * generic.cs (Nullable.LiftedBinaryOperator): Add support for the
636         boolean operators '&&', '||', '&' and '|'.
637         (Nullable.OperatorTrueOrFalse): New public class.
638
639         * ecore.cs (Expression.GetOperatorTrue/False): Return an `Expression'
640         instead of a `StaticCallExpr'; added support for nullables.
641
642 2005-03-10  Martin Baulig  <martin@ximian.com>
643
644         * expression.cs
645         (ArrayAccess.EmitDynamicInitializers): Use `etype.IsValueType'
646         rather than `etype.IsSubclassOf (TypeManager.value_type)'.      
647
648 2005-03-07  Martin Baulig  <martin@ximian.com>
649
650         * generic.cs (Nullable.Unwrap): Implement IMemoryLocation and make
651         it work if `expr' is not an IMemoryLocation.
652         (Nullable.Lifted): Implement IMemoryLocation.
653         (Nullable.LiftedConversion.ResolveUnderlying): Use the correct
654         target type.
655
656 2005-03-05  Martin Baulig  <martin@ximian.com>
657
658         * generic.cs (Nullable.Unwrap, Wrap): New protected classes.
659         (Nullable.Lifted): New abstract class; rewrote the lifted conversions.
660         (Nullable): Added support for lifted unary and binary operators.
661
662         * expression.cs (Unary.DoResolve): Added support for nullable types.
663         (Binary.DoResolve): Likewise.
664         (Conditional.DoResolve): Likewise.
665
666 2005-03-02  Martin Baulig  <martin@ximian.com>
667
668         * decl.cs (DeclSpace.SetParameterInfo): Make this virtual.
669
670         * class.cs (ClassPart.SetParameterInfo): Override this.
671         (PartialContainer.SetParameterInfo): Override this.
672         (TypeContainer.CheckConstraints): New protected method.
673         (PartialContainer.CheckConstraints): Override this and check
674         whether the same contraints were specified in all parts of a
675         partial generic type definition.
676         (PartialContainer.UpdateConstraints): New public method.
677
678         * generic.cs (TypeParameter.UpdateConstraints): New public method.
679
680 2005-03-02  Martin Baulig  <martin@ximian.com>
681
682         Committing a patch from Carlos Alberto Cortez to fix #72887.
683
684         * convert.cs (Convert.ExplicitReferenceConversionExists): Allow
685         casts from `T []' to `int []'.
686
687 2005-03-02  Martin Baulig  <martin@ximian.com>
688
689         * generic.cs (TypeManager.IsEqual): Make this symmetric.
690
691         * expression.cs (Binary.ResolveOperator): When resolving a
692         BinaryDelegate, use `TypeManager.IsEqual (l, r)' rather than just
693         `=='.  Fixes #71866.  See gen-127.cs.
694
695 2005-03-02  Martin Baulig  <martin@ximian.com>
696
697         * class.cs (TypeContainer.DoDefineMembers): We also need a default
698         static constructor in static classes.
699
700 2005-03-02  Martin Baulig  <martin@ximian.com>
701
702         * generic.cs
703         (NullableType.Name, NullableType.FullName): Add a "?" to the name.
704         (Nullable.LiftedConversion): Added support for user-defined
705         conversions.
706
707         * cs-tokenizer.cs (Tokenizer.PutbackCloseParens): New public method.
708
709         * cs-parser.jay: Use ComposedCast everywhere instead of
710         NullableType, so we don't need to check for NullableType
711         everywhere.
712         (conditional_expression): Added `INTERR CLOSE_PARENS' rule for the
713         case where we'll be resolved into a `parenthesized_expression_0'
714         afterwards.
715
716         * convert.cs
717         (Convert.UserDefinedConversion): Added nullable conversions.
718
719 2005-02-28  Martin Baulig  <martin@ximian.com>
720
721         * generic.cs (TypeManager.IsNullableType): New static method.
722         (Nullable): New abstract class.
723         (Nullable.NullLiteral): New public class.
724         (Nullable.LiftedConversion): New public class.
725
726         * cs-parser.jay (non_expression_type): Changed `builtin_types' to
727         `builtin_types opt_nullable'.
728
729         * convert.cs
730         (Convert.ImplicitConversionStandard): Added nullable conversions.
731         (Convert.ExplicitConversionStandard): Likewise.
732         (Convert.ExplicitConversion): Likewise.
733
734 2005-02-26  Martin Baulig  <martin@ximian.com>
735
736         * expression.cs (ComposedCast.DoResolveAsTypeStep): Allow `dim' to
737         begin with a "?", for instance "?[]".  Don't do a type lookup if
738         `dim' is empty.
739
740 2005-02-25  Martin Baulig  <martin@ximian.com>
741
742         The first part of Nullable Types :-)
743
744         * generic.cs (NullableType): New public class.
745         (NullCoalescingOperator): New public class.
746         (TypeArguments.Resolve): Add a CS0306 check.
747
748         * cs-parser.jay (opt_error_modifier): Removed, this was unused.
749         (opt_nullable): New rule.
750         (type): Added `opt_nullable' to `namespace_or_type_name',
751         `builtin_types' and `pointer_type'.
752         (array_type): Added `opt_nullable'.
753         (opt_rank_specifier_or_nullable): New rule; this is the
754         combination of `opt_rank_specifier' and `opt_nullable'.
755         (opt_error): New rule; catch errors here.
756         (nullable_type_or_conditional): New rule; we use this to check for
757         nullable and still detect the conditional operator.
758         (local_variable_type): Use `opt_rank_specifier_or_nullable'
759         instead `opt_rank_specifier'.
760
761         * expression.cs (ComposedCast.DoResolveAsTypeStep): Added support
762         for nullables.
763
764 2005-02-24  Martin Baulig  <martin@ximian.com>
765
766         * README, README.Changes: Removed; they're old and obsolete.
767
768 2005-02-22  Martin Baulig  <martin@ximian.com>
769
770         * generic.cs (TypeParameter.Resolve): If resolving the constraints
771         returned an error, set `constraints' to null to avoid a crash
772         later on.
773         (TypeParameter.ResolveType): Likewise.
774
775 2005-02-22  Martin Baulig  <martin@ximian.com>
776
777         * generic.cs
778         (Constraints.ResolveTypes): Protect against being called twice.
779         (Constraints.CheckInterfaceMethod): Don't call ResolveTypes().
780         (TypeParameter.ResolveType): New public method; calls
781         constraints.ResolveTypes().
782         (TypeParameter.DefineType): Moved constraints.ResolveType() out
783         into the new ResolveType().
784         (GenericMethod.Define): Call ResolveType() on all our
785         TypeParameter's.        
786
787 2005-02-21  Martin Baulig  <martin@ximian.com>
788
789         * generic.cs
790         (TypeManager.generic_nullable_type): New static public field.
791         (TypeManager.InitGenericCoreType): Lookup "System.Nullable`1".
792
793         * rootcontext.cs
794         (RootContext.ResolveCore): Resolve "System.Nullable`1".
795
796 2005-02-15  Martin Baulig  <martin@ximian.com>
797
798         * generic.cs (ConstructedType.Constraints): Correctly check
799         constraints if the argument type is a type parameter; fixes
800         #72326. 
801
802 2005-02-02  Martin Baulig  <martin@ximian.com>
803
804         * delegate.cs (Delegate.DefineType): Report an internal error if
805         TypeManager.multicast_delegate_type is null.  See bug #72015 for
806         details.        
807
808 2005-01-29  Miguel de Icaza  <miguel@novell.com>
809
810         * pending.cs: Produce better code (no nops produced by using Ldarg
811         + value).
812         
813         * pending.cs (PendingImplementation.DefineProxy): It was not `arg
814         i - 1' it should be arg + 1.
815
816         Fixes bug #71819.
817         
818 2005-01-26  Martin Baulig  <martin@ximian.com>
819
820         * cs-parser.jay (indexer_declarator): Don't report an error if we
821         have type parameters since we can be an explicit interface
822         implementation; fixes #71449.
823
824 2005-01-26  Martin Baulig  <martin@ximian.com>
825
826         * class.cs (TypeContainer.AttributeTargets): Return the correct
827         AttributeTargets depending on our `Kind' instead of throwing an
828         exception; fixes #71632.
829
830 2005-01-26  Martin Baulig  <martin@ximian.com>
831
832         * delegate.cs (Delegate.DefineType): Correctly define our type
833         parameters.  Fixes #71483.
834
835 2005-01-25  Raja R Harinath  <rharinath@novell.com>
836
837         Fix #71602.
838         * expression.cs (MemberAccess.DoResolve): Don't complain with
839         cs0572 when the LHS of a member access has identical name and type
840         name.
841
842 2005-01-25  Marek Safar  <marek.safar@seznam.cz>
843
844         Fix #71651, #71675
845         * attribute.cs (ExtractSecurityPermissionSet): Catch exceptions from
846         CreatePermission.
847         Create custom PermissionSet only for PermissionSetAttribute.
848
849 2005-01-24  Marek Safar  <marek.safar@seznam.cz>
850
851         Fix #71649
852         * class.cs (StaticClass.DefineContainerMembers): Enable enums and
853         delegates in static class.
854
855 2005-01-24  Martin Baulig  <martin@ximian.com>
856
857         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
858         merging an implicit block, just use its reachability.
859
860         * statement.cs (Block.Resolve): Make the unreachable code check
861         work wrt. implicit blocks; see test-337 from #63842.
862
863 2005-01-21  Alp Toker  <alp@atoker.com>
864  
865         * cs-parser.jay: destructor_declaration's container is PartialContainer
866         not Class when partial types are used, so use Kind prop instead of
867         'is'.
868         
869 2005-01-22  Miguel de Icaza  <miguel@ximian.com>
870
871         * cs-parser.jay: Improve error reporting when an interface
872         declares new types.
873
874 2005-01-20  Dick Porter  <dick@ximian.com>
875
876         * support.cs: SeekableStreamReader fix from Sandor Dobos
877         (dobos_s@ibcnet.hu) to cope with Position setting when multibyte
878         chars are read.  Fixes bug 70369.
879
880 2005-01-20  Raja R Harinath  <rharinath@novell.com>
881
882         * cs-parser.jay (catch_clause): Simplify current_block handling
883         somewhat.
884
885 2005-01-17  Miguel de Icaza  <miguel@ximian.com>
886
887         * convert.cs (ImplicitStandardConversionExists): Synchronize the
888         code with ImplicitStandardConversion to handle the implicit
889         conversion of method groups into valid delegate invocations. 
890
891         The problem is that in parameter handling we were using this code
892         path.  Fixes bug #64698
893
894 2005-01-19  Raja R Harinath  <rharinath@novell.com>
895
896         * cs-parser.jay: Fix several infelicities.
897         - Avoid assigning to the parser value stack.  Code like 
898           '$3 = null' is unclean.  Synthesize a value for the code block
899           instead. 
900         - Avoid using oob_stack for storing location information.  Use ...
901         (_mark_): ... this.  New (empty) rule.  Saves the current location
902         in $$.
903         (foreach_statement): Avoid using oob_stack for current_block
904         handling.  Use technique used in for_statement and
905         using_statement.  Synthesize a value for the code block to store
906         additional intermediate information.
907
908 2005-01-13  Miguel de Icaza  <miguel@ximian.com>
909
910         * ecore.cs (IsAccessorAccessible): Accessibility to private fields
911         of a different type is only allowed to private fields of a
912         containing type, not on fields of a base class.
913
914         See test-174.cs and error cs0122-9.cs
915
916 2005-01-13  Raja R Harinath  <rharinath@novell.com>
917
918         Fix test-335.cs (bug #58126).
919         * cs-parser.jay (argument): Split out non-expression parts of the
920         rule into 'non_simple_argument'.
921         (invocation_expression): Support parenthesized invocations with
922         multiple arguments, and with single non-simple arguments.
923
924 2005-01-13  Raja R Harinath  <rharinath@novell.com>
925
926         * cs-tokenizer.cs (xtoken): Reset 'comments_seen' in a couple more
927         places.
928
929 2005-01-12  Raja R Harinath  <rharinath@novell.com>
930
931         Fix cs0038-1.cs, cs1640-6.cs.
932         * ecore.cs (Expression.Resolve): Remove special-case for
933         SimpleName in error-handling.
934         (Expression.almostMatchedMembers): Relax access permission to
935         protected.
936         (Expression.MemberLookupFailed): Handle duplicates in
937         almostMatchedMembers list.
938         (SimpleName.DoSimpleNameResolve): Catch CS0038 errors earlier.
939         * expression.cs (New.DoResolve): Report CS1540 for more cases.
940         * typemanager.cs (GetFullNameSignature): Use the MethodBase
941         overload if the passed in MemberInfo is a MethodBase.
942
943 2005-01-25  Martin Baulig  <martin@ximian.com>
944
945         * doc.cs
946         (DocUtil.emptyParamList): Removed; use `Type.EmptyTypes' instead.
947
948 2005-01-12  Marek Safar  <marek.safar@seznam.cz>
949
950         Fix #70749
951         * attribute.cs (ExtractSecurityPermissionSet): Don't report error
952         for non-CAS & merge permission sets properly.
953
954 2005-01-11  Raja R Harinath  <rharinath@novell.com>
955
956         Improve standard-compliance of simple name and member access 
957         resolution.  Fixes bugs #52697, #57200, #67520, #69519.
958         * ecore.cs (FullNamedExpression): New abstract base class 
959         for Namespaces and TypeExpressions.
960         (ResolveFlags.SimpleName): Remove.
961         (SimpleName): Remove support for dotted names.
962         (SimpleName.ResolveAsTypeStep): Simplify.  Now just a wrapper to 
963         DeclSpace.FindType and DeclSpace.LookupType.
964         (SimpleName.DoSimpleNameResolve): Remove support for dotted names.
965         (Expression.ExprClassName): Make member function.
966         * expression.cs (MemberAccess.ResolveAsTypeStep): Support LHS being
967         a namespace.  Remove creation of dotted "SimpleName"s.
968         (MemberAccess.DoResolve): Likewise.
969         * decl.cs (DeclSpace.Cache): Make private.
970         (DeclSpace.LookupInterfaceOrClass): Return a FullNamedExpression.
971         (DeclSpace.FindType): Update.
972         (DeclSpace.LookupType): Move here from RootContext.  Return a 
973         FullNamedExpression.
974         * namespace.cs (Namespace): Derive from FullNamedExpression
975         so that it can be part of expression resolution.
976         (Namespace.Lookup): Return an FullNamedExpression.
977         (NamespaceEntry.LookupAlias): Lookup aliases only in current
978         namespace.
979         * rootcontext.cs (NamespaceLookup): Remove.
980         (LookupType): Move to DeclSpace.
981         * attribute.cs (CheckAttributeType): Update.
982         * doc.cs (FindDocumentedType): Remove allowAlias argument.
983         (FindDocumentedTypeNonArray): Likewise.
984
985 2005-01-11  Raja R Harinath  <rharinath@novell.com>
986
987         Fix cs0509.cs, cs1632.cs.
988         * class.cs (TypeContainer.GetNormalBases): Don't assume !IsClass
989         is the same as IsInterface.
990         (TypeContainer.GetClassBases): Likewise.
991         * statement.cs (LabeledStatement.ig): New field.
992         (LabeledStatement.LabelTarget): Save ILGenerator which created the
993         label.
994         (LabeledStatement.DoEmit): Check that the label was created with
995         the same ILGenerator.
996
997 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
998
999         Fix #71058
1000         * attribute.cs (GetMethodObsoleteAttribute): Need to transform
1001         accessors to its properties.
1002
1003         * ecore.cs (PropertyExpr): Add AccessorTable to help track back
1004         from accessors to property.
1005         
1006 2005-01-10  Marek Safar  <marek.safar@seznam.cz>
1007
1008         Fix #70722
1009         * class.cs (MethodCore.CheckBase): Test base method obsoleteness
1010         only for overrides.
1011         
1012 2005-01-08  Miguel de Icaza  <miguel@ximian.com>
1013
1014         * attribute.cs: Check for null and empty strings.  
1015
1016         I have lost another battle to Paolo.
1017
1018 2005-01-07  Marek Safar  <marek.safar@seznam.cz>
1019
1020         Fix #70942
1021         * class.cs (PropertyMethod): Set Parent field in ctors.
1022         (SetMethod.InternalParameters): Add unsafe switch hack.
1023         Override MarkForDuplicationCheck where it is appropriate.
1024
1025         * decl.cs (MemberCore.MarkForDuplicationCheck): New method.
1026         It says whether container allows members with the same name.
1027         Base default is no.
1028         (DeclSpace.AddToContainer): Use MarkForDuplicationCheck.
1029         Removed is_method parameter.
1030
1031 2005-01-06  Duncan Mak  <duncan@ximian.com>
1032
1033         * cs-tokenizer.cs (xtoken): Redo the work for signaling CS1040
1034         because the previous change led to incorrect reporting of CS1032
1035         ("Cannot define/undefine preprocessor symbols after first token in
1036         file"). Instead of using `tokens_seen' as the only flag that
1037         triggers CS1040, introduce `comments_seen'. This new flag is used
1038         to signify having seen comments on the current line, so it is
1039         unset after a newline.
1040
1041 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
1042
1043         * doc.cs : When searching for a type, find nested type too.
1044           This fixes bug #71040.
1045
1046 2005-01-06  Atsushi Enomoto  <atsushi@ximian.com>
1047
1048         * doc.cs :
1049           - Warn missing member comment on those classes which also does not
1050             have doc comments. Fixed bug #71041.
1051           - Don't warn missing doc comment on default constructor.
1052             Fixed bug #71042.
1053
1054 2005-01-06  Duncan Mak  <duncan@ximian.com>
1055
1056         * cs-tokenizer.cs (xtoken): After handling traditional C-style
1057         comments, set `tokens_seen' to true. This allows us to detect
1058         misplaced preprocessor directives (i.e. not at the beginning of
1059         the a line, nor after whitespaces). In that case, report error
1060         CS1040. This fixes bug #56460.
1061
1062         * cs-parser.jay (interface_member_declaration): Add checks for
1063         IsExplicitImpl, and report CS0541 error if an interface member is
1064         defined as an explicit interface declaration.
1065
1066 2005-01-06  Marek Safar  <marek.safar@seznam.cz>
1067
1068         Fix #70817
1069         * class.cs (PropertyMethod): Set Parent field in ctors.
1070         (SetMethod.InternalParameters): Add unsafe switch hack.
1071         
1072         * decl.cs (MemberCore.Parent): Cannot be readonly.
1073
1074 2005-01-06  Raja R Harinath  <rharinath@novell.com>
1075
1076         * decl.cs (DeclSpace.ResolveType): Remove.
1077         (DeclSpace.ResolveBaseTypeExpr): Rename from ResolveTypeExpr.
1078         Merge in code from ...
1079         (DeclSpace.GetTypeResolvingEmitContext): ... here.  Remove.
1080         * class.cs, enum.cs: Update to changes.
1081
1082 2005-01-06  Miguel de Icaza  <miguel@ximian.com>
1083
1084         * anonymous.cs: Ensure that we init the scope of our parent if it
1085         has not been initialized yet.
1086
1087 2004-12-30  Duncan Mak  <duncan@ximian.com>
1088
1089         * typemanager.cs (TypeManager.CheckStructCycles): Don't crash here
1090         if field.FieldBuilder is null. Fixes #70758.
1091
1092         * convert.cs: Fixed some typos and updated some of the comments.
1093         (ImplicitStandardConversionExists):
1094         (TryImplicitIntConversion): If `target_type' is an interface and
1095         the type of `ic' implements this interface, return true or a new
1096         BoxedCast instead of null. This fixes #70468.
1097
1098 2004-12-29  Duncan Mak  <duncan@ximian.com>
1099
1100         * expression.cs (Argument.Emit): Check that Expr is
1101         IMemoryLocation before casting to it, and report CS1510 otherwise.
1102
1103         This fixes #70402.
1104
1105 2004-12-21  Ben Maurer  <bmaurer@ximian.com>
1106
1107         * statement.cs (Block.ThisVariable): remove the recursion here, to
1108         make the --profile more sane.
1109
1110 2004-12-17  Carlos Cortez <calberto.cortez@gmail.com>
1111
1112         * driver.cs: Patch to handle a xsp bug that prevents to reference an .exe
1113         assembly, by JB Evain.
1114
1115 2004-12-17  Raja R Harinath  <rharinath@novell.com>
1116
1117         * class.cs, decl.cs, ecore.cs, iterators.cs, pending.cs, 
1118           rootcontext.cs, typemanager.cs: Make nomenclature consistent.
1119         "parent" refers to enclosing type/class.  "base" refers to superclass.
1120
1121 2004-12-17  Raja R Harinath  <rharinath@novell.com>
1122
1123         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1124         Ensure that we only have GlobalAttributes.
1125         * attribute.cs (Attribute.Emit): Make non-virtual.
1126         (GlobalAttribute.Emit): Remove.
1127         (Attribute.Resolve): Make virtual.
1128         (GlobalAttribute.Resolve): New.  Set Rootcontext.Tree.Types.NamespaceEntry.
1129         (Attribute.GetConditionalAttributeValue): Take an EmitContext as
1130         the argument. Don't create one.
1131         (Attribute.GetObsoleteAttribute): Likewise.
1132         (Attribute.GetClsCompliantAttributeValue): Likewise.
1133         * class.cs, decl.cs: Update to changes.
1134
1135 2004-12-17  Marek Safar  <marek.safar@seznam.cz>
1136
1137         * delegate.cs (NewDelegate.DoResolve): Add error 149 report.
1138         
1139         * ecore.cs (Expression.MemberLookupFailed): Fixed error 143.
1140         
1141         * statement.cs (Foreach.Resolve): Add error 186 report.
1142
1143 2004-12-16  Marek Safar  <marek.safar@seznam.cz>
1144
1145         * expression.cs (Conditional.DoResolve): Add warning 429.
1146         
1147         * statement.cs (If.Resolve): Add warning 665.
1148
1149 2004-12-16  Raja R Harinath  <rharinath@novell.com>
1150
1151         New invariant: RootContext.Tree.Types.NamespaceEntry == null
1152         except when in the parser, and in GlobalAttribute.
1153         * driver.cs (MainDriver): Reset RootContext.Tree.Types.NamespaceEntry.
1154         * attribute.cs (GlobalAttribute.CheckAttributeType): Reset
1155         RootContext.Tree.Types.NamespaceEntry once work is done.
1156         (GlobalAttribute.Emit): New.  Wrapper for Attribute.Emit, but sets
1157         and resets RootContext.Tree.Types.NamespaceEntry.
1158
1159 2004-12-15  Marek Safar  <marek.safar@seznam.cz>
1160
1161         * cs-parser.jay: Don't create a block for every variable.
1162
1163 2004-12-14  Miguel de Icaza  <miguel@ximian.com>
1164
1165         * location.cs: Provide extra information.
1166
1167         * statement.cs: The instance is not `ldarg_0.THIS' when accessing
1168         variables from the captured environment, it is the ldarg_0.
1169
1170 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
1171
1172         * cs-parser.jay: Changed warning level for 642 to 4 until Miguel
1173         find a conclusion.
1174         
1175         * class.cs: Changed warning level for 169 to avoid developer
1176         displeasure from warning flooding. It will be changed back when they
1177         fix most of current BCL warnings.
1178         
1179         * RootContext.cs: Pushed default WarningLevel to 3.
1180         
1181         * statement.cs: Removed unused variable.
1182
1183 2004-12-14  Marek Safar  <marek.safar@seznam.cz>
1184
1185         * class.cs (TypeContainer.GetClassBases): Add error 1521 report.
1186         (TypeContainer.MethodModifiersValid): Refactored to use MemberCore.
1187         Add error 502 report.
1188         (StaticClass.DefineType): Add error 441 report.
1189         (Class.AllowedModifiersProp): New virtual property as temporary
1190         extension to AllowedModifiers.
1191         (Class.DefineType): Add error 418 report. Moved ModFlags check here
1192         to share implementation with StaticClass and don't call virtual
1193         methods from ctor.
1194         
1195         * driver.cs (MainDriver): Add error 1558 test.
1196
1197         * parameter.cs (Parameter.ApplyAttributeBuilder): Add error 662
1198         report. Moved error 36 test here.
1199
1200         * statement.cs (Throw.Resolve): Add error 724 report.
1201
1202         * typemanager.cs: Add out_attribute_type core type.
1203         
1204 2004-12-13  Marek Safar  <marek.safar@seznam.cz>
1205
1206         * class.cs (TypeContainer.VerifyClsCompliance): Add error
1207         3018 report.
1208         (PropertyBase.VerifyClsCompliance): Add errror 3025 report.
1209
1210         * codegen.cs (ModuleClass.ApplyAttributeBuilder): Add error
1211         3017 report.
1212         
1213         * decl.cs (MemberCore.VerifyClsCompliance): Add warning 3021.
1214
1215         * parameter.cs (ReturnParameter.ApplyAttributeBuilder): 
1216         Add error 3023 report.
1217         (Parameter.ApplyAttributeBuilder): Add error 3022 report.
1218
1219         * tree.cs (RootTypes.IsClsCompliaceRequired): Add fake
1220         implementation.
1221
1222 2004-12-12  John Luke  <john.luke@gmail.com>
1223
1224         * driver.cs (AddArgs): take -- into account when
1225         adding arguments, fixes bug 65710 
1226
1227 2004-12-12  Martin Baulig  <martin@ximian.com>
1228
1229         * expression.cs (Unary.TryReduceNegative): Added support for
1230         SByteConstant and ByteConstant.
1231         (Unary.Reduce): Check error values from TryReduceNegative().
1232
1233 2004-12-10  Marek Safar  <marek.safar@seznam.cz>
1234
1235         * attributes.cs (Attribute.Resolve): Avoid multiple error report
1236         and report exception as error 182.
1237
1238 2004-12-10  Raja R Harinath  <rharinath@novell.com>
1239
1240         * driver.cs (Main): Fix message when there are warnings.
1241
1242 2004-12-09  Miguel de Icaza  <miguel@ximian.com>
1243
1244         * delegate.cs: Fixed my fix from yesterday, sorry about that.
1245
1246 2004-12-09  Marek Safar  <marek.safar@seznam.cz>
1247
1248         * anonymous.cs, class.cs, convert.cs, doc.cs, support.cs: 
1249         Reduced number of warnings.
1250         
1251         * class.cs (TypeContainer.VerifyClsCompliance): One if is enough.
1252
1253 2004-12-08  Miguel de Icaza  <miguel@ximian.com>
1254
1255         * driver.cs: Removed message.
1256
1257         * delegate.cs: Fix bug introduced in 1.1.x: 70219.
1258
1259 2004-12-08    <vargaz@freemail.hu>
1260
1261         * cs-tokenizer.cs: Add workaround for NET 2.0 beta 1 csc bug.
1262
1263 2004-12-08  Martin Baulig  <martin@ximian.com>
1264
1265         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
1266         instead of a CS3002 for properties and indexer.
1267
1268 2004-12-08  Martin Baulig  <martin@ximian.com>
1269
1270         * decl.cs (MemberName.ToString): Make this work again.
1271
1272 2004-12-08  Marek Safar  <marek.safar@seznam.cz>
1273
1274         * attribute.cs (Resolve): Add error 591 detection.
1275
1276         * class.cs (FieldMember.Define): Add error 1547 detection.
1277         (Indexer.Define): Add error 620 detection.
1278         (Operator.Define): Add error 590 detection.
1279
1280         * ecore.cs: Missing argument for error 79.
1281
1282         * expression.cs (ComposedCast.DoResolveAsTypeStep): Add error 611
1283         detection.
1284
1285 2004-12-07  Marek Safar  <marek.safar@seznam.cz>
1286
1287         Fix #70106
1288         * assign.cs.cs (Assign.DoResolve): Reports error 1648 for value types
1289         only.
1290
1291 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
1292
1293         * cs-parser.jay : handle doc comments on implicit/explicit operators.
1294           Some operator comments were suppressed.
1295         * doc.cs : Implicit/explicit operator name in doc comments are like
1296           "op_Explicit(type)~returnType", so added suffix handling.
1297
1298 2005-01-21  Alp Toker  <alp@atoker.com>
1299
1300         * cs-parser.jay: destructor_declaration's container is PartialContainer
1301         not Class when partial types are used, so use Kind prop instead of 'is'.
1302
1303 2004-12-12  Martin Baulig  <martin@ximian.com>
1304
1305         * expression.cs (Unary.TryReduceNegative): Added support for
1306         SByteConstant and ByteConstant.
1307         (Unary.Reduce): Check error values from TryReduceNegative().
1308
1309 2004-12-11  Martin Baulig  <martin@ximian.com>
1310
1311         * support.cs (ReflectionParameters.ParameterName): If we have a
1312         `gpd', call `ParameterName' on it.
1313
1314         * parameter.cs (Parameter.GetParameterAttributes): New static method.
1315
1316         * pending.cs (PendingImplementation.DefineProxy): Call
1317         DefineParameter() for all of the MethodBuilder's arguments.
1318
1319 2004-12-09  Martin Baulig  <martin@ximian.com>
1320
1321         * doc.cs (DocUtil): Make this a static class.
1322
1323 2004-12-09  Martin Baulig  <martin@ximian.com>
1324
1325         * expression.cs (Invocation.InferType): Moved the type inference
1326         implementation into TypeManager.
1327
1328         * generics.cs (TypeManager): Moved the type inference
1329         implementation here.
1330
1331 2004-12-09  Martin Baulig  <martin@ximian.com>
1332
1333         * typemanager.cs (TypeManager): Make this a partial class.
1334
1335         * generics.cs
1336         (TypeManager): Move the generics part of `TypeManager' here.
1337
1338 2004-12-08  Martin Baulig  <martin@ximian.com>
1339
1340         * class.cs (TypeContainer.VerifyClsCompliance): Report a CS3003
1341         instead of a CS3002 for properties and indexer.  Added CS3024
1342         check for generic interfaces.
1343
1344         * attributes.cs (AttributeTester.AnalyzeTypeCompliance): Generic
1345         instances are not CLS-compliant.
1346
1347 2004-12-08  Martin Baulig  <martin@ximian.com>
1348
1349         * cs-parser.jay
1350         (void_pointer_expression): New rule for `void*', `void**' etc.
1351         (typeof_expression): Add `void_pointer_expression'; fixes #66846.       
1352
1353 2004-12-08  Martin Baulig  <martin@ximian.com>
1354
1355         * expression.cs (Invocation.InferType): Removed the hack for
1356         MethodCore.MayUnify().  
1357
1358         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Make
1359         this actually work.
1360
1361         * class.cs (MethodCore.MayUnify): Use
1362         TypeManager.MayBecomeEqualGenericTypes().       
1363
1364 2004-12-08  Martin Baulig  <martin@ximian.com>
1365
1366         * expression.cs (Is.DoResolve, As.DoResolve): If we're a type
1367         parameter, box it.  Fixes #69233.
1368
1369 2004-12-08  Martin Baulig  <martin@ximian.com>
1370
1371         * generic.cs (ConstructedType.CheckConstraints): Valuetypes always
1372         have the ctor constraint.  Fixes #68326.
1373
1374 2004-12-07  Atsushi Enomoto  <atsushi@ximian.com>
1375
1376         * cs-parser.jay : interface comment was not consumed because of
1377           extra opt_semicolon before doc handling.
1378
1379 2004-12-03  Raja R Harinath  <rharinath@novell.com>
1380
1381         Fix test-327.cs, test-328.cs, and put in early infrastructure
1382         for eventually fixing #52697.
1383         * namespace.cs (NamespaceEntry.LookupForUsing): New method.
1384         (NamespaceEntry.LookupNamespaceOrType): New method, refactored
1385         from other methods.
1386         (NamespaceEntry.Lookup): Remove 'ignore_using' flag.
1387         (AliasEntry.Resolve, UsingEntry.Resolve): Use 'LookupForUsing'.
1388         (VerifyUsing, error246): Update.
1389         * rootcontext.cs (RootContext.NamespaceLookup): Just use
1390         'NamespaceEntry.LookupNamespaceOrType'.
1391
1392 2004-12-07  Martin Baulig  <martin@ximian.com>
1393
1394         * driver.cs: Call it "BETA SOFTWARE" :-)
1395
1396 2004-12-06  Raja R Harinath  <rharinath@novell.com>
1397
1398         Fix crash on cs0657-17.cs.
1399         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1400         Use RootContext.Tree.Types, not 'new RootTypes ()'.
1401         * attribute.cs (GlobalAttribute.CheckAttributeType): Narrow down
1402         the case where the NamespaceEntry gets overwritten.
1403
1404 2004-12-06  Marek Safar  <marek.safar@seznam.cz>
1405
1406         Fixed #69195, #56821
1407         * ecore.cs (ResolveBoolean): Tiny refactoring.
1408
1409         * expression.cs (Binary.DoResolve): Add warning 429 and skipping
1410         of right expression resolving when left is false constant and
1411         operator is LogicalAnd OR true constant and operator is LogicalOr.
1412
1413         * statement.cs (ResolveUnreachable): Always reports warning.
1414
1415 2004-12-05  Miguel de Icaza  <miguel@ximian.com>
1416
1417         * class.cs: Distinguish between 1721 and 1722 (just a little help
1418         for the programmer).
1419
1420 2004-12-03  Miguel de Icaza  <miguel@ximian.com>
1421
1422         * delegate.cs: Only allow this on new versions of the language. 
1423
1424 2004-12-02  Duncan Mak  <duncan@ximian.com>
1425
1426         * ecore.cs (PropertyExpr.IsAccessorAccessible): Moved to
1427         Expression class.
1428         (Expression.IsAccessorAccessible): Moved from the PropertyExpr to
1429         here as a static method. Take an additional bool out parameter
1430         `must_do_cs1540_check' for signaling to InstanceResolve.
1431         (PropertyExpr.InstanceResolve): Removed the `must_do_cs1540_check'
1432         member field from PropertyExpr class and made it an argument of
1433         the method instead.
1434         (EventExpr.InstanceResolve): Copied from PropertyExpr, removed the
1435         check for MarshalByRefObject, and report CS0122 instead of CS1540.
1436         (EventExpr.DoResolve): Call IsAccessorAccessible on `add_accessor'
1437         and `remove_accessor' as well as InstanceResolve: report CS0122
1438         where applicable.
1439
1440         Fixes #70129.
1441
1442 2004-12-07  Martin Baulig  <martin@ximian.com>
1443
1444         * decl.cs (DeclSpace.AddToContainer): Report correct errors CS0694
1445         and CS0692 where appropriate.
1446
1447 2004-12-06  Martin Baulig  <martin@ximian.com>
1448
1449         * class.cs (MethodCore.MayUnify): Moved the CS0408 check here from
1450         IsDuplicateImplementation() and improved it.
1451
1452         * expression.cs (Invocation.InferTypeArguments): Added
1453         `Type[] inferred_class_types' argument (for MethodCore.MayUnify)
1454         and removed the "ref" modifier from `infered_types'.
1455
1456         * decl.cs (MemberName.ToString): Removed the exception.
1457
1458 2004-12-03  Atsushi Enomoto  <atsushi@ximian.com>
1459
1460         * cs-tokenizer.cs : Only '////' is rejected. Other non-whitespace
1461           comments are allowed.
1462
1463 2004-12-03  Carlos Alberto Cortez <calberto.cortez@gmail.com>
1464
1465         * delegate.cs: Add checks for subtypes in paramaters and return values
1466         in VerifyMethod () to add support for Covariance/Contravariance
1467         in delegates.
1468         
1469 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
1470
1471         * report.cs: Remove extra closing parenthesis.
1472
1473         * convert.cs (Error_CannotImplicitConversion): If the name of the
1474         types are the same, provide some extra information.
1475
1476 2004-12-02  Marek Safar  <marek.safar@seznam.cz>
1477
1478         Fix bug #70102
1479         * attribute.cs (Resolve): Improved implementation of params
1480         attribute arguments.
1481
1482         * support.cs (ParameterData): Add HasParams to be faster.
1483
1484 2004-12-02  Atsushi Enomoto  <atsushi@ximian.com>
1485
1486         all things are for /doc support:
1487
1488         * doc.cs: new file that supports XML documentation generation.
1489         * mcs.exe.sources: added doc.cs.
1490         * driver.cs:
1491           Handle /doc command line option.
1492           Report error 2006 instead of 5 for missing file name for /doc.
1493           Generate XML documentation when required, after type resolution.
1494         * cs-tokenizer.cs:
1495           Added support for picking up documentation (/// and /** ... */),
1496           including a new XmlCommentState enumeration.
1497         * cs-parser.jay:
1498           Added lines to fill Documentation element for field, constant,
1499           property, indexer, method, constructor, destructor, operator, event
1500           and class, struct, interface, delegate, enum.
1501           Added lines to warn incorrect comment.
1502         * rootcontext.cs :
1503           Added Documentation field (passed only when /doc was specified).
1504         * decl.cs:
1505           Added DocComment, DocCommentHeader, GenerateDocComment() and
1506           OnGenerateDocComment() and some supporting private members for
1507           /doc feature to MemberCore.
1508         * class.cs:
1509           Added GenerateDocComment() on TypeContainer, MethodCore and Operator.
1510         * delegate.cs:
1511           Added overriden DocCommentHeader.
1512         * enum.cs:
1513           Added overriden DocCommentHeader and GenerateDocComment().
1514
1515 2004-12-01  Miguel de Icaza  <miguel@ximian.com>
1516
1517         * cfold.cs (ConstantFold.DoConstantNumericPromotions): After
1518         unwrapping the enumeration values, chain to
1519         DoConstantNumericPromotions again, so we can promote things to the
1520         fundamental types (takes care of enums that are bytes, sbytes).
1521
1522         Fixes bug #62054.
1523
1524 2004-12-01  Raja R Harinath  <rharinath@novell.com>
1525
1526         * attribute.cs (Attribute.CheckAttributeType): Remove complain flag.
1527         Fix long-standing bug in type-lookup.  Use FindType instead of
1528         LookupType when ec.ResolvingTypeTree.
1529         (Attribute.ResolveType, Attribute.Resolve)
1530         (Attribute.DefinePInvokeMethod,GlobalAttribute.CheckAttributeType):
1531         Update to changes.
1532         (Attributes.Search): Remove internal version.  Update.
1533         (Attributes.SearchMulti): Update.
1534         (Attributes.GetClsCompliantAttribute): Remove.
1535         (Attributes.GetIndexerNameAttribute): Remove.
1536         * decl.cs (MemberCore.GetClsCompliantAttributeValue): Update to changes.
1537         (DeclSpace.GetClsCompliantAttributeValue): Likewise.
1538         * class.cs (Indexer.Define): Likewise.
1539
1540 2004-12-01  Marek Safar  <marek.safar@seznam.cz>
1541
1542         Fix bug #68790
1543         * ecore.cs: CheckMarshallByRefAccess new virtual method for testing
1544         MarshallByReference members access.
1545
1546         * expression.cs: Use CheckMarshallByRefAccess;
1547         Better error CS0197 message.
1548
1549         * report.cs: Print whole related error message.
1550
1551 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
1552
1553         * class (GetClassBases): Better error 60 report.
1554         (EventProperty): Disabled warning 67 detection.
1555
1556 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
1557
1558         Fix bug #60324
1559         * cfold.cs (Assign.DoResolve): Add subtraction for DecimalConstant.
1560
1561         * constant.cs (DecimalConstant.Emit): Don't use int ctor for
1562         precise values.
1563
1564 2004-11-29  Marek Safar  <marek.safar@seznam.cz>
1565
1566         Fix bug #49488
1567         * assign.cs (Assign.DoResolve): Add error 1648, 1650 report.
1568
1569         * decl.cs (MemberCore.MemberName): Error 1648 in compiler.
1570
1571 2004-11-26  Miguel de Icaza  <miguel@ximian.com>
1572
1573         * attribute.cs (Attribute.Resolve): Refine error reporting and
1574         report a cs0117 if the identifier does not exist, to distinguish
1575         from 0617 which is a miss-use of the actual identifier.
1576
1577         * ecore.cs (EventExpr.Emit): Refine error report and distinguish
1578         between cs0070 and cs0079.
1579
1580         * class.cs (MemberBase.DoDefine): When reporting a wrong
1581         accessibility level, we use MethodCore to compare instead of
1582         Method (this was a regression in some refactoring effort).
1583
1584         So now we correctly report cs0056 again.
1585
1586         * convert.cs (ImplicitReferenceConversion): Corrected typo, I was
1587         testing the target_type (which was known to be object_type) and
1588         not the source type (which is anonymous_method).
1589
1590         Fixed reporting of error cs1660.
1591
1592         * expression.cs (UserCast.Source): Expose the underlying cast.
1593
1594         * statement.cs (Switch.SwitchGoverningType): Sort the list of
1595         allowed types to find a match to int32 first (most common).
1596
1597         In addition, it ignores any ImplicitUserConversions that did an
1598         internal implicit conversion (as the switch statement allows only
1599         one integral conversion to exist).
1600
1601         * class.cs (PartialContainer.Create): rename `name' to
1602         `member_name' for clarity.  Then replace the string calls with a
1603         call to MemberName.GetPartialName, as now using
1604         MemberName.ToString is an error (this is due to the side effects
1605         it had, that were fixed in the past).
1606
1607         This will restore the error reporting on a number of partial class
1608         errors that were missusing this (and getting an exception as a
1609         results, which is now just a plain textual warning, because
1610         yyparse debug output would crash otherwise).
1611
1612 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1613
1614         * Makefile (PROGRAM_INSTALL_DIR): Remove.
1615
1616 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1617
1618         * rootcontext.cs (LookupType): Make sure to cache lookups that
1619         don't give us a negative result. This saves about 5% of corlib
1620         compilation time.
1621
1622 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1623
1624         * report.cs (AbstractMessage.Print): messages are sent to stderr
1625
1626         * class.cs (TypeContainer.GetClassBases): It is an error to have a
1627         non-interface in the list of interfaces (at this point, either
1628         parent was properly set, or a base class is being listed in the
1629         interfaces section).
1630
1631         This flags error 1722, and resolves the crash from bug 69259.
1632
1633 2004-11-25  Ben Maurer  <bmaurer@ximian.com>
1634
1635         * statement.cs (Using.EmitExpressionFinally): make this work right
1636         for valuetypes. Fixes 69926.
1637
1638 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1639
1640         * const.cs (Const.ChangeType): Cope with the "0 literal can be
1641         converted to an enum" here, before we try to change the underlying
1642         type.  This code exists, but it is a different code path than the
1643         one used while encoding constants.
1644
1645         (ImplicitReferenceConversionExists): In addition, resynchronized
1646         the code here, so it matches the same code in
1647         ImplicitReferenceConversionExists for the `from any class-type S
1648         to any interface-type T'.       
1649
1650 2004-11-25  Marek Safar  <marek.safar@seznam.cz>
1651
1652         * cfold.cs (BinaryFold): Add addition for DecimalConstant.
1653
1654 2004-11-24  Miguel de Icaza  <miguel@ximian.com>
1655
1656         * cs-parser.jay: Use verbosity accordingly. 
1657
1658 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1659
1660         * expression.cs (Unary.ResolveOperator): Do not report warning;
1661         AddressOf reads from variable.
1662         
1663         (LocalVariableReferences.DoResolveBase): Improved my previous fix.
1664
1665 2004-11-24  Marek Safar  <marek.safar@seznam.cz>
1666
1667         Fix bug #69462
1668
1669         * attribute.cs (Attributable): Removed CheckTargets.
1670         (Attributes.Emit): Explicit attribute targets are tested here.
1671
1672         * class.cs (EventField.ValidAttributeTargets): Explicit target "field" is
1673         not enabled for interfaces.
1674
1675         * codegen.cs (CommonAssemblyModulClass.AddAttributes): Removed CheckTargets.
1676         (GetAssemblyName): Ouch next bug there.
1677
1678 2004-11-23  Carlos Alberto Cortez <calberto.cortez@gmail.com>
1679
1680         * expression.cs: Error 275 added.
1681         
1682 2004-11-23  Marek Safar  <marek.safar@seznam.cz>
1683
1684         Fix bug #69177 (Implemented decimal constant support)
1685
1686         * cfold.cs (DoConstantNumericPromotions: Add DecimalConstant.
1687         (BinaryFold): Add DecimalConstant.
1688
1689         * const.cs (Define): Decimal constant 
1690         (is not constant.
1691         (ChangeType): Add decimal type handling.
1692         (LookupConstantValue): Don't set value for decimal type but
1693         emit DecimalConstantAttribute. Needed for constant optimization.
1694
1695         * constant.cs (ToDecimal): New method.
1696         (ConvertToDecimal): New method.
1697         (IntConstant): Implemented ConvertToDecimal.
1698         (DecimalConstant.Emit): Emit optimized version for decimals in
1699         int range.
1700
1701         * expression.cs (ResolveOperator): Changed order of constant
1702         reduction to work correctly with native types which have
1703         overloaded operators.
1704         (ResolveMemberAccess): Extract constant value from attribute
1705         for decimal type.
1706
1707         * rootcontext.cs (ResolveCore): Add DecimalConstantAttribute.
1708
1709         * typemanager.cs (TypeManager): Add decimal_constant_attribute_type,
1710         void_decimal_ctor_int_arg, decimal_constant_attribute_ctor.
1711         (ChangeType): Decimal is special.
1712         (TypeToCoreType): Add decimal type.
1713
1714 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1715
1716         * convert.cs (ImplicitConversionRequired): Add error cs0642 for
1717         decimal types.
1718
1719 2004-11-22  Marek Safar  <marek.safar@seznam.cz>
1720
1721         * class.cs (EventField.ApplyAttributeBuilder): Fix error
1722         test cs1667-5.cs.
1723
1724 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1725
1726         * class.cs (MemberBase.DoDefine): Fix error cs0508 report.
1727
1728         * pending.cs (PendingImplementation): Grab only interfaces.
1729
1730 2004-11-19  Marek Safar  <marek.safar@seznam.cz>
1731
1732         * statement.cs (ForeachHelperMethods): Add location member and
1733         error 202 detection.
1734
1735 2004-11-18  Marek Safar  <marek.safar@seznam.cz>
1736
1737         * expression.cs (DoResolveBase): Fixed wrong warning for out
1738         variables.
1739
1740 2004-12-04  Martin Baulig  <martin@ximian.com>
1741
1742         * convert.cs (Convert.TypeParameter_to_Null): Use the constraints
1743         to check whether the conversion is ok.
1744
1745         * typemanager.cs (TypeManager.GetTypeArguments): Just return
1746         `Type.EmptyTypes' if we're not a generic TypeContainer.
1747
1748 2004-11-25  Miguel de Icaza  <miguel@ximian.com>
1749
1750         * convert.cs (ImplicitReferenceConversionExists): A surprisingly
1751         old bug: when converting from the null literal to a pointer,
1752         return an EmptyCast, not the NullLiteral.
1753
1754         This fixes #69921, the recent null_type changes probably made this
1755         bug more prominent.
1756
1757 2004-12-03  Martin Baulig  <martin@ximian.com>
1758
1759         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
1760         method as our child, call AnonymousMethod.Compatible() on it.
1761
1762 2004-12-02  Miguel de Icaza  <miguel@ximian.com>
1763
1764         * class.cs (FieldBase): Use an unused bit field from the field to
1765         encode the `has_offset' property from the FieldMember.  This saves
1766         a couple of Ks on bootstrap compilation.
1767
1768         * delegate.cs (NewDelegate.DoResolve): If we have an anonymous
1769         method as our child, return the AnonymousMethod resolved
1770         expression.
1771
1772         * expression.cs (New.DoResolve): Allow return values from
1773         NewDelegate to also include AnonymousMethods.
1774
1775         Fixes #70150.
1776
1777 2004-11-29  Raja R Harinath  <rharinath@novell.com>
1778
1779         * decl.cs (MemberCore.MemberName): Remove readonly to fix an error
1780         cs1648 report.
1781         * rootcontext.cs (ResolveCore::interfaces_first_stage): Add
1782         System.Runtime.InteropServices._Exception, since it's a base
1783         interface of the core type System.Exception in the net_2_0 profile.
1784
1785 2004-11-27  Martin Baulig  <martin@ximian.com>
1786
1787         * ecore.cs (Expression.StoreFromPtr): Use `stobj' for generic parameters.
1788
1789 2004-11-26  Raja R Harinath  <rharinath@novell.com>
1790
1791         * Makefile: Convert to use executable.make.
1792         * gmcs.exe.sources: New.
1793
1794 2004-11-25  Martin Baulig  <martin@ximian.com>
1795
1796         * expression.cs (Invocation.InferType): Added support for byref types.
1797
1798 2004-11-25  Martin Baulig  <martin@ximian.com>
1799
1800         * statement.cs (Foreach.FetchMethodMoveNext): Wrap `mi.ReturnType'
1801         in TypeManager.TypeToCoreType().
1802
1803 2004-11-25  Martin Baulig  <martin@ximian.com>
1804
1805         * iterators.cs (Iterator.DoDefineMembers): Override and lookup the
1806         "Dispose" method from the `current_type'.
1807         (Iterator.EmitMoveNext): Use the `dispose_method' we looked up in
1808         DoDefineMembers() instead of using the MethodBuilder; this is
1809         required for generic iterators.
1810
1811         * class.cs (TypeContainer.DoDefineMembers): Make this virtual.
1812
1813 2004-11-24  Martin Baulig  <martin@ximian.com>
1814
1815         * ecore.cs (Expression.LoadFromPtr): Use `ldobj' for generic parameters.
1816
1817 2004-11-20  Martin Baulig  <martin@ximian.com>
1818
1819         * expression.cs (Invocation.InferType): Correctly infer generic
1820         instances; see gen-103.cs.
1821         (Invocation.InferTypeArguments): If a generic method doesn't have
1822         any unbound type parameters, we don't need to infer anything.
1823
1824 2004-11-19  Raja R Harinath  <rharinath@novell.com>
1825
1826         * Makefile (gmcs.exe): Update to new location of bootstrap mcs.exe.
1827
1828 2004-11-17  Raja R Harinath  <rharinath@novell.com>
1829
1830         * typemanager.cs (TypeHandle.GetTypeHandle): Make private.
1831         (TypeHandle.GetMemberCache): New.
1832         (TypeHandle.TypeHandle): Update.
1833         (TypeManager.LookupMemberCache): Rewritten from LookupMemberContainer.
1834         (TypeManager.LookupParentInterfacesCache):
1835         Rename from LookupInterfaceCache.  Optimize slightly.
1836         (TypeManager.MemberLookup_FindMembers): Update.
1837         * decl.cs (MemberCache.MemberCache): Set Container to null in the
1838         multi-type variant.
1839         (AddCacheContents): Rename from AddHashtable.
1840         * class.cs (TypeContainer.parent_container): Remove.
1841         (TypeContainer.VerifyClsCompliance): Don't use parent_container.
1842         (TypeContainer.DoDefineMembers): Don't initialize it.
1843         Update to name changes.
1844         
1845 2004-11-17  Miguel de Icaza  <miguel@ximian.com>
1846
1847         * class.cs (MethodCore.CheckAccessModifiers): New helper routine
1848         that factors the code to check access modifiers on override.  
1849
1850         (PropertyBase): Use the code here.
1851
1852         Patch from Lluis S'anchez, fixes bug #69361.
1853
1854 2004-11-15  Miguel de Icaza  <miguel@ximian.com>
1855
1856         * anonymous.cs (AnonymousMethod.Error_AddressOfCapturedVar): New
1857         routine that is used to report the use of a captured variable
1858         whose address has been taken.
1859
1860         There are two checks: one when variables are being captured and
1861         the other check is when the address of a variable is taken. 
1862         
1863         (because an anonymous methods might be resolved before *or* after
1864         the address has been taken) and 
1865
1866         * expression.cs (Conditional.DoResolve): Remove the special
1867         casing that Martin added to trueExpr and falseExpr being both
1868         NullLiteral.  We get the right behavior now just by introducing
1869         the null_type into the compiler. 
1870
1871         * convert.cs (ExplicitConversion): Change the code to use
1872         null_type instead of testing `expr is NullLiteral'.
1873         (ImplicitConversionStandard): use null_type too.
1874         (ImplicitReferenceConversionExists): use null_type too.
1875         (ImplicitReferenceConversion): use null_type too.
1876
1877         * literal.cs: The type of `NullLiteral' is now null_type instead
1878         of object_type. 
1879         (Resolve): Set the type here.
1880
1881         * typemanager.cs: Introduce null_type.
1882
1883 2004-11-18  Martin Baulig  <martin@ximian.com>
1884
1885         * rootcontext.cs
1886         (RootContext.LookupType): Return a `Type', not a `TypeExpr'.
1887
1888 2004-11-18  Martin Baulig  <martin@ximian.com>
1889
1890         * ecore.cs (TypeExpr.DoResolveAsTypeStep): Make this protected.
1891
1892 2004-11-18  Martin Baulig  <martin@ximian.com>
1893
1894         * generic.cs (Constraints.Resolve): Take an `EmitContext' instead
1895         of a `DeclSpace'.  If one of our constraints is a `ConstructedType',
1896         call ResolveConstructedType() on it to resolve it without checking
1897         constraints.
1898         (Constraints.ResolveTypes): Check them here.
1899         (ConstructedType.DoResolveAsTypeStep): Fully resolve ourselves,
1900         but don't check constraints.
1901         (ConstructedType.ResolveAsTypeTerminal): Override this and also
1902         check constraints here.
1903         (ConstructedType.ResolveConstructedType): New public method.  This
1904         is called from DoResolveAsTypeStep() and Constraints.Resolve() to
1905         resolve ourselves without checking constraints.
1906
1907         * ecore.cs (Expression.ResolveAsTypeTerminal): Make this virtual.
1908
1909 2004-11-18  Martin Baulig  <martin@ximian.com>
1910
1911         * decl.cs
1912         (DeclSpace.CurrentType): Changed type from `TypeExpr' to `Type'.
1913
1914         * delegate.cs (Delegate.DefineType): Always create the EmitContext.
1915
1916 2004-11-18  Martin Baulig  <martin@ximian.com>
1917
1918         * ecore.cs (TypeExpr.ResolveType): Removed.
1919         (Expression.ResolveAsTypeTerminal): We always return a fully
1920         resolved `TypeExpr', so we can just access its `Type'.
1921
1922         * class.cs (TypeContainer.DefineType): Resolve `CurrentType' here.
1923
1924 2004-11-17  Martin Baulig  <martin@ximian.com>
1925
1926         * ecore.cs (IAlias.Type): Replaced with ResolveAsType() to make
1927         sure we don't return any unresolved TypeExpr's.
1928         (TypeAliasExpression): The .ctor now takes an `IAlias' instead of
1929         a `TypeExpr'.
1930         (Expression.ResolveAsTypeTerminal): Make sure `te.Type != null'.
1931
1932         * expression.cs (MemberAccess.ResolveAsTypeStep): Don't return any
1933         unresolved `ConstructedType's.
1934
1935 2004-11-17  Martin Baulig  <martin@ximian.com>
1936
1937         * ecore.cs (TypeExpr.ResolveType): Don't make this virtual.
1938
1939 2004-11-17  Martin Baulig  <martin@ximian.com>
1940
1941         * ecore.cs
1942         (Expression.ResolveAsTypeTerminal): Removed the `bool silent' argument.
1943
1944         * decl.cs (DeclSpace.ResolveType): Removed.
1945         (DeclSpace.ResolveTypeExpr): Removed the `bool silent' argument.
1946
1947 2004-11-17  Martin Baulig  <martin@ximian.com>
1948
1949         * decl.cs (MemberCache.AddHashtable): Add entries in the opposite
1950         direction, like FindMembers() does.  Fixes #69546, testcase is in
1951         test-315.cs.    
1952
1953 2004-11-16  Martin Baulig  <martin@ximian.com>
1954
1955         This is based on a patch from Marek Safar, see bug #69082.
1956         Fixes bugs #63705 and #67130.
1957
1958         * typemanager.cs (TypeManager.LookupInterfaceCache): New public
1959         method; create a MemberCache for an interface type and cache the
1960         result.
1961
1962         * decl.cs (IMemberContainer.ParentContainer): Removed.
1963         (IMemberContainer.ParentCache): New property.
1964         (MemberCache.SetupCacheForInterface): Removed.
1965         (MemberCache..ctor): Added .ctor which takes a `Type[]'; use this
1966         to create a cache for an interface's "parent".
1967
1968         * class.cs (TypeContainer.DoDefineMembers): Setup cache for
1969         interfaces too.
1970
1971 2004-11-14  Ben Maurer  <bmaurer@ximian.com>
1972
1973         * statement.cs: Avoid adding bools to a hashtable.
1974
1975 2004-11-15  Martin Baulig  <martin@ximian.com>
1976
1977         * decl.cs (MemberName.GetPartialName): Removed, use GetTypeName() instead.
1978
1979 2004-11-11  Martin Baulig  <martin@ximian.com>
1980
1981         * typemanager.cs (TypeManager.GetMethodName): New method.
1982
1983         * class.cs (MethodData.Define): Include the generic arity in the
1984         name of an explicit interface; also add it to the method name.
1985
1986         * pending.cs (PendingImplementation.InterfaceMethod): The method
1987         name now includes the generic arity.
1988
1989 2004-11-07  Miguel de Icaza  <miguel@ximian.com>
1990
1991         * expression.cs (Invocation.OverloadResolve): Flag error if we are
1992         calling an unsafe method from a safe location.
1993
1994 2004-11-06  Marek Safar  <marek.safar@seznam.cz>
1995
1996         Fix #69167
1997         * codegen.cs (ApplyAttributeBuilder): Do not return; it is only warning.
1998
1999 2004-11-06  Miguel de Icaza  <miguel@ximian.com>
2000
2001         * namespace.cs (VerifyUsing): use GetPartialName instead of
2002         ToString. 
2003
2004 2004-11-05  Miguel de Icaza  <miguel@ximian.com>
2005
2006         * statement.cs (Return.Resolve): Fix regression in typo: if
2007         `in_exc', we have to request a NeedReturnLabel, this was a typo
2008         introduced in the anonymous method check-in.  Fixes #69131.
2009
2010         * Indexers were using the ShortName when defining themselves,
2011         causing a regression in the compiler bootstrap when applying the
2012         patch from 2004-11-02 (first part), now they use their full name
2013         and the bug is gone.
2014
2015 2004-11-04  Zoltan Varga  <vargaz@freemail.hu>
2016
2017         * driver.cs: Strip the path from the names of embedded resources. Fixes
2018         #68519.
2019
2020 2004-11-04  Raja R Harinath  <rharinath@novell.com>
2021
2022         Fix error message regression: cs0104-2.cs.
2023         * namespace.cs (NamespaceEntry.Lookup): Remove 'silent' flag.
2024         (AliasEntry.Resolve): Update.
2025         * rootcontext.cs (RootContext.NamespaceLookup): Update.  Remove
2026         'silent' flag.
2027         (RootContext.LookupType): Update.
2028
2029 2004-11-03  Carlos Alberto Cortez <carlos@unixmexico.org>
2030
2031         * cs-parser.jay: Add support for handling accessor modifiers
2032         * class: Add support port accessor modifiers and error checking,
2033         define PropertyMethod.Define as virtual (not abstract anymore)
2034         * ecore.cs: Add checking for proeprties access with access modifiers
2035         * iterators.cs: Modify Accessor constructor call based in the modified
2036         constructor
2037 2004-11-02  Ben Maurer  <bmaurer@ximian.com>
2038
2039         * expression.cs (StringConcat): Handle being called twice,
2040         as when we have a concat in a field init with more than two
2041         ctors in the class
2042
2043 2004-11-02  Miguel de Icaza  <miguel@ximian.com>
2044
2045         * class.cs (Event.Define, Indexer.Define, Property.Define): Do not
2046         special case explicit implementations, we should always produce
2047         the .property or .event declaration.
2048         
2049         * decl.cs (MemberName): Renamed GetFullName to GetPartialName
2050         since it will not return correct data if people use this
2051         unresolved in the presence of using statements (see test-313).
2052
2053         * class.cs (MethodData.Define): If we are an explicit interface
2054         implementation, set the method name to the full name of the
2055         interface plus the name of the method.  
2056
2057         Notice that using the method.MethodName.GetFullName() does not
2058         work, as it will only contain the name as declared on the source
2059         file (it can be a shorthand in the presence of using statements)
2060         and not the fully qualifed type name, for example:
2061
2062         using System;
2063
2064         class D : ICloneable {
2065                 object ICloneable.Clone ()  {
2066                 }
2067         }
2068
2069         Would produce a method called `ICloneable.Clone' instead of
2070         `System.ICloneable.Clone'.
2071
2072         * namespace.cs (Alias.Resolve): Use GetPartialName.
2073         
2074 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
2075
2076         * cs-parser.jay: Add error 1055 report.
2077
2078 2004-11-01  Miguel de Icaza  <miguel@ximian.com>
2079
2080         * assign.cs (Assign.DoResolve): Only do the transform of
2081         assignment into a New if the types are compatible, if not, fall
2082         through and let the implicit code deal with the errors and with
2083         the necessary conversions. 
2084
2085 2004-11-01  Marek Safar  <marek.safar@seznam.cz>
2086
2087         * cs-parser.jay: Add error 1031 report.
2088
2089         * cs-tokenizer.cs: Add location for error 1038.
2090
2091 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
2092
2093         * cs-parser.jay: Add error 1016 report.
2094
2095 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
2096
2097         * cs-parser.jay: Add errors 1575,1611 report.
2098
2099 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
2100
2101         * cs-parser.jay: Add error 1001 report.
2102
2103 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
2104
2105         Fix #68850
2106         * attribute.cs (GetMarshal): Add method argument for
2107         caller identification.
2108
2109         * class.cs, codegen.cs, enum.cs, parameter.cs: Added
2110         agument for GetMarshal and RuntimeMissingSupport.
2111
2112 2004-10-31  Marek Safar  <marek.safar@seznam.cz>
2113
2114         * attribute.cs (ExtractSecurityPermissionSet): Removed
2115         TypeManager.code_access_permission_type.
2116
2117         * typemanager.cs: Removed TypeManager.code_access_permission_type.
2118
2119 2004-10-27  Miguel de Icaza  <miguel@ximian.com>
2120
2121         * expression.cs (LocalVariableReference.DoResolveLValue): Check
2122         for obsolete use of a variable here.   Fixes regression on errors
2123         cs0619-25 and cs0619-26.
2124
2125 2004-10-27  Marek Safar  <marek.safar@seznam.cz>
2126
2127         Fix #62358, implemented security attribute encoding.
2128
2129         * attribute.cs (Attribute.CheckSecurityActionValididy): New method.
2130         Tests permitted SecurityAction for assembly or other types.
2131         (Assembly.ExtractSecurityPermissionSet): New method. Transforms
2132         data from SecurityPermissionAttribute to PermisionSet class.
2133
2134         * class.cs (ApplyAttributeBuilder): Added special handling
2135         for System.Security.Permissions.SecurityAttribute based types.
2136
2137         * codegen.cs (AssemblyClass.ApplyAttributeBuilder): Added
2138         special handling for System.Security.Permissions.SecurityAttribute
2139         based types.
2140
2141         * enum.cs (ApplyAttributeBuilder): Added special handling
2142         for System.Security.Permissions.SecurityAttribute based types.
2143
2144         * parameter.cs (ApplyAttributeBuilder): Added special handling
2145         for System.Security.Permissions.SecurityAttribute based types.
2146
2147         * rootcontext.cs: Next 2 core types.
2148
2149         * typemanager.cs (TypeManager.security_permission_attr_type):
2150         Built in type for the SecurityPermission Attribute.
2151         (code_access_permission_type): Build in type.
2152
2153 2004-10-17  Miguel de Icaza  <miguel@ximian.com>
2154
2155         * expression.cs (LocalVariableReference.DoResolveBase, Emit):
2156         Remove the tests for `ec.RemapToProxy' from here, and encapsulate
2157         all of this information into
2158         EmitContext.EmitCapturedVariableInstance.
2159         
2160         * codegen.cs (EmitCapturedVariableInstance): move here the
2161         funcionality of emitting an ldarg.0 in the presence of a
2162         remapping.   This centralizes the instance emit code.
2163
2164         (EmitContext.EmitThis): If the ScopeInfo contains a THIS field,
2165         then emit a load of this: it means that we have reached the
2166         topmost ScopeInfo: the one that contains the pointer to the
2167         instance of the class hosting the anonymous method.
2168
2169         * anonymous.cs (AddField, HaveCapturedFields): Propagate field
2170         captures to the topmost CaptureContext.
2171
2172 2004-10-12  Miguel de Icaza  <miguel@ximian.com>
2173
2174         * expression.cs (LocalVariableReference): Move the knowledge about
2175         the iterators into codegen's EmitCapturedVariableInstance.
2176
2177 2004-10-11  Miguel de Icaza  <miguel@ximian.com>
2178
2179         * codegen.cs (EmitContext.ResolveTopBlock): Emit a 1643 when not
2180         all code paths return a value from an anonymous method (it is the
2181         same as the 161 error, but for anonymous methods).
2182
2183 2004-10-08  Miguel de Icaza  <miguel@ximian.com>
2184
2185         The introduction of anonymous methods in the compiler changed
2186         various ways of doing things in the compiler.  The most
2187         significant one is the hard split between the resolution phase
2188         and the emission phases of the compiler.
2189
2190         For instance, routines that referenced local variables no
2191         longer can safely create temporary variables during the
2192         resolution phase: they must do so from the emission phase,
2193         since the variable might have been "captured", hence access to
2194         it can not be done with the local-variable operations from the runtime.
2195         
2196         * statement.cs 
2197
2198         (Block.Flags): New flag `IsTopLevel' to indicate that this block
2199         is a toplevel block.
2200
2201         (ToplevelBlock): A new kind of Block, these are the blocks that
2202         are created by the parser for all toplevel method bodies.  These
2203         include methods, accessors and anonymous methods.
2204
2205         These contain some extra information not found in regular blocks:
2206         A pointer to an optional CaptureContext (for tracking captured
2207         local variables and parameters).  A pointer to the parent
2208         ToplevelBlock.
2209         
2210         (Return.Resolve): Catch missmatches when returning a value from an
2211         anonymous method (error 1662).
2212         Invoke NeedReturnLabel from the Resolve phase instead of the emit
2213         phase.
2214
2215         (Break.Resolve): ditto.
2216
2217         (SwitchLabel): instead of defining the labels during the
2218         resolution phase, we now turned the public ILLabel and ILLabelCode
2219         labels into methods called GetILLabelCode() and GetILLabel() that
2220         only define the label during the Emit phase.
2221
2222         (GotoCase): Track the SwitchLabel instead of the computed label
2223         (its contained therein).  Emit the code by using
2224         SwitchLabel.GetILLabelCode ().
2225
2226         (LocalInfo.Flags.Captured): A new flag has been introduce to track
2227         whether the Local has been captured or not.
2228
2229         (LocalInfo.IsCaptured): New property, used to tell whether the
2230         local has been captured.
2231         
2232         * anonymous.cs: Vastly updated to contain the anonymous method
2233         support.
2234
2235         The main classes here are: CaptureContext which tracks any
2236         captured information for a toplevel block and ScopeInfo used to
2237         track the activation frames for various local variables.   
2238
2239         Each toplevel block has an optional capture context associated
2240         with it.  When a method contains an anonymous method both the
2241         toplevel method and the anonymous method will create a capture
2242         context.   When variables or parameters are captured, they are
2243         recorded on the CaptureContext that owns them, for example:
2244
2245         void Demo () {
2246              int a;
2247              MyDelegate d = delegate {
2248                  a = 1;
2249              }
2250         }
2251
2252         Here `a' will be recorded as captured on the toplevel
2253         CapturedContext, the inner captured context will not have anything
2254         (it will only have data if local variables or parameters from it
2255         are captured in a nested anonymous method.
2256
2257         The ScopeInfo is used to track the activation frames for local
2258         variables, for example:
2259
2260         for (int i = 0; i < 10; i++)
2261                 for (int j = 0; j < 10; j++){
2262                    MyDelegate d = delegate {
2263                         call (i, j);
2264                    }
2265                 }
2266
2267         At runtime this captures a single captured variable `i', but it
2268         captures 10 different versions of the variable `j'.  The variable
2269         `i' will be recorded on the toplevel ScopeInfo, while `j' will be
2270         recorded on a child.  
2271
2272         The toplevel ScopeInfo will also track information like the `this'
2273         pointer if instance variables were referenced (this is necessary
2274         as the anonymous method lives inside a nested class in the host
2275         type of the method). 
2276
2277         (AnonymousMethod): Expanded to track the Toplevel, implement
2278         `AnonymousMethod.Compatible' to tell whether an anonymous method
2279         can be converted to a target delegate type. 
2280
2281         The routine now also produces the anonymous method content
2282
2283         (AnonymousDelegate): A helper class that derives from
2284         DelegateCreation, this is used to generate the code necessary to
2285         produce the delegate for the anonymous method that was created. 
2286
2287         * assign.cs: API adjustments for new changes in
2288         Convert.ImplicitStandardConversionExists.
2289
2290         * class.cs: Adjustments to cope with the fact that now toplevel
2291         blocks are of type `ToplevelBlock'. 
2292
2293         * cs-parser.jay: Now we produce ToplevelBlocks for toplevel blocks
2294         insteda of standard blocks.
2295
2296         Flag errors if params arguments are passed to anonymous methods.
2297
2298         * codegen.cs (EmitContext): Replace `InAnonymousMethod' with
2299         `CurrentAnonymousMethod' which points to the current Anonymous
2300         Method.  The variable points to the AnonymousMethod class that
2301         holds the code being compiled.  It is set in the new EmitContext
2302         created for the anonymous method.
2303
2304         (EmitContext.Phase): Introduce a variable and an enumeration to
2305         assist in enforcing some rules about when and where we are allowed
2306         to invoke certain methods (EmitContext.NeedsReturnLabel is the
2307         only one that enfonces this right now).
2308
2309         (EmitContext.HaveCaptureInfo): new helper method that returns
2310         whether we have a CapturedContext initialized.
2311
2312         (EmitContext.CaptureVariable): New method used to register that a
2313         LocalInfo must be flagged for capturing. 
2314
2315         (EmitContext.CapturedParameter): New method used to register that a
2316         parameters must be flagged for capturing. 
2317         
2318         (EmitContext.CapturedField): New method used to register that a
2319         field must be flagged for capturing. 
2320
2321         (EmitContext.HaveCapturedVariables,
2322         EmitContext.HaveCapturedFields): Return whether there are captured
2323         variables or fields. 
2324
2325         (EmitContext.EmitMethodHostInstance): This is used to emit the
2326         instance for the anonymous method.  The instance might be null
2327         (static methods), this (for anonymous methods that capture nothing
2328         and happen to live side-by-side with the current method body) or a
2329         more complicated expression if the method has a CaptureContext.
2330
2331         (EmitContext.EmitTopBlock): Routine that drives the emission of
2332         code: it will first resolve the top block, then emit any metadata
2333         and then emit the code.  The split is done so that we can extract
2334         any anonymous methods and flag any captured variables/parameters.
2335         
2336         (EmitContext.ResolveTopBlock): Triggers the resolution phase,
2337         during this phase, the ILGenerator should not be used as labels
2338         and local variables declared here might not be accessible to any
2339         code that is part of an anonymous method.  
2340
2341         Exceptions to this include the temporary variables that are
2342         created by some statements internally for holding temporary
2343         variables. 
2344         
2345         (EmitContext.EmitMeta): New routine, in charge of emitting all the
2346         metadata for a cb
2347
2348         (EmitContext.TemporaryReturn): This method is typically called
2349         from the Emit phase, and its the only place where we allow the
2350         ReturnLabel to be defined other than the EmitMeta.  The reason is
2351         that otherwise we would have to duplicate a lot of logic in the
2352         Resolve phases of various methods that today is on the Emit
2353         phase. 
2354
2355         (EmitContext.NeedReturnLabel): This no longer creates the label,
2356         as the ILGenerator is not valid during the resolve phase.
2357
2358         (EmitContext.EmitThis): Extended the knowledge in this class to
2359         work in anonymous methods in addition to iterators. 
2360
2361         (EmitContext.EmitCapturedVariableInstance): This emits whatever
2362         code is necessary on the stack to access the instance to a local
2363         variable (the variable will be accessed as a field).
2364
2365         (EmitContext.EmitParameter, EmitContext.EmitAssignParameter,
2366         EmitContext.EmitAddressOfParameter): Routines to support
2367         parameters (not completed at this point). 
2368         
2369         Removals: Removed RemapLocal and RemapLocalLValue.  We probably
2370         will also remove the parameters.
2371
2372         * convert.cs (Convert): Define a `ConstantEC' which points to a
2373         null.  This is just to prefity some code that uses
2374         ImplicitStandardConversion code and do not have an EmitContext
2375         handy.
2376
2377         The idea is to flag explicitly that at that point in time, it is
2378         known that the conversion will not trigger the delegate checking
2379         code in implicit conversions (which requires a valid
2380         EmitContext). 
2381
2382         Everywhere: pass new EmitContext parameter since
2383         ImplicitStandardConversionExists now requires it to check for
2384         anonymous method conversions. 
2385
2386         (Convert.ImplicitStandardConversionExists): If the type of an
2387         expression is the anonymous_method_type, and the type is a
2388         delegate, we invoke the AnonymousMethod.Compatible method to check
2389         whether an implicit conversion is possible. 
2390
2391         (Convert.ImplicitConversionStandard): Only do implicit method
2392         group conversions if the language level is not ISO_1.
2393
2394         * delegate.cs (Delegate.GetInvokeMethod): Common method to get the
2395         MethodInfo for the Invoke method.  used by Delegate and
2396         AnonymousDelegate.
2397
2398         * expression.cs (Binary.DoNumericPromotions): only allow anonymous
2399         method conversions if the target type is a delegate.
2400
2401         Removed extra debugging nops.
2402
2403         (LocalVariableReference): Turn the `local_info' into a public
2404         field. 
2405
2406         Add `prepared' field, the same hack used for FieldExprs to cope
2407         with composed assignments, as Local variables do not necessarily
2408         operate purely on the stack as they used to: they can be captured
2409         fields. 
2410
2411         Add `temp' for a temporary result, like fields.
2412
2413         Refactor DoResolve and DoResolveLValue into DoResolveBase.
2414
2415         It now copes with Local variables that are captured and emits the
2416         proper instance variable to load it from a field in the captured
2417         case. 
2418
2419         (ParameterReference.DoResolveBase): During the resolve phase,
2420         capture parameters if we are in an anonymous method.
2421
2422         (ParameterReference.Emit, ParameterReference.AddressOf): If in an
2423         anonymous method, use the EmitContext helper routines to emit the
2424         parameter reference.
2425
2426         * iterators.cs: Set RemapToProxy to true/false during the
2427         EmitDispose class.
2428
2429         * parameters.cs (GetParameterByName): New helper method. 
2430
2431         * typemanager.cs (anonymous_method_type) a new type that
2432         represents an anonyous method.  This is always an internal type,
2433         used as a fencepost to test against the anonymous-methodness of an
2434         expression. 
2435         
2436 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
2437
2438         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
2439         561 report.
2440         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
2441
2442 2004-11-10  Martin Baulig  <martin@ximian.com>
2443
2444         * expression.cs (Invocation.BetterFunction): If two methods have
2445         equal parameter types, but only one of them is generic, the
2446         non-generic one wins.
2447         (New.DoResolve): Don't set `is_struct' to false if we're a generic
2448         instance; just use `Type.IsValueType' to determine whether
2449         something is a struct or not.
2450         (MemberAccess.DoResolveAsTypeStep): Don't modify the `args' field,
2451         so we can be called multiple times.
2452
2453 2004-11-10  Martin Baulig  <martin@ximian.com>
2454
2455         * generic.cs (TypeParameter.DefineConstraints): New public method.
2456         (TypeParameter.CheckAccessLevel): Override this and return true.
2457         (ConstructedType.ResolveType): Renamed to DoResolveType(), don't
2458         override ResolveType() anymore.
2459         (ConstructedType.DoResolveAsTypeStep): Call DoResolveType() here.
2460
2461 2004-11-10  Martin Baulig  <martin@ximian.com>
2462
2463         * rootcontext.cs (RootContext.LookupType): If we're a nested type,
2464         call DeclSpace.ResolveNestedType() on it.
2465
2466 2004-11-10  Martin Baulig  <martin@ximian.com>
2467
2468         * support.cs (ReflectionParameters.ParameterModifier): If `gpd' is
2469         non-null, call ParameterModifier() on it.
2470
2471 2004-11-10  Martin Baulig  <martin@ximian.com>
2472
2473         * iterators.cs
2474         (Iterators): Added `current_type' and `this_type' fields.
2475         (Iterators.DefineIterator): Create a new EmitContext and store it
2476         in `ec'; compute `this_type'.
2477
2478 2004-11-10  Martin Baulig  <martin@ximian.com>
2479
2480         * typemanager.cs
2481         (TypeManager.IsPrivateAccessible): New public method.
2482         (Closure.Filter): Use IsPrivateAccessible() instead of IsEqual().
2483
2484 2004-11-10  Martin Baulig  <martin@ximian.com>
2485
2486         * class.cs (TypeContainer.DefineType): Call
2487         TypeBuilder.DefineGenericParameters() before resolving the type
2488         parameters.
2489         (MethodData.parent_method): New protected field.
2490         (MethodData..ctor): Added `MethodInfo parent_method' argument.
2491         (MethodData.Define): Compute `parent_method'.
2492
2493         * decl.cs
2494         (MemberCore.GetObsoleteAttribute): Don't create a new EmitContext.
2495         (MemberCore.GetClsCompliantAttributeValue): Likewise.
2496         (DeclSpace.ec): New protected field; store the EmitContext here.
2497         (DeclSpace.EmitContext): New public property.
2498         (DeclSpace.ResolveType): Un-comment from the [Obsolte] attribute.
2499         (DeclSpace.ResolveNestedType): New public method.
2500         (DeclSpace.ResolveTypeExpr): Just call ResolveAsTypeTerminal() here.
2501         (DeclSpace.NestedAccessible): Added `Type tb' argument.
2502         (DeclSpace.FamilyAccessible): Likewise.
2503         (DeclSpace.FindType): Call ResolveNestedType() for nested types.
2504         (DeclSpace.GetClsCompliantAttributeValue): Don't create a new
2505         EmitContext.
2506
2507         * delegate.cs (Delegate.Define): Store the EmitContext in the `ec'
2508         field.
2509
2510         * enum.cs (Enum.Define): Store the EmitContext in the `ec' field.
2511         (Enum.Emit): Don't create a new EmitContext.
2512
2513 2004-10-18  Martin Baulig  <martin@ximian.com>
2514
2515         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
2516         `Type' directly, but call ResolveType() on it.
2517         (Catch.Resolve): Likewise.
2518         (Foreach.Resolve): Likewise.
2519
2520 2004-10-18  Martin Baulig  <martin@ximian.com>
2521
2522         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
2523         `Type' directly, but call ResolveType() on it.
2524         (Probe.DoResolve): Likewise.
2525         (ArrayCreation.LookupType): Likewise.
2526         (TypeOf.DoResolve): Likewise.
2527         (SizeOf.DoResolve): Likewise.
2528
2529 2004-10-18  Raja R Harinath  <rharinath@novell.com>
2530
2531         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
2532         the ResolveType.
2533
2534 2004-10-17  John Luke  <john.luke@gmail.com>
2535
2536         * class.cs (Operator.GetSignatureForError): use CSharpName
2537
2538         * parameter.cs (Parameter.GetSignatureForError): Returns
2539         correct name even if was not defined.
2540
2541 2004-10-13  Raja R Harinath  <rharinath@novell.com>
2542
2543         Fix #65816.
2544         * class.cs (TypeContainer.EmitContext): New property.
2545         (DefineNestedTypes): Create an emitcontext for each part.
2546         (MethodCore.DoDefineParameters): Use container's emitcontext.
2547         Pass type array to InternalParameters.
2548         (MemberBase.DoDefine): Use container's emitcontext.
2549         (FieldMember.Define): Likewise.
2550         (Event.Define): Likewise.
2551         (SetMethod.GetParameterInfo): Change argument to EmitContext.
2552         Pass type array to InternalParameters.
2553         (SetIndexerMethod.GetParameterInfo): Likewise.
2554         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
2555         * delegate.cs (Define): Pass emitcontext to
2556         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
2557         array to InternalParameters.
2558         * expression.cs (ParameterReference.DoResolveBase): Pass
2559         emitcontext to GetParameterInfo.
2560         (ComposedCast.DoResolveAsTypeStep): Remove check on
2561         ec.ResolvingTypeTree.
2562         * parameter.cs (Parameter.Resolve): Change argument to
2563         EmitContext.  Use ResolveAsTypeTerminal.
2564         (Parameter.GetSignature): Change argument to EmitContext.
2565         (Parameters.ComputeSignature): Likewise.
2566         (Parameters.ComputeParameterTypes): Likewise.
2567         (Parameters.GetParameterInfo): Likewise.
2568         (Parameters.ComputeAndDefineParameterTypes): Likewise.
2569         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
2570         * support.cs (InternalParameters..ctor): Remove variant that takes
2571         a DeclSpace.
2572         * typemanager.cs (system_intptr_expr): New.
2573         (InitExpressionTypes): Initialize it.
2574
2575 2004-10-12  Chris Toshok  <toshok@ximian.com>
2576
2577         * cs-parser.jay: fix location for try_statement and catch_clause.
2578
2579 2004-10-18  Martin Baulig  <martin@ximian.com>
2580
2581         * class.cs (FieldMember.Define): Don't access the TypeExpr's
2582         `Type' directly, but call ResolveType() on it.
2583         (MemberBase.DoDefine): Likewise.
2584
2585         * expression.cs (New.DoResolve): Don't access the TypeExpr's
2586         `Type' directly, but call ResolveType() on it.
2587         (ComposedCast.DoResolveAsTypeStep): Likewise.
2588
2589         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
2590         `Type' directly, but call ResolveType() on it.
2591
2592 2004-10-17  John Luke  <john.luke@gmail.com>
2593
2594         * class.cs (Operator.GetSignatureForError): use CSharpName
2595
2596         * parameter.cs (Parameter.GetSignatureForError): Returns
2597         correct name even if was not defined.
2598
2599 2004-10-13  Raja R Harinath  <rharinath@novell.com>
2600
2601         Fix #65816.
2602         * class.cs (TypeContainer.EmitContext): New property.
2603         (DefineNestedTypes): Create an emitcontext for each part.
2604         (MethodCore.DoDefineParameters): Use container's emitcontext.
2605         Pass type array to InternalParameters.
2606         (MemberBase.DoDefine): Use container's emitcontext.
2607         (FieldMember.Define): Likewise.
2608         (Event.Define): Likewise.
2609         (SetMethod.GetParameterInfo): Change argument to EmitContext.
2610         Pass type array to InternalParameters.
2611         (SetIndexerMethod.GetParameterInfo): Likewise.
2612         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
2613         * delegate.cs (Define): Pass emitcontext to
2614         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
2615         array to InternalParameters.
2616         * expression.cs (ParameterReference.DoResolveBase): Pass
2617         emitcontext to GetParameterInfo.
2618         (ComposedCast.DoResolveAsTypeStep): Remove check on
2619         ec.ResolvingTypeTree.
2620         * parameter.cs (Parameter.Resolve): Change argument to
2621         EmitContext.  Use ResolveAsTypeTerminal.
2622         (Parameter.GetSignature): Change argument to EmitContext.
2623         (Parameters.ComputeSignature): Likewise.
2624         (Parameters.ComputeParameterTypes): Likewise.
2625         (Parameters.GetParameterInfo): Likewise.
2626         (Parameters.ComputeAndDefineParameterTypes): Likewise.
2627         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
2628         * support.cs (InternalParameters..ctor): Remove variant that takes
2629         a DeclSpace.
2630         * typemanager.cs (system_intptr_expr): New.
2631         (InitExpressionTypes): Initialize it.
2632
2633 2004-10-12  Chris Toshok  <toshok@ximian.com>
2634
2635         * cs-parser.jay: fix location for try_statement and catch_clause.
2636
2637 2004-10-07  Raja R Harinath  <rharinath@novell.com>
2638
2639         More DeclSpace.ResolveType avoidance.
2640         * decl.cs (MemberCore.InUnsafe): New property.
2641         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
2642         with newly created EmitContext.
2643         (FieldMember.Define): Likewise.
2644         * delegate.cs (Delegate.Define): Likewise.
2645         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
2646         only if normal name-lookup fails.
2647         (TypeExpr.DoResolve): Enable error-checking.
2648         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
2649         (SizeOf.DoResolve): Likewise.
2650         (ComposedCast.DoResolveAsTypeStep): Likewise.
2651         (StackAlloc.DoResolve): Likewise.
2652         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
2653         (Block.Unsafe): New property.
2654         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
2655         (Unsafe): Set 'unsafe' flag of contained block.
2656         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
2657         (Fixed.Resolve): Likewise.
2658         (Catch.Resolve): Likewise.
2659         (Using.ResolveLocalVariableDecls): Likewise.
2660         (Foreach.Resolve): Likewise.
2661
2662 2004-10-05  John Luke <john.luke@gmail.com>
2663
2664         * cs-parser.jay: add location to error CS0175
2665
2666 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
2667
2668         * ecore.cs (Expression.Constantity): Add support for turning null
2669         into a constant.
2670
2671         * const.cs (Const.Define): Allow constants to be reference types
2672         as long as the value is Null.
2673
2674 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
2675
2676         * namespace.cs (NamespaceEntry.Using): No matter which warning
2677         level is set, check if this namespace name has already been added.
2678
2679 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
2680
2681         * expression.cs: reftype [!=]= null should always use br[true,false].
2682         # 67410
2683
2684 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
2685
2686         Fix #67108
2687         * attribute.cs: Enum conversion moved to 
2688         GetAttributeArgumentExpression to be applied to the all
2689         expressions.
2690
2691 2004-10-01  Raja R Harinath  <rharinath@novell.com>
2692
2693         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
2694         * class.c (TypeContainer.DefineType): Flag error if
2695         base types aren't accessible due to access permissions.
2696         * decl.cs (DeclSpace.ResolveType): Move logic to
2697         Expression.ResolveAsTypeTerminal.
2698         (DeclSpace.ResolveTypeExpr): Thin layer over
2699         Expression.ResolveAsTypeTerminal.
2700         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
2701         Refactor code into NestedAccess.  Use it.
2702         (DeclSpace.NestedAccess): New.
2703         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
2704         argument to silence errors.  Check access permissions.
2705         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
2706         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
2707         (Cast.DoResolve): Likewise.
2708         (New.DoResolve): Likewise.
2709         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
2710         (TypeOf.DoResolve): Likewise.
2711
2712         * expression.cs (Invocation.BetterConversion): Return the Type of
2713         the better conversion.  Implement section 14.4.2.3 more faithfully.
2714         (Invocation.BetterFunction): Make boolean.  Make correspondence to
2715         section 14.4.2.2 explicit.
2716         (Invocation.OverloadResolve): Update.
2717         (Invocation): Remove is_base field.
2718         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
2719         (Invocation.Emit): Likewise.
2720
2721 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
2722
2723         * cs-parser.jay: Reverted 642 warning fix.
2724
2725 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2726
2727         Fix bug #66615
2728         * decl.cs (FindMemberWithSameName): Indexer can have more than
2729         1 argument.
2730
2731 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2732
2733         * expression.cs (LocalVariableReference.DoResolveLValue):
2734         Do not report warning 219 for out values.
2735         (EmptyExpression.Null): New member to avoid extra allocations.
2736
2737 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2738
2739         * cs-parser.jay: Fix wrong warning 642 report.
2740
2741         * cs-tokenizer.cs (CheckNextToken): New helper;
2742         Inspect next character if is same as expected.
2743
2744 2004-09-23  Martin Baulig  <martin@ximian.com>
2745
2746         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
2747         (Convert.ImplicitReferenceConversionExists): Likewise.
2748
2749 2004-11-09  Raja R Harinath  <rharinath@novell.com>
2750
2751         * Makefile (DISTFILES): Comment out a few missing files.
2752
2753 2004-10-29  Raja R Harinath  <rharinath@novell.com>
2754
2755         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
2756         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
2757         (gmcs.exe): Invoke bootstrap-libs.
2758         (clean-local): Clean the net_2_0_bootstrap profile too.
2759         (PROGRAM_INSTALL_DIR): New.
2760         (install-local): Use it.
2761
2762 2004-10-13  Martin Baulig  <martin@ximian.com>
2763
2764         * generic.cs (TypeManager.InflatedConstraints): New nested class.
2765         (TypeParameter.DefineType): If we're a method type parameter and
2766         that method is overriding something, "inflate" its constraints.
2767
2768 2004-10-12  Martin Baulig  <martin@ximian.com>
2769
2770         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
2771         and have type arguments, create and resolve a ConstructedType.
2772
2773 2004-10-12  Martin Baulig  <martin@ximian.com>
2774
2775         * decl.cs (MemberCache.FindMemberToOverride): Use
2776         TypeManager.IsEqual() to compare the parameters and Type.Equals()
2777         to compare the invocationType.
2778
2779         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
2780         When comparing two type parameters, only do the signature-only
2781         comparision for method type parameters.
2782
2783 2004-10-11  Martin Baulig  <martin@ximian.com>
2784
2785         * report.cs: Don't make --fatal abort on warnings, we have
2786         -warnaserror for that.
2787
2788 2004-10-11  Martin Baulig  <martin@ximian.com>
2789
2790         * typemanager.cs
2791         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
2792         (TypeManager.IsEqual): Call ourself recursively instead of using
2793         Type.IsEqual(). 
2794
2795 2004-10-11  Martin Baulig  <martin@ximian.com>
2796
2797         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
2798         on our own type parameters, not on the ones we inherit from a containing
2799         class.
2800
2801         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
2802         the comparision.
2803
2804         * generic.cs (TypeParameter.Define): We may only be called once.
2805
2806         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
2807         instead of TypeManager.IsEqual().
2808
2809 2004-09-28  Martin Baulig  <martin@ximian.com>
2810
2811         * generic.cs
2812         (GenericConstraints.EffectiveBaseClass): New public property.
2813         (TypeParameter.GenericConstraints): New public property.
2814         (ConstructedType.CheckConstraints): Improved.
2815
2816         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
2817         (Convert.TypeParameterConversion): New private method; use this in
2818         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
2819         for all conversions related to type parameters.
2820
2821 2004-09-24  Martin Baulig  <martin@ximian.com>
2822
2823         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
2824         type parameter conversions for type parameters which are known to
2825         be reference types.
2826
2827 2004-09-24  Martin Baulig  <martin@ximian.com>
2828
2829         * generic.cs (GenericConstraints): Added `IsReferenceType' and
2830         `IsValueType' properties.
2831
2832         * support.cs (ReflectionConstraints): Use
2833         Type.GetGenericParameterConstraints() instead of the old hack.
2834
2835 2004-09-24  Martin Baulig  <martin@ximian.com>
2836
2837         * generic.cs (GenericConstraints): Moved here and made it an
2838         abstract class.
2839
2840         * support.cs (GenericConstraints): Moved to generic.cs.
2841
2842 2004-09-24  Martin Baulig  <martin@ximian.com>
2843
2844         * support.cs
2845         (ReflectionConstraints): Un-nested this class and made it public.
2846
2847         * typemanager.cs
2848         (TypeManager.GetTypeParameterConstraints): New public method.
2849         (TypeManager.HasConstructorConstraint): Use the attributes.
2850
2851 2004-09-24  Martin Baulig  <martin@ximian.com>
2852
2853         * support.cs (GenericConstraints): Replaced `HasConstructor',
2854         `IsReferenceType' and `IsValueType' with `Attributes'.
2855         (ReflectionParameters.ReflectionConstraints): Removed the Create()
2856         method and made the .ctor public.
2857
2858         * generic.cs (Constraints.Attributes): New public property.
2859         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
2860         `IsReferenceType' -> `HasReferenceTypeConstraint' and
2861         `IsValueType' -> `HasValueTypeConstraint'.
2862
2863 2004-09-23  Martin Baulig  <martin@ximian.com>
2864
2865         * generic.cs (Constraints): Reflect latest runtime changes.
2866
2867 2004-09-23  Martin Baulig  <martin@ximian.com>
2868
2869         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
2870         (Convert.ImplicitReferenceConversionExists): Likewise.
2871
2872 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
2873
2874         * class.cs (Operator.Define): Add error 448 and 559 report.
2875         
2876 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2877
2878         * class.cs (MemberBase.IsTypePermitted): New protected
2879         method for checking error CS0610.
2880
2881 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2882
2883         * class.cs (TypeContainer.HasExplicitLayout): New property
2884         Returns whether container has StructLayout attribute set Explicit.
2885         (FieldMember): New abstract class for consts and fields.
2886         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
2887         (Field): Reuse FieldMember.
2888
2889         * const.cs (Const): Reuse FieldMember.
2890
2891         * rootcontext.cs: EmitConstants call moved to class.
2892
2893 2004-09-22  Martin Baulig  <martin@ximian.com>
2894
2895         Marek and me just fixed one of our oldest bugs: #28562 :-)
2896
2897         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
2898
2899         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
2900         we're an EnumConstant, just return that.
2901         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
2902         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
2903         to get the value which'll actually be written into the attribute.
2904         However, we have to use GetValue() to access the attribute's value
2905         in the compiler.        
2906
2907 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
2908
2909         * constant.cs (Constant.IsNegative): New abstract property
2910         IsNegative.
2911
2912         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
2913         (StackAlloc.DoResolve): Reused IsNegative.
2914
2915 2004-09-22  Martin Baulig  <martin@ximian.com>
2916
2917         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
2918         public method; like LookupTypeContainer, but also works for
2919         generic instances.
2920
2921         * report.cs (Report.SymbolRelatedToPreviousError): Use
2922         TypeManager.LookupGenericTypeContainer().       
2923
2924 2004-09-22  Martin Baulig  <martin@ximian.com>
2925
2926         Thanks to Peter Sestoft for this bug report.
2927
2928         * expression.cs (Conditional): If both the `trueExpr' and the
2929         `falseExpr' is a NullLiteral, return a NullLiteral.
2930
2931 2004-09-22  Martin Baulig  <martin@ximian.com>
2932
2933         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
2934         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
2935         for the "get_Current" call.
2936
2937 2004-09-21  Martin Baulig  <martin@ximian.com>
2938
2939         * convert.cs (Convert.ImplicitReferenceConversion): When
2940         converting to an interface type, first check whether we're
2941         converting from a reference type.
2942
2943 2004-09-14  Martin Baulig  <martin@ximian.com>
2944
2945         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
2946
2947 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
2948
2949         Fixed bug #61902
2950         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
2951         called and is obsolete then this member suppress message
2952         when call is inside next [Obsolete] method or type.
2953
2954         * expression.cs: Use TestObsoleteMethodUsage member.
2955
2956 2004-09-14  Martin Baulig  <martin@ximian.com>
2957
2958         * genericparser.cs: Removed.
2959
2960 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
2961
2962         * class.cs (MethodCore.CheckBase): Fix bug #65757.
2963
2964 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
2965
2966         * attribute.cs (Attribute.Resolve): Add error 653 report.
2967
2968         * class.cs (Class.ApplyAttributeBuilder): Add error 641
2969         report.
2970         (Method.ApplyAttributeBuilder): Add error 685 report.
2971         (Operator.Define): Add error 564 report.
2972
2973         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
2974
2975         * expression.cs (Invocation.DoResolve): Add error
2976         245 and 250 report.
2977
2978         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
2979         error 674 report.
2980
2981 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2982
2983         * class.cs (ConstructorInitializer.Resolve):
2984         Wrong error number (515->516).
2985
2986 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2987
2988         * class.cs (Indexer.Define): Add error 631 report.
2989
2990 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2991
2992         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
2993
2994 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
2995
2996         * expression.cs (Probe.DoResolve): Add error CS0241 report.
2997
2998 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
2999
3000         * cs-parser.jay: Added error CS0241 report.
3001
3002 2004-09-10  Raja R Harinath  <rharinath@novell.com>
3003
3004         * cs-parser.jay (fixed_statement): Introduce a scope for the
3005         declaration in the 'fixed' statement.
3006
3007 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
3008
3009         * cs-parser.jay: Added CS0230 error report.
3010
3011 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
3012
3013         * cs-parser.jay: Added errors CS0231 and CS0257 report.
3014
3015 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
3016
3017         * expression.cs (Argument.Resolve): Added error CS0192 and
3018         CS0199 report.
3019
3020 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
3021
3022         C# 2.0 #pragma warning feature
3023
3024         * cs-tokenizer.cs (PreProcessPragma): New method; 
3025         Handles #pragma directive.
3026
3027         * report.cs (WarningRegions): New class; Support
3028         class for #pragma warning directive. It tests whether
3029         warning is enabled for a given line.
3030
3031 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
3032
3033         * const.cs: Add more descriptive error report, tahnks to
3034         Sebastien. 
3035
3036 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
3037
3038         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
3039
3040 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
3041
3042         * expression.cs: Apply patch from Ben: Remove dead code from
3043         ArrayCreation, and remove the TurnintoConstant call in const.cs,
3044         as that code just threw an exception anwyays.
3045
3046         * const.cs: Remove the call to the turnintoconstant, for details
3047         see bug: #63144
3048         
3049         * literal.cs: The type of the null-literal is the null type;  So
3050         we use a placeholder type (literal.cs:System.Null, defined here)
3051         for it.
3052
3053         * expression.cs (Conditional.DoResolve): Remove some old code that
3054         is no longer needed, conversions have been fixed.
3055
3056         (ArrayCreationExpression.DoResolve): Return false if we fail to
3057         resolve the inner expression.
3058
3059 2004-09-07  Raja R Harinath  <rharinath@novell.com>
3060
3061         Fix test-290.cs.
3062         * cs-parser.jay (delegate_declaration): Record a delegate
3063         declaration as a type declaration.
3064         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
3065
3066 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
3067
3068         * parameter.cs: Do not crash if the type can not be resolved. 
3069
3070         * expression.cs: Report errors with unsafe pointers, fixes #64896
3071
3072 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
3073
3074         * expression.cs: Pointer arith always needs to do a conv.i
3075         if the operand is a long. fix 65320
3076
3077 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
3078
3079         Fixed cs0619-37.cs, cs0619-38.cs
3080
3081         * enum.cs (GetObsoleteAttribute): Removed.
3082
3083         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
3084         on Enum member is double staged. The first is tested member
3085         and then enum.
3086
3087 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
3088
3089         Fixed #56986, #63631, #65231
3090
3091         * class.cs: (TypeContainer.AddToMemberContainer): New method,
3092         adds member to name container.
3093         (TypeContainer.AddToTypeContainer): New method, adds type to
3094         name container.
3095         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
3096         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
3097         AddOperator): Simplified by reusing AddToMemberContainer.
3098         (TypeContainer.UserDefinedStaticConstructor): Changed to property
3099         instead of field.
3100         (Method.CheckForDuplications): Fixed implementation to test all
3101         possibilities.
3102         (MemberBase): Detection whether member is explicit interface
3103         implementation is now in constructor.
3104         (MemberBase.UpdateMemberName): Handles IndexerName.
3105         (Accessor): Changed to keep also location information.
3106         (AbstractPropertyEventMethod): Is derived from MemberCore.
3107         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
3108         will be emited or not.
3109         (PropertyBase.AreAccessorsDuplicateImplementation):
3110         Tests whether accessors are not in collision with some method.
3111         (Operator): Is derived from MethodCore to simplify common
3112         operations.
3113
3114         * decl.cs (Flags.TestMethodDuplication): Test for duplication
3115         must be performed.
3116         (DeclSpace.AddToContainer): Adds the member to defined_names
3117         table. It tests for duplications and enclosing name conflicts.
3118
3119         * enum.cs (EnumMember): Clean up to reuse the base structures
3120
3121 2004-09-03  Martin Baulig  <martin@ximian.com>
3122
3123         Merged latest changes into gmcs.  Please keep this comment in
3124         here, it makes it easier for me to see what changed in MCS since
3125         the last time I merged.
3126
3127 2004-09-03  Martin Baulig  <martin@ximian.com>
3128
3129         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
3130         into TypeContainer, to make partial classes work again.
3131
3132 2004-09-03  Martin Baulig  <martin@ximian.com>
3133
3134         * rootcontext.cs (RootContext.V2): Removed.
3135
3136 2004-03-23  Martin Baulig  <martin@ximian.com>
3137
3138         * expression.cs (Invocation.OverloadResolve): Added `bool
3139         may_fail' argument and use it instead of the Location.IsNull() hack.
3140
3141 2004-09-09  Martin Baulig  <martin@ximian.com>
3142
3143         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
3144
3145 2004-09-09  Martin Baulig  <martin@ximian.com>
3146
3147         * generic.cs (TypeParameter.DefineType): Added support for
3148         explicit interface methods.
3149
3150 2004-09-09  Martin Baulig  <martin@ximian.com>
3151
3152         * README.Changes: New document.  Started to list important changes
3153         between MCS and GMCS here.
3154
3155 2004-09-08  Martin Baulig  <martin@ximian.com>
3156
3157         * class.cs
3158         (TypeContainer.CheckRecursiveDefinition): New protected method.
3159         (TypeContainer.DefineType): Move the CS0146 check into
3160         CheckRecursiveDefinition().     
3161
3162 2004-09-06  Martin Baulig  <martin@ximian.com>
3163
3164         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
3165         types for the constructor constraint.
3166
3167 2004-09-03  Martin Baulig  <martin@ximian.com>
3168
3169         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
3170         into TypeContainer, to make partial classes work again.
3171
3172 2004-09-03  Martin Baulig  <martin@ximian.com>
3173
3174         * rootcontext.cs (RootContext.V2): Removed.
3175
3176 2004-03-23  Martin Baulig  <martin@ximian.com>
3177
3178         * expression.cs (Invocation.OverloadResolve): Added `bool
3179         may_fail' argument and use it instead of the Location.IsNull() hack.
3180
3181 2004-09-03  Martin Baulig  <martin@ximian.com>
3182
3183         Merged latest changes into gmcs.  Please keep this comment in
3184         here, it makes it easier for me to see what changed in MCS since
3185         the last time I merged.
3186
3187 2004-09-03  Raja R Harinath  <rharinath@novell.com>
3188
3189         Fix #61128.
3190         * expression.cs (BetterConversion): Don't allow either conversion 
3191         to be null.  Remove redundant implicit conversion test when 'q ==
3192         null' -- when this function is invoked, we already know that the
3193         implicit conversion exists.
3194         (BetterFunction): Assume that 'best' is non-null.  Remove
3195         redundant reimplementation of IsApplicable when 'best' is null.
3196         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
3197         number of arguments.
3198         (IsAncestralType): Extract from OverloadResolve.
3199         (OverloadResolve): Make robust to the MethodGroupExpr being
3200         unsorted.  Implement all the logic of Section 14.5.5.1, and
3201         support overloading of methods from multiple applicable types.
3202         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
3203
3204         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
3205         (RealError, Warning): Append type of report to related symbol.
3206
3207 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
3208
3209         * enum.cs: Fixed CLS-Compliance checks for enum members.
3210         Error tests cs3008-8.cs, cs3014-8.cs
3211
3212 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
3213
3214         Fixed bug #62342, #63102
3215         * class.cs: ImplementIndexer uses member.IsExplicitImpl
3216         like ImplementMethod.
3217
3218 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
3219
3220         * attribute.cs (Attribute.GetAttributeArgumentExpression):
3221         Fixed bug #65170.
3222
3223 2004-09-02  Martin Baulig  <martin@ximian.com>
3224
3225         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
3226         TypeManager.GetArgumentTypes() rather than calling GetParameters()
3227         on the MethodBase.
3228
3229 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
3230
3231         C# 2.0 Static classes implemented
3232
3233         * class.cs (TypeContainer): instance_constructors,
3234         initialized_fields, initialized_static_fields,
3235         default_constructor, base_inteface_types are protected to be
3236         accessible from StaticClass.
3237         (TypeContainer.DefineDefaultConstructor): New virtual method
3238         for custom default constructor generating
3239         (StaticClass): New class to handle "Static classes" feature.
3240
3241         * cs-parser.jay: Handle static keyword on class like instance
3242         of StaticClass.
3243
3244         * driver.cs: Added "/langversion" command line switch with two
3245         options (iso-1, default).
3246
3247 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
3248
3249         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
3250
3251 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
3252
3253         * delegate.cs: Style.
3254
3255 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3256
3257         * delegate.cs: Add seperate instance expr field for miguel.
3258
3259 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3260
3261         * PointerArithmetic (Resolve): make sure we are not doing
3262         pointer arith on void*. Also, make sure we are resolved
3263         by not setting eclass until resolve.
3264
3265         All callers: Make sure that PointerArithmetic gets resolved.
3266
3267 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3268
3269         * ArrayCreation (LookupType): If the type does not resolve 
3270         to an array, give an error.
3271
3272 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
3273
3274         * statement.cs (Try.Resolve): Fixed bug #64222
3275
3276 2004-08-27  Martin Baulig  <martin@ximian.com>
3277
3278         * class.cs
3279         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
3280         crash here.     
3281
3282 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
3283
3284         * ecore.cs (Constantify): Get underlying type via
3285         System.Enum.GetUnderlyingType to avoid StackOverflow on the
3286         Windows in special cases.
3287
3288 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
3289
3290         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
3291         for obtaining also private methods.
3292         (GetRemoveMethod): Used GetRemoveMethod (true)
3293         for obtaining also private methods.
3294
3295 2004-09-02  Martin Baulig  <martin@ximian.com>
3296
3297         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
3298         TypeManager.GetArgumentTypes() rather than calling GetParameters()
3299         on the MethodBase.
3300
3301 2004-08-27  Martin Baulig  <martin@ximian.com>
3302
3303         * class.cs
3304         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
3305         crash here.     
3306
3307 2004-08-25  Martin Baulig  <martin@ximian.com>
3308
3309         * support.cs (ReflectionParameters..ctor): If this is a generic
3310         method, retrieve and store its type parameters.
3311         (InternalParameters..ctor): Added `TypeParameter[]' argument.
3312         (ReflectionParameters.GenericConstraints): The argument specifies
3313         the type parameter, not the method parameter.
3314         (InternalParameters.GenericConstraints): Likewise.
3315
3316         * generic.cs (TypeParameter.DefineType): Correctly handle
3317         constraints wrt. generic methods in interfaces and their
3318         implementations.        
3319
3320 2004-08-24  Martin Baulig  <martin@ximian.com>
3321
3322         * generic.cs (TypeParameter.IsSubclassOf): New public method.
3323         (Constraints.IsSubclassOf): New internal method.
3324
3325         * typemanager.cs (TypeManager.FindMembers): Added special support
3326         for GenericTypeParameterBuilder's.      
3327         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
3328         type parameters.
3329
3330 2004-08-24  Martin Baulig  <martin@ximian.com>
3331
3332         * typemanager.cs
3333         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
3334         this for accessibility checks.
3335         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
3336         IsNestedFamilyAccessible.
3337         (TypeManager.IsSubclassOf): New method, do what the name actually
3338         says.   
3339
3340 2004-08-24  Martin Baulig  <martin@ximian.com>
3341
3342         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
3343         as a SimpleName, include the generic arity.
3344
3345 2004-08-24  Martin Baulig  <martin@ximian.com>
3346
3347         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
3348         MethodAttributes.HideBySig for operators.
3349
3350 2004-08-23  Martin Baulig  <martin@ximian.com>
3351
3352         Back to the old error reporting system :-)
3353
3354         * report.cs (Message): Removed.
3355         (Report.MessageData, ErrorData, WarningData): Removed.
3356         (Report.Error, Warning): Back to the old system.
3357
3358 2004-08-23  Martin Baulig  <martin@ximian.com>
3359
3360         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
3361
3362         * class.cs (TypeContainer.ParentContainer): New public virtual
3363         method; replaces the explicit interface implementation.
3364         (ClassPart.ParentContainer): Override.
3365
3366 2004-08-23  Martin Baulig  <martin@ximian.com>
3367
3368         * statement.cs (Switch): Added support for constant switches; see
3369         #59428 or test-285.cs.
3370
3371 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
3372
3373         Fixed bug #62740.
3374         * statement.cs (GetEnumeratorFilter): Removed useless
3375         logic because C# specs is strict. GetEnumerator must be
3376         public.
3377
3378 2004-08-22  Martin Baulig  <martin@ximian.com>
3379
3380         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
3381         a switch and may break, reset the barrier.  Fixes #59867.
3382
3383 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
3384
3385         CLS-Compliance speed up (~5% for corlib)
3386
3387         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
3388         New method. Tests container for CLS-Compliant names
3389
3390         * class.cs (TypeContainer.VerifyClsName): New method.
3391         Checks whether container name is CLS Compliant.
3392         (Constructor): Implements IMethodData.
3393
3394         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
3395         low-case table for CLS Compliance test.
3396         (MemberCache.VerifyClsParameterConflict): New method.
3397         Checks method parameters for CS3006 error.
3398
3399         * enum.cs (EnumMember): Is derived from MemberCore.
3400         (Enum.VerifyClsName): Optimized for better performance.
3401
3402 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
3403
3404         * report.cs: Renamed Error_T to Error and changed all
3405         references.
3406
3407 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
3408
3409         * class.cs (TypeContainer.IndexerArrayList): New inner class
3410         container for indexers.
3411         (TypeContainer.DefaultIndexerName): New constant for default
3412         indexer name. Replaced all "Item" with this constant.
3413         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
3414
3415         * typemanager.cs (TypeManager.default_member_ctor): Cache here
3416         DefaultMemberAttribute constructor.
3417
3418 2004-08-05  Martin Baulig  <martin@ximian.com>
3419
3420         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
3421         Fix bug #59429.
3422
3423 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
3424
3425         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
3426         multi platforms problem.
3427
3428         * compiler.csproj: Included shared files.
3429
3430 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
3431
3432         Fix bug 60333, 55971 in the more general way
3433         * attribute.cs (Attribute.GetAttributeArgumentExpression):
3434         Added arg_type argument for constant conversion.
3435         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
3436
3437 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
3438
3439         Fix bug #59760
3440         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
3441         OperatorArrayList, MethodCoreArrayList for typecontainer
3442         containers. Changed class member types to these new types.
3443         (MethodArrayList.DefineMembers): Added test for CS0659.
3444
3445 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
3446
3447         * cfold.cs: Synchronize the folding with the code in expression.cs
3448         Binary.DoNumericPromotions for uint operands.
3449
3450         * attribute.cs: Revert patch from Raja, it introduced a regression
3451         while building Blam-1.2.1 (hard to isolate a test case).
3452
3453 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
3454
3455         Fix for #55382
3456         * class.cs:
3457         (TypeContainer.Define): Renamed to DefineContainerMembers because of
3458         name collision.
3459         (MethodCore.parent_method): New member. The method we're overriding
3460         if this is an override method.
3461         (MethodCore.CheckBase): Moved from Method class and made common.
3462         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
3463         private.
3464         (MethodCore.CheckForDuplications): New abstract method. For custom
3465         member duplication search in a container
3466         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
3467         method and its return type.
3468         (Event.conflict_symbol): New member. Symbol with same name in the
3469         parent class.
3470
3471         * decl.cs:
3472         (MemberCache.FindMemberWithSameName): New method. The method
3473         is looking for conflict with inherited symbols.
3474
3475 2004-08-04  Martin Baulig  <martin@ximian.com>
3476
3477         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
3478
3479         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
3480
3481 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
3482
3483         * report.cs (Message): New enum for better error, warning reference in
3484         the code.
3485         (MessageData): New inner abstract class. It generally handles printing of
3486         error and warning messages.
3487         Removed unused Error, Warning, Message methods.
3488
3489 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
3490
3491         Fix for cs0592-8.cs test
3492         * attribute.cs
3493         (Attributable.ValidAttributeTargets): Made public.
3494         (Attribute.ExplicitTarget): New member for explicit target value.
3495         (Attribute.CheckTargets): Now we translate explicit attribute
3496         target to Target here.
3497
3498 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
3499
3500         * ecore.cs (MethodGroupExpr): new IsBase property.
3501
3502         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
3503
3504         * delegate.cs (DelegateCreation): store a MethodGroupExpr
3505         rather than an instance expr.
3506
3507         (DelegateCreation.Emit): Use the method group rather than
3508         the instance expression. Also, if you have base.Foo as the
3509         method for a delegate, make sure to emit ldftn, not ldftnvirt.
3510
3511         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
3512
3513         (NewDelegate.DoResolve): Only check for the existance of Invoke
3514         if the method is going to be needed. Use MethodGroupExpr.
3515
3516         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
3517
3518         * expression.cs: For pointer arith., make sure to use
3519         the size of the type, not the size of the pointer to
3520         the type.
3521
3522 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
3523
3524         Fix for #60722
3525         * class.cs (Class): Added error CS0502 test.
3526
3527 2004-08-03  John Luke  <jluke@cfl.rr.com>
3528             Raja R Harinath  <rharinath@novell.com>
3529
3530         Fix for #60997.
3531         * attribute.cs (Attribute.complained_before): New flag.
3532         (Attribute.ResolveType, Attribute.Resolve),
3533         (Attribute.DefinePInvokeMethod): Set it.
3534         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
3535         
3536 2004-08-03  Martin Baulig  <martin@ximian.com>
3537
3538         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
3539         use a user-defined operator; we still need to do numeric
3540         promotions in case one argument is a builtin type and the other
3541         one has an implicit conversion to that type.  Fixes #62322.
3542
3543 2004-08-18  Martin Baulig  <martin@ximian.com>
3544
3545         * class.cs (Method.Define): Use the correct method name when
3546         creating the MethodBuilder for a generic method.
3547
3548 2004-08-17  Martin Baulig  <martin@ximian.com>
3549
3550         * generic.cs (Constraints): Support type parameter constraints.
3551
3552 2004-08-16  Martin Baulig  <martin@ximian.com>
3553
3554         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
3555         (Token.GENERIC_DIMENSION): New token; this is returned if we
3556         encounter an unbound generic type in a typeof() expression.
3557
3558         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
3559         this token is only generated while parsing a typeof() expression.
3560         (typeof_expression): Removed the old unbound_type hack.
3561
3562         * generic.cs (TypeArguments.IsUnbound): New public property.
3563
3564         * decl.cs (MemberName): Added support for unbound types.
3565
3566 2004-08-14  Martin Baulig  <martin@ximian.com>
3567
3568         * typemanager.cs
3569         (TypeManager.IsEqualGenericInstance): New static method.
3570         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
3571         just used to check accessibility, so follow the rules of 26.1.6.        
3572
3573         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
3574         ConstructedType instead of a TypeExpression if we have type arguments.
3575
3576         * cs-parser.jay (typeof_expression): Support unbound generic types.
3577
3578         * ecore.cs (UnboundTypeExpression): New public class.
3579
3580 2004-08-12  Martin Baulig  <martin@ximian.com>
3581
3582         * typemanager.cs (TypeManager.IsNestedChildOf): Use
3583         TypeManager.IsEqual() rather than `=='.
3584
3585         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
3586         generic instances as well.
3587
3588 2004-08-12  Martin Baulig  <martin@ximian.com>
3589
3590         * expression.cs (Invocation.InferType): We can only infer method
3591         type parameters.  Fixes #62647.
3592
3593 2004-08-11  Martin Baulig  <martin@ximian.com>
3594
3595         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
3596         before resolving the base classes.
3597
3598 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
3599
3600         * Makefile: install .mdb file too.
3601
3602 2004-08-05  Martin Baulig  <martin@ximian.com>
3603
3604         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
3605         initializer, the current type is just the TypeBuilder, not the
3606         instantiated generic type.
3607         (FieldExpr.IsFieldInitializer): New public property.
3608
3609 2004-08-04  Martin Baulig  <martin@ximian.com>
3610
3611         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
3612
3613         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
3614
3615 2004-08-03  Martin Baulig  <martin@ximian.com>
3616
3617         * class.cs (MethodData.Define): If we're an explicit
3618         implementation, remove the generic arity from the type name.
3619
3620 2004-08-03  Martin Baulig  <martin@ximian.com>
3621
3622         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
3623         use a user-defined operator; we still need to do numeric
3624         promotions in case one argument is a builtin type and the other
3625         one has an implicit conversion to that type.  Fixes #62322.
3626
3627 2004-08-02  Martin Baulig  <martin@ximian.com>
3628
3629         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
3630         `TypeExpr[]' array.
3631         (TypeContainer.GetClassBases): Return the unexpanded list of
3632         interfaces; we expand them later.
3633         (TypeContainer.DefineType): After creating the TypeBuilder, call
3634         TypeManager.ExpandInterfaces() to get an expanded and resolved
3635         list of interfaces.
3636
3637         * ecore.cs (TypeExpr.GetInterfaces): Removed
3638
3639         * generics.cs (Constraints.InterfaceConstraints): Remove.
3640         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
3641         register the interface constraints.
3642
3643         * typemanager.cs
3644         (TypeManager.AddUserType): Removed the `ifaces' argument.
3645         (TypeManager.AddTypeParameter): Likewise.
3646         (TypeManager.AddUserInterface): Removed, was unused.
3647         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
3648         `TypeExpr[]' array for the interfaces.
3649         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
3650         has been defined, returns a list of the resolved interfaces types.
3651         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
3652         (TypeManager.GetExplicitInterfaces): Likewise.  
3653
3654 2004-08-02  Martin Baulig  <martin@ximian.com>
3655
3656         * expression.cs (Invocation.EmitCall): If we're invoking a method
3657         on a type parameter, use the new `Constrained' prefix opcode.
3658
3659 2004-08-02  Martin Baulig  <martin@ximian.com>
3660
3661         * statement.cs (LocalInfo.Flags): Added `IsThis'.
3662         (LocalInfo.IsThis): New public property.
3663         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
3664
3665 2004-08-01  Martin Baulig  <martin@ximian.com>
3666
3667         * class.cs (TypeContainer.GetClassBases): Don't set the default
3668         here since we may get called from GetPartialBases().
3669         (TypeContainer.DefineType): If GetClassBases() didn't return a
3670         parent, use the default one.
3671
3672 2004-07-30  Martin Baulig  <martin@ximian.com>
3673
3674         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
3675
3676         * class.cs (SourceMethod): New public class, derive from the
3677         symbol writer's ISourceMethod.
3678         (Method): Use the new symbol writer API.
3679
3680         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
3681         as argument and use the new symbol writer.
3682
3683         * location.cs
3684         (SourceFile): Implement the symbol writer's ISourceFile.
3685         (Location.SymbolDocument): Removed.
3686         (Location.SourceFile): New public property.
3687
3688         * symbolwriter.cs: Use the new symbol writer API.
3689
3690 2004-07-30  Raja R Harinath  <rharinath@novell.com>
3691
3692         * Makefile (install-local): Remove.  Functionality moved to
3693         executable.make.
3694
3695 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
3696
3697         * Makefile: Install mcs.exe.config file together with mcs.exe.
3698         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
3699         correct runtime version.
3700         
3701 2004-07-25  Martin Baulig  <martin@ximian.com>
3702
3703         * class.cs
3704         (TypeContainer.RegisterOrder): Removed, this was unused.
3705         (TypeContainer, interface_order): Removed.
3706         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
3707         TypeContainer as argument since we can also be called with a
3708         `PartialContainer' for a partial class/struct/interface.
3709         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
3710         of checking whether we're an `Interface' - we could be a
3711         `PartialContainer'.
3712         (PartialContainer.Register): Override; call
3713         AddClass()/AddStruct()/AddInterface() on our parent.
3714
3715         * cs-parser.jay (interface_member_declaration): Add things to the
3716         `current_container', not the `current_class'.
3717
3718         * rootcontext.cs (RegisterOrder): The overloaded version which
3719         takes an `Interface' was unused, removed.
3720
3721         * typemanager.cs (TypeManager.LookupInterface): Return a
3722         `TypeContainer', not an `Interface'.
3723         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
3724         contain a `PartialContainer' for an interface, so check it's
3725         `Kind' to figure out what it is.
3726
3727 2004-07-25  Martin Baulig  <martin@ximian.com>
3728
3729         * class.cs (Class.DefaultTypeAttributes): New public constant.
3730         (Struct.DefaultTypeAttributes): Likewise.
3731         (Interface.DefaultTypeAttributes): Likewise.
3732         (PartialContainer.TypeAttr): Override this and add the
3733         DefaultTypeAttributes.
3734
3735 2004-07-25  Martin Baulig  <martin@ximian.com>
3736
3737         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
3738         we can just use the `Parent' field instead.
3739
3740 2004-07-25  Martin Baulig  <martin@ximian.com>
3741
3742         * class.cs (TypeContainer.Emit): Renamed to EmitType().
3743
3744 2004-07-25  Martin Baulig  <martin@ximian.com>
3745
3746         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
3747         our parts before defining any methods.
3748         (TypeContainer.VerifyImplements): Make this virtual.
3749         (ClassPart.VerifyImplements): Override and call VerifyImplements()
3750         on our PartialContainer.
3751
3752 2004-07-25  Martin Baulig  <martin@ximian.com>
3753
3754         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
3755
3756         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
3757         argument, we can just use the `Parent' field instead.
3758
3759         * class.cs
3760         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
3761         (MemberBase.DoDefine): Likewise.
3762
3763 2004-07-24  Martin Baulig  <martin@ximian.com>
3764
3765         * decl.cs (MemberCore.Parent): New public field.
3766         (DeclSpace.Parent): Moved to MemberCore.
3767
3768         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
3769         (MemberBase.ctor): Added TypeContainer argument, pass it to our
3770         parent's .ctor.
3771         (FieldBase, Field, Operator): Likewise.
3772         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
3773         (EventField, Event): Likewise.
3774
3775 2004-07-23  Martin Baulig  <martin@ximian.com>
3776
3777         * class.cs (PartialContainer): New public class.
3778         (ClassPart): New public class.
3779         (TypeContainer): Added support for partial classes.
3780         (TypeContainer.GetClassBases): Splitted some of the functionality
3781         out into GetNormalBases() and GetPartialBases().
3782
3783         * cs-tokenizer.cs (Token.PARTIAL): New token.
3784         (Tokenizer.consume_identifier): Added some hacks to recognize
3785         `partial', but only if it's immediately followed by `class',
3786         `struct' or `interface'.
3787
3788         * cs-parser.jay: Added support for partial clases.
3789
3790 2004-07-23  Martin Baulig  <martin@ximian.com>
3791
3792         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
3793         a `DeclSpace' and also made it readonly.
3794         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
3795         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
3796         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
3797
3798         * cs-parser.jay: Pass the `current_class', not the
3799         `current_container' (at the moment, this is still the same thing)
3800         to a new Method, Property, Event, Indexer or Constructor.
3801
3802 2004-07-23  Martin Baulig  <martin@ximian.com>
3803
3804         * cs-parser.jay (CSharpParser): Added a new `current_class' field
3805         and removed the `current_interface' one.
3806         (struct_declaration, class_declaration, interface_declaration):
3807         Set `current_class' to the newly created class/struct/interface;
3808         set their `Bases' and call Register() before parsing their body.
3809
3810 2004-07-23  Martin Baulig  <martin@ximian.com>
3811
3812         * class.cs (Kind): New public enum.
3813         (TypeContainer): Made this class abstract.
3814         (TypeContainer.Kind): New public readonly field.
3815         (TypeContainer.CheckDef): New public method; moved here from
3816         cs-parser.jay.
3817         (TypeContainer.Register): New public abstract method.
3818         (TypeContainer.GetPendingImplementations): New public abstract
3819         method.
3820         (TypeContainer.GetClassBases): Removed the `is_class' and
3821         `is_iface' parameters.
3822         (TypeContainer.DefineNestedTypes): Formerly known as
3823         DoDefineType().
3824         (ClassOrStruct): Made this class abstract.
3825
3826         * tree.cs (RootTypes): New public type. 
3827
3828 2004-07-20  Martin Baulig  <martin@ximian.com>
3829
3830         * tree.cs (Tree.RecordNamespace): Removed.
3831         (Tree.Namespaces): Removed.
3832
3833         * rootcontext.cs (RootContext.IsNamespace): Removed.
3834
3835         * cs-parser.jay (namespace_declaration): Just create a new
3836         NamespaceEntry here.
3837
3838 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
3839
3840         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
3841         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
3842         entry to make sure it runs in the correct runtime version.
3843         
3844 2004-07-18  Martin Baulig  <martin@ximian.com>
3845
3846         * generic.cs (ConstructedType.CheckConstraints): Improved
3847         constraints checking.
3848
3849 2004-07-18  Martin Baulig  <martin@ximian.com>
3850
3851         * expression.cs (Invocation.BetterMethod): Call
3852         TypeManager.TypeToCoreType() on all types and removed my previous
3853         hack; we're already doig the right thing here.
3854
3855 2004-07-17  Martin Baulig  <martin@ximian.com>
3856
3857         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
3858
3859 2004-07-16  Martin Baulig  <martin@ximian.com>
3860
3861         * iterators.cs: Added generics support.
3862
3863 2004-07-16  Martin Baulig  <martin@ximian.com>
3864
3865         * iterators.cs: Rewrote this.  We're now using one single Proxy
3866         class for both the IEnumerable and the IEnumerator interface and
3867         `Iterator' derives from Class so we can use the high-level API.
3868
3869         * class.cs (TypeContainer.AddIterator): New method.
3870         (TypeContainer.DoDefineType): New protected virtual method, which
3871         is called from DefineType().
3872         (TypeContainer.DoDefineMembers): Call DefineType() and
3873         DefineMembers() on all our iterators.
3874         (TypeContainer.Emit): Call Emit() on all our iterators.
3875         (TypeContainer.CloseType): Call CloseType() on all our iterators.
3876
3877         * codegen.cs (EmitContext.CurrentIterator): New public field.
3878
3879 2004-07-15  Martin Baulig  <martin@ximian.com>
3880
3881         * typemanager.cs
3882         (TypeManager.not_supported_exception_type): New type.   
3883
3884 2004-07-14  Martin Baulig  <martin@ximian.com>
3885
3886         * typemanager.cs
3887         (TypeManager.generic_ienumerable_type): New type.
3888         (TypeManager.generic_ienumerator_type): New type.
3889
3890         * rootcontext.cs
3891         (RootContext.interfaces_first_stage): Added
3892         "System.Collections.Generic.IEnumerator`1" and
3893         "System.Collections.Generic.IEnumerable`1".     
3894
3895 2004-07-14  Martin Baulig  <martin@ximian.com>
3896
3897         * iterators.cs: Use real error numbers.
3898
3899 2004-07-14  Martin Baulig  <martin@ximian.com>
3900
3901         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
3902         requires this to be a System.Collection.IEnumerable and not a
3903         class implementing that interface.
3904         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
3905
3906 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
3907
3908         * class.cs: Fixed previous fix, it broke some error tests.
3909
3910 2004-07-12  Martin Baulig  <martin@ximian.com>
3911
3912         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
3913         Fixes #61293.
3914
3915 2004-07-14  Martin Baulig  <martin@ximian.com>
3916
3917         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
3918         an exclamation mark (!) for the generic arity to reflect the
3919         latest spec changes; ie. use "System.Collections.Generic.IList`1".
3920
3921 2004-07-13  Martin Baulig  <martin@ximian.com>
3922
3923         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
3924         specifiers being part of a type argument.
3925
3926 2004-07-13  Martin Baulig  <martin@ximian.com>
3927
3928         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
3929         name for generic types.
3930
3931 2004-07-13  Martin Baulig  <martin@ximian.com>
3932
3933         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
3934         bit to fix #60119.
3935
3936 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
3937
3938         * assign.cs (LocalTemporary): Add new argument: is_address,If
3939         `is_address' is true, then the value that we store is the address
3940         to the real value, and not the value itself.
3941         
3942         * ecore.cs (PropertyExpr): use the new local temporary
3943         stuff to allow us to handle X.Y += z (where X is a struct)
3944
3945 2004-07-08  Martin Baulig  <martin@ximian.com>
3946
3947         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
3948         not always return, just like we're doing in Using.Resolve().
3949
3950 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
3951
3952         * cs-parser.jay (fixed_statement): flag this as Pinned.
3953
3954 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
3955
3956         * typemanager.cs (TypeManager): Removed MakePinned method, this
3957         mechanism is replaced with the .NET 2.x compatible mechanism of
3958         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
3959
3960         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
3961         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
3962         `IsFixed' property which has a different meaning.
3963
3964 2004-07-02  Raja R Harinath  <rharinath@novell.com>
3965
3966         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
3967         visible from inside a nested class, not just the names of the
3968         immediately enclosing class.
3969         Fix for bug #60730.
3970
3971 2004-06-24  Raja R Harinath  <rharinath@novell.com>
3972
3973         * expression.cs (BetterConversion): Remove buggy special-case
3974         handling of "implicit constant expression conversions".  At this
3975         point, we already know that the conversion is possible -- we're
3976         only checking to see which is better.
3977
3978 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3979
3980         * cs-parser.jay: Added error CS0210 test.
3981
3982 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3983
3984         * cs-parser.jay: Added error CS0134 test.
3985
3986 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3987
3988         Fix bug #52507
3989         * cs-parser.jay: Added error CS0145 test.
3990
3991 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
3992
3993         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
3994
3995 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
3996         
3997         * expression.cs (StackAlloc.Resolve): The argument may not
3998         be a constant; deal with this case.
3999         
4000 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
4001
4002         * attribute.cs (IndexerName_GetIndexerName): Renamed to
4003         GetIndexerAttributeValue.
4004         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
4005
4006         * class.cs (Indexer.Define): Added error tests for CS0415,
4007         CS0609.
4008
4009 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
4010
4011         * attribute.cs (Attribute.Resolve): Keep field code in sync with
4012         property code.
4013
4014 2004-06-23  Martin Baulig  <martin@ximian.com>
4015
4016         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
4017         neither return nor throw, reset the barrier as well.  Fixes #60457.
4018
4019 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
4020
4021         * class.cs : EventAttributes is now set to None by default.
4022           This fixes bug #60459.
4023
4024 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
4025
4026         Fix bug #60219
4027         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
4028         Don't throw exception but return null (it's sufficient now).
4029
4030 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
4031
4032         * typemanager.cs (GetArgumentTypes): Faster implementation.
4033
4034 2004-06-18  Martin Baulig  <martin@ximian.com>
4035
4036         * attribute.cs (Attribute.Resolve): Check whether we're an
4037         EmptyCast which a Constant child.  Fixes #60333.
4038
4039 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
4040
4041         * statement.cs (EmitCollectionForeach): Account for the fact that
4042         not all valuetypes are in areas which we can take the address of.
4043         For these variables, we store to a temporary variable. Also, make
4044         sure that we dont emit a `callvirt' on a valuetype method.
4045
4046 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
4047
4048         * expression.cs (StackAlloc.DoReSolve): Added test for
4049         negative parameter (CS0247).
4050
4051 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
4052
4053         Fix bug #59792
4054         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
4055
4056 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
4057
4058         Fix bug #59781
4059         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
4060         ulong.
4061
4062 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
4063
4064         Fix bug #58254 & cs1555.cs, cs1556.cs
4065         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
4066
4067 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
4068
4069         * cs-parser.jay: Added error CS1669 test for indexers.
4070
4071 2004-06-18  Martin Baulig  <martin@ximian.com>
4072
4073         * generics.cs (GenericMethod.ctor): Don't take an Attributes
4074         argument.  Fixes #60441.
4075
4076 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
4077         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
4078         The name needs to have the actual name of the method in order
4079         for other tests (such as the one in OverloadResolve for Invoke
4080         on a delegate) to work. As well, it does not really help
4081         error reporting because the method group had multiple methods.
4082         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
4083         Make profiling work.
4084         
4085 2004-06-13  Martin Baulig  <martin@ximian.com>
4086
4087         * cs-parser.jay: Don't allow generic attributes.
4088
4089 2004-06-13  Martin Baulig  <martin@ximian.com>
4090
4091         * class.cs (MemberBase.DoDefineBase): New protected method.
4092         (MemberBase.DoDefine): Compute the `flags' in the new
4093         DoDefineBase() which must be called first.
4094         (Method.Define): Call DoDefineBase() first so we have the flags
4095         when defining the generic method.
4096
4097         * cs-parser.jay (interface_method_declaration): Support generic methods.
4098
4099 2004-06-13  Martin Baulig  <martin@ximian.com>
4100
4101         * decl.cs (TypeName): Removed.
4102         (MemberName): Removed TypeName and MemberNow; now we just have
4103         MemberName.
4104
4105         * cs-parser.jay: Don't distinguish between type arguments and type
4106         parameters in the grammar and simplified the rules a bit.  The
4107         reduce/reduce conflicts are now gone (except the one we inherited
4108         from mcs).
4109
4110 2004-06-11  Martin Baulig  <martin@ximian.com>
4111
4112         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
4113         call this twice: for params and varargs methods.
4114
4115 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
4116
4117         * class.cs:
4118         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
4119
4120 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
4121
4122         * attribute.cs (Attribute.GetValidTargets): Made public.
4123
4124         * class.cs: 
4125         (AbstractPropertyEventMethod): New class for better code sharing.
4126         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
4127         CS1667 report.
4128         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
4129
4130 2004-06-09  Martin Baulig  <martin@ximian.com>
4131
4132         * cs-parser.jay: Removed a reduce/reduce conflict.
4133
4134 2004-06-03  Martin Baulig  <martin@ximian.com>
4135
4136         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
4137         GetSimpleName() and return a SimpleName.
4138
4139         * ecore.cs (SimpleName.Arguments): New public field.
4140         (SimpleName): Added overloaded ctor which takes an additional
4141         TypeArguments argument.
4142         (SimpleName.SimpleNameResolve): Added support for generic methods.
4143         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
4144         formerly in MemberAccess.DoResolve(), but we also need it in
4145         SimpleNameResolve().
4146
4147         * expression.cs (MemberAccess.DoResolve): Use the new
4148         MethodGroupExpr.ResolveGeneric().       
4149
4150 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4151
4152         * decl.cs: If possible, use lookuptypedirect here. We can only do
4153         this if there is no `.' after the namespace. Avoids using
4154         LookupType, which does lots of slow processing.
4155         (FindNestedType) New method, does what it says :-).
4156         * namespace.cs: use LookupTypeDirect.
4157         * rootcontext.cs: use membercache, if possible.
4158         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
4159
4160 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4161
4162         * expression.cs:
4163         According to the spec, 
4164
4165         In a member access of the form E.I, if E is a single identifier,
4166         and if the meaning of E as a simple-name (§7.5.2) is a constant,
4167         field, property, localvariable, or parameter with the same type as
4168         the meaning of E as a type-name (§3.8), then both possible
4169         meanings of E are permitted.
4170
4171         We did not check that E as a simple-name had the same type as E as
4172         a type name.
4173
4174         This trivial check gives us 5-7% on bootstrap time.
4175
4176 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4177
4178         * expression.cs (Invocation.OverloadResolve): Avoid the
4179         use of hashtables and boxing here by allocating on demand.
4180
4181 2004-05-30  Martin Baulig  <martin@ximian.com>
4182
4183         * rootcontext.cs (RootContext.LookupType): Don't cache things if
4184         we're doing a silent lookup.  Don't try to lookup nested types in
4185         TypeManager.object_type (thanks to Ben Maurer).
4186
4187 2004-05-30  Martin Baulig  <martin@ximian.com>
4188
4189         Committing a patch from Ben Maurer.
4190
4191         * rootcontext.cs (RootContext.LookupType): Cache negative results.
4192
4193 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4194
4195         * convert.cs: add a trivial cache for overload operator resolution.
4196
4197 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
4198
4199         * attribute.cs
4200         (AttributeTester.GetObsoleteAttribute): Returns instance of
4201         ObsoleteAttribute when type is obsolete.
4202
4203         * class.cs
4204         (TypeContainer.VerifyObsoleteAttribute): Override.
4205         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
4206         (MethodCode.VerifyObsoleteAttribute): Override.
4207         (MemberBase.VerifyObsoleteAttribute): Override.
4208
4209         * decl.cs
4210         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
4211         and report proper error.
4212
4213         *delegate.cs
4214         (Delegate.VerifyObsoleteAttribute): Override.
4215
4216         * ecore.cs
4217         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
4218         and report proper error.
4219         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
4220
4221         * enum.cs
4222         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
4223         and enum member.
4224
4225         * expression.cs
4226         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
4227         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
4228         Added test for ObsoleteAttribute.
4229
4230         * statement.cs
4231         (Catch): Derived from Statement.
4232
4233 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4234
4235         * decl.cs: If possible, use lookuptypedirect here. We can only do
4236         this if there is no `.' after the namespace. Avoids using
4237         LookupType, which does lots of slow processing.
4238         (FindNestedType) New method, does what it says :-).
4239         * namespace.cs: use LookupTypeDirect.
4240         * rootcontext.cs: use membercache, if possible.
4241         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
4242
4243 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4244
4245         * expression.cs:
4246         According to the spec, 
4247
4248         In a member access of the form E.I, if E is a single identifier,
4249         and if the meaning of E as a simple-name (§7.5.2) is a constant,
4250         field, property, localvariable, or parameter with the same type as
4251         the meaning of E as a type-name (§3.8), then both possible
4252         meanings of E are permitted.
4253
4254         We did not check that E as a simple-name had the same type as E as
4255         a type name.
4256
4257         This trivial check gives us 5-7% on bootstrap time.
4258
4259 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
4260
4261         Fixed bug #59071 & cs0160.cs
4262         * statement.cs (Try.Resolve): Check here whether order of catch
4263         clauses matches their dependencies.
4264
4265 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
4266
4267         Fixed bug #58624
4268         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
4269         unsafe type.
4270
4271 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4272
4273         * expression.cs (Invocation.OverloadResolve): Avoid the
4274         use of hashtables and boxing here by allocating on demand.
4275
4276 2004-05-30  Martin Baulig  <martin@ximian.com>
4277
4278         * rootcontext.cs (RootContext.LookupType): Don't cache things if
4279         we're doing a silent lookup.  Don't try to lookup nested types in
4280         TypeManager.object_type (thanks to Ben Maurer).
4281
4282 2004-05-30  Martin Baulig  <martin@ximian.com>
4283
4284         Committing a patch from Ben Maurer.
4285
4286         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
4287
4288 2004-05-29  Martin Baulig  <martin@ximian.com>
4289
4290         * class.cs (IMethodData.ShouldIgnore): New method.
4291
4292         * typemanager.cs (TypeManager.MethodFlags): Don't take a
4293         `Location' argument, we don't need it anywhere.  Use
4294         `IMethodData.ShouldIgnore ()' instead of
4295         `MethodData.GetMethodFlags ()'.
4296         (TypeManager.AddMethod): Removed.
4297         (TypeManager.AddMethod2): Renamed to AddMethod.
4298
4299 2004-05-29  Martin Baulig  <martin@ximian.com>
4300
4301         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
4302
4303         * convert.cs (Convert.ImplicitReferenceConversion): If we're
4304         converting from a class type S to an interface type and we already
4305         have an object on the stack, don't box it again.  Fixes #52578.
4306
4307 2004-05-29  Martin Baulig  <martin@ximian.com>
4308
4309         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
4310         Added support for `params' parameters.  Fixes #59267.
4311
4312 2004-05-29  Martin Baulig  <martin@ximian.com>
4313
4314         * literal.cs (NullPointer): Provide a private .ctor which sets
4315         `type' to TypeManager.object_type.  Fixes #59048.
4316
4317 2004-05-29  Martin Baulig  <martin@ximian.com>
4318
4319         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
4320         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
4321
4322         * ecore.cs (EventExpr.instance_expr): Make the field private.
4323
4324 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
4325
4326         Fixed bug #50080 & cs0214-2.cs
4327         * expression.cs (Cast.DoResolve): Check unsafe context here.
4328         
4329         * statement.cs (Resolve.DoResolve): Likewise.
4330
4331 2004-05-26  Martin Baulig  <martin@ximian.com>
4332
4333         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
4334
4335         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
4336         (RootContext.LookupType): Pass down the `silent' flag.
4337
4338 2004-05-25  Martin Baulig  <martin@ximian.com>
4339
4340         * expression.cs
4341         (MethodGroupExpr.IdenticalTypeName): New public property.
4342         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
4343         expression actually refers to a type.
4344
4345 2004-05-25  Martin Baulig  <martin@ximian.com>
4346
4347         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
4348         for #56176 and made it actually work.
4349
4350 2004-05-25  Martin Baulig  <martin@ximian.com>
4351
4352         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
4353         (FieldExpr, PropertyExpr): Override and implement
4354         CacheTemporaries.  Fixes #52279.
4355
4356 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
4357
4358         * location.cs: In the new compiler listing a file twice is a
4359         warning, not an error.
4360
4361 2004-05-24  Martin Baulig  <martin@ximian.com>
4362
4363         * enum.cs (Enum.DefineType): For the `BaseType' to be a
4364         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
4365
4366 2004-05-24  Martin Baulig  <martin@ximian.com>
4367
4368         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
4369         walking the `using' list.  Fixes #53921.
4370
4371 2004-05-24  Martin Baulig  <martin@ximian.com>
4372
4373         * const.cs (Const.LookupConstantValue): Added support for
4374         EmptyCast's; fixes #55251.
4375
4376 2004-05-24  Martin Baulig  <martin@ximian.com>
4377
4378         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
4379         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
4380         which does the CS0135 check.  The reason is that we first need to
4381         check whether the variable actually exists.
4382
4383 2004-05-24  Martin Baulig  <martin@ximian.com>
4384
4385         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
4386         than RootContext.LookupType() to find the explicit interface
4387         type.  Fixes #58584.
4388
4389 2004-05-24  Raja R Harinath  <rharinath@novell.com>
4390
4391         * Makefile: Simplify.  Use executable.make.
4392         * mcs.exe.sources: New file.  List of sources of mcs.exe.
4393
4394 2004-05-24  Anders Carlsson  <andersca@gnome.org>
4395
4396         * decl.cs:
4397         * enum.cs:
4398         Use the invariant culture when doing String.Compare for CLS case
4399         sensitivity.
4400         
4401 2004-05-23  Martin Baulig  <martin@ximian.com>
4402
4403         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
4404         don't have any dots.  Fixes #52622, added cs0246-8.cs.
4405
4406         * namespace.cs (NamespaceEntry.Lookup): Likewise.
4407
4408 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
4409
4410         * class.cs (MemberBase.Define): Reuse MemberType member for 
4411         resolved type. Other methods can use it too.
4412
4413 2004-05-23  Martin Baulig  <martin@ximian.com>
4414
4415         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
4416         the variable also exists in the current block (otherwise, we need
4417         to report a CS0103).  Fixes #58670.
4418
4419 2004-05-23  Martin Baulig  <martin@ximian.com>
4420
4421         * flowanalysis.cs (Reachability.Reachable): Compute this
4422         on-the-fly rather than storing it as a field.
4423
4424 2004-05-23  Martin Baulig  <martin@ximian.com>
4425
4426         * flowanalysis.cs (Reachability.And): Manually compute the
4427         resulting `barrier' from the reachability.      
4428        
4429 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
4430
4431         Fix bug #57835
4432         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
4433         instance of ObsoleteAttribute when symbol is obsolete.
4434
4435         * class.cs
4436         (IMethodData): Extended interface for ObsoleteAttribute support.
4437
4438 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
4439
4440         * attribute.cs: Fix bug #55970
4441
4442 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
4443
4444         Fix bug #52705
4445         * attribute.cs
4446         (GetObsoleteAttribute): New method. Creates the instance of
4447         ObsoleteAttribute.
4448         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
4449         ObsoleteAttribute when member is obsolete.
4450         (AttributeTester.Report_ObsoleteMessage): Common method for
4451         Obsolete error/warning reporting.
4452
4453         * class.cs
4454         (TypeContainer.base_classs_type): New member for storing parent type.
4455
4456         * decl.cs
4457         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
4458         for this MemberCore.
4459
4460 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
4461
4462         * attribute.cs, const.cs: Fix bug #58590
4463
4464 2004-05-21  Martin Baulig  <martin@ximian.com>
4465
4466         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
4467         out parameters if the end of the method is unreachable.  Fixes
4468         #58098. 
4469
4470 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
4471
4472         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
4473         Hari was right, why extra method.
4474
4475 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
4476
4477         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
4478
4479 2004-05-20  Martin Baulig  <martin@ximian.com>
4480
4481         * delegate.cs: Convert this file to Unix mode - like the original
4482         version in mcs is.
4483
4484 2004-05-20  Martin Baulig  <martin@ximian.com>
4485
4486         * attribute.cs: Convert this file to Unix mode - like the original
4487         version in mcs is.
4488
4489 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
4490
4491        Fix bug #58688 (MCS does not report error when the same attribute
4492        is assigned twice)
4493
4494        * attribute.cs (Attribute.Emit): Distinction between null and default.
4495
4496 2004-05-19  Raja R Harinath  <rharinath@novell.com>
4497
4498        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
4499        of a top-level attribute without an attribute target.
4500        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
4501        Make non-static.
4502        (Attribute.Conditional_GetConditionName), 
4503        (Attribute.Obsolete_GetObsoleteMessage): Update.
4504        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
4505        part of ScanForIndexerName.
4506        (Attribute.CanIgnoreInvalidAttribute): New function.
4507        (Attribute.ScanForIndexerName): Move to ...
4508        (Attributes.ScanForIndexerName): ... here.
4509        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
4510        (Attributes.Search): New internal variant that can choose not to
4511        complain if types aren't resolved.  The original signature now
4512        complains.
4513        (Attributes.GetClsCompliantAttribute): Use internal variant, with
4514        complaints suppressed.
4515        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
4516        only if it not useful.
4517        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
4518        top-level for attributes that are shared between the assembly
4519        and a top-level class.
4520        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
4521        * class.cs: Update to reflect changes.
4522        (DefineIndexers): Fuse loops.
4523        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
4524        a couple more variants of attribute names.
4525
4526 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
4527
4528         Fix bug #52585 (Implemented explicit attribute declaration)
4529
4530         * attribute.cs:
4531         (Attributable.ValidAttributeTargets): New abstract method. It gets
4532         list of valid attribute targets for explicit target declaration.
4533         (Attribute.Target): It holds target itself.
4534         (AttributeSection): Removed.
4535         (Attribute.CheckTargets): New method. It checks whether attribute
4536         target is valid for the current element.
4537
4538         * class.cs:
4539         (EventProperty): New class. For events that are declared like
4540         property (with add and remove accessors).
4541         (EventField): New class. For events that are declared like field.
4542         class.cs
4543
4544         * cs-parser.jay: Implemented explicit attribute target declaration.
4545
4546         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
4547         Override ValidAttributeTargets.
4548
4549         * parameter.cs:
4550         (ReturnParameter): Class for applying custom attributes on 
4551         the return type.
4552         (ParameterAtribute): New class. Class for applying custom
4553         attributes on the parameter type.
4554
4555 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
4556
4557         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
4558         definitions. 
4559
4560         (Method): Allow UNSAFE here.
4561
4562         * modifiers.cs: Support unsafe reporting.
4563
4564 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
4565
4566         * decl.cs: Fix bug #58478.
4567
4568 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4569
4570         * statement.cs: When checking for unreachable code on an EmptyStatement,
4571         set the location. Fixes bug #58488.
4572
4573 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
4574
4575         * driver.cs: Add -pkg handling.
4576
4577         From Gonzalo: UseShelLExecute=false
4578
4579 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
4580
4581         * attribute.cs:
4582         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
4583         for attribute.
4584         (Attribute.IsClsCompliaceRequired): Moved to base for better
4585         accesibility.
4586         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
4587         when attribute is AttributeUsageAttribute.
4588         (Attribute.GetValidTargets): Simplified.
4589         (Attribute.GetAttributeUsage): New method returns AttributeUsage
4590         attribute for this type.
4591         (Attribute.ApplyAttributes): Method renamed to Emit and make
4592         non-static.
4593         (GlobalAttributeSection): New class for special handling of global
4594         attributes (assembly, module).
4595         (AttributeSection.Emit): New method.
4596
4597         * class.cs: Implemented Attributable abstract methods.
4598         (MethodCore.LabelParameters): Moved to Parameter class.
4599         (Accessor): Is back simple class.
4600         (PropertyMethod): Implemented Attributable abstract class.
4601         (DelegateMethod): Implemented Attributable abstract class.
4602         (Event): New constructor for disctintion between normal Event
4603         and Event with accessors.
4604
4605         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
4606
4607         * codegen.cs, const.cs, decl.cs, delegate.cs:
4608         (CommonAssemblyModulClass): Implemented Attributable abstract class
4609         and simplified.
4610
4611         * enum.cs: Implement IAttributeSupport interface.
4612         (EnumMember): New class for emum members. Implemented Attributable
4613         abstract class
4614
4615         * parameter.cs:
4616         (ParameterBase): Is abstract.
4617         (ReturnParameter): New class for easier [return:] attribute handling.
4618
4619         * typemanager.cs: Removed builder_to_attr.
4620
4621 2004-05-11  Raja R Harinath  <rharinath@novell.com>
4622
4623         Fix bug #57151.
4624         * attribute.cs (Attribute.GetPositionalValue): New function.
4625         * class.cs (TypeContainer.VerifyMembers): New function.
4626         (TypeContainer.Emit): Use it.
4627         (ClassOrStruct): New base class for Class and Struct.
4628         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
4629         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
4630         class.
4631         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
4632         then each non-static field should have a FieldOffset attribute.
4633         Otherwise, none of the fields should have a FieldOffset attribute.
4634         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
4635         and FieldOffset attributes.
4636         * typemanager.cs (TypeManager.struct_layout_attribute_type)
4637         (TypeManager.field_offset_attribute_type): New core types.
4638         (TypeManager.InitCoreTypes): Initialize them.
4639
4640 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
4641
4642         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
4643         Return correct type.
4644         From bug #58270.
4645
4646 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
4647
4648         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
4649         be implicitly converted to ulong.
4650         
4651         * expression.cs: The logic for allowing operator &, | and ^ worked
4652         was wrong, it worked before because we did not report an error in
4653         an else branch.  Fixes 57895.
4654
4655         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
4656         allow volatile fields to be reference types.
4657
4658 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
4659
4660         * driver.cs: Add support for /debug-
4661
4662 2004-05-07  Raja R Harinath  <rharinath@novell.com>
4663
4664         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
4665         Add a 'complain' parameter to silence errors.
4666         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
4667         silently overlooked type-resolutions.
4668         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
4669         to reflect changes.
4670         (Attributes.Search): New function.
4671         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
4672         (Attributes.GetAttributeFullName): Remove hack.
4673         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
4674         Update to reflect changes.
4675         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
4676         Use Attributes.Search instead of nested loops.
4677
4678 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
4679
4680         * decl.cs:
4681         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
4682         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
4683         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
4684
4685         * report.cs: (Report.Warning): Renamed to Warning_T because of
4686         parameter collision.
4687
4688 2004-05-05  Raja R Harinath  <rharinath@novell.com>
4689
4690         * expression.cs (MemberAccess.ResolveMemberAccess):
4691         Exit with non-zero status after Report.Error.
4692         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
4693         Likewise.
4694         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
4695
4696 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
4697
4698         * support.cs: Don't hang when the file is empty.
4699
4700 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
4701
4702         * support.cs: In SeekableStreamReader, compute the preamble size of the
4703           underlying stream. Position changes should take into account that initial
4704           count of bytes.
4705
4706 2004-05-03  Todd Berman  <tberman@sevenl.net>
4707
4708         * driver.cs: remove unused GetSysVersion function.
4709
4710 2004-05-03  Todd Berman  <tberman@sevenl.net>
4711
4712         * driver.cs: Remove the hack from saturday, as well as the hack
4713         from jackson (LoadAssemblyFromGac), also adds the CWD to the
4714         link_paths to get that bit proper.
4715
4716 2004-05-01  Todd Berman  <tberman@sevenl.net>
4717
4718         * driver.cs: Try a LoadFrom before a Load, this checks the current
4719         path. This is currently a bug in mono that is be fixed, however, this
4720         provides a workaround for now. This will be removed when the bug
4721         is fixed.
4722
4723 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
4724
4725         * CryptoConvert.cs: Updated to latest version. Fix issue with 
4726         incomplete key pairs (#57941).
4727
4728 2004-05-01  Todd Berman  <tberman@sevenl.net>
4729
4730         * driver.cs: Remove '.' from path_chars, now System.* loads properly
4731         from the GAC
4732
4733 2004-04-30  Jackson Harper  <jackson@ximian.com>
4734
4735         * codegen.cs: Open keys readonly.
4736         
4737 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4738
4739         * typemanager.cs: don't report cyclic struct layout when a struct
4740         contains 2 or more fields of the same type. Failed for Pango.AttrShape
4741         which has 2 Pango.Rectangle fields.
4742
4743 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
4744
4745         * expression.cs: Handle IntPtr comparisons with IL code
4746         rather than a method call.
4747
4748 2004-04-29  Martin Baulig  <martin@ximian.com>
4749
4750         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
4751         the list of PropertyInfo's in class hierarchy and find the
4752         accessor.  Fixes #56013.
4753
4754 2004-04-29  Martin Baulig  <martin@ximian.com>
4755
4756         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
4757
4758 2004-04-29  Martin Baulig  <martin@ximian.com>
4759
4760         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
4761
4762         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
4763
4764 2004-04-29  Martin Baulig  <martin@ximian.com>
4765
4766         * class.cs (ConstructorInitializer.Resolve): Check whether the
4767         parent .ctor is accessible.  Fixes #52146.
4768
4769 2004-04-29  Martin Baulig  <martin@ximian.com>
4770
4771         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
4772
4773         * statement.cs (Using.EmitLocalVariableDecls): Use
4774         TypeManager.idisposable_type, not typeof (IDisposable).
4775         (Foreach.EmitCollectionForeach): Added support for valuetypes.
4776
4777 2004-04-29  Martin Baulig  <martin@ximian.com>
4778
4779         * class.cs (Event.Define): Don't emit the field and don't set
4780         RTSpecialName and SpecialName for events on interfaces.  Fixes
4781         #57703. 
4782
4783 2004-04-29  Raja R Harinath  <rharinath@novell.com>
4784
4785         Refactor Attribute.ApplyAttributes.
4786         * attribute.cs (Attributable): New base class for objects that can
4787         have Attributes applied on them.
4788         (Attribute): Make AttributeUsage fields public.
4789         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
4790         (Attribute.IsInternalCall): New property.
4791         (Attribute.UsageAttr): Convert to a public read-only property.
4792         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
4793         (Attribute.ResolveType, Attribute.Resolve)
4794         (Attribute.ScanForIndexerName): Update to reflect changes.
4795         (Attribute.CheckAttributeTarget): Re-format.
4796         (Attribute.ApplyAttributes): Refactor, to various
4797         Attributable.ApplyAttributeBuilder methods.
4798         * decl.cs (MemberCore): Make Attributable.
4799         * class.cs (Accessor): Make Attributable.
4800         (MethodData.ApplyAttributes): Use proper attribute types, not
4801         attribute names.
4802         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
4803         (TypeContainer.ApplyAttributeBuilder)
4804         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
4805         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
4806         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
4807         (Operator.ApplyAttributeBuilder): New factored-out methods.
4808         * const.cs (Const.ApplyAttributeBuilder): Likewise.
4809         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
4810         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
4811         * parameter.cs (ParameterBase): New Attributable base class
4812         that can also represent Return types.
4813         (Parameter): Update to the changes.
4814
4815 2004-04-29  Jackson Harper  <jackson@ximian.com>
4816
4817         * driver.cs: Prefer the corlib system version when looking for
4818         assemblies in the GAC. This is still a hack, but its a better hack
4819         now.
4820         
4821 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
4822
4823         * decl.cs, enum.cs: Improved error 3005 reporting.
4824   
4825         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
4826         (related_symbols): New private member for list of symbols
4827         related to reported error/warning.
4828         
4829         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
4830
4831 2004-04-29  Martin Baulig  <martin@ximian.com>
4832
4833         * ecore.cs (Expression.Constantify): If we're an enum and
4834         TypeManager.TypeToCoreType() doesn't give us another type, use
4835         t.UnderlyingSystemType.  Fixes #56178.  
4836
4837 2004-04-29  Martin Baulig  <martin@ximian.com>
4838
4839         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
4840         interfaces and for each interface, only add members directly
4841         declared in that interface.  Fixes #53255.
4842
4843 2004-04-28  Martin Baulig  <martin@ximian.com>
4844
4845         * expression.cs (ConditionalLogicalOperator): Use a temporary
4846         variable for `left' to avoid that we evaluate it more than once;
4847         bug #52588.
4848
4849 2004-04-28  Martin Baulig  <martin@ximian.com>
4850
4851         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
4852         `void[]' (CS1547).
4853
4854 2004-04-28  Martin Baulig  <martin@ximian.com>
4855
4856         * statement.cs (LocalInfo.Resolve): Check whether the type is not
4857         void (CS1547).
4858
4859         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
4860         whether the type is not void (CS1547).
4861
4862 2004-04-28  Martin Baulig  <martin@ximian.com>
4863
4864         * expression.cs (Unary.DoResolveLValue): Override this and report
4865         CS0131 for anything but Operator.Indirection.
4866
4867 2004-04-28  Martin Baulig  <martin@ximian.com>
4868
4869         Committing a patch from Ben Maurer; see bug #50820.
4870
4871         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4872         check for classes.
4873
4874         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4875         classes.        
4876
4877 2004-04-28  Martin Baulig  <martin@ximian.com>
4878
4879         Committing a patch from Ben Maurer; see bug #50820.
4880
4881         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
4882         check for classes.
4883
4884         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
4885         classes.        
4886
4887 2004-04-28  Martin Baulig  <martin@ximian.com>
4888
4889         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
4890         (Block.AddLabel): Call DoLookupLabel() to only search in the
4891         current block.
4892
4893 2004-04-28  Martin Baulig  <martin@ximian.com>
4894
4895         * cfold.cs (ConstantFold.BinaryFold): Added special support for
4896         comparing StringConstants and NullLiterals in Equality and Inequality.
4897
4898 2004-04-28  Jackson Harper  <jackson@ximian.com>
4899
4900         * driver.cs: Attempt to load referenced assemblies from the
4901         GAC. This is the quick and dirty version of this method that
4902         doesnt take into account versions and just takes the first
4903         canidate found. Will be good enough for now as we will not have more
4904         then one version installed into the GAC until I update this method.
4905
4906 2004-04-28  Martin Baulig  <martin@ximian.com>
4907
4908         * typemanager.cs (TypeManager.CheckStructCycles): New public
4909         static method to check for cycles in the struct layout.
4910
4911         * rootcontext.cs (RootContext.PopulateTypes): Call
4912         TypeManager.CheckStructCycles() for each TypeContainer.
4913         [Note: We only need to visit each type once.]
4914
4915 2004-04-28  Martin Baulig  <martin@ximian.com>
4916
4917         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
4918
4919         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
4920         success and added `out object value'.  Use a `bool resolved' field
4921         to check whether we've already been called rather than
4922         `ConstantValue != null' since this breaks for NullLiterals.
4923
4924 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4925
4926         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
4927         setting of this flag, since the 'set' method may be non-public.
4928
4929 2004-04-28  Raja R Harinath  <rharinath@novell.com>
4930
4931         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
4932         check on current_vector.Block.
4933
4934 2004-04-27  Martin Baulig  <martin@ximian.com>
4935
4936         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
4937         a field initializer.  Fixes #56459.
4938
4939 2004-04-27  Martin Baulig  <martin@ximian.com>
4940
4941         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
4942         we're not attempting to use an indexer.  Fixes #52154.
4943
4944 2004-04-27  Martin Baulig  <martin@ximian.com>
4945
4946         * statement.cs (Return): Don't create a return label if we don't
4947         need it; reverts my change from January 20th.  Thanks to Ben
4948         Maurer for this.
4949
4950 2004-04-27  Martin Baulig  <martin@ximian.com>
4951
4952         According to the spec, `goto' can only leave a nested scope, but
4953         never enter it.
4954
4955         * statement.cs (Block.LookupLabel): Only lookup in the current
4956         block, don't recurse into parent or child blocks.
4957         (Block.AddLabel): Check in parent and child blocks, report
4958         CS0140/CS0158 if we find a duplicate.
4959         (Block): Removed this indexer for label lookups.
4960         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
4961         this already does the error reporting for us.
4962
4963         * flowanalysis.cs
4964         (FlowBranching.UsageVector.Block): New public variable; may be null.
4965         (FlowBranching.CreateSibling): Added `Block' argument.
4966         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
4967         label for the target of a `goto' and check whether we're not
4968         leaving a `finally'.
4969
4970 2004-04-27  Martin Baulig  <martin@ximian.com>
4971
4972         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
4973         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
4974         just for returns).
4975
4976 2004-04-27  Martin Baulig  <martin@ximian.com>
4977
4978         * statement.cs (Block.AddLabel): Also check for implicit blocks
4979         and added a CS0158 check.
4980
4981 2004-04-27  Martin Baulig  <martin@ximian.com>
4982
4983         * flowanalysis.cs (FlowBranchingLoop): New class.
4984         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
4985         UsageVector's instead of an ArrayList.
4986         (FlowBranching.Label): Likewise.
4987         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
4988         (FlowBranching.AddBreakVector): New method.
4989
4990 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
4991
4992         * attribute.cs: Small regression fix: only convert the type if we
4993         the type is different, fixes System.Drawing build.
4994
4995 2004-04-27  Martin Baulig  <martin@ximian.com>
4996
4997         * attribute.cs (Attribute.Resolve): If we have a constant value
4998         for a named field or property, implicity convert it to the correct
4999         type.
5000
5001 2004-04-27  Raja R Harinath  <rharinath@novell.com>
5002
5003         * statement.cs (Block.Block): Implicit blocks share
5004         'child_variable_names' fields with parent blocks.
5005         (Block.AddChildVariableNames): Remove.
5006         (Block.AddVariable): Mark variable as "used by a child block" in
5007         every surrounding block.
5008         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
5009         been used in a child block, complain about violation of "Invariant
5010         meaning in blocks" rule.
5011         * cs-parser.jay (declare_local_variables): Don't use
5012         AddChildVariableNames.
5013         (foreach_statement): Don't create an implicit block: 'foreach'
5014         introduces a scope.
5015
5016 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
5017
5018         * convert.cs (ImplicitNumericConversion): 0 is also positive when
5019         converting from 0L to ulong.  Fixes 57522.
5020
5021 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
5022
5023         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
5024         derived class hides via 'new' keyword field from base class (test-242.cs).
5025         TODO: Handle this in the more general way.
5026         
5027         * class.cs (CheckBase): Ditto.
5028
5029 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
5030
5031         * decl.cs (caching_flags): New member for storing cached values
5032         as bit flags.
5033         (MemberCore.Flags): New enum where bit flags for caching_flags
5034         are defined.
5035         (MemberCore.cls_compliance): Moved to caching_flags.
5036         (DeclSpace.Created): Moved to caching_flags.
5037
5038         * class.cs: Use caching_flags instead of DeclSpace.Created
5039         
5040 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
5041
5042         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
5043         if we are only a derived class, not a nested class.
5044
5045         * typemanager.cs: Same as above, but do this at the MemberLookup
5046         level (used by field and methods, properties are handled in
5047         PropertyExpr).   Allow for the qualified access if we are a nested
5048         method. 
5049
5050 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
5051
5052         * class.cs: Refactoring.
5053         (IMethodData): New inteface; Holds links to parent members
5054         to avoid member duplication (reduced memory allocation).
5055         (Method): Implemented IMethodData interface.
5056         (PropertyBase): New inner classes for get/set methods.
5057         (PropertyBase.PropertyMethod): Implemented IMethodData interface
5058         (Event): New inner classes for add/remove methods.
5059         (Event.DelegateMethod): Implemented IMethodData interface.
5060
5061         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
5062         EmitContext (related to class.cs refactoring).
5063
5064 2004-04-21  Raja R Harinath  <rharinath@novell.com>
5065
5066         * delegate.cs (Delegate.VerifyApplicability): If the number of
5067         arguments are the same as the number of parameters, first try to
5068         verify applicability ignoring  any 'params' modifier on the last
5069         parameter.
5070         Fixes #56442.
5071
5072 2004-04-08  Martin Baulig  <martin@ximian.com>
5073
5074         Merged latest changes into gmcs.  Please keep this comment in
5075         here, it makes it easier for me to see what changed in MCS since
5076         the last time I merged.
5077
5078 2004-04-16  Raja R Harinath  <rharinath@novell.com>
5079
5080         * class.cs (TypeContainer.AddIndexer): Use
5081         'ExplicitInterfaceName' to determine if interface name was
5082         explicitly specified.  'InterfaceType' is not initialized at this time.
5083         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
5084         Indexers array is already in the required order.  Initialize
5085         'IndexerName' only if there are normal indexers.
5086         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
5087         (TypeContainer.Emit): Emit DefaultMember attribute only if
5088         IndexerName is initialized.
5089         Fixes #56300.
5090
5091 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
5092
5093         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
5094         Fixes #57007
5095
5096 2004-04-15  Raja R Harinath  <rharinath@novell.com>
5097
5098         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
5099         attributes.
5100         Fix for #56456.
5101
5102         * attribute.cs (Attribute.Resolve): Check for duplicate named
5103         attributes.
5104         Fix for #56463.
5105
5106 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
5107
5108         * iterators.cs (MarkYield): track whether we are in an exception,
5109         and generate code accordingly.  Use a temporary value to store the
5110         result for our state.
5111
5112         I had ignored a bit the interaction of try/catch with iterators
5113         since their behavior was not entirely obvious, but now it is
5114         possible to verify that our behavior is the same as MS .NET 2.0
5115
5116         Fixes 54814
5117
5118 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
5119
5120         * iterators.cs: Avoid creating temporaries if there is no work to
5121         do. 
5122
5123         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
5124         Enumerations, use TypeManager.EnumToUnderlying and call
5125         recursively. 
5126
5127         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
5128         bug #57013
5129
5130         (This.Emit): Use EmitContext.EmitThis to emit our
5131         instance variable.
5132
5133         (This.EmitAssign): Ditto.
5134
5135         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
5136         codepaths, we will move all the functionality into
5137         Mono.CSharp.This 
5138
5139         (FieldExpr.EmitAssign): Ditto.
5140
5141         This fixes several hidden bugs that I uncovered while doing a code
5142         review of this today.
5143
5144         * codegen.cs (EmitThis): reworked so the semantics are more clear
5145         and also support value types "this" instances.
5146
5147         * iterators.cs: Changed so that for iterators in value types, we
5148         do not pass the value type as a parameter.  
5149
5150         Initialization of the enumerator helpers is now done in the caller
5151         instead of passing the parameters to the constructors and having
5152         the constructor set the fields.
5153
5154         The fields have now `assembly' visibility instead of private.
5155
5156 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
5157
5158         * expression.cs (Argument.Resolve): Check if fields passed as ref
5159         or out are contained in a MarshalByRefObject.
5160
5161         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
5162         another compiler type.
5163
5164 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
5165
5166         * class.cs (Indexer.Define): use the new name checking method.
5167         Also, return false on an error.
5168         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
5169         (is_identifier_[start/part]_character): make static.
5170
5171 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
5172
5173         * expression.cs (Binary.ResolveOperator): Do no append strings
5174         twice: since we can be invoked more than once (array evaluation)
5175         on the same concatenation, take care of this here.  Based on a fix
5176         from Ben (bug #56454)
5177
5178 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
5179
5180         * codegen.cs: Fix another case where CS1548 must be reported (when 
5181         delay-sign isn't specified and no private is available #56564). Fix
5182         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
5183         error when MCS is used on the MS runtime and we need to delay-sign 
5184         (which seems unsupported by AssemblyBuilder - see #56621).
5185
5186 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
5187
5188         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
5189         (TypeManager.ComputeNamespaces): Faster implementation for
5190         Microsoft runtime.
5191
5192         * compiler.csproj: Updated AssemblyName to mcs.
5193
5194 2004-05-11  Jackson Harper  <jackson@ximian.com>
5195
5196         * Makefile: Preserve MONO_PATH
5197         
5198 2004-05-11  Jackson Harper  <jackson@ximian.com>
5199
5200         * Makefile: Use mono and mcs to build gmcs
5201         
5202 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
5203
5204         * codegen.cs: Add patch from Robert Shade
5205         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
5206         sync with mcs.
5207
5208 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
5209
5210         * CryptoConvert.cs: Updated to latest version. Fix issue with 
5211         incomplete key pairs (#57941).
5212
5213 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
5214
5215         * codegen.cs: Fix another case where CS1548 must be reported (when 
5216         delay-sign isn't specified and no private is available #56564). Fix
5217         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
5218         error when MCS is used on the MS runtime and we need to delay-sign 
5219         (which seems unsupported by AssemblyBuilder - see #56621).
5220
5221 2004-04-29  Jackson Harper  <jackson@ximian.com>
5222
5223         * Makefile: Set MONO_PATH to use the bootstrap corlib
5224         * driver.cs: Check the GAC for referenced assemblies.
5225                 
5226 2004-04-29  Martin Baulig  <martin@ximian.com>
5227
5228         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
5229
5230 2004-04-07  Martin Baulig  <martin@ximian.com>
5231
5232         * expression.cs (Binary.ResolveOperator): Added special case for
5233         Equality/Inequality between a type parameter and a null literal.
5234
5235 2004-04-07  Martin Baulig  <martin@ximian.com>
5236
5237         * convert.cs: Check null literal -> type parameter conversions.
5238
5239 2004-04-07  Martin Baulig  <martin@ximian.com>
5240
5241         * generic.cs (ConstructedType.CheckConstraints): Enforce the
5242         `class' and `struct' constraints.
5243
5244 2004-04-07  Martin Baulig  <martin@ximian.com>
5245
5246         * generic.cs (SpecialConstraint): New public enum.
5247         (Constraints.Resolve): Added support for the `class' and `struct'
5248         constraints.
5249
5250         * cs-parser.jay (type_parameter_constraint): Added support for the
5251         `class' and `struct' constraints.
5252
5253 2004-04-07  Martin Baulig  <martin@ximian.com>
5254
5255         * support.cs (GenericConstraints): Replaced `Types' by
5256         `ClassConstraint' and `InterfaceConstraints'; added
5257         `HasClassConstraint'.   
5258
5259 2004-04-07  Martin Baulig  <martin@ximian.com>
5260
5261         * generic.cs
5262         (Constraints.InterfaceConstraints): New public property.
5263         (Constraints.Types): Make this property public
5264         (TypeParameter): Implement IMemberContainer.
5265         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
5266         instead of a TypeBuilder/MethodBuilder; pass the interface
5267         constraints to TypeManager.AddTypeParameter().
5268         (TypeParameter.DefineType): Just take an EmitContext and no
5269         TypeBuilder/MethodBuilder.  Use the new public API.
5270
5271         * typemanager.cs (TypeManager.AddTypeParameter): Added
5272         `TypeExpr[]' argument; add the interfaces to the
5273         `builder_to_ifaces' hash.
5274         (TypeManager.LookupMemberContainer): For
5275         GenericTypeParameterBuilders, get the TypeParameter from the
5276         `builder_to_type_param'.
5277         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
5278         the TypeParameter and call FindMembers on it.
5279
5280 2004-04-07  Martin Baulig  <martin@ximian.com>
5281
5282         * class.cs
5283         (MethodCore.GenericMethod): Moved this field here from Method.
5284         (MethodCore.IsDuplicateImplementation): Take the number of type
5285         parameters into account if we're a generic method.
5286
5287         * expression.cs (Invocation.InferTypeArguments): Don't return true
5288         if `arguments' is null; we still need to check whether we actually
5289         don't need to infer anything in this case.
5290         (MemberAccess): Merged the functionality from GenericMemberAccess
5291         into this class.
5292
5293         * generic.cs (GenericMemberAccess): Removed.
5294
5295 2004-04-05  Martin Baulig  <martin@ximian.com>
5296
5297         * decl.cs (MemberCore): For generic classes, interfaces and
5298         structs, `Name' now includes the number of type parameters
5299         ("Stack!1.Node!1").
5300         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
5301         encode the number of type arguments in the type name.
5302
5303         * expression.cs (Expression.MemberLookup): Removed the
5304         `num_type_args' argument; we now encode the number of type
5305         arguments in the type name.
5306
5307         * ecore.cs (SimpleName): Encode the number of type arguments in
5308         the type name itself.
5309
5310         * generic.cs (ConstructedType): Likewise.
5311
5312         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
5313         `MemberName'; we now include the number of type parameters in the
5314         type name.
5315
5316         * typemanager.cs (TypeManager.CheckGeneric): Removed.
5317         (TypeManager.MemberLookup): Removed the
5318         `num_type_args' argument; we now encode the number of type
5319         arguments in the type name.     
5320
5321 2004-04-03  Martin Baulig  <martin@ximian.com>
5322
5323         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
5324         (MemberCore.MemberName): Moved here from MemberBase.
5325         (DeclSpace.SetParameterInfo): Just take the constraints as an
5326         ArrayList; we already have the type parameters in our
5327         `MemberName'; also do the CS0080 reporting here.
5328
5329         * cs-parser.jay (struct_declaration): Use `member_name' instead of
5330         `IDENTIFIER opt_type_parameter_list'; when constructing our
5331         `MemberName', it'll already include our type parameters.
5332         (class_declaration, interface_declaration): Likewise.
5333         (delegate_declaration): Likewise.
5334         (MakeName): Take a MemberName and return a MemberName.
5335         The following two changes are required to avoid shift/reduce conflicts:
5336         (member_name): Don't include a TypeName anymore; ie. this is now
5337         just 'IDENTIFIER opt_type_parameter_list'.
5338         (property_declaration, event_declaration): Use a
5339         `namespace_or_type_name' instead of a `member_name'.            
5340
5341 2004-04-03  Martin Baulig  <martin@ximian.com>
5342
5343         * decl.cs (MemberName): Renamed to `TypeName' and created a new
5344         `MemberName' class.
5345         (TypeName): Formerly known as MemberName.
5346
5347         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
5348         instead of a `MemberName'.
5349
5350         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
5351         (member_name): New rule; create a MemberName.
5352
5353 2004-04-02  Martin Baulig  <martin@ximian.com>
5354
5355         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
5356         (CS0305 and CS0308).
5357
5358 2004-04-02  Martin Baulig  <martin@ximian.com>
5359
5360         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
5361         support for nested types.
5362
5363 2004-04-02  Martin Baulig  <martin@ximian.com>
5364
5365         * ecore.cs (IAlias): New public interface.
5366         (TypeExpr, TypeExpression): Implement IAlias.
5367         (TypeAliasExpression): New public class.
5368
5369         * namespace.cs (Namespace): Implement IAlias.
5370         (Namespace.Lookup): Return an IAlias instead on an object.
5371         (Namespace.DefineName): Take an IAlias instead of an object.
5372         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
5373         an object.
5374         (NamespaceEntry.UsingAlias): Take a Membername instead of an
5375         Expression.
5376         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
5377         object.
5378         (NamespaceEntry.Lookup): Likewise.
5379
5380         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
5381         instead of a Type.      
5382
5383         * decl.cs (DeclSpace): Implement IAlias.
5384         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
5385
5386         * generic.cs (ConstructedType): Improved error checking.
5387
5388 2004-04-02  Martin Baulig  <martin@ximian.com>
5389
5390         * convert.cs: Added type parameter conversions.
5391
5392         * ecore.cs
5393         (UnboxCast.Emit): Emit an `unbox.any' for type params.
5394         (ClassCast.Emit): If the source type is a type parameter, box it.
5395         If the target type is a type parameter, emit an `unbox.any'
5396         instead of a `classcast'.1      
5397
5398 2004-04-01  Martin Baulig  <martin@ximian.com>
5399
5400         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
5401
5402 2004-04-01  Martin Baulig  <martin@ximian.com>
5403
5404         * generic.cs (ConstructedType.CheckConstraints): Use
5405         Convert.ImplicitStandardConversionExists(); user-defined implicit
5406         conversions are not allowed according to the spec.
5407
5408 2004-03-30  Martin Baulig  <martin@ximian.com>
5409
5410         * expression.cs (New): Added support for type parameters.
5411
5412         * typemanager.cs
5413         (TypeManager.activator_type): New public static field.
5414         (TypeManager.activator_create_instance): Likewise.
5415
5416 2004-03-30  Martin Baulig  <martin@ximian.com>
5417
5418         * typemanager.cs (TypeManager.HasConstructorConstraint): New
5419         public method.
5420
5421 2004-03-30  Martin Baulig  <martin@ximian.com>
5422
5423         * generic.cs (ConstructedType.CheckConstraints): Actually follow
5424         the spec here: the argument type must be convertible to the
5425         constraints.
5426
5427 2004-03-30  Martin Baulig  <martin@ximian.com>
5428
5429         * generic.cs
5430         (TypeParameter.Define, TypeParameter.DefineMethod): Call
5431         TypeManager.AddTypeParameter().
5432         (ConstructedType.CheckConstraints): Re-enable this and actually
5433         check whether we have a constructor constraint.
5434
5435         * typemanager.cs
5436         (TypeManager.builder_to_type_param): New static field.
5437         (TypeManager.AddTypeParameter): New static method.
5438         (TypeManager.LookupTypeParameter): New public method.
5439
5440 2004-03-30  Martin Baulig  <martin@ximian.com>
5441
5442         * generic.cs (TypeParameter.DefineType): Return a boolean and use
5443         the new API to actually define the constructor constraint.
5444
5445         * typemanager.cs
5446         (TypeManager.new_constraint_attr_type): New static field.
5447         (TypeManager.InitCoreTypes): Initialize it.
5448
5449 2004-03-30  Martin Baulig  <martin@ximian.com>
5450
5451         * generic.cs (Constraints): Completed error checking, use correct
5452         error numbers.
5453
5454 2004-03-29  Martin Baulig  <martin@ximian.com>
5455
5456         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
5457
5458         * expression.cs (Invocation.InferTypeArguments): Added overloaded
5459         public version which takes a `ParameterData pd' instead of an
5460         `ArrayList args'.
5461
5462 2004-03-29  Martin Baulig  <martin@ximian.com>
5463
5464         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
5465         not a MethodInfo.       
5466
5467 2004-03-29  Martin Baulig  <martin@ximian.com>
5468
5469         * expression.cs (Argument.ResolveMethodGroup): If we're a
5470         ConstructedType, call GetMemberAccess() on it.  
5471
5472 2004-03-29  Martin Baulig  <martin@ximian.com>
5473
5474         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
5475         (MethodCore.CheckGenericOverride): When overriding a generic
5476         method, check whether the constraints match.
5477
5478         * support.cs (GenericConstraints): New public interface.
5479         (ParameterData.GenericConstraints): New public method.
5480
5481         * parameter.cs (Parameter.Resolve): Check whether we're a generic
5482         method parameter and compute our constraints if appropriate.
5483         (Parameter.GenericConstraints): New public property.
5484
5485         * generic.cs (Constraints): Implement GenericConstraints.
5486
5487 2004-03-29  Martin Baulig  <martin@ximian.com>
5488
5489         * decl.cs (MemberCache.FindMemberToOverride): Use
5490         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
5491
5492 2004-03-29  Martin Baulig  <martin@ximian.com>
5493
5494         * generic.cs (GenericMethod.Define): Resolve our type parameters.
5495
5496 2004-03-29  Martin Baulig  <martin@ximian.com>
5497
5498         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
5499         not allowed on non-generic declarations").
5500
5501 2004-03-29  Martin Baulig  <martin@ximian.com>
5502
5503         * expression.cs (Invocation.InferTypeArguments): Added overloaded
5504         public version of this method.
5505
5506         * class.cs (MethodCore.IsDuplicateImplementation): Use
5507         Invocation.InferTypeArguments() to check this.
5508
5509 2004-03-29  Martin Baulig  <martin@ximian.com>
5510
5511         * convert.cs: Use TypeManager.IsDelegateType() instead of
5512         comparing types correctly.
5513
5514 2004-03-29  Martin Baulig  <martin@ximian.com>
5515
5516         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
5517         types directly to make it work for generic instances.
5518
5519         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
5520
5521 2004-03-29  Martin Baulig  <martin@ximian.com>
5522
5523         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
5524         support for arrays.     
5525
5526 2004-03-24  Martin Baulig  <martin@ximian.com>
5527
5528         * decl.cs (DeclSpace.FindType): Also use
5529         TypeManager.CheckGeneric() for types from the using clauses.
5530
5531 2004-03-23  Martin Baulig  <martin@ximian.com>
5532
5533         * expression.cs (Invocation.OverloadResolve): Added `bool
5534         may_fail' argument and use it instead of the Location.IsNull() hack.
5535
5536 2004-03-23  Martin Baulig  <martin@ximian.com>
5537
5538         * expression.cs (Invocation.InferType): Use correct type inference
5539         rules here.     
5540
5541 2004-03-23  Martin Baulig  <martin@ximian.com>
5542
5543         * ecore.cs (MethodGroupExpr.Name): Use
5544         TypeManager.CSharpSignature() instead of just the name.
5545
5546         * expression.cs (Invocation.OverloadResolve): Provide better error
5547         reporting.
5548         (Invocation.DoResolve): OverloadResolve() never returns null
5549         without reporting an error, so removed the error -6 reporting here.
5550
5551 2004-03-23  Martin Baulig  <martin@ximian.com>
5552
5553         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
5554         generic methods.
5555
5556         * cs-parser.jay (delegate_declaration): Support generic delegates.
5557
5558         * delegate.cs: Support generic delegates.
5559
5560 2004-03-22  Martin Baulig  <martin@ximian.com>
5561
5562         * expression.cs (Invocation.InferParamsTypeArguments): New static
5563         method; does type inference for params arguments.
5564
5565 2004-03-21  Martin Baulig  <martin@ximian.com>
5566
5567         * typemanager.cs (TypeManager.IsGenericMethod): New public static
5568         method; checks whether a method is a generic method.    
5569
5570         * expression.cs (Invocation.InferTypeArguments): New static method;
5571         infer type arguments for generic method invocation.
5572
5573         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
5574         property; we set this to true if we're resolving a generic method
5575         invocation and the user specified type arguments, ie. we're not
5576         doing type inference.
5577
5578 2004-03-20  Martin Baulig  <martin@ximian.com>
5579
5580         * class.cs (MethodData.DeclaringType): New public property.
5581         (MethodData.Define): Set DeclaringType here.
5582         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
5583         instead of OperatorMethodBuilder.DeclaringType.
5584
5585 2004-03-20  Martin Baulig  <martin@ximian.com>
5586
5587         * cs-tokenizer.cs (xtoken): Return a special
5588         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
5589
5590         * cs-parser.jay (default_value_expression): Switch to the new
5591         syntax (14.5.13).
5592
5593 2004-03-19  Martin Baulig  <martin@ximian.com>
5594
5595         * decl.cs (MemberName): New class.  We use this to "construct"
5596         namespace_or_type_name's.
5597
5598         * generics.cs (TypeArguments.GetDeclarations): New public method;
5599         returns the type arguments as a string[] and reports a CS0081 if
5600         one of them is not an identifier.
5601
5602         * class.cs (MemberBase): The .ctor now takes the name as a
5603         MemberName instead of a string.
5604         (MemberBase.ExplicitInterfaceName): Changed type from string to
5605         Expression.
5606         (MemberBase.DoDefine): If we're an explicit implementation, the
5607         InterfaceType may be a generic instance.
5608
5609         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
5610         (namespace_name): Call MemberName.GetName () to transform the
5611         MemberName into a string and ensure we don't have any type
5612         arguments.
5613         (type_name): Call MemberName.GetTypeExpression() to transfrom the
5614         MemberName into an expression.
5615         (method_header): Use namespace_or_type_name instead of member_name.     
5616
5617 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
5618
5619         * rootcontext.cs: Add new types to the boot resolution.
5620
5621         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
5622         MulticastDelegate is not allowed.
5623
5624         * typemanager.cs: Add new types to lookup: System.TypedReference
5625         and ArgIterator.
5626
5627         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
5628         check for TypedReference or ArgIterator, they are not allowed. 
5629
5630         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
5631         makes us properly catch 1510 in some conditions (see bug 56016 for
5632         details). 
5633
5634 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
5635
5636         * CryptoConvert.cs: update from corlib version
5637         with endian fixes.
5638
5639 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
5640
5641         * class.cs (Indexer.Define): Check indexername declaration
5642
5643 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
5644
5645         * attribute.cs (IsClsCompliant): Fixed problem with handling
5646         all three states (compliant, not-compliant, undetected).
5647
5648 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
5649
5650         * attribute.cs (Attribute): Location is now public.
5651         (Resolve): Store resolved arguments (pos_values) in attribute class.
5652         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
5653         (GetClsCompliantAttributeValue): New method that gets
5654         CLSCompliantAttribute value.
5655         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
5656         if exists else null.
5657         (AttributeTester): New class for CLS-Compliant verification routines.
5658
5659         * class.cs (Emit): Add CLS-Compliant verification.
5660         (Method.GetSignatureForError): Implemented.
5661         (Constructor.GetSignatureForError): Implemented
5662         (Constructor.HasCompliantArgs): Returns if constructor has
5663         CLS-Compliant arguments.
5664         (Constructor.Emit): Override.
5665         (Construcor.IsIdentifierClsCompliant): New method; For constructors
5666         is needed to test only parameters.
5667         (FieldBase.GetSignatureForError): Implemented.
5668         (TypeContainer): New member for storing base interfaces.
5669         (TypeContainer.FindMembers): Search in base interfaces too.
5670
5671         * codegen.cs (GetClsComplianceAttribute): New method that gets
5672         assembly or module CLSCompliantAttribute value.
5673         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
5674         for assembly.
5675         (ModuleClass.Emit): Add error 3012 test.
5676
5677         * const.cs (Emit): Override and call base for CLS-Compliant tests.
5678
5679         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
5680         state for all decl types.
5681         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
5682         if CLS-Compliant tests are required.
5683         (IsClsCompliaceRequired): New method. Analyze whether code
5684         must be CLS-Compliant.
5685         (IsExposedFromAssembly): New method. Returns true when MemberCore
5686         is exposed from assembly.
5687         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
5688         value or gets cached value.
5689         (HasClsCompliantAttribute): New method. Returns true if MemberCore
5690         is explicitly marked with CLSCompliantAttribute.
5691         (IsIdentifierClsCompliant): New abstract method. This method is
5692         used to testing error 3005.
5693         (IsIdentifierAndParamClsCompliant): New method. Common helper method
5694         for identifier and parameters CLS-Compliant testing.
5695         (VerifyClsCompliance): New method. The main virtual method for
5696         CLS-Compliant verifications.
5697         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
5698         null. I don't know why is null (too many public members !).
5699         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
5700         and get value of first CLSCompliantAttribute that found.
5701
5702         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
5703         (VerifyClsCompliance): Override and add extra tests.
5704
5705         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
5706         clscheck- disable CLS-Compliant verification event if assembly is has
5707         CLSCompliantAttribute(true).
5708
5709         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
5710         ApllyAttribute is now called in emit section as in the other cases.
5711         Possible future Emit integration.
5712         (IsIdentifierClsCompliant): New override.
5713         (VerifyClsCompliance): New override.
5714         (GetEnumeratorName): Returns full enum name.
5715
5716         * parameter.cs (GetSignatureForError): Implemented.
5717
5718         * report.cs (WarningData): New struct for Warning message information.
5719         (LocationOfPreviousError): New method.
5720         (Warning): New method. Reports warning based on the warning table.
5721         (Error_T): New method. Reports error based on the error table.
5722
5723         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
5724         verifications are done here.
5725
5726         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
5727
5728         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
5729         CLSCompliantAttribute.
5730         (all_imported_types): New member holds all imported types from other
5731         assemblies.
5732         (LoadAllImportedTypes): New method fills static table with exported types
5733         from all referenced assemblies.
5734         (Modules): New property returns all assembly modules.
5735
5736 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
5737
5738         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
5739         throwing a parser error.
5740
5741         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
5742         which removes the hardcoded get_/set_ prefixes for properties, as
5743         IL allows for the properties to be named something else.  
5744
5745         Bug #56013
5746
5747         * expression.cs: Do not override operand before we know if it is
5748         non-null.  Fix 56207
5749
5750 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5751
5752         * typemanager.cs: support for pinned variables.
5753
5754 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5755
5756         * decl.cs, typemanager.cs: Avoid using an arraylist
5757         as a buffer if there is only one result set.
5758
5759 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
5760
5761         * expression.cs: Make sure you cant call a static method
5762         with an instance expression, bug #56174.
5763
5764 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
5765
5766         * class.cs (IsDuplicateImplementation): Improve error reporting to
5767         flag 663 (method only differs in parameter modifier).
5768
5769         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
5770         in preprocessor directives.
5771
5772         * location.cs (LookupFile): Allow for the empty path.
5773
5774         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
5775         better approach for some of that patch, but its failing with the
5776         CharSet enumeration.  For now try/catch will do.
5777
5778         * typemanager.cs: Do not crash if a struct does not have fields.
5779         Fixes 56150.
5780
5781 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5782
5783         * expression.cs: cs0213, cant fix a fixed expression.
5784         fixes 50231.
5785
5786 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5787
5788         * cs-parser.jay: detect invalid embeded statements gracefully.
5789         bug #51113.
5790
5791 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
5792
5793         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
5794         As a regex:
5795         s/
5796         the invocation type may not be a subclass of the tye of the item/
5797         The type of the item must be a subclass of the invocation item.
5798         /g
5799
5800         Fixes bug #50820.
5801
5802 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
5803
5804         * attribute.cs: Added methods to get a string and a bool from an
5805         attribute. Required to information from AssemblyKeyFileAttribute,
5806         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
5807         * codegen.cs: Modified AssemblyName creation to include support for
5808         strongnames. Catch additional exceptions to report them as CS1548.
5809         * compiler.csproj: Updated include CryptoConvert.cs.
5810         * compiler.csproj.user: Removed file - user specific configuration.
5811         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
5812         Mono.Security assembly. The original class is maintained and tested in
5813         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
5814         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
5815         like CSC 8.0 (C# v2) supports.
5816         * Makefile: Added CryptoConvert.cs to mcs sources.
5817         * rootcontext.cs: Added new options for strongnames.
5818
5819 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
5820
5821         * driver.cs: For --expect-error, report error code `2'
5822         if the program compiled with no errors, error code `1' if
5823         it compiled with an error other than the one expected.
5824
5825 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
5826
5827         * compiler.csproj: Updated for Visual Studio .NET 2003.
5828         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
5829         * compiler.sln: Updated for Visual Studio .NET 2003.
5830
5831 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
5832
5833         * expression.cs: Fix bug #47234. We basically need to apply the
5834         rule that we prefer the conversion of null to a reference type
5835         when faced with a conversion to 'object' (csc behaviour).
5836
5837 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5838
5839         * statement.cs: Shorter form for foreach, eliminates
5840         a local variable. r=Martin.
5841
5842 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5843
5844         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
5845         checks if we can use brtrue/brfalse to test for 0.
5846         * expression.cs: use the above in the test for using brtrue/brfalse.
5847         cleanup code a bit.
5848
5849 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5850
5851         * expression.cs: Rewrite string concat stuff. Benefits:
5852
5853         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
5854         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
5855         rather than a concat chain.
5856
5857         * typemanager.cs: Add lookups for more concat overloads.
5858
5859 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
5860
5861         * expression.cs: Emit shorter il code for array init.
5862
5863         newarr
5864         dup
5865         // set 1
5866
5867         // set 2
5868
5869         newarr
5870         stloc.x
5871
5872         ldloc.x
5873         // set 1
5874
5875         ldloc.x
5876         // set 2
5877
5878 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
5879
5880         * statement.cs: Before, two switch blocks would be merged if the
5881         total size of the blocks (end_item - begin_item + 1) was less than
5882         two times the combined sizes of the blocks.
5883
5884         Now, it will only merge if after the merge at least half of the
5885         slots are filled.
5886
5887         fixes 55885.
5888
5889 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
5890
5891         * class.cs : csc build fix for GetMethods(). See bug #52503.
5892
5893 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
5894
5895         * expression.cs: Make sure fp comparisons work with NaN.
5896         This fixes bug #54303. Mig approved this patch a long
5897         time ago, but we were not able to test b/c the runtime
5898         had a related bug.
5899
5900 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
5901
5902         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
5903
5904 2004-03-19  Martin Baulig  <martin@ximian.com>
5905
5906         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
5907         two overloads may unify for some type parameter substitutions and
5908         report a CS0408 if appropriate.
5909
5910 2004-03-19  Martin Baulig  <martin@ximian.com>
5911
5912         * class.cs (MemberCore.IsDuplicateImplementation): Report the
5913         error here and not in our caller.
5914
5915 2004-03-19  Martin Baulig  <martin@ximian.com>
5916
5917         * interface.cs: Completely killed this file.
5918         (Interface): We're now a TypeContainer and live in class.cs.
5919
5920         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
5921         argument; we're now also called for interfaces.
5922         (TypeContainer.DefineMembers): Allow this method being called
5923         multiple times.
5924         (TypeContainer.GetMethods): New public method; formerly known as
5925         Interface.GetMethod().  This is used by PendingImplementation.
5926         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
5927         it's now private and non-static.
5928         (Interface): Moved this here; it's now implemented similar to
5929         Class and Struct.
5930         (Method, Property, Event, Indexer): Added `bool is_interface'
5931         argument to their .ctor's.
5932         (MemberBase.IsInterface): New public field.
5933
5934         * cs-parser.jay: Create normal Method, Property, Event, Indexer
5935         instances instead of InterfaceMethod, InterfaceProperty, etc.
5936         (opt_interface_base): Removed; we now use `opt_class_base' instead.
5937         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
5938
5939 2004-03-19  Martin Baulig  <martin@ximian.com>
5940
5941         * class.cs (MethodCore.IsDuplicateImplementation): New private
5942         method which does the CS0111 checking.
5943         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
5944         Use IsDuplicateImplementation().
5945
5946 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
5947
5948         * decl.cs (FindMemberToOverride): New method to find the correct
5949         method or property to override in the base class.
5950         * class.cs
5951             - Make Method/Property use the above method to find the
5952               version in the base class.
5953             - Remove the InheritableMemberSignatureCompare as it is now
5954               dead code.
5955
5956         This patch makes large code bases much faster to compile, as it is
5957         O(n) rather than O(n^2) to do this validation.
5958
5959         Also, it fixes bug 52458 which is that nested classes are not
5960         taken into account when finding the base class member.
5961
5962         Reviewed/Approved by Martin.
5963
5964 2004-03-17  Martin Baulig  <martin@ximian.com>
5965
5966         * expression.cs (MemberAccess.DoResolve): Take the parent's number
5967         of type arguments into account; use the `real_num_type_args'
5968         approach like in DoResolveAsTypeStep().
5969
5970         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
5971         nested types.
5972
5973 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
5974
5975         * interface.cs: In all interface classes removed redundant
5976         member initialization.
5977
5978 2004-03-16  Martin Baulig  <martin@ximian.com>
5979
5980         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
5981
5982 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
5983
5984         * decl.cs (DefineTypeAndParents): New helper method to define a
5985         type's containers before the type itself is defined;  This is a
5986         bug exposed by the recent changes to Windows.Forms when an
5987         implemented interface was defined inside a class that had not been
5988         built yet.   
5989
5990         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
5991
5992         (Check): Loop correctly to report errors modifiers
5993         (UNSAFE was not in the loop, since it was the same as TOP).
5994
5995         * interface.cs: Every interface member now takes a ModFlags,
5996         instead of a "is_new" bool, which we set on the base MemberCore. 
5997
5998         Every place where we called "UnsafeOk" in the interface, now we
5999         call the proper member (InterfaceMethod.UnsafeOK) instead to get
6000         the unsafe settings from the member declaration instead of the
6001         container interface. 
6002
6003         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
6004
6005         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
6006         `set_indexer_name' to the pending bits (one per type).
6007
6008         We fixed a bug today that was picking the wrong method to
6009         override, since for properties the existing InterfaceMethod code
6010         basically ignored the method name.  Now we make sure that the
6011         method name is one of the valid indexer names.
6012
6013 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
6014  
6015         * support.cs (SeekableStreamReader): Keep track of stream byte
6016         positions and don't mix them with character offsets to the buffer.
6017
6018         Patch from Gustavo Giráldez
6019
6020 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
6021
6022         * interface.cs (InterfaceSetGetBase): Removed double member
6023         initialization, base class does it as well.
6024
6025 2004-03-13  Martin Baulig  <martin@ximian.com>
6026
6027         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
6028         when compiling corlib.
6029
6030 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
6031
6032         * convert.cs (ExplicitConversion): We were reporting an error on
6033         certain conversions (object_type source to a value type, when the
6034         expression was `null') before we had a chance to pass it through
6035         the user defined conversions.
6036
6037         * driver.cs: Replace / and \ in resource specifications to dots.
6038         Fixes 50752
6039
6040         * class.cs: Add check for duplicate operators.  Fixes 52477
6041
6042 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
6043
6044         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
6045         that are in the middle of the statements, not only at the end.
6046         Fixes #54987
6047
6048         * class.cs (TypeContainer.AddField): No longer set the
6049         `HaveStaticConstructor' flag, now we call it
6050         `UserDefineStaticConstructor' to diferentiate the slightly
6051         semantic difference.
6052
6053         The situation is that we were not adding BeforeFieldInit (from
6054         Modifiers.TypeAttr) to classes that could have it.
6055         BeforeFieldInit should be set to classes that have no static
6056         constructor. 
6057
6058         See:
6059
6060         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
6061
6062         And most importantly Zoltan's comment:
6063
6064         http://bugzilla.ximian.com/show_bug.cgi?id=44229
6065
6066         "I think beforefieldinit means 'it's ok to initialize the type sometime 
6067          before its static fields are used', i.e. initialization does not need
6068          to be triggered by the first access to the type. Setting this flag
6069          helps the JIT to compile better code, since it can run the static
6070          constructor at JIT time, and does not need to generate code to call it
6071          (possibly lots of times) at runtime. Unfortunately, mcs does not set
6072          this flag for lots of classes like String. 
6073          
6074          csc sets this flag if the type does not have an explicit static 
6075          constructor. The reasoning seems to be that if there are only static
6076          initalizers for a type, and no static constructor, then the programmer
6077          does not care when this initialization happens, so beforefieldinit
6078          can be used.
6079          
6080          This bug prevents the AOT compiler from being usable, since it 
6081          generates so many calls to mono_runtime_class_init that the AOT code
6082          is much slower than the JITted code. The JITted code is faster, 
6083          because it does not generate these calls if the vtable is type is
6084          already initialized, which is true in the majority of cases. But the
6085          AOT compiler can't do this."
6086
6087 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
6088
6089         * class.cs (MethodData.Emit): Refactor the code so symbolic
6090         information is generated for destructors;  For some reasons we
6091         were taking a code path that did not generate symbolic information
6092         before. 
6093
6094 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
6095
6096         * class.cs: Create a Constructor.CheckBase method that
6097         takes care of all validation type code. The method
6098         contains some code that was moved from Define.
6099
6100         It also includes new code that checks for duplicate ctors.
6101         This fixes bug #55148.
6102
6103 2004-03-09  Joshua Tauberer <tauberer@for.net>
6104
6105         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
6106         a { ... }-style array creation invokes EmitStaticInitializers
6107         which is not good for reference-type arrays.  String, decimal
6108         and now null constants (NullCast) are not counted toward
6109         static initializers.
6110
6111 2004-03-05  Martin Baulig  <martin@ximian.com>
6112
6113         * location.cs (SourceFile.HasLineDirective): New public field;
6114         specifies whether the file contains or is referenced by a "#line"
6115         directive.
6116         (Location.DefineSymbolDocuments): Ignore source files which
6117         either contain or are referenced by a "#line" directive.        
6118
6119 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
6120
6121         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
6122         direct access to our parent, so check the method inline there.
6123
6124 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
6125
6126         * expression.cs (Invocation.EmitCall): Miguel's last commit
6127         caused a regression. If you had:
6128
6129             T t = null;
6130             t.Foo ();
6131
6132         In Foo the implict this would be null.
6133
6134 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
6135
6136         * expression.cs (Invocation.EmitCall): If the method is not
6137         virtual, do not emit a CallVirt to it, use Call.
6138
6139         * typemanager.cs (GetFullNameSignature): Improve the method to
6140         cope with ".ctor" and replace it with the type name.
6141
6142         * class.cs (ConstructorInitializer.Resolve): Now the method takes
6143         as an argument the ConstructorBuilder where it is being defined,
6144         to catch the recursive constructor invocations.
6145
6146 2004-03-16  Martin Baulig  <martin@ximian.com>
6147
6148         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
6149         ConstructedType, call ResolveType() on it to get the type rather
6150         than just using `expr.Type'.
6151
6152 2004-03-16  Martin Baulig  <martin@ximian.com>
6153
6154         * generics.cs (ConstructedType.GetMemberAccess): Take the
6155         EmitContext instead on the TypeExpr and use
6156         ec.TypeContainer.CurrentType/ec.ContainerType.
6157
6158 2004-03-16  Martin Baulig  <martin@ximian.com>
6159
6160         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
6161         parameters before aliases.
6162
6163 2004-03-16  Martin Baulig  <martin@ximian.com>
6164
6165         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
6166         New oublic function; checks whether two generic instances may become
6167         equal under some instantiations (26.3.1).
6168
6169         * class.cs (TypeContainer.Define): Call
6170         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
6171         error.
6172
6173 2004-03-16  Martin Baulig  <martin@ximian.com>
6174
6175         * class.cs (TypeContainer.GetClassBases): Moved
6176         Error_TypeParameterAsBase() here and also check whether the base
6177         class is not an attribute.
6178
6179 2004-03-16  Martin Baulig  <martin@ximian.com>
6180
6181         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
6182
6183 2004-03-16  Martin Baulig  <martin@ximian.com>
6184
6185         * class.cs (Error_TypeParameterAsBase): Use correct error number
6186         here (CS0689).  
6187
6188 2004-03-16  Martin Baulig  <martin@ximian.com>
6189
6190         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
6191         for generics.
6192
6193         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
6194         error reporting.
6195
6196 2004-03-15  Martin Baulig  <martin@ximian.com>
6197
6198         * typemanager.cs (TypeManager.GetFullName): New public method.
6199         (TypeManager.MemberLookup): Added `int_num_type_arguments'
6200         argument; only return members with the correct number of type
6201         arguments.
6202         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
6203         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
6204         whether the number of type arguments matches.
6205
6206         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
6207         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
6208
6209         * expression.cs (MemberAccess): Added public `NumTypeArguments'
6210         field; it's set by the protected .ctor when we're actually a
6211         GenericMemberAccess.
6212         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
6213         arguments and pass it to MemberLookupFinal ().
6214
6215         * ecore.cs (Expression.MemberLookup): Added `int
6216         num_type_arguments' argument; only return members with the correct
6217         number of type arguments.
6218         (Expression.MemberLookupFailed): Check whether the MemberLookup
6219         failed because we did not have the correct number of type
6220         arguments; report CS0305 in this case.
6221
6222         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
6223         `e.ResolveAsTypeTerminal()' already did so.
6224
6225 2004-03-15  Martin Baulig  <martin@ximian.com>
6226
6227         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
6228         we're a ConstructedType; in this case, the caller must report an
6229         error (for instance CS0131).
6230
6231         * generic.cs (TypeArguments): Added Location argument to the .ctor.
6232         (TypeArguments.Resolve): Actually report errors here.
6233
6234 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
6235
6236         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
6237         `set_indexer_name' to the pending bits (one per type).
6238
6239         We fixed a bug today that was picking the wrong method to
6240         override, since for properties the existing InterfaceMethod code
6241         basically ignored the method name.  Now we make sure that the
6242         method name is one of the valid indexer names.
6243
6244 2004-03-15  Martin Baulig  <martin@ximian.com>
6245
6246         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
6247         for generic instances.
6248
6249 2004-03-13  Martin Baulig  <martin@ximian.com>
6250
6251         * class.cs (TypeContainer.DefineType): Call
6252         TypeManager.AddUserType() immediately after creating the
6253         TypeBuilder; pass all type parameters when creating the
6254         CurrentType.
6255
6256         * decl.cs (DeclSpace.FindNestedType): New public method.
6257         (DeclSpace.FindType): Added `int num_type_args' argument; only
6258         return types with the correct number of type parameters.
6259         (DeclSpace.CountTypeParams): New public property.
6260
6261         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
6262         the number of type parameters; defaults to zero.
6263
6264         * generic.cs (TypeArguments.Count): New public property.
6265         (ConstructedType.DoResolveAsTypeStep): First call
6266         ds.FindNestedType() to find out whether we're nested in the
6267         current generic type; in this case, we inherit all type parameters
6268         from the current class.
6269
6270         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
6271         num_type_args' argument.
6272         (RootContext.LookupType): Added overloaded version which takes the
6273         number of type arguments; only return types with the correct
6274         number of type arguments.
6275
6276         * typemanager.cs (TypeManager.CheckGeneric): New public function;
6277         checks whether `Type t' has `int num_type_args'.
6278
6279 2004-03-13  Martin Baulig  <martin@ximian.com>
6280
6281         * generic.cs (GenericMethod.DefineType): New method; calls
6282         DefineType() on all the type parameters.
6283
6284         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
6285         (MethodData.Define): If we're a generic method, call
6286         GenericMethod.DefineType() to define the type parameters.       
6287
6288 2004-03-10  Martin Baulig  <martin@ximian.com>
6289
6290         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
6291         instead of IsAssignableFrom.    
6292
6293 2004-03-10  Martin Baulig  <martin@ximian.com>
6294
6295         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
6296
6297         * support.cs (ParameterData.HasArrayParameter): New property.
6298         (ReflectionParameters.ctor): Take a MethodBase instead of a
6299         ParameterInfo[].  If we have any type parameters, get the generic
6300         method definition and ask it whether we have variable arguments.
6301
6302 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
6303
6304         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
6305         routines to check if a type is an enumerable/enumerator allow
6306         classes that implement the IEnumerable or IEnumerator interfaces.
6307
6308         * class.cs (Property, Operator): Implement IIteratorContainer, and
6309         implement SetYields.
6310
6311         (Property.Define): Do the block swapping for get_methods in the
6312         context of iterators.   We need to check if Properties also
6313         include indexers or not.
6314
6315         (Operator): Assign the Block before invoking the
6316         OperatorMethod.Define, so we can trigger the Iterator code
6317         replacement. 
6318
6319         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
6320         Property and Operator classes are not created when we parse the
6321         declarator but until we have the block completed, so we use a
6322         singleton SimpleIteratorContainer.Simple to flag whether the
6323         SetYields has been invoked.
6324
6325         We propagate this setting then to the Property or the Operator to
6326         allow the `yield' to function.
6327
6328 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
6329
6330         * codegen.cs: Implemented attribute support for modules.
6331         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
6332         Assembly/Module functionality.
6333
6334         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
6335         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
6336         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
6337
6338 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
6339
6340         * interface.cs (FindMembers): The operation is performed on all base
6341         interfaces and not only on the first. It is required for future CLS Compliance patch.
6342
6343 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
6344
6345         * statement.cs, codegen.cs:
6346         This patch deals with patterns such as:
6347
6348         public class List : IEnumerable {
6349
6350                 public MyEnumerator GetEnumerator () {
6351                         return new MyEnumerator(this);
6352                 }
6353
6354                 IEnumerator IEnumerable.GetEnumerator () {
6355                         ...
6356                 }
6357                 
6358                 public struct MyEnumerator : IEnumerator {
6359                         ...
6360                 }
6361         }
6362
6363         Before, there were a few things we did wrong:
6364         1) we would emit callvirt on a struct, which is illegal
6365         2) we emited ldarg when we needed to emit ldarga
6366         3) we would mistakenly call the interface methods on an enumerator
6367         type that derived from IEnumerator and was in another assembly. For example:
6368
6369         public class MyEnumerator : IEnumerator
6370
6371         Would have the interface methods called, even if there were public impls of the
6372         method. In a struct, this lead to invalid IL code.
6373
6374 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
6375
6376         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
6377           renamed to Emit.
6378
6379         * delegate.cs (Define): Fixed crash when delegate type is undefined.
6380
6381 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
6382
6383         * cs-parser.jay: Fix small regression: we were not testing V2
6384         compiler features correctly.
6385
6386         * interface.cs: If the emit context is null, then create one
6387
6388 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
6389
6390         * decl.cs (GetSignatureForError): New virtual method to get full name
6391           for error messages.
6392
6393         * attribute.cs (IAttributeSupport): New interface for attribute setting.
6394           Now it is possible to rewrite ApplyAttributes method to be less if/else.
6395
6396         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
6397           Duplicated members and code in these classes has been removed.
6398           Better encapsulation in these classes.
6399
6400 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
6401
6402         * assign.cs (Assign.DoResolve): When dealing with compound
6403         assignments, there is a new rule in ECMA C# 2.4 (might have been
6404         there before, but it is documented here) that states that in:
6405
6406         a op= b;
6407
6408         If b is of type int, and the `op' is a shift-operator, then the
6409         above is evaluated as:
6410
6411         a = (int) a op b 
6412
6413         * expression.cs (Binary.ResolveOperator): Instead of testing for
6414         int/uint/long/ulong, try to implicitly convert to any of those
6415         types and use that in pointer arithmetic.
6416
6417         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
6418         method to print information for from the type, not from the
6419         null-method we were given.
6420
6421 2004-02-01  Duncan Mak  <duncan@ximian.com>
6422
6423         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
6424         parsing for cmd, fixes bug #53694.
6425
6426 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
6427
6428         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
6429         in the member name duplication tests. Property and operator name duplication
6430         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
6431
6432 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
6433
6434         * interface.cs (PopulateMethod): Fixed crash when interface method
6435         returns not existing type (error test cs0246-3.cs).
6436
6437 2004-02-02  Ravi Pratap M <ravi@ximian.com>
6438
6439         * cs-parser.jay (interface_accessors): Re-write actions to also
6440         store attributes attached to get and set methods. Fix spelling
6441         while at it.
6442
6443         (inteface_property_declaration): Modify accordingly.
6444
6445         (InterfaceAccessorInfo): New helper class to store information to pass
6446         around between rules that use interface_accessors.
6447
6448         * interface.cs (Emit): Apply attributes on the get and set
6449         accessors of properties and indexers too.
6450
6451         * attribute.cs (ApplyAttributes): Modify accordingly to use the
6452         right MethodBuilder when applying attributes to the get and set accessors.
6453
6454 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
6455
6456         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
6457
6458 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
6459
6460         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
6461
6462 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
6463
6464         * cs-parser.jay: Remove YIELD token, instead use the new grammar
6465         changes that treat `yield' specially when present before `break'
6466         or `return' tokens.
6467
6468         * cs-tokenizer.cs: yield is no longer a keyword.
6469
6470 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
6471
6472         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
6473         setting for default constructors.
6474         For default constructors are almost every time set wrong Modifier. The
6475         generated IL code has been alright. But inside mcs this values was
6476         wrong and this was reason why several of my CLS Compliance tests
6477         failed.
6478
6479 2004-02-27  Martin Baulig  <martin@ximian.com>
6480
6481         * generics.cs (ConstructedType.ResolveType): Make the nested type
6482         stuff actually work.
6483
6484 2004-02-25  Martin Baulig  <martin@ximian.com>
6485
6486         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
6487         property; returns the type parameters just from the current type,
6488         ie. with the ones from outer classes.
6489         (DeclSpace.LookupGeneric): First search in the current class, then
6490         in outer classes.
6491         (DeclSpace.initialize_type_params): When hiding a type parameter
6492         from an outer class, put it into the `type_param_list' anyways.
6493
6494         * expression.cs (MemberAccess.expr): Made this field protected.
6495
6496         * class.cs (TypeContainer.Define): The `CurrentType' just contains
6497         the type parameters from the current class.
6498
6499         * generic.cs (ConstructedType.ResolveType): Support nested generic
6500         types by taking the type parameters which we inherit from outer
6501         classes into account.
6502         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
6503         support for nested generic types.
6504
6505 2004-02-23  Martin Baulig  <martin@ximian.com>
6506
6507         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
6508         field and check whether we're nested inside a generic type.
6509         (DeclSpace.ResolveType): If we're resolving to a generic type
6510         definition, create a ConstructedType and return its resolved type.
6511         (DeclSpace.initialize_type_params): New private method;
6512         initializes the `type_param_list' field from the type parameters
6513         from this and all enclosing classes.
6514         (DeclSpace.TypeParameters): Call initialize_type_params() unless
6515         we're already initialized.
6516
6517 2004-02-23  Martin Baulig  <martin@ximian.com>
6518
6519         * class.cs (Method.Define): Create the generic method before
6520         calling DoDefine().
6521         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
6522         the TypeContainer one); we use this for generic methods.
6523
6524         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
6525         parent's TypeBuilder.
6526
6527 2004-02-18  Martin Baulig  <martin@ximian.com>
6528
6529         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
6530         to check for equality.
6531
6532 2004-02-05  Martin Baulig  <martin@ximian.com>
6533
6534         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
6535         `ec.TypeContainer.CurrentType', use it instead of
6536         `ec.ContainerType' to check whether we're in the type's ctor.
6537
6538 2004-01-29  Martin Baulig  <martin@ximian.com>
6539
6540         * expression.cs (Invocation.DoResolve): If we're a
6541         `ConstructedType', then we're actually a generic method, so
6542         rewrite the expr as a GenericMemberAccess.
6543
6544         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
6545         here; manually parse it into a string.
6546
6547 2004-01-28  Martin Baulig  <martin@ximian.com>
6548
6549         * typemanager.cs (TypeManager.IsEqual): New static method.
6550         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
6551         check for equality instead of using `=='.
6552
6553 2004-01-26  Martin Baulig  <martin@ximian.com>
6554
6555         * decl.cs (DeclSpace.CurrentType): New public field.
6556
6557         * expression.cs (This.ResolveBase): If we have an
6558         `ec.TypeContainer.CurrentType', use it instead of
6559         `ec.ContainerType'.
6560
6561         * class.cs (TypeContainer.DefineType): If we're a generic type,
6562         create the `CurrentType' (unresolved).
6563         (TypeContainer.GenericType): New private field.
6564         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
6565         it and store it in `GenericType' before creating the MemberCache.
6566         (TypeContainer.GetMembers): If we have a `GenericType', call
6567         TypeManager.FindMembers() on it.
6568
6569         * interface.cs (Interface.GenericType): New private field.
6570         (Interface.DefineType): If we're a generic type, create the
6571         `CurrentType' (unresolved).
6572         (Interface.DefineMembers): If we have a `CurrentType', resolve it
6573         and store it in `GenericType' before creating the MemberCache.
6574         (Interface.GetMembers): If we have a `GenericType', call
6575         TypeManager.FindMembers() on it.
6576
6577 2004-01-22  Martin Baulig  <martin@ximian.com>
6578
6579         * cs-parser.jay (namespace_or_type_name): Return an Expression,
6580         not a QualifiedIdentifier.  This is what `type_name_expression'
6581         was previously doing.
6582         (type_name_expression): Removed; the code is now in
6583         `namespace_or_type_name'.
6584         (qualified_identifier): Removed, use `namespace_or_type_name'
6585         instead.
6586         (QualifiedIdentifier): Removed this class.      
6587
6588 2004-01-22  Martin Baulig  <martin@ximian.com>
6589
6590         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
6591         not a string as alias name.
6592
6593 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
6594
6595         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
6596         #52730 bug, and instead compute correctly the need to use a
6597         temporary variable when requesting an address based on the
6598         static/instace modified of the field and the constructor.
6599  
6600 2004-01-21  Martin Baulig  <martin@ximian.com>
6601
6602         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
6603         class and namespace before looking up aliases.  Fixes #52517.
6604
6605 2004-01-21  Martin Baulig  <martin@ximian.com>
6606
6607         * flowanalysis.cs (UsageVector.Merge): Allow variables being
6608         assinged in a 'try'; fixes exception4.cs.
6609
6610 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6611         * class.cs : Implemented parameter-less constructor for TypeContainer
6612
6613         * decl.cs: Attributes are now stored here. New property OptAttributes
6614
6615         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
6616
6617         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
6618
6619 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6620
6621         * typemanager.cs (CSharpSignature): Now reports also inner class name.
6622           (CSharpSignature): New method for indexer and property signature.
6623
6624 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6625
6626         * pending.cs (IsVirtualFilter): Faster implementation.
6627
6628 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6629
6630         * typemanager.cs: Avoid inclusion of same assembly more than once.
6631
6632 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6633
6634         * cs-parser.jay: Fixed problem where the last assembly attribute
6635           has been applied also to following declaration (class, struct, etc.)
6636           
6637 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
6638
6639         * class.cs: Added error CS0538, CS0539 reporting.
6640         Fixed crash on Microsoft runtime when field type is void.
6641
6642         * cs-parser.jay: Added error CS0537 reporting.
6643
6644         * pending.cs: Added error CS0535 reporting.
6645         Improved error report for errors CS0536, CS0534.
6646
6647 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
6648
6649         Merge a few bits from the Anonymous Method MCS tree.
6650
6651         * statement.cs (ToplevelBlock): New class for toplevel methods,
6652         will hold anonymous methods, lifted variables.
6653
6654         * cs-parser.jay: Create toplevel blocks for delegates and for
6655         regular blocks of code. 
6656
6657 2004-01-20  Martin Baulig  <martin@ximian.com>
6658
6659         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
6660         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
6661         and `NeedExplicitReturn'; added `IsLastStatement'.
6662         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
6663         have a `ReturnLabel' or we're not unreachable.
6664
6665         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
6666         child's reachability; don't just override ours with it.  Fixes
6667         #58058 (lluis's example).
6668         (FlowBranching): Added public InTryOrCatch(), InCatch(),
6669         InFinally(), InLoop(), InSwitch() and
6670         BreakCrossesTryCatchBoundary() methods.
6671
6672         * statement.cs (Return): Do all error checking in Resolve().
6673         Unless we are the last statement in a top-level block, always
6674         create a return label and jump to it.
6675         (Break, Continue): Do all error checking in Resolve(); also make
6676         sure we aren't leaving a `finally'.
6677         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
6678         statement in a top-level block.
6679         (Block.Flags): Added `IsDestructor'.
6680         (Block.IsDestructor): New public property.
6681
6682 2004-01-20  Martin Baulig  <martin@ximian.com>
6683
6684         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
6685
6686 2004-01-20  Martin Baulig  <martin@ximian.com>
6687
6688         * statement.cs (Statement.ResolveUnreachable): New public method.
6689         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
6690         (Block.Resolve): Resolve unreachable statements.
6691
6692 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
6693
6694         * expression.cs: We need to fix the case where we do
6695         not have a temp variable here.
6696
6697         * assign.cs: Only expression compound assignments need
6698         temporary variables.
6699
6700 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
6701
6702         * flowanalysis.cs: Reduce memory allocation in a few ways:
6703           - A block with no variables should not allocate a bit
6704             vector for itself.
6705           - A method with no out parameters does not need any tracking
6706             for assignment of the parameters, so we need not allocate
6707             any data for it.
6708           - The arrays:
6709                 public readonly Type[] VariableTypes;
6710                 public readonly string[] VariableNames;
6711             Are redundant. The data is already stored in the variable
6712             map, so we need not allocate another array for it.
6713           - We need to add alot of checks for if (params | locals) == null
6714             due to the first two changes.
6715
6716 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
6717
6718         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
6719         implement IMemoryLocation, we store a copy on a local variable and
6720         take the address of it.  Patch from Benjamin Jemlich
6721
6722         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
6723         to use a special "type_name_expression" rule which reduces the
6724         number of "QualifiedIdentifier" classes created, and instead
6725         directly creates MemberAccess expressions.
6726
6727 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
6728
6729         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
6730         that fixes #52853.  Null literal assignment to ValueType
6731
6732         * class.cs (MethodData.Emit): Instead of checking the name of the
6733         method to determine if its a destructor, create a new derived
6734         class from Method called Destructor, and test for that.  
6735
6736         * cs-parser.jay: Create a Destructor object instead of a Method.  
6737
6738         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
6739
6740         Fixes: 52933
6741
6742 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
6743
6744         * expression.cs (Binary.ResolveOperator): Perform an implicit
6745         conversion from MethodGroups to their delegate types on the
6746         Addition operation.
6747
6748         * delegate.cs: Introduce a new class DelegateCreation that is the
6749         base class for `NewDelegate' and `ImplicitDelegateCreation',
6750         factor some code in here.
6751
6752         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
6753         conversion from MethodGroups to compatible delegate types. 
6754
6755         * ecore.cs (Expression.Resolve): Do not flag error 654
6756         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
6757         we allow conversions from MethodGroups to delegate types now.
6758
6759         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
6760         assignments in v2 either.
6761
6762 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
6763
6764         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
6765         static read-only fields in ctors.
6766
6767         Applied patch from Benjamin Jemlich 
6768
6769         * expression.cs (UnaryMutator): Avoid leaking local variables. 
6770
6771 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
6772
6773         * cs-tokenizer.cs (IsCastToken): Allow the various native types
6774         here to return true, as they can be used like this:
6775
6776                 (XXX) int.MEMBER ()
6777
6778         Fixed 49836 and all the other dups
6779
6780 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
6781
6782         * driver.cs: Implement /win32res and /win32icon.
6783
6784 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
6785
6786         * cs-parser.jay: Add a rule to improve error handling for the
6787         common mistake of placing modifiers after the type.
6788
6789 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
6790
6791         * cs-parser.jay (interface_event_declaration): Catch
6792         initialization of events on interfaces, and report cs0068
6793
6794         * cs-parser.jay (interface_event_declaration): Catch
6795         initialization of events. 
6796
6797         * ecore.cs: Better report missing constructors.
6798
6799         * expression.cs (Binary.ResolveOperator): My previous bug fix had
6800         the error reporting done in the wrong place.  Fix.
6801
6802         * expression.cs (Binary.ResolveOperator): Catch the 
6803         operator + (E x, E y) error earlier, and later allow for implicit
6804         conversions in operator +/- (E e, U x) from U to the underlying
6805         type of E.
6806
6807         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
6808         52596, if the container class is abstract, the default constructor
6809         is protected otherwise its public (before, we were always public).
6810
6811         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
6812         fixed statement.
6813
6814         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
6815         Jemlich that fixes bug #52597, MCS was generating invalid code for
6816         idisposable structs.   Thanks to Ben for following up with this
6817         bug as well.
6818
6819 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
6820
6821         * driver.cs: Allow assemblies without code to be generated, fixes
6822         52230.
6823
6824 2004-01-07  Nick Drochak <ndrochak@gol.com>
6825
6826         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
6827
6828 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
6829
6830         * cs-parser.jay: Add rules to improve error reporting if fields or
6831         methods are declared at the namespace level (error 116)
6832
6833         * Add rules to catch event add/remove
6834
6835 2004-01-04  David Sheldon <dave-mono@earth.li>
6836
6837   * expression.cs: Added matching ")" to error message for 
6838   CS0077
6839
6840 2004-01-03 Todd Berman <tberman@gentoo.org>
6841
6842         * ecore.cs, attribute.cs:
6843         Applying fix from #52429.
6844
6845 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6846
6847         * ecore.cs, expression.cs, statement.cs:
6848         Total rewrite of how we handle branching. We
6849         now handle complex boolean expressions with fewer
6850         jumps. As well if (x == 0) no longer emits a ceq.
6851
6852         if (x is Foo) is much faster now, because we generate
6853         better code.
6854
6855         Overall, we get a pretty big improvement on our benchmark
6856         tests. The code we generate is smaller and more readable.
6857
6858         I did a full two-stage bootstrap. The patch was reviewed
6859         by Martin and Miguel.
6860
6861 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6862
6863         * cs-parser.jay: Make primary_expression not take a QI.
6864         we dont need this because the member_access rule covers
6865         us here. So we replace the rule with just IDENTIFIER.
6866
6867         This has two good effects. First, we remove a s/r conflict.
6868         Second, we allocate many fewer QualifiedIdentifier objects.
6869
6870 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6871
6872         * attribute.cs: Handle MarshalAs attributes as pseudo, and
6873         set the correct information via SRE. This prevents
6874         hanging on the MS runtime. Fixes #29374.
6875
6876 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
6877
6878         * convert.cs: correctly handle conversions to value types
6879         from Enum and ValueType as unboxing conversions.
6880
6881         Fixes bug #52569. Patch by Benjamin Jemlich.
6882
6883 2004-01-02  Ravi Pratap  <ravi@ximian.com>
6884
6885         * expression.cs (BetterConversion): Prefer int -> uint
6886         over int -> ulong (csc's behaviour). This fixed bug #52046.
6887
6888 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
6889
6890         * decl.cs (MemberCache.FindMembers): now returns a
6891         MemberInfo [].
6892
6893         * typemanager.cs: In general, go with with ^^.
6894         (CopyNewMethods): take an IList.
6895         (RealMemberLookup): Only allocate an arraylist
6896         if we copy from two sets of methods.
6897
6898         This change basically does two things:
6899         1) Fewer array lists allocated due to CopyNewMethods.
6900         2) the explicit cast in MemberList costed ALOT.
6901
6902 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
6903
6904         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
6905         a hashtable to avoid needless string allocations when an identifier is
6906         used more than once (the common case).
6907
6908 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6909
6910         * pending.cs: MS's TypeBuilder.GetInterfaces ()
6911         is broken, it will not return anything. So, we
6912         have to use the information we have in mcs to
6913         do the task.
6914
6915         * typemanager.cs: Add a cache for GetInterfaces,
6916         since this will now be used more often (due to ^^)
6917
6918         (GetExplicitInterfaces) New method that gets the
6919         declared, not effective, interfaces on a type
6920         builder (eg, if you have interface IFoo, interface
6921         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
6922         { IBar }.
6923
6924         This patch makes MCS able to bootstrap itself on
6925         Windows again.
6926
6927 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
6928
6929         * expression.cs: Remove the Nop's that Miguel put
6930         in by mistake.
6931
6932 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6933
6934         * report.cs, codegen.cs: Give the real stack trace to
6935         the error when an exception is thrown.
6936
6937 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6938
6939         * decl.cs: only allocate hashtables for ifaces if 
6940         it is an iface!
6941
6942 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
6943
6944         * expression.cs: fix the error from cs0121-2.cs
6945         (a parent interface has two child interfaces that
6946         have a function with the same name and 0 params
6947         and the function is called through the parent).
6948
6949 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
6950
6951         * class.cs, rootcontext.cs, typmanager.cs: do not
6952         leak pointers.
6953
6954 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
6955
6956         * codegen.cs: remove stack for the ec flow branching.
6957         It is already a linked list, so no need.
6958
6959 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
6960
6961         * Makefile: Allow custom profiler here.
6962
6963 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6964
6965         * typemanager.cs (LookupType):
6966           - Use a static char [], because split takes
6967             a param array for args, so it was allocating
6968             every time.
6969           - Do not store true in a hashtable, it boxes.
6970
6971 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
6972
6973         * flowanalysis.cs: bytify common enums.
6974
6975 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6976
6977         * modifiers.cs: Add a new set of flags for the
6978         flags allowed on explicit interface impls.
6979         * cs-parser.jay: catch the use of modifiers in
6980         interfaces correctly.
6981         * class.cs: catch private void IFoo.Blah ().
6982
6983         All related to bug #50572.
6984
6985 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6986
6987         * decl.cs: Rewrite the consistant accessability checking.
6988         Accessability is not linear, it must be implemented in
6989         a tableish way. Fixes #49704.
6990
6991 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
6992
6993         * expression.cs: Handle negation in a checked context.
6994         We must use subtraction from zero. Fixes #38674.
6995
6996 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
6997
6998         * class.cs: Ignore static void main in DLLs.
6999         * rootcontext.cs: Handle the target type here,
7000         since we are have to access it from class.cs
7001         * driver.cs: account for the above.
7002
7003 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
7004
7005         * report.cs: Give line numbers and files if available.
7006
7007 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
7008
7009         * driver.cs: Implement /addmodule.
7010
7011         * typemanager.cs:  Change 'modules' field so it now contains Modules not
7012         ModuleBuilders.
7013
7014 2003-12-20  Martin Baulig  <martin@ximian.com>
7015
7016         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
7017         (FieldBase.IsAssigned): Removed this field.
7018         (FieldBase.SetAssigned): New public method.
7019         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
7020
7021 2003-12-20  Martin Baulig  <martin@ximian.com>
7022
7023         * expression.cs (LocalVariableReference.DoResolve): Don't set
7024         `vi.Used' if we're called from DoResolveLValue().
7025
7026         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
7027         returns the usage vector it just merged into the current one -
7028         pass this one to UsageWarning().
7029         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
7030         of the `EmitContext', don't call this recursively on our children.
7031
7032 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
7033
7034         * driver.cs: Implement /target:module.
7035
7036 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
7037
7038         * support.cs (CharArrayHashtable): New helper class.
7039
7040         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
7041         char arrays, not strings, so we can avoid creating a string in
7042         consume_identifier if the identifier is a keyword.
7043
7044 2003-12-16  Martin Baulig  <martin@ximian.com>
7045
7046         * statement.cs (LocalInfo.Assigned): Removed this property.
7047         (LocalInfo.Flags): Removed `Assigned'.
7048         (LocalInfo.IsAssigned): New public method; takes the EmitContext
7049         and uses flow analysis.
7050         (Block.UsageWarning): Made this method private.
7051         (Block.Resolve): Call UsageWarning() if appropriate.
7052
7053         * expression.cs (LocalVariableReference.DoResolve): Always set
7054         LocalInfo.Used here.
7055
7056 2003-12-13  Martin Baulig  <martin@ximian.com>
7057
7058         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
7059         any value here; we're now using flow analysis to figure out
7060         whether a statement/block returns a value.
7061
7062 2003-12-13  Martin Baulig  <martin@ximian.com>
7063
7064         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
7065         working again.
7066         (FlowBranching.MergeFinally): Don't call
7067         `branching.CheckOutParameters()' here, this is called in
7068         MergeTopBlock().
7069         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
7070         when adding the `finally' vector.       
7071
7072 2003-12-13  Martin Baulig  <martin@ximian.com>
7073
7074         * flowanalysis.cs
7075         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
7076         actually work and also fix #48962.
7077
7078 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
7079
7080         * decl.cs: Do not check System.Object for nested types,
7081         since we know it does not have any. Big bang for buck:
7082
7083         BEFORE:
7084            Run 1:   8.35 seconds
7085            Run 2:   8.32 seconds
7086            corlib:  17.99 seconds
7087         AFTER:
7088            Run 1:   8.17 seconds
7089            Run 2:   8.17 seconds
7090            corlib:  17.39 seconds
7091
7092 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
7093
7094         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
7095         time we are returning 0 members, so we save alot here.
7096
7097 2003-12-11  Martin Baulig  <martin@ximian.com>
7098
7099         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
7100         `MergeChild()', also just take the `FlowBranching' as argument;
7101         call Merge() on it and return the result.
7102         (FlowBranching.Merge): We don't need to do anything if we just
7103         have one sibling.
7104
7105 2003-12-11  Martin Baulig  <martin@ximian.com>
7106
7107         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
7108         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
7109         Maurer for this idea.
7110
7111 2003-12-11  Martin Baulig  <martin@ximian.com>
7112
7113         * flowanalysis.cs (MergeResult): This class is now gone; we now
7114         use the `UsageVector' for this.  The reason for this is that if a
7115         branching just has one sibling, we don't need to "merge" them at
7116         all - that's the next step to do.
7117         (FlowBranching.Merge): We now return a `UsageVector' instead of a
7118         `MergeResult'.
7119
7120 2003-12-11  Martin Baulig  <martin@ximian.com>
7121
7122         Reworked flow analyis and made it more precise and bug-free.  The
7123         most important change is that we're now using a special `Reachability'
7124         class instead of having "magic" meanings of `FlowReturns'.  I'll
7125         do some more cleanups and optimizations and also add some more
7126         documentation this week.
7127
7128         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
7129         largely reworked this class.
7130         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
7131         the new `Reachability' class instead of having "magic" values here.
7132         (FlowBranching): We're now using an instance of `Reachability'
7133         instead of having separate `Returns', `Breaks' etc. fields.
7134
7135         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
7136         based on flow analysis; ignore the return value of block.Emit ().
7137
7138 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
7139
7140         * driver.cs typemanager.cs: Find the mono extensions to corlib even
7141         if they are private.
7142
7143 2003-12-09  Martin Baulig  <martin@ximian.com>
7144
7145         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
7146         call them directly on the UsageVector.
7147
7148 2003-12-09  Martin Baulig  <martin@ximian.com>
7149
7150         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
7151         Changed return type from `FlowReturns' to `Reachability'.
7152
7153 2003-12-09  Martin Baulig  <martin@ximian.com>
7154
7155         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
7156         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
7157         `Reachable' fields with a single `Reachability' one.
7158
7159 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
7160
7161         * class.cs (FindMembers): Remove foreach's.
7162
7163         Bootstrap times:
7164
7165         BEFORE
7166                 Run 1:   8.74 seconds
7167                 Run 2:   8.71 seconds
7168
7169         AFTER
7170                 Run 1:   8.64 seconds
7171                 Run 2:   8.58 seconds
7172
7173
7174 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
7175
7176         * cs-parser.jay:
7177         * gen-treedump.cs:
7178         * statement.cs:
7179         This patch does a few things:
7180                 1. EmptyStatement is now a singleton, so it is never reallocated.
7181                 2. All blah is EmptyStatement constructs have been changed to
7182                    blah == EmptyStatement.Value, which is much faster and valid
7183                    now that EmptyStatement is a singleton.
7184                 3. When resolving a block, rather than allocating a new array for
7185                    the non-empty statements, empty statements are replaced with
7186                    EmptyStatement.Value
7187                 4. Some recursive functions have been made non-recursive.
7188         Mainly the performance impact is from (3), however (1) and (2) are needed for
7189         this to work. (4) does not make a big difference in normal situations, however
7190         it makes the profile look saner.
7191
7192         Bootstrap times:
7193
7194         BEFORE
7195         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
7196         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
7197         Total memory allocated: 56397 KB
7198
7199         AFTER
7200         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
7201         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
7202         Total memory allocated: 55666 KB
7203
7204 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
7205
7206         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
7207         than the hashtable in a hashtable version
7208
7209         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
7210         we always end up concating a string. This results in a huge perf
7211         loss, because many strings have to be tracked by the GC. In this
7212         patch, we first use a hashtable that works with two keys, so that
7213         the strings do not need to be concat'ed.
7214
7215         Bootstrap times:
7216         BEFORE
7217                 Run 1:   8.74 seconds
7218                 Run 2:   8.71 seconds
7219
7220         AFTER
7221                 Run 1:   8.65 seconds
7222                 Run 2:   8.56 seconds
7223
7224 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
7225
7226         * Makefile: Add a new target `do-time' that does a quick and simple
7227         profile, leaving easy to parse output.
7228
7229 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
7230
7231         * codegen.cs (Init): Create the dynamic assembly with 
7232         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
7233
7234 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
7235
7236         * support.cs: Make the PtrHashtable use only one
7237         instance of its comparer.
7238
7239 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
7240
7241         * typemanager.cs: Fix lookup of GetNamespaces.
7242
7243 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
7244
7245         * expression.cs: Removed redundant line.
7246
7247         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
7248         ArrayLists, use for loops with bounds.  
7249
7250         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
7251         arraylist.
7252
7253         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
7254         arraylists, use for loop with bounds.
7255
7256         The above three changes give us a 0.071 second performance
7257         improvement out of 3.294 seconds down to 3.223.  On my machine
7258         the above changes reduced the memory usage by 1,387 KB during
7259         compiler bootstrap.
7260
7261         * cs-parser.jay (QualifiedIdentifier): New class used to represent
7262         QualifiedIdentifiers.  Before we created a new string through
7263         concatenation, and mostly later on, the result would be
7264         manipulated by DecomposeQI through string manipulation.
7265
7266         This reduced the compiler memory usage for bootstrapping from
7267         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
7268         compile times in 0.05 seconds.
7269
7270 2003-11-28  Dick Porter  <dick@ximian.com>
7271
7272         * support.cs: Do string compares with the Invariant culture.
7273
7274         * rootcontext.cs: 
7275         * gen-treedump.cs: 
7276         * expression.cs: 
7277         * driver.cs: 
7278         * decl.cs: 
7279         * codegen.cs: 
7280         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
7281         the comparison is done with the Invariant culture.
7282
7283 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
7284
7285         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
7286         GetEnumerator method.
7287
7288         (ProbeCollectionType): Iterate starting at the most specific type
7289         upwards looking for a GetEnumerator
7290
7291         * expression.cs: Shift count can be up to 31 for int/uint and 63
7292         for long/ulong.
7293
7294 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
7295
7296         * statement.cs (Block.LookupLabel): Also look for the label on the
7297         children blocks.  Use a hash table to keep track of visited
7298         nodes. 
7299
7300         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
7301         we actually did transform the other operand, otherwise fall back
7302         to the common codepath that casts to long.
7303
7304         * cs-tokenizer.cs: Use the same code pattern as the int case.
7305         Maybe I should do the parsing myself, and avoid depending on the
7306         Parse routines to get this done.
7307
7308 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
7309
7310         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
7311         which fixes bug 51347.  This time test it.
7312
7313         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
7314         attributes for example can not tell the difference between these.
7315         The difference was only a syntax feature of the language. 
7316
7317         * attribute.cs: Apply attributes to delegates.
7318
7319         * delegate.cs: Call the apply attributes method.
7320
7321 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
7322
7323         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
7324         comparing 0 vs Byte.MinValue, not the value
7325
7326         (ImplicitConversionRequired): When reporting a conversion error,
7327         use error 31 to print out the constant error instead of the
7328         simpler 29.
7329
7330         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
7331         which fixes bug 51347.
7332
7333 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
7334
7335         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
7336         which fixes the -warnaserror command line option.
7337
7338 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
7339
7340         * cfold.cs (DoNumericPromotions): During constant folding of
7341         additions on UIntConstant, special case intconstants with
7342         IntConstants like we do on the expression binary operator. 
7343
7344 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
7345
7346         * convert.cs (ImplicitReferenceConversion): We were missing a case
7347         (System.Enum are not value types or class types, so we need to
7348         classify them separatedly).
7349
7350         * driver.cs: We do not support error 2007.
7351
7352 2003-11-12 Jackson Harper <jackson@ximian.com>
7353
7354         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
7355         system directory. Also use the full file name so users can
7356         libraries names mscorlib-o-tron.dll in a non system dir.
7357         
7358 2004-01-04  David Sheldon <dave-mono@earth.li>
7359
7360         * expression.cs: Added matching ")" to error message for CS0077.
7361
7362 2003-12-19  Martin Baulig  <martin@ximian.com>
7363
7364         * typemanager.cs (TypeManager.IsEqualGenericType): New public
7365         static method; see documentation in the method.
7366         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
7367
7368         * convert.cs (Convert.ImplicitReferenceConversion,
7369         Convert.ImplicitReferenceConversionExists): Add support for
7370         generic type declarations; see gen-36.cs.
7371
7372 2003-12-19  Martin Baulig  <martin@ximian.com>
7373
7374         * pending.cs (Pending.InterfaceMethod): Use
7375         `Type.IsAssignableFrom()' instead of `=='.
7376
7377 2003-12-18  Martin Baulig  <martin@ximian.com>
7378
7379         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
7380         byref types first.
7381
7382         * convert.cs (Convert.ImplicitStandardConversionExists): Use
7383         `expr_type.Equals (target_type)' instead of `=='.
7384
7385 2003-12-08  Martin Baulig  <martin@ximian.com>
7386
7387         * generics.cs (Constraints.Types): Removed.
7388         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
7389         to Type's.
7390         (Constraints.ResolveTypes): New public method; resolves the
7391         TypeExpr's to Type's.
7392         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
7393         longer takes the constraints.
7394         (TypeParameter.DefineMethod): Likewise.
7395         (TypeParameter.DefineType): New public method.  Calls
7396         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
7397         the constraints.
7398
7399 2003-12-08  Martin Baulig  <martin@ximian.com>
7400
7401         * convert.cs (Convert.ImplicitConversionStandard): Use
7402         `expr_type.Equals (target_type)' instead of `=='.
7403
7404 2003-12-08  Martin Baulig  <martin@ximian.com>
7405
7406         * typemanager.cs (TypeManager.GetReferenceType): Call
7407         `Type.MakeByRefType ()'.
7408
7409 2003-12-08  Martin Baulig  <martin@ximian.com>
7410
7411         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
7412         just has some special meaning in some situations.  For instance,
7413         it is allowed to use `where' as the name of a variable etc.
7414
7415 2003-12-04  Martin Baulig  <martin@ximian.com>
7416
7417         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
7418         `Type.MakeArrayType()' for array types.
7419
7420 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
7421
7422         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
7423         debugging message.
7424
7425         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
7426         corlib to compile.
7427
7428 2003-11-16  Martin Baulig  <martin@ximian.com>
7429
7430         * codegen.cs (EmitContext.IsGeneric): Removed.
7431
7432         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
7433         ResolveGeneric() on the DeclSpace.
7434
7435 2003-11-16  Martin Baulig  <martin@ximian.com>
7436
7437         * generic.cs (TypeArguments.Resolve):
7438         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
7439         `ResolveType()' on it to get the Type.
7440
7441 2003-11-15  Martin Baulig  <martin@ximian.com>
7442
7443         * generic.cs (ConstructedType.GetInterfaces): Override this.
7444
7445 2003-11-14  Martin Baulig  <martin@ximian.com>
7446
7447         * interface.cs (Interface.DefineType): Define all type parameters
7448         before adding the interfaces we inherit.
7449
7450 2003-11-11  Martin Baulig  <martin@ximian.com>
7451
7452         * generic.cs (ConstructedType.ResolveType): Always call
7453         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
7454
7455 2003-11-10  Martin Baulig  <martin@ximian.com>
7456
7457         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
7458         (TypeManager.InitCoreTypes): Initialize them here, but instead of
7459         calling `ResolveType()' on them, directly assign their `Type'.
7460
7461 2003-11-08  Martin Baulig  <martin@ximian.com>
7462
7463         * generic.cs (ConstructedType): Override `IsClass' etc.
7464
7465 2003-11-08  Martin Baulig  <martin@ximian.com>
7466
7467         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
7468         return value and the `out parent' parameter.
7469         (TypeContainer.DefineType): Moved the CS0644 check into
7470         GetClassBases().  Don't pass the interface types to the
7471         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
7472         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
7473
7474         * ecore.cs (TypeExpr.IsAttribute): New property.
7475         (TypeExpr.GetInterfaces): New method.
7476
7477         * interface.cs (Interface.GetInterfaceTypeByName): Return a
7478         TypeExpr instead of a Type.
7479         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
7480         (Interface.DefineType): Don't pass the interface types to the
7481         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
7482         them later and then call `TypeBulider.AddInterfaceImplementation()'.
7483
7484         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
7485         instead of a `Type[]'.
7486         (TypeManager.RegisterBuilder): Likewise.
7487         (TypeManager.AddUserInterface): Likewise.
7488         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
7489         `Type[]' and also return a `TypeExpr[]'.
7490         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
7491
7492 2003-11-08  Martin Baulig  <martin@ximian.com>
7493
7494         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
7495         Expression.     
7496
7497 2003-11-08  Martin Baulig  <martin@ximian.com>
7498
7499         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
7500         TypeManager.ResolveExpressionTypes().
7501
7502         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
7503         instead of an Expression.
7504         (TypeExpr): This is now an abstract base class for `TypeExpression'.
7505         (TypeExpression): New public class; formerly known as `TypeExpr'.
7506
7507         * expression.cs (ComposedCast): Derive from TypeExpr.
7508
7509         * typemanager.cs (TypeManager.system_*_expr): These are now
7510         TypExpr's instead of Expression's.
7511         (TypeManager.ResolveExpressionTypes): New public static function;
7512         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
7513         of them.        
7514
7515 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
7516
7517         * expression.cs (New.DoResolve): Do not dereference value that
7518         might be a null return.
7519
7520         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
7521         sure that the constant value has the right type.  Fixes an
7522         unreported bug, similar to 50425.
7523
7524         * const.cs (Const.LookupConstantValue): Call
7525         ImplicitStandardConversionExists before doing a conversion to
7526         avoid havng the TypeManager.ChangeType do conversions.
7527
7528         Reduced the number of casts used
7529
7530         (Const.ChangeType): New routine to enable reuse of the constant
7531         type changing code from statement.
7532
7533         * typemanager.cs (ChangeType): Move common initialization to
7534         static global variables.
7535
7536         Fixes #50425.
7537
7538         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
7539         every value type to go through, even if it was void.  Fix that. 
7540
7541         * cs-tokenizer.cs: Use is_identifier_start_character on the start
7542         character of the define, and the is_identifier_part_character for
7543         the rest of the string.
7544
7545 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
7546
7547         * expression.cs (UnaryMutator.EmitCode): When I updated
7548         LocalVariableReference.DoResolve, I overdid it, and dropped an
7549         optimization done on local variable references.
7550
7551 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
7552
7553         * ecore.cs: Convert the return from Ldlen into an int.
7554
7555 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
7556
7557         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
7558         the accessibility, this is a special case for toplevel non-public
7559         classes (internal for instance).
7560
7561 2003-10-20  Nick Drochak <ndrochak@gol.com>
7562
7563         * ecore.cs: Fix typo and build.  Needed another right paren.
7564
7565 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
7566
7567         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
7568         `internal' case regular and protected, but not allowing protected
7569         to be evaluated later.  Bug 49840
7570
7571 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
7572
7573         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
7574         to kb.Nlast, and not the kb.nFirst to isolate the switch
7575         statement.
7576
7577         Extract the underlying type, so enumerations of long/ulong are
7578         treated like long/ulong.
7579
7580 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
7581
7582         * expression.cs (New): Overload the meaning of RequestedType to
7583         track the possible creation of the NewDelegate type, since
7584         DoResolve is invoked more than once for new constructors on field
7585         initialization.
7586
7587         See bugs: #48800 and #37014
7588
7589         * cs-parser.jay (declare_local_constants): Take an arraylist
7590         instead of a single constant.
7591
7592         (local_constant_declaration): It should take a
7593         constant_declarators, not a constant_declarator.  Fixes 49487
7594
7595         * convert.cs: Fix error report.
7596
7597 2003-10-13 Jackson Harper <jackson@ximian.com>
7598
7599         * typemanager.cs (TypeToCoreType): Add float and double this fixes
7600         bug #49611
7601         
7602 2003-11-03  Martin Baulig  <martin@ximian.com>
7603
7604         * expression.cs (ArrayAccess.GetStoreOpcode): Added
7605         `out bool has_type_arg'; if set, we need to pass the type to
7606         ig.Emit().
7607         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
7608         Stelem_Any/Ldelem_Any for generic parameters.   
7609
7610 2003-11-02  Martin Baulig  <martin@ximian.com>
7611
7612         * expression.cs (Invocation.EmitCall): Use
7613         `TypeManager.IsValueType()' to check whether it's a value type.
7614         Don't set `struct_call' when calling a method on a type parameter.
7615
7616 2003-11-02  Martin Baulig  <martin@ximian.com>
7617
7618         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
7619         and removed the TypeBuilder argument.
7620
7621         * typemanager.cs (TypeManager.IsValueType): Return
7622         `t.IsGenericParameter || t.IsValueType'.
7623
7624 2003-10-25  Martin Baulig  <martin@ximian.com>
7625
7626         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
7627         call ConstructedType.Resolve() on it.
7628
7629         * generic.cs (ConstructedType.Resolve): Set `type' on success.
7630
7631 2003-10-25  Martin Baulig  <martin@ximian.com>
7632
7633         * class.cs (TypeContainer.GetClassBases): Changed
7634         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
7635         CS8214 reporting here.
7636         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
7637         instead of a `Type' for our parent.  In case of a recursive
7638         declaration (see tests/gen-23.cs for an example), our parent is a
7639         ConstructedType and it doesn't have its type set.  So, first
7640         create our own TypeBuilder, then call constructed.Resolve() to get
7641         the parent's type and finally TypeBuilder.SetParent() it.
7642
7643         * ecore.cs (TypeExpr.Name): New public virtual property.
7644
7645         * generic.cs
7646         (ConstructedType): We're now a TypeExpr and not just an Expression.
7647         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
7648         arguments here; this is done later.
7649         (ConstructedType.Resolve): New public method to resolve the type
7650         arguments and bind them.
7651
7652 2003-10-21  Martin Baulig  <martin@ximian.com>
7653
7654         * convert.cs: Use `TypeManager.IsValueType' instead of
7655         'type.IsValueType' everywhere.
7656
7657         * typemanager.cs (TypeManager.IsValueType): Return true for type
7658         parameters.  The reason for this is that we need to box a type
7659         parameter when converting it to a reference type.
7660
7661         * cs-parser.jay: Added support for default value expressions.
7662
7663         * generics.cs (DefaultValueExpression): New public class.       
7664
7665 2003-10-17  Martin Baulig  <martin@ximian.com>
7666
7667         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
7668         TypeContainer so we can also use this for Interfaces.
7669         (TypeParameter.Resolve): Likewise.
7670
7671         * interface.cs (Interface.DefineType): Added support for generic
7672         interfaces.
7673
7674         * cs-parser.jay: Added support for generic structs and interfaces.
7675
7676 2003-10-17  Martin Baulig  <martin@ximian.com>
7677
7678         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
7679         call generic methods :-)
7680
7681 2003-10-16  Martin Baulig  <martin@ximian.com>
7682
7683         * cs-parser.jay (namespace_or_type_name): Only create a
7684         GenericMemberAccess if we actually have type arguments.
7685
7686 2003-10-13  Martin Baulig  <martin@ximian.com>
7687
7688         * class.cs (Method.Define): If we're a generic method, call
7689         TypeBuilder.DefineGenericMethod () before resolving
7690         the parameters.
7691         (MethodData): Added .ctor which takes an additional MethodBuilder
7692         argument; this is used for generic methods.
7693         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
7694         we already have a MethodBuilder.
7695
7696 2003-10-10  Martin Baulig  <martin@ximian.com>
7697
7698         * class.cs (Method): Added .ctor which takes a `GenericMethod'
7699         instead of a `DeclSpace'.  This is used for generic methods.
7700
7701         * cs-parser.jay (method_header): Added support for generic
7702         methods; create a `GenericMethod' instance and pass it to the
7703         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
7704         parameters and locals.
7705
7706         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
7707         since we already have the location.  Check whether we're a generic
7708         type declaration or a generic method and create the correct type
7709         parameter.
7710
7711         * generic.cs (TypeParameter.DefineMethod): New public method.
7712         (GenericMethod): New public class; derives from DeclSpace and is
7713         used for generic methods.       
7714
7715 2003-10-09  Martin Baulig  <martin@ximian.com>
7716
7717         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
7718         to the .ctor.
7719         (MethodCore.DoDefineParameters): Removed the TypeContainer
7720         argument; use the DeclSpace which was passed to the .ctor instead.
7721         (MethodCore.CheckParameter): Take a DeclSpace instead of a
7722         TypeContainer; we only need a DeclSpace here.
7723
7724 2003-10-09  Martin Baulig  <martin@ximian.com>
7725
7726         * class.cs (MethodData): Added additional `DeclSpace ds' argument
7727         to the .ctor.
7728         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
7729         EmitContext's .ctor.    
7730
7731 2003-10-09  Martin Baulig  <martin@ximian.com>
7732
7733         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
7734         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
7735         AsAccessible(), moved them as well.
7736
7737         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
7738
7739 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
7740
7741         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
7742         generation for >=, as spotted by Paolo, bug 48679.  
7743         Patch from David Waite.
7744
7745         * cs-tokenizer.cs: Add handling for #pragma.
7746
7747         * cs-parser.jay: Allow for both yield and yield return in the
7748         syntax.  The anti-cobolization of C# fight will go on!
7749
7750         * class.cs (TypeBuilder.DefineType): Catch error condition here
7751         (Parent.DefineType erroring out and returning null).
7752
7753         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
7754         coping with enumerations variables, we were mistakenly processing
7755         them as a regular value type instead of built-in types.  Fixes the
7756         bug #48063
7757
7758         * typemanager.cs (IsBuiltinOrEnum): New method.
7759
7760 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
7761
7762         * cs-parser.jay: Upgrade: yield now needs the return clause.
7763
7764 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
7765
7766         * cs-parser.jay : Renamed yyName to yyNames related to jay.
7767
7768 2003-09-29  Martin Baulig  <martin@ximian.com>
7769
7770         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
7771         inflated generic methods.
7772
7773         * generics.cs (ConstructedType): Distinguish between open and
7774         closed constructed types; correctly resolve the arguments.
7775
7776 2003-09-22  Martin Baulig  <martin@ximian.com>
7777
7778         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
7779         all type arguments meet their constraints.
7780
7781 2003-09-19  Martin Baulig  <martin@ximian.com>
7782
7783         * decl.cs (MemberCache.SetupCacheForInterface): Take a
7784         `MemberCache parent' argument.  Normally, an interface doesn't
7785         have a parent type except System.Object, but we use this in gmcs
7786         for generic type parameters.
7787
7788 2003-09-18  Martin Baulig  <martin@ximian.com>
7789
7790         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
7791         on `type.IsInterface'; don't check whether the type has a parent
7792         to determine whether it's an interface.
7793
7794 2003-09-17  Martin Baulig  <martin@ximian.com>
7795
7796         * generic.cs (ConstructedType.ToString): Always use `name' as the
7797         type name.
7798
7799 2003-09-15  Martin Baulig  <martin@ximian.com>
7800
7801         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
7802
7803         * generic.cs (Constraints.Resolve): New public method; this is
7804         called to resolve the constraint types and to check whether all
7805         the constraints are correct.
7806         (Constraints.Types): New public property.
7807         (TypeParameter.Resolve): New public method; resolves all the
7808         type's constraints.
7809
7810         * class.cs (TypeContainer.DefineType): Call
7811         TypeParameter.Resolve() before actually defining the type.
7812
7813 2003-09-15  Martin Baulig  <martin@ximian.com>
7814
7815         * class.cs (TypeContainer.DefineType): Added an error flag to
7816         avoid reporting duplicate CS0146's ("class definition is
7817         circular.").
7818
7819         * driver.cs (Driver.MainDriver): Abort if
7820         RootContext.ResolveTree() reported any errors.
7821
7822 2003-09-07  Martin Baulig  <martin@ximian.com>
7823
7824         * report.cs (Error, Warning): Added overloaded versions which take
7825         a `params object[] args' and call String.Format().
7826
7827 2003-09-07  Martin Baulig  <martin@ximian.com>
7828
7829         * decl.cs (DeclSpace..ctor): Don't call
7830         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
7831         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
7832         (DeclSpace.RecordDecl): New method.
7833
7834         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
7835
7836 2003-09-02  Ravi Pratap  <ravi@ximian.com>
7837
7838         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
7839         value attributes to be applied to ParameterBuilders.
7840
7841         * class.cs (MethodCore.LabelParameters): Make static and more
7842         generic so that it can be used from other places - like interface
7843         methods, for instance.
7844
7845         * interface.cs (Interface.Emit): Call LabelParameters before
7846         emitting attributes on the InterfaceMethod.
7847
7848 2003-09-07  Martin Baulig  <martin@ximian.com>
7849
7850         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
7851         if the number of type parameters doesn't match.
7852
7853 2003-09-04  Martin Baulig  <martin@ximian.com>
7854
7855         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
7856         for arrays of generic type params (ie. `!0[]').
7857
7858 2003-09-04  Martin Baulig  <martin@ximian.com>
7859
7860         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
7861         for the moment.
7862
7863 2003-09-04  Martin Baulig  <martin@ximian.com>
7864
7865         * decl.cs (DeclSpace.LookupGeneric): New method.
7866         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
7867         moment.
7868
7869         * generic.cs (TypeParameterExpr): Take a TypeParameter as
7870         argument, not just a string.
7871         (TypeParameter.Define): New public method; this is called to
7872         actually define the generic parameter; after this, you can use the
7873         new `Type' property to get the type.
7874
7875 2003-09-04  Martin Baulig  <martin@ximian.com>
7876
7877         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
7878         is now an ArrayList; initialize the result of the `TypeParameters'
7879         property here.
7880         (DeclSpace.GetGenericData): Removed.
7881         (DeclSpace.LookupGeneric): Temporarily removed; we need to
7882         implement this in a different way.
7883         (DeclSpace.GetTypeParameters): Removed; there's now a
7884         `TypeParameters' property.
7885         (DeclSpace.TypeParameters): New public property.
7886
7887         * generic.cs (Constraints): Make this class public.
7888         (TypeParameter): New public class.
7889
7890 2003-09-04  Martin Baulig  <martin@ximian.com>
7891
7892         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
7893         generic parameters.
7894
7895         * class.cs (TypeContainer.DefineType): Call
7896         TypeBuilder.DefineGenericParameter () on all generic parameters if
7897         this is a generic type.
7898
7899 2003-08-28  Martin Baulig  <martin@ximian.com>
7900
7901         * sample-stack.il: Compile this with ilasm: "ilasm /dll
7902         sample-stack.il".
7903
7904         * sample-hello.cs: Compile this with gmcs: "gmcs
7905         /r:sample-stack.dll sample-hello.cs".
7906
7907 2003-08-28  Martin Baulig  <martin@ximian.com>
7908
7909         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
7910         the parameters to the generic type.
7911
7912 2003-08-28  Martin Baulig  <martin@ximian.com>
7913
7914         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
7915
7916 2003-08-28  Martin Baulig  <martin@ximian.com>
7917
7918         * cs-parser.jay (opt_type_argument_list): Use
7919         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
7920         (primary_expression): Replace `qualified_identifier' with `type_name'.
7921         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
7922
7923         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
7924         parser to check whether it is syntactically a type parameter list;
7925         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
7926         this case.
7927
7928 2003-08-26  Martin Baulig  <martin@ximian.com>
7929
7930         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
7931         resolving aliases; fixes #47927.
7932
7933 2003-08-26  Martin Baulig  <martin@ximian.com>
7934
7935         * statement.cs (Using.DoResolve): This is internally emitting a
7936         try/finally clause, so we need to set ec.NeedExplicitReturn if we
7937         do not always return.  Fixes #47681.
7938
7939 2003-08-26  Martin Baulig  <martin@ximian.com>
7940
7941         * decl.cs (MemberCore): Moved WarningNotHiding(),
7942         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
7943         into MemberBase.
7944         (AdditionResult): Make this nested in DeclSpace.
7945         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
7946         argument; call NamespaceEntry.Define() unless we're nested in a
7947         class or struct.
7948
7949         * namespace.cs (Namespace.DefineName): New public function.  This
7950         is called from DeclSpace's .ctor to add 
7951         (Namespace.Lookup): Include DeclSpaces in the lookup.
7952
7953         * class.cs (Operator): Derive from MemberBase, not MemberCore.
7954
7955         * const.cs (Const): Derive from MemberBase, not MemberCore.     
7956
7957 2003-08-25  Martin Baulig  <martin@ximian.com>
7958
7959         * convert.cs (Convert.ExplicitReferenceConversion): When
7960         converting from an interface type to a class, unbox if the target
7961         type is a struct type.  Fixes #47822.
7962
7963 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7964
7965         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
7966         #47854.
7967
7968 2003-08-22  Martin Baulig  <martin@ximian.com>
7969
7970         * class.cs (TypeManager.DefineType): When defining a nested type,
7971         call DefineType() on our parent; fixes #47801.
7972
7973 2003-08-22  Martin Baulig  <martin@ximian.com>
7974
7975         * class.cs (MethodData.Define): While checking if a method is an
7976         interface implementation, improve the test a bit more to fix #47654.
7977
7978 2003-08-22  Martin Baulig  <martin@ximian.com>
7979
7980         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
7981         correctly; fixes #47722.
7982
7983 2003-08-22  Martin Baulig  <martin@ximian.com>
7984
7985         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
7986         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
7987
7988         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
7989
7990 2003-08-22  Martin Baulig  <martin@ximian.com>
7991
7992         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
7993         can only be assigned in static constructors.  Fixes #47161.
7994
7995 2003-08-22  Martin Baulig  <martin@ximian.com>
7996
7997         Rewrote and improved the flow analysis code.
7998
7999         * flowbranching.cs (FlowBranching): Make this class abstract.
8000         (FlowBranching.CreateBranching): New static function to create a
8001         new flow branching.
8002         (FlowBranchingBlock, FlowBranchingException): New classes.
8003         (FlowBranching.UsageVector.Type): New public readonly field.
8004         (FlowBranching.UsageVector.Breaks): Removed the setter.
8005         (FlowBranching.UsageVector.Returns): Removed the setter.
8006         (FlowBranching.UsageVector): Added Break(), Return(),
8007         NeverReachable() and Throw() methods to modify the reachability.
8008         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
8009         done by FlowBranching.Merge().
8010         (FlowBranching.UsageVector.MergeChild): New method; merges the
8011         merge result into the current vector.
8012         (FlowBranching.Merge): New abstract method to merge a branching.
8013
8014 2003-08-12  Martin Baulig  <martin@ximian.com>
8015
8016         * expression.cs (Indirection.CacheTemporaries): Create the
8017         LocalTemporary with the pointer type, not its element type.
8018
8019 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
8020
8021         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
8022         token was a keyword or not.
8023
8024         Add `error' options where an IDENTIFIER was expected;  Provide
8025         CheckToken and CheckIdentifierToken convenience error reporting
8026         functions. 
8027
8028         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
8029
8030         * decl.cs: Rename `NamespaceEntry Namespace' public field into
8031         NameSpaceEntry NameSpaceEntry.
8032
8033         (LookupInterfaceOrClass): Avoid creating a full qualified name
8034         from namespace and name: avoid doing lookups when we know the
8035         namespace is non-existant.   Use new Tree.LookupByNamespace which
8036         looks up DeclSpaces based on their namespace, name pair.
8037
8038         * driver.cs: Provide a new `parser verbose' to display the
8039         exception thrown during parsing.  This is turned off by default
8040         now, so the output of a failure from mcs is more graceful.
8041
8042         * namespace.cs: Track all the namespaces defined in a hashtable
8043         for quick lookup.
8044
8045         (IsNamespace): New method
8046
8047 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
8048
8049         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
8050         we know that we need to concatenate (full typename can never be
8051         null). 
8052
8053         * class.cs: ditto.
8054
8055         * statement.cs: Use a bitfield;  Do not initialize to null things
8056         which are done by the constructor by default.
8057
8058         * cs-parser.jay: bug fix, parameter was 4, not 3.
8059
8060         * expression.cs: Just use the property;
8061
8062         * statement.cs: No need for GetVariableInfo method.
8063
8064 2003-08-08  Martin Baulig  <martin@ximian.com>
8065
8066         * flowanalysis.cs (FlowReturns): This is now nested in the
8067         `FlowBranching' class.
8068         (MyBitVector): Moved this here from statement.cs.
8069         (FlowBranching.SiblingType): New enum type.
8070         (FlowBranching.CreateSibling): Added `SiblingType' argument.
8071
8072 2003-08-07  Martin Baulig  <martin@ximian.com>
8073
8074         * flowanalysis.cs (FlowBranchingType): This is now nested in the
8075         `FlowBranching' class and called `BranchingType'.
8076
8077 2003-08-07  Martin Baulig  <martin@ximian.com>
8078
8079         * flowanalysis.cs: Moved all the control flow analysis code into
8080         its own file.
8081
8082 2003-08-07  Martin Baulig  <martin@ximian.com>
8083
8084         * assign.cs (Assign.DoResolve): `target' must either be an
8085         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
8086         #37319.
8087
8088 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
8089
8090         * expression.cs (BinaryMethod): This kind of expression is created by the
8091         Binary class if it determines that the operator has to be handled
8092         by a method.
8093
8094         (BinaryDelegate): This kind of expression is created if we are
8095         dealing with a + or - operator on delegates.
8096
8097         (Binary): remove method, argumetns, and DelegateOperator: when
8098         dealing with methods, 
8099
8100         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
8101
8102         * statement.cs (Block): use bitfields for the three extra booleans
8103         we had in use.   Remove unused topblock parameter.
8104
8105         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
8106
8107         * assign.cs: Drop extra unneeded tests.
8108
8109 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
8110
8111         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
8112
8113         * statement.cs (Foreach): Use VariableStorage instead of
8114         LocalBuilders.   
8115
8116         * codegen.cs (VariableStorage): New class used by clients that
8117         require a variable stored: locals or fields for variables that
8118         need to live across yield.
8119
8120         Maybe provide a convenience api for EmitThis+EmitLoad?
8121
8122         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
8123         these bad boys.
8124
8125 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
8126
8127         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
8128         RemapParameterLValue): New methods that are used to turn a
8129         precomputed FieldInfo into an expression like this:
8130
8131                 instance.FieldInfo
8132
8133         The idea is to use this instead of making LocalVariableReference
8134         have more than one meaning.
8135
8136         * cs-parser.jay: Add error production to BASE.
8137
8138         * ecore.cs: Deal with TypeManager.GetField returning null, which
8139         is now a valid return value.
8140
8141         (FieldExprNoAddress): New expression for Fields whose address can
8142         not be taken.
8143
8144         * expression.cs (LocalVariableReference): During the resolve
8145         phases, create new expressions if we are in a remapping context.
8146         Remove code that dealt with remapping here.
8147
8148         (ParameterReference): same.
8149
8150         (ProxyInstance): New expression, like the `This' expression, but
8151         it is born fully resolved.  We know what we are doing, so remove
8152         the errors that are targeted to user-provided uses of `this'.
8153
8154         * statement.cs (Foreach): our variable is now stored as an
8155         Expression;  During resolution, follow the protocol, dont just
8156         assume it will return this.
8157
8158 2003-08-06  Martin Baulig  <martin@ximian.com>
8159
8160         * support.cs (SeekableStreamReader.cs): New public class.
8161
8162         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
8163         SeekableStreamReader instead of the normal StreamReader.
8164
8165 2003-08-04  Martin Baulig  <martin@ximian.com>
8166
8167         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
8168         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
8169         deambiguate casts and delegate invocations.
8170         (parenthesized_expression): Use the new tokens to ensure this is
8171         not a cast of method invocation.
8172
8173         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
8174         when reading a `)' and Deambiguate_CloseParens () was previously
8175         called.
8176
8177         * expression.cs (ParenthesizedExpression): New class.  This is
8178         just used for the CS0075 test.
8179         (Binary.DoResolve): Check for CS0075.   
8180
8181 2003-07-29  Ravi Pratap  <ravi@ximian.com>
8182
8183         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
8184         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
8185         reference comparison.
8186
8187         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
8188         examine the ReturnType for equality - this is necessary in the
8189         cases of implicit and explicit operators whose signature also
8190         includes the return type.
8191
8192 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
8193
8194         * namespace.cs: Cache the result of the namespace computation,
8195         instead of computing it every time.
8196
8197 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
8198
8199         * decl.cs: Use a global arraylist that we reuse over invocations
8200         to avoid excesive memory consumption.  Reduces memory usage on an
8201         mcs compile by one meg (45 average).
8202
8203         * typemanager.cs (LookupTypeReflection): In .NET pointers are
8204         private, work around that.
8205
8206 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
8207
8208         * literal.cs (IntLiteral): Define Zero and One static literals. 
8209
8210         * cs-parser.jay (integer_literal): use static literals to reduce
8211         memory usage for the most used literals (0, 1 and -1).  211kb
8212         reduced in memory usage.
8213
8214         Replace all calls to `new ArrayList' with `new
8215         ArrayList(4)' which is a good average number for most allocations,
8216         and also requires only 16 bytes of memory for its buffer by
8217         default. 
8218
8219         This reduced MCS memory usage in seven megabytes for the RSS after
8220         bootstrapping.
8221
8222 2003-07-28  Ravi Pratap  <ravi@ximian.com>
8223
8224         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
8225         handle params methods the correct way by forming only one
8226         applicable set with params and normal methods in them. Earlier we
8227         were looking at params methods only if we found no normal methods
8228         which was not the correct thing to do.
8229
8230         (Invocation.BetterFunction): Take separate arguments indicating
8231         when candidate and the best method are params methods in their
8232         expanded form.
8233
8234         This fixes bugs #43367 and #46199.
8235
8236         * attribute.cs: Documentation updates.
8237
8238         (CheckAttribute): Rename to CheckAttributeTarget.
8239         (GetValidPlaces): Rename to GetValidTargets.
8240
8241         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
8242         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
8243
8244         Fixes bug #44468.
8245
8246 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
8247
8248         * codegen.cs: Compute IsGeneric correctly.
8249
8250         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
8251         resolution. 
8252
8253         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
8254         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
8255         regressions, and I was chasing more bugs than I required.
8256
8257         * interface.cs: Use expressions for base type names (like classes
8258         and structs have been doing for a while now), and resolve that.
8259         This patch should probably go into head as well.
8260
8261         This makes it one less user of FindType.
8262
8263 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
8264
8265         This compiler can not self host currently.  Need to fix that.
8266         
8267         * Makefile: compile to `gmcs.exe'
8268
8269         * driver.cs: Turn on v2 by default on gmcs.
8270
8271         * generic.cs (ConstructedType): Does no longer take a container
8272         type argument;  That will be taken care of later.
8273
8274         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
8275         Use SimpleName to resolve for now, so we can continue the work on
8276         the parser, until we get Type.GetType that understands generics.
8277
8278         (ConstructedType.ToString): Implement
8279
8280         (TypeArguments.Resolve): Resolve the child expressions as types. 
8281         
8282         * cs-parser.jay: Rename interface_constraints to
8283         type_parameter_constraints
8284
8285         (namespace_or_type_name): Only use constructed types for the basic
8286         construction, we will deal with identifier<...> later.
8287
8288         (type/type_name): No longer call DecomposeQI, as
8289         namespace_or_type_name is always decoded now.
8290         
8291 2003-07-22  Ravi Pratap  <ravi@ximian.com>
8292
8293         * expression.cs (Invocation.OverloadResolve): Follow the spec more
8294         closely: we eliminate methods in base types when we have an
8295         applicable method in a top-level type.
8296
8297         Please see section 14.5.5.1 for an exact description of what goes
8298         on. 
8299
8300         This fixes bug #45127 and a host of other related to corlib compilation.
8301
8302         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
8303         array is the method corresponding to the top-level type (this is
8304         because of the changes made to icall.c) so we change this
8305         accordingly.
8306
8307         (MethodGroupExpr.Name): This too.
8308
8309         * typemanager.cs (GetElementType): New method which does the right
8310         thing when compiling corlib. 
8311
8312         * everywhere: Make use of the above in the relevant places.
8313
8314 2003-07-22  Martin Baulig  <martin@ximian.com>
8315
8316         * cs-parser.jay (invocation_expression): Moved
8317         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
8318         `cast_expression', but create a InvocationOrCast which later
8319         resolves to either an Invocation or a Cast.
8320
8321         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
8322         method; call this before EmitStatement() to make sure that this
8323         expression can be used as a statement.
8324
8325         * expression.cs (InvocationOrCast): New class; resolves to either
8326         an Invocation or a Cast.
8327
8328         * statement.cs (StatementExpression): Call ResolveStatement() on
8329         the ExpressionStatement before emitting it.
8330
8331 2003-07-21  Martin Baulig  <martin@ximian.com>
8332
8333         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
8334         `ref' and `out' attributes match; fixes #46220.
8335         (MemberAccess.ResolveMemberAccess): You can't reference a type
8336         through an expression; fixes #33180.
8337         (Indexers.GetIndexersForType): Don't return the indexers from
8338         interfaces the class implements; fixes #46502.
8339
8340 2003-07-21  Martin Baulig  <martin@ximian.com>
8341
8342         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
8343         CS0661 checks; fixes bug #30442.
8344
8345 2003-07-21  Martin Baulig  <martin@ximian.com>
8346
8347         * decl.cs (AdditionResult): Added `Error'.
8348
8349         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
8350
8351         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
8352         cs0031.cs actually work.
8353
8354  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
8355  
8356         * cs-parser.jay (namespace_name): do not use
8357         namespace_or_type_name, use qualified_identifier, because
8358         namespace_or_type_name will soon return a composed expression
8359         instead of a string.
8360  
8361         (namespace_or_type_name): Instead of returning a string, now this
8362         production returns an expression.
8363  
8364         * codegen.cs (EmitContext): Setup IsGeneric property based on
8365         whether our DeclSpace is generic, our the method is generic.
8366  
8367         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
8368         the method is generic.
8369  
8370         * cs-parser.jay (type_arguments, opt_type_argument_list,
8371         type_parameters, type_parameter_list, opt_type_parameter_list,
8372         type_parameter,, opt_type_parameter_constraints_clauses,
8373         type_parameter_constraints_clauses,
8374         type_parameter_constraint_clause, type_parameter_constraint,
8375         interface_constraints): Add new production
8376  
8377         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
8378         DeclSpace is generic or not.
8379  
8380         (DeclSpace.SetParameterInfo): New routine, used to set the
8381         parameter info for a type.
8382  
8383         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
8384         returns a GenericTypeExpr
8385  
8386         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
8387         generic, lookup the generic argument.
8388  
8389         * attribute.cs: Do not allow TypeParameterExpressions in
8390         Attributes.
8391  
8392         * class.cs: Do not allow the Main method to be defined in a
8393         Generic container.
8394  
8395         * expression.cs (SizeOf): Do not allow generic types to be used as
8396         arguments to sizeof.
8397  
8398         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
8399         it: whether a type is generic or not.  Only works for types we are
8400         currently building for now.
8401         
8402 2003-07-20  Martin Baulig  <martin@ximian.com>
8403
8404         * namespace.cs: Fixed that bug which caused a crash when compiling
8405         the debugger's GUI.
8406
8407 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
8408
8409         * typemanager.cs (LookupTypeReflection): Never expose types which
8410         are NotPublic, NestedPrivate, NestedAssembly, or
8411         NestedFamANDAssem.  We used to return these, and later do a check
8412         that would report a meaningful error, but the problem is that we
8413         would not get the real match, if there was a name override.
8414
8415 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
8416
8417         * namespace.cs (Namespace, Name): Do not compute the namespace
8418         name dynamically, compute it in the constructor.  This reduced
8419         memory usage by 1697 KB.
8420
8421         * driver.cs: Use --pause to pause at the end.
8422
8423 2003-07-17  Peter Williams  <peter@newton.cx>
8424
8425         * Makefile: Change the name of the test target so that it doesn't
8426         conflict with the recursive test target.
8427
8428 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
8429
8430         * expression.cs (LocalVariableReference.Emit, EmitAssign,
8431         AddressOf): Do not use EmitThis, that was wrong, use the actual
8432         this pointer.
8433
8434 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
8435
8436         * class.cs (MethodData.Define): While checking if a method is an
8437         interface implementation, improve the test: If we are not public
8438         (use new test here: use the computed MethodAttributes directly,
8439         instead of the parsed modifier flags) check if the `implementing'
8440         method comes from an interface or not.
8441
8442         * pending.cs (VerifyPendingMethods): Slightly better error
8443         message.
8444
8445         * makefile: add test target that does the mcs bootstrap.
8446
8447 2003-07-16  Ravi Pratap  <ravi@ximian.com>
8448
8449         * interface.cs (Define): Do nothing here since there are no
8450         members to populate etc. Move the attribute emission out of here
8451         since this was just totally the wrong place to put it. Attribute
8452         application happens during the 'Emit' phase, not in the 'Define'
8453         phase.
8454
8455         (Emit): Add this method and move the attribute emission here
8456
8457         * rootcontext.cs (EmitCode): Call the Emit method on interface
8458         types too.
8459
8460 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
8461
8462         * expression.cs (OverloadResolve): Report error only if Location
8463         is not 'Null' which means that there was a probe going on.
8464
8465 2003-07-14  Martin Baulig  <martin@ximian.com>
8466
8467         * expression.cs (ConditionalLogicalOperator): New public class to
8468         implement user defined conditional logical operators.
8469         This is section 14.11.2 in the spec and bug #40505.
8470
8471 2003-07-14  Martin Baulig  <martin@ximian.com>
8472
8473         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
8474
8475 2003-07-14  Martin Baulig  <martin@ximian.com>
8476
8477         * codegen.cs (EmitContext.InFixedInitializer): New public field.
8478
8479         * ecore.cs (IVariable.VerifyFixed): New interface method.
8480
8481         * expression.cs (Unary.ResolveOperator): When resolving the `&'
8482         operator, check whether the variable is actually fixed.  Fixes bug
8483         #36055.  Set a variable definitely assigned when taking its
8484         address as required by the spec.
8485
8486         * statement.cs (LocalInfo.IsFixed): New field.
8487         (LocalInfo.MakePinned): Set `IsFixed' to true.
8488
8489 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
8490
8491         * attribute.cs (Attribute.Resolve): While doing a Member lookup
8492         for .ctors, ensure that we only ask for members declared in the
8493         attribute type (BindingFlags.DeclaredOnly).
8494
8495         Fixes bug #43632.
8496
8497         * expression.cs (Error_WrongNumArguments): Report error 1501
8498         correctly the way CSC does.
8499
8500 2003-07-13  Martin Baulig  <martin@ximian.com>
8501
8502         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
8503         lookup on the fully qualified name, to make things like "X.X" work
8504         where "X.X" is a fully qualified type name, but we also have a
8505         namespace "X" in the using list.  Fixes #41975.
8506
8507 2003-07-13  Martin Baulig  <martin@ximian.com>
8508
8509         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
8510         function. If we're a CompoundAssign, we need to create an embedded
8511         CompoundAssign, not an embedded Assign.
8512         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
8513         Fixes #45854.
8514
8515 2003-07-13  Martin Baulig  <martin@ximian.com>
8516
8517         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
8518         work to fix bug #46088.
8519
8520 2003-07-13  Ravi Pratap <ravi@ximian.com>
8521
8522         * class.cs (Operator.Emit): Do not emit attributes here - it is
8523         taken care of by the Method class that we delegate too. This takes
8524         care of bug #45876.
8525
8526 2003-07-10  Martin Baulig  <martin@ximian.com>
8527
8528         * expression.cs (TypeOfVoid): New class.
8529         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
8530
8531 2003-07-10  Martin Baulig  <martin@ximian.com>
8532
8533         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
8534         bug #35957.
8535
8536 2003-07-10  Martin Baulig  <martin@ximian.com>
8537
8538         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
8539         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
8540
8541         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
8542
8543         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
8544
8545 2003-07-10  Martin Baulig  <martin@ximian.com>
8546
8547         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
8548         of decimal.  Fixes #42850.
8549
8550         NOTE: I also fixed the created byte blob, but this doesn't work on
8551         the MS runtime and csc never produces any byte blobs for decimal
8552         arrays.
8553
8554 2003-07-10  Martin Baulig  <martin@ximian.com>
8555
8556         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
8557         structs; fixes #32068.
8558         (Block.AddChildVariableNames): Fixed #44302.
8559
8560 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8561
8562         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
8563
8564 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8565
8566         * attribute.cs: And this test is onger needed.
8567
8568 2003-07-08  Martin Baulig  <martin@ximian.com>
8569
8570         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
8571         inaccessible types.  Fixes #36313.
8572
8573         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
8574
8575         * namespace.cs (NamespaceEntry): Create implicit entries for all
8576         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
8577         implicit entries for N1.N2 and N1.
8578
8579 2003-07-08  Martin Baulig  <martin@ximian.com>
8580
8581         Rewrote the handling of namespaces to fix a lot of the issues
8582         wrt. `using' aliases etc.
8583
8584         * namespace.cs (Namespace): Splitted this class into a
8585         per-assembly `Namespace' and a per-file `NamespaceEntry'.
8586
8587         * typemanager.cs (TypeManager.IsNamespace): Removed.
8588         (TypeManager.ComputeNamespaces): Only compute namespaces from
8589         loaded assemblies here, not the namespaces from the assembly we're
8590         currently compiling.
8591
8592 2003-07-08  Martin Baulig  <martin@ximian.com>
8593
8594         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
8595
8596 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8597
8598         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
8599         already fixed it.  
8600
8601         I thought about the memory savings here, but LookupTypeReflection
8602         is used under already very constrained scenarios.  Compiling
8603         corlib or mcs only exposes one hit, so it would not really reduce
8604         any memory consumption.
8605
8606 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8607
8608         * typemanager.cs: fixes bug #45889 by only adding public types from
8609         other assemblies to the list of known types.
8610
8611 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
8612
8613         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
8614         on the type we resolved.
8615
8616 2003-07-05  Martin Baulig  <martin@ximian.com>
8617
8618         * pending.cs (PendingImplementation.ParentImplements): Don't
8619         create the proxy if the parent is abstract.
8620
8621         * class.cs (TypeContainer.DefineIndexers): Process explicit
8622         interface implementations first.  Fixes #37714.
8623
8624 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
8625
8626         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
8627         defined recursively;  but since we modify the input parameters
8628         (left is set to `this' temporarily), we reset this value if the
8629         left_is_explicit is false, which gives the original semantics to
8630         the code.  
8631
8632         * literal.cs (NullPointer): new class used to represent a null
8633         literal in a pointer context.
8634
8635         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
8636         type is a pointer, use a NullPointer object instead of a
8637         NullLiteral.   Closes 43687
8638
8639         (ExplicitConversion): Convert pointer values using
8640         the conv opcode to the proper type.
8641
8642         * ecore.cs (New): change ValueTypeVariable property into a method,
8643         that returns whether the valuetype is suitable for being used.
8644
8645         * expression.cs (Binary.DoNumericPromotions): Only return if we
8646         the int constant was a valid uint, and we can return both left and
8647         right as uints.  If not, we continue processing, to trigger the
8648         type conversion.  This fixes 39018.
8649
8650         * statement.cs (Block.EmitMeta): During constant resolution, set
8651         the CurrentBlock property on the emitcontext, so that we resolve
8652         constants propertly.
8653
8654 2003-07-02  Martin Baulig  <martin@ximian.com>
8655
8656         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
8657         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
8658
8659         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
8660         than emitting it here.
8661
8662         * statement.cs: Fixed some more flow analysis bugs.
8663
8664 2003-07-02  Martin Baulig  <martin@ximian.com>
8665
8666         * class.cs (MethodData.Define): When implementing interface
8667         methods, set Final unless we're Virtual.
8668
8669         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
8670         check work for interface methods.
8671
8672 2003-07-01  Martin Baulig  <martin@ximian.com>
8673
8674         * ecore.cs (EmitContext.This): Replaced this property with a
8675         GetThis() method which takes a Location argument.  This ensures
8676         that we get the correct error location for a CS0188.
8677
8678 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
8679
8680         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
8681         ImplicitStandardConversion.
8682
8683         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
8684
8685 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
8686
8687         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
8688         optimization.
8689
8690 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
8691
8692         * class.cs (Constructor.Define): Turn off initlocals for unsafe
8693         constructors.
8694
8695         (MethodData.Define): Turn off initlocals for unsafe methods.
8696
8697 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
8698
8699         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
8700         complete;  Fixes #37521.
8701
8702         * delegate.cs: Use Modifiers.TypeAttr to compute the
8703         TypeAttributes, instead of rolling our own.  This makes the flags
8704         correct for the delegates.
8705
8706 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
8707
8708         * class.cs (Constructor.Define): Set the private flag for static
8709         constructors as well.
8710
8711         * cs-parser.jay (statement_expression): Set the return value to
8712         null, to avoid a crash when we catch an error.
8713
8714 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
8715
8716         * cs-parser.jay: Applied patch from Jackson that adds support for
8717         extern and unsafe modifiers to destructor declarations.
8718
8719         * expression.cs: Report error 21 if the user is trying to index a
8720         System.Array.
8721
8722         * driver.cs: Add an error message, suggested by the bug report.
8723
8724         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
8725         if we do not have a ": this ()" constructor initializer.  Fixes 45149
8726
8727 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
8728
8729         * namespace.cs: Add some information to reduce FAQs.
8730
8731 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
8732
8733         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
8734         underlying enumeration types.  Fixes #43915.
8735
8736         * expression.cs: Treat ushort/short as legal values to be used in
8737         bitwise operations.
8738
8739 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
8740
8741         * delegate.cs: transfer custom attributes for paramenters from
8742         the delegate declaration to Invoke and BeginInvoke.
8743
8744 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
8745
8746         * attribute.cs: handle custom marshalers and emit marshal info
8747         for fields, too.
8748
8749 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
8750
8751         * makefile.gnu: Added anonymous.cs to the compiler sources.
8752
8753 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
8754
8755         * iterators.cs: Change the name of the proxy class to include two
8756         underscores.
8757
8758         * cs-parser.jay: Update grammar to include anonymous methods.
8759
8760         * anonymous.cs: new file.
8761
8762 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
8763
8764         * class.cs (Field.Define): Add missing test for pointers and
8765         safety. 
8766
8767 2003-05-27  Ravi Pratap  <ravi@ximian.com>
8768
8769         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
8770         we use the stobj opcode.
8771
8772         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
8773         since it wasn't the correct fix. 
8774
8775         It still is puzzling that we are required to use stobj for IntPtr
8776         which seems to be a ValueType.
8777
8778 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
8779
8780         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
8781         during regular simple name resolution.   Now, the trick is that
8782         instead of returning for processing the simplename, we do a
8783         TypeManager.LookupType (ie, a rooted lookup as opposed to a
8784         contextual lookup type).   If a match is found, return that, if
8785         not, return for further composition.
8786
8787         This fixes long-standing 30485.
8788
8789         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
8790         using the address to initialize an object, do an Stobj instead of
8791         using the regular Stelem.
8792
8793         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
8794         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
8795         Because if we are a BaseIndexerAccess that value will be true.
8796         Fixes 43643.
8797
8798         * statement.cs (GotoCase.Resolve): Return after reporting an
8799         error, do not attempt to continue. 
8800
8801         * expression.cs (PointerArithmetic.Emit): If our operand is a
8802         long, convert our constants to match the operand before
8803         multiplying.  Convert to I type before adding.   Fixes 43670.
8804
8805 2003-05-14  Ravi Pratap  <ravi@ximian.com>
8806
8807         * enum.cs (ImplicitConversionExists) : Rename to
8808         ImplicitEnumConversionExists to remove ambiguity. 
8809
8810         * ecore.cs (NullCast): New type of cast expression class which
8811         basically is very similar to EmptyCast with the difference being
8812         it still is a constant since it is used only to cast a null to
8813         something else
8814         (eg. (string) null)
8815
8816         * convert.cs (ImplicitReferenceConversion): When casting a null
8817         literal, we return a NullCast.
8818
8819         * literal.cs (NullLiteralTyped): Remove - I don't see why this
8820         should be around anymore.
8821
8822         The renaming (reported was slightly wrong). Corrections:
8823
8824         ConvertImplicitStandard -> ImplicitConversionStandard
8825         ConvertExplicitStandard -> ExplicitConversionStandard
8826
8827         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
8828         before passing them in !
8829
8830         * convert.cs (ImplicitConversionStandard): When comparing for
8831         equal expr and target types, ensure that expr is not a
8832         NullLiteral.
8833
8834         In general, we must not be checking (expr_type ==
8835         target_type) in the top level conversion methods
8836         (ImplicitConversion, ExplicitConversion etc). This checking is
8837         done in the methods that they delegate to.
8838
8839 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
8840
8841         * convert.cs: Move Error_CannotConvertType,
8842         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
8843         ImplicitNumericConversion, ImplicitConversionExists,
8844         ImplicitUserConversionExists, StandardConversionExists,
8845         FindMostEncompassedType, FindMostSpecificSource,
8846         FindMostSpecificTarget, ImplicitUserConversion,
8847         ExplicitUserConversion, GetConversionOperators,
8848         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
8849         TryImplicitIntConversion, Error_CannotConvertImplicit,
8850         ConvertImplicitRequired, ConvertNumericExplicit,
8851         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
8852         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
8853         its own file.
8854
8855         Perform the following renames:
8856
8857         StandardConversionExists -> ImplicitStandardConversionExists
8858         ConvertImplicit -> ImplicitConversion
8859         ConvertImplicitStandard -> ImplicitStandardConversion
8860         TryImplicitIntConversion -> ImplicitIntConversion
8861         ConvertImplicitRequired -> ImplicitConversionRequired
8862         ConvertNumericExplicit -> ExplicitNumericConversion
8863         ConvertReferenceExplicit -> ExplicitReferenceConversion
8864         ConvertExplicit -> ExplicitConversion
8865         ConvertExplicitStandard -> ExplicitStandardConversion
8866
8867 2003-05-19  Martin Baulig  <martin@ximian.com>
8868
8869         * statement.cs (TypeInfo.StructInfo): Made this type protected.
8870         (TypeInfo): Added support for structs having structs as fields.
8871
8872         * ecore.cs (FieldExpr): Implement IVariable.
8873         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
8874         VariableInfo for the field.
8875
8876 2003-05-18  Martin Baulig  <martin@ximian.com>
8877
8878         * expression.cs (This.DoResolve): Report a CS0027 if we're
8879         emitting a field initializer.
8880
8881 2003-05-18  Martin Baulig  <martin@ximian.com>
8882
8883         * expression.cs (This.ResolveBase): New public function.
8884         (This.DoResolve): Check for CS0188.
8885
8886         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
8887         This.Resolve().
8888
8889         * ecore.cs (MethodGroupExpr.DoResolve): Set the
8890         `instance_expression' to null if we don't have any non-static
8891         methods.
8892
8893 2003-05-18  Martin Baulig  <martin@ximian.com>
8894
8895         Reworked the way how local variables and parameters are handled by
8896         the flow analysis code.
8897
8898         * statement.cs (TypeInfo, VariableMap): New public classes.
8899         (VariableInfo): New public class.  This is now responsible for
8900         checking whether a variable has been assigned.  It is used for
8901         parameters and local variables.
8902         (Block.EmitMeta): Take the InternalParameters as argument; compute
8903         the layout of the flow vectors here.
8904         (Block.LocalMap, Block.ParameterMap): New public properties.
8905         (FlowBranching): The .ctor doesn't get the InternalParameters
8906         anymore since Block.EmitMeta() now computes the layout of the flow
8907         vector.
8908         (MyStructInfo): This class is now known as `StructInfo' and nested
8909         in `TypeInfo'; we don't access this directly anymore.
8910
8911         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
8912         property and removed IsAssigned(), IsFieldAssigned(),
8913         SetAssigned() and SetFieldAssigned(); we now call them on the
8914         VariableInfo so we don't need to duplicate this code everywhere.
8915
8916         * expression.cs (ParameterReference): Added `Block block' argument
8917         to the .ctor.
8918         (LocalVariableReference, ParameterReference, This): The new
8919         VariableInfo class is now responsible for all the definite
8920         assignment stuff.
8921
8922         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
8923         IsParameterAssigned, SetParameterAssigned): Removed.
8924
8925 2003-05-18  Martin Baulig  <martin@ximian.com>
8926
8927         * typemanager.cs (InitCoreTypes): Try calling
8928         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
8929         the 3-args-version.  Corlib now also needs our `void_type'.
8930         (GetMethod): Added overloaded version which takes an optional
8931         `bool report_errors' to allow lookups of optional methods.
8932
8933 2003-05-12  Martin Baulig  <martin@ximian.com>
8934
8935         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
8936         only used for locals and not for parameters.
8937
8938 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
8939
8940         * support.cs (InternalParameters.ParameterType): Return the
8941         ExternalType of the parameter.
8942
8943         * parameter.cs (Parameter.ExternalType): drop the two arguments,
8944         they were unused.
8945
8946 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
8947
8948         * class.cs (MethodData.Define): Do not set the `newslot' on
8949         interface members, if they are also flagged as "override".
8950
8951         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
8952         better code for ++i and i++.  This only works for static fields
8953         and local variables.
8954
8955         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
8956         want to pull the DeclSpace out of the builder_to_declspace instead
8957         of the TypeBuilder (like in TypeContainer.FindMembers).
8958
8959         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
8960         instead of LookupTypeContainer.  Fixes the crash on .NET for
8961         looking up interface members.
8962
8963         * const.cs: Create our own emit context during the Definition
8964         stage, so that constants are evaluated in the proper context, when
8965         a recursive definition happens.
8966
8967 2003-05-11  Martin Baulig  <martin@ximian.com>
8968
8969         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
8970         new block for a switch section.
8971         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
8972         the adding/lookup in the switch block.  Fixes #39828.
8973
8974 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
8975
8976         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
8977         functionality: I needed to convert the data after I had performed
8978         the add/sub operation into the operands type size.
8979
8980         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
8981         pass the type for the box operation, otherwise the resulting
8982         object would have been of type object.
8983
8984         (BoxedCast): Add constructor to specify the type to box as.
8985
8986 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
8987
8988         * iterators.cs: I was reusing the `count' variable inadvertently,
8989         take steps to not allow this to happen.
8990
8991 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
8992
8993         * attribute.cs (Attribute.Resolve): Params attributes are encoded
8994         by creating an array at the point where the params starts and
8995         putting all those arguments there, then adjusting the size of the
8996         array.
8997
8998 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
8999
9000         * expression.cs (New.AddressOf): Implement interface
9001         IMemoryLocation.  This is used when the `new' operator is used in
9002         the context of an invocation to a method on a value type.
9003
9004         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
9005         example. 
9006
9007         * namespace.cs: Also check the using aliases here.
9008
9009         * driver.cs: Move the test for using validity after the types have
9010         been entered, so we do a single pass that also includes the using
9011         aliases. 
9012
9013         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
9014         in the regular case.   CreateSiblingForFinally is doing extra
9015         error checking.
9016
9017         * attribute.cs (GetAttributeArgumentExpression): Store the result
9018         on an out value, and use the return value to indicate failure
9019         instead of using null (which is a valid return for Constant.GetValue).
9020
9021         * statement.cs: Perform the analysis flow for the increment
9022         portion after the statement, because this will be the real flow of
9023         execution.  Fixes #42385
9024
9025         * codegen.cs (EmitContext.EmitArgument,
9026         EmitContext.EmitStoreArgument): New helper functions when the
9027         RemapToProxy flag is set.
9028
9029         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
9030         function.
9031
9032         Add support for remapping parameters. 
9033
9034         * iterators.cs: Propagate parameter values;  Store parameter
9035         values in the proxy classes.
9036
9037 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
9038
9039         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
9040         need a proxy reference;  I do not know what I was thinking
9041
9042         * cs-parser.jay (constructor_initializer): catch another error,
9043         and display nice message.
9044
9045         (field_declaration): catch void field declaration
9046         to flag a better error. 
9047
9048         * class.cs (MemberBase.CheckBase): Report an error instead of a
9049         warning if a new protected member is declared in a struct. 
9050         (Field.Define): catch the error of readonly/volatile.
9051
9052         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
9053
9054         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
9055         volatile variable is taken
9056
9057 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
9058
9059         * statement.cs (Fixed.Resolve): Report an error if we are not in
9060         an unsafe context.
9061
9062 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
9063
9064         * typemanager.cs: reuse the code that handles type clashes for
9065         delegates and enumerations.
9066
9067         * class.cs (Report28): Always report.
9068
9069         * expression.cs (EncodeAsAttribute): Allow nulls here.
9070
9071 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
9072
9073         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
9074         the functionality for testing whether an expression is valid for
9075         an attribute here.  Also handle the case of arrays of elements
9076         being stored. 
9077
9078         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
9079         encoding a linear array into an array of objects that are suitable
9080         to be passed to an CustomAttributeBuilder.
9081
9082         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
9083
9084         * ecore.cs: (FieldExpr): Handle field remapping here.
9085
9086         * iteratators.cs: Pass the instance variable (if the method is an
9087         instance method) to the constructors, so we can access the field
9088         variables on the class.
9089
9090         TODO: Test this with structs.  I think the THIS variable on
9091         structs might have to be a pointer, and not a refenrece
9092
9093 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
9094
9095         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
9096         local variables to fields in a proxy class.
9097
9098         * iterators.cs (PopulateProxy): Rename our internal fields to
9099         <XXX>.  
9100         Create a <THIS> field if we are an instance method, so we can
9101         reference our parent container variables.
9102         (MapVariable): Called back from the EmitContext code to enter a
9103         new variable to field mapping into the proxy class (we just create
9104         a FieldBuilder).
9105
9106         * expression.cs
9107         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
9108         for using the remapped locals to fields.
9109
9110         I placed the code here, because that gives the same semantics to
9111         local variables, and only changes the Emit code.
9112
9113         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
9114         statements inside iterators.
9115         (VariableInfo): Add a FieldBuilder for the cases when we are
9116         remapping local variables to fields in a proxy class
9117
9118         * ecore.cs (SimpleNameResolve): Avoid testing two times for
9119         current_block != null.
9120
9121         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
9122         not cope with strings, as it has been moved to the
9123         TableSwitchEmit.  Fixed bug in switch generation.
9124
9125         * expression.cs (New.DoResolve): Provide more context for the user
9126         when reporting an error.
9127
9128         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
9129         pointers. 
9130
9131         * expression.cs (MemberAccess.DoResolve): When we get a type back,
9132         check the permissions for it.  Note than in a type-resolution
9133         context the check was already present in DeclSpace.ResolveType,
9134         but was missing from the MemberAccess.
9135
9136         (ArrayCreation.CheckIndices): warn if the user has
9137         more nested levels of expressions, but there are no more
9138         dimensions specified.  Avoids crash on bug 41906.
9139
9140 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
9141
9142         * statement.cs (Block): replace Implicit bool, for a generic
9143         flags.   
9144         New flag: `Unchecked'.  This is used during the EmitMeta phase
9145         (which is out-of-line with the regular Resolve/Emit process for a
9146         statement, as this is done ahead of time, but still gets a chance
9147         to call constant resolve).
9148
9149         (Block.Flags): new enum for adding a new flag.
9150
9151         (Block.EmitMeta): track the state of unchecked.
9152
9153         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
9154         to enable constant resolution to work there as well.
9155
9156 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
9157
9158         * typemanager.cs (ienumerable_type): Also look up
9159         System.Collections.IEnumerable. 
9160
9161 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
9162
9163         TODO: Test more than one conditional per method.
9164
9165         * class.cs (Indexer.Define): Report the location where the user is
9166         referencing the unsupported feature.
9167
9168         (MethodData): Overload the use of `conditionals' to
9169         minimize the creation of needless ArrayLists.   This saves roughly
9170         212kb on my machine.
9171
9172         (Method): Implement the new IIteratorContainer interface.
9173         (Method.SetYields): Implement the method by setting the ModFlags
9174         to contain METHOD_YIELDS.
9175
9176         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
9177         which just got set to null.
9178
9179         * iterators.cs: New file.
9180
9181         (Yield, YieldBreak): New statements.
9182
9183         * statement.cs (Return.Resolve): Flag an error if we are used in
9184         an iterator method.
9185
9186         * codegen.cs (InIterator): New flag set if the code is being
9187         compiled in an iterator method.
9188
9189         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
9190         internal modifier, and we just use it to avoid adding extra
9191         fields, as this is seldom used.  
9192
9193         * cs-parser.jay: Add yield_statement (yield and yield break).
9194
9195         * driver.cs: New flag -v2 to turn on version 2 features. 
9196
9197         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
9198         hashtable when v2 is enabled.
9199
9200 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
9201
9202         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
9203         there is already a namespace defined with this name.
9204
9205         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
9206         people upgraded their corlibs.
9207
9208         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
9209         always use fully qualified types, no need to use the compiler
9210         front end.
9211
9212         (TypeManager.IsNamespace): Use binarysearch.
9213
9214         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
9215         AddDelegate): I did not quite use the new IsValid API properly: I
9216         have to pass the short-name and the fullname.  I was passing only
9217         the basename instead of the fullname sometimes. 
9218
9219         (TypeContainer.DefineType): call NamespaceClash.
9220
9221         * interface.cs (Interface.DefineType): use NamespaceClash before
9222         defining the type.
9223
9224         * delegate.cs (Delegate.DefineType): use NamespaceClash before
9225         defining the type.
9226
9227         * enum.cs: (Enum.DefineType): use NamespaceClash before
9228         defining the type.
9229
9230         * typemanager.cs (: 3-line patch that gives us some tasty 11%
9231         speed increase.  First, use the negative_hits cache when we get a
9232         negative.  Second, add the type with its full original name
9233         instead of the new . and + encoded name (reflection uses + to
9234         separate type from a nested type).  Use LookupTypeReflection
9235         directly which bypasses the type->name hashtable (that we already
9236         know does not contain the type.
9237
9238         * decl.cs (DeclSpace.ResolveTypeExpr): track the
9239         location/container type. 
9240
9241         * driver.cs: When passing utf8, use directly the UTF8Encoding.
9242
9243 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
9244
9245         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
9246
9247         * delegate.cs (NewDelegate.Resolve): Test whether an instance
9248         method is being referenced in the method group from a static
9249         context, and report error 120 if so.
9250
9251         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
9252         Error118. 
9253
9254         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
9255         is created, we create the A namespace).
9256
9257         * cs-parser.jay: A namespace also introduces a DeclarationFound.
9258         Fixes #41591
9259
9260 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
9261
9262         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
9263         invocation to ModuleBuilder.GetType with the same values will
9264         return a new type instance, so we need to cache its return
9265         values. 
9266
9267         * expression.cs (Binary.ResolveOperator): Only allow the compare
9268         operators on enums if they are of the same type.
9269
9270         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
9271         types of ValueType on their own case.  Before we were giving them
9272         the same treatment as objects.
9273
9274         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
9275         fullname.  Short name is used to compare against container name.
9276         Fullname is used to check against defined namespace names.
9277
9278         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
9279         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
9280
9281         (Method.CheckBase): Call parent.
9282         (MemberBase.CheckBase): Check for protected members on sealed
9283         classes.
9284         (PropertyBase.CheckBase): Call parent.
9285         (Field.Define): Call parent.
9286
9287         * report.cs: Negative error codes are now mapped to 8000 - code,
9288         so that the display is render more nicely.
9289
9290         * typemanager.cs: Do not use try/catch, instead report a regular
9291         error. 
9292
9293         (GetPointerType, GetReferenceType): These methods provide
9294         mechanisms to obtain the T* and T& from a T.  We had the code
9295         previously scattered around the code base, and it also used
9296         TypeManager.LookupType that would go through plenty of caches.
9297         This one goes directly to the type source.
9298
9299         In some places we did the Type.GetType followed by
9300         ModuleBuilder.GetType, but not in others, so this unifies the
9301         processing as well.
9302
9303         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
9304         statements now that we have namespace information.
9305
9306         * typemanager.cs (IsNamespace): New method, returns whether the
9307         string presented is a namespace or not.
9308
9309         (ComputeNamespaces): New public entry point, computes the list of
9310         available namespaces, using the GetNamespaces API call in Mono, or
9311         the slower version in MS.NET.   
9312
9313         Now before we start the semantic analysis phase, we have a
9314         complete list of namespaces including everything that the user has
9315         provided.
9316
9317         Deleted old code to cache namespaces in .nsc files.
9318
9319 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
9320
9321         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
9322         class/struct location definition Location for the implicit
9323         constructor location.
9324
9325         (Operator.Define): Use the location of the operator for the
9326         implicit Method definition.
9327
9328         (Constructor.Emit): use the constructor location for the implicit
9329         base initializer constructor.
9330
9331         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
9332         and the Expression class now contains two new methods:
9333
9334         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
9335         isolate type lookup from the rest of the resolution process.
9336
9337         Since we use Expressions to hold type definitions due to the way
9338         we parse the input we have historically overloaded Resolve to
9339         perform the Type lookups if a special flag is passed.  Now this is
9340         eliminated and two methods take their place. 
9341
9342         The differences in the two methods between xStep and xTerminal is
9343         that xStep is involved in our current lookup system that uses
9344         SimpleNames to compose a name, while xTerminal is used just to
9345         catch the case where the simplename lookup failed.
9346
9347 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
9348
9349         * expression.cs (ResolveMemberAccess): Remove redundant code.
9350         TypeExpr expressions are always born fully resolved.
9351
9352         * interface.cs (PopulateMethod): Do not lookup the types twice.
9353         We were doing it once during SemanticAnalysis and once during
9354         PopulateMethod.
9355
9356         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
9357         in local variable type definitions, were being returned as a
9358         SimpleName (we decomposed everything into a string), that is
9359         because primary_expression was being used instead of a type in the
9360         grammar (reduce/reduce conflicts).
9361
9362         The part that was wrong is that we converted the expression into a
9363         string (an oversimplification in one hand, compounded with primary
9364         expressions doing string concatenation).
9365
9366         So things like:
9367
9368         A.B.C [] x;
9369
9370         Would return "A.B.C[]" as a SimpleName.  This stopped things like
9371         using clauses from working on this particular context.  And a type
9372         was being matched directly against "A.B.C[]".
9373
9374         We now use the correct approach, and allow for ComposedCast to be
9375         part of the unary expression.  So the "A.B.C []" become a composed
9376         cast of "A.B.C" (as a nested group of MemberAccess with a
9377         SimpleName at the end) plus the rank composition "[]". 
9378
9379         Also fixes 35567
9380
9381 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
9382
9383         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
9384         for the access level checking.
9385
9386         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
9387         `TypeContainer container', because I kept getting confused when I
9388         was debugging this code.
9389
9390         * expression.cs (Indexers): Instead of tracking getters/setters,
9391         we now track them in parallel.  We create one arraylist less, but
9392         most importantly it is possible now for the LValue code to find a
9393         matching get for a set.
9394
9395         (IndexerAccess.DoResolveLValue): Update the code.
9396         GetIndexersForType has been modified already to extract all the
9397         indexers from a type.  The code assumed it did not.
9398
9399         Also make the code set the correct return type for the indexer.
9400         This was fixed a long time ago for properties, but was missing for
9401         indexers.  It used to be void_type.
9402
9403         (Binary.Emit): Test first for doubles instead of
9404         floats, as they are more common.
9405
9406         (Binary.EmitBranchable): Use the .un version of the branch opcodes
9407         when dealing with floats and the <=, >= operators.  This fixes bug
9408         #39314 
9409
9410         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
9411         to load the array value by emitting a load on the foreach variable
9412         type.  This was incorrect.  
9413
9414         We now emit the code to load an element using the the array
9415         variable type, and then we emit the conversion operator.
9416
9417         Fixed #40176
9418
9419 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
9420
9421         * attribute.cs: Avoid allocation of ArrayLists in the common case.
9422
9423 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
9424
9425         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
9426         test for protection before we test for signatures. 
9427
9428         (MethodSignature.ToString): implement.
9429
9430         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
9431         to the case where we reduced into a LongConstant.
9432
9433         * decl.cs (CheckAccessLevel): If the type is an array, we can not
9434         depend on whether the information is acurrate, because the
9435         Microsoft runtime will always claim that the array type is public,
9436         regardless of the real state.
9437
9438         If the type is a pointer, another problem happens: the type is
9439         reported as non-public in Microsoft.  
9440
9441         In both cases we have to call CheckAccessLevel recursively with
9442         the underlying type as the argument to be tested.
9443
9444 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
9445
9446         * assign.cs (Assign.Emit): If we are dealing with a compound
9447         assignment expression, we should use the code path that stores the
9448         intermediate result in a temporary value.  This fixes #40903.
9449
9450         *expression.cs (Indirection.ToString): Provide ToString method for
9451         debugging. 
9452
9453 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
9454
9455         * class.cs: Null out fields holding references to Block objects so
9456         they can be garbage collected.
9457
9458         * expression.cs (OverloadResolve): Remove unused local.
9459
9460 2003-04-07  Martin Baulig  <martin@ximian.com>
9461
9462         * codegen.cs (EmitContext.CurrentFile): New public field.
9463         (EmitContext.Mark): Use the CurrentFile to check whether the
9464         location is in the correct file.
9465         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
9466
9467 2003-04-07  Martin Baulig  <martin@ximian.com>
9468
9469         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
9470
9471         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
9472         location.  [FIXME: The location argument which gets passed to this
9473         method is sometimes wrong!]
9474
9475 2003-04-07  Nick Drochak <ndrochak@gol.com>
9476
9477         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
9478
9479 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
9480
9481         * expression.cs (Indirection.EmitAssign): We were using the
9482         temporary, but returning immediately instead of continuing the
9483         EmitAssing flow.
9484
9485 2003-04-06  Martin Baulig  <martin@ximian.com>
9486
9487         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
9488         if it's a nested child, but also deriving from the outer class.
9489         See test 190.cs.
9490
9491         * typemanager.cs (IsNestedChildOf): Make this work if it's a
9492         nested child, but also deriving from the outer class.  See
9493         test-190.cs.
9494         (FilterWithClosure): We may access private members of the outer
9495         class if we're a nested child and deriving from the outer class.
9496         (RealMemberLookup): Only set `closure_private_ok' if the
9497         `original_bf' contained BindingFlags.NonPublic.
9498
9499 2003-04-05  Martin Baulig  <martin@ximian.com>
9500
9501         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
9502         probe if its a type parameter, and if so, flag an error.
9503
9504         * decl.cs: Move here the SetParameterInfo code from class.cs.
9505         Handle IsGeneric here.
9506
9507         Handle a variety of errors in the parameter info definition.
9508
9509         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
9510         type parameters here.
9511
9512         * cs-parser.jay (class_declaration): report errors for parameters
9513         here as well.
9514
9515 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
9516
9517         * generic.cs: New file, contains support code for generics.
9518
9519         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
9520         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
9521
9522         Update parser for the above removals.
9523
9524         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
9525         now taken care of in the parser.
9526
9527 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
9528
9529         * class.cs (Event.Define): Do not allow abstract events to have
9530         initializers. 
9531
9532 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
9533
9534         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
9535         block in event declarations.
9536
9537         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
9538         value type, get its address.
9539
9540         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
9541         leaving a class on the stack instead of a boolean value (int
9542         0/1).  Change the code so we compare against null, and then the
9543         result against zero.
9544
9545         * class.cs (TypeContainer.GetClassBases): We were checking for the
9546         parent class being sealed too late.
9547
9548         * expression.cs (Binary.Emit): For <= and >= when dealing with
9549         floating point values, use cgt.un and clt.un instead of cgt and
9550         clt alone.
9551
9552 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
9553
9554         * statement.cs: Apply the same optimization as MS: skip the 
9555         GetEnumerator returning an IEnumerator, and use the one returning a 
9556         CharEnumerator instead. This allows us to avoid the try-finally block 
9557         and the boxing.
9558
9559 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
9560
9561         * cs-parser.jay: Attributes cannot be applied to
9562                          namespaces. Fixes #40473
9563
9564 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9565
9566         * class.cs:
9567         (Add*): check if the name is valid using the full name for constants,
9568         fields, properties and events.
9569
9570 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
9571
9572         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
9573         char constants to be part of the enumeration.
9574
9575         * expression.cs (Conditional.DoResolve): Add support for operator
9576         true. Implements the missing functionality from 14.12
9577
9578         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
9579         operator true/false as required by the spec.
9580
9581         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
9582         implicit conversion to boolean.
9583
9584         * statement.cs (Statement.ResolveBoolean): A boolean expression is
9585         also one where the type implements `operator true'. 
9586
9587         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
9588         get an expression that will invoke operator true based on an
9589         expression.  
9590
9591         (GetConversionOperators): Removed the hack that called op_True
9592         here.  
9593
9594         (Expression.ResolveBoolean): Move this from Statement.
9595
9596 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
9597
9598         * ecore.cs (FieldExpr): do not allow initialization of initonly
9599         fields on derived classes
9600
9601 2003-03-13  Martin Baulig  <martin@ximian.com>
9602
9603         * statement.cs (Block.Emit): Call ig.BeginScope() and
9604         ig.EndScope() when compiling with debugging info; call
9605         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
9606
9607 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
9608
9609         * expression.cs (Indexers): Do not construct immediately, allow
9610         for new members to be appended as we go.  Fixes 38143
9611
9612 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9613
9614         * expression.cs: save/restore context when resolving an unchecked
9615         expression.
9616
9617 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
9618
9619         * cfold.cs: Catch division by zero in modulus operator during
9620         constant folding.
9621
9622 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
9623
9624         * interface.cs (Interface.DefineMembers): Avoid defining members
9625         twice. 
9626
9627 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
9628
9629         * driver.cs: handle the +/- options for -noconfig
9630
9631         * statement.cs (Unckeched.Resolve): Also track the state of
9632         unchecked in the Resolve phase.
9633
9634 2003-02-27  Martin Baulig  <martin@ximian.com>
9635
9636         * ecore.cs (Expression.MemberLookup): Don't create a
9637         MethodGroupExpr for something which is not a method.  Fixes #38291.
9638
9639 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
9640
9641         * class.cs (MemberBase.CheckParameters): Also check that the type
9642         is unmanaged if it is a pointer.
9643
9644         * expression.cs (SizeOf.Resolve): Add location information.
9645
9646         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
9647         a managed type is declared.
9648
9649         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
9650         parameter modifiers as well.  Fixes bug 38606
9651
9652         * class.cs: Very sad.  Am backing out the speed up changes
9653         introduced by the ArrayList -> Array in the TypeContainer, as they
9654         were not actually that much faster, and introduced a bug (no error
9655         reports on duplicated methods).
9656
9657         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
9658         source first, this will guarantee that we have a valid expression
9659         before calling in lower levels functions that will require a
9660         resolved object.  Then use this original_source in the
9661         target.ResolveLValue instead of the original source that was
9662         passed to us.
9663
9664         Another change.  Use target.Resolve instead of LValueResolve.
9665         Although we are resolving for LValues, we will let the Assign code
9666         take care of that (it will be called again from Resolve).  This
9667         basically allows code like this:
9668
9669         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
9670         class Y { void A (X x) { x [0] += o; }
9671
9672         The problem was that the indexer was trying to resolve for
9673         set_Item (idx, object o) and never finding one.  The real set_Item
9674         was set_Item (idx, X).  By delaying the process we get the right
9675         semantics. 
9676
9677         Fixes bug 36505
9678
9679 2003-02-23  Martin Baulig  <martin@ximian.com>
9680
9681         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
9682         while calling DoEmit ().
9683
9684         * codegen.cs (EmitContext.Mark): Don't mark locations in other
9685         source files; if you use the #line directive inside a method, the
9686         compiler stops emitting line numbers for the debugger until it
9687         reaches the end of the method or another #line directive which
9688         restores the original file.
9689
9690 2003-02-23  Martin Baulig  <martin@ximian.com>
9691
9692         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
9693
9694 2003-02-23  Martin Baulig  <martin@ximian.com>
9695
9696         * statement.cs (Block.AddChildVariableNames): We need to call this
9697         recursively, not just for our immediate children.
9698
9699 2003-02-23  Martin Baulig  <martin@ximian.com>
9700
9701         * class.cs (Event.Define): Always make the field private, like csc does.
9702
9703         * typemanager.cs (TypeManager.RealMemberLookup): Make events
9704         actually work, fixes bug #37521.
9705
9706 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
9707
9708         * delegate.cs: When creating the various temporary "Parameters"
9709         classes, make sure that we call the ComputeAndDefineParameterTypes
9710         on those new parameters (just like we do with the formal ones), to
9711         allow them to be resolved in the context of the DeclSpace.
9712
9713         This fixes the bug that Dick observed in Bugzilla #38530.
9714
9715 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
9716
9717         * expression.cs (ResolveMemberAccess): When resolving a constant,
9718         do not attempt to pull a constant if the value was not able to
9719         generate a valid constant.
9720
9721         * const.cs (LookupConstantValue): Do not report more errors than required.
9722
9723 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9724
9725         * expression.cs: fixes bug #38328.
9726
9727 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
9728
9729         * class.cs: Changed all the various members that can be part of a
9730         class from being an ArrayList to be an Array of the right type.
9731         During the DefineType type_list, interface_list, delegate_list and
9732         enum_list are turned into types, interfaces, delegates and enums
9733         arrays.  
9734
9735         And during the member population, indexer_list, event_list,
9736         constant_list, field_list, instance_constructor_list, method_list,
9737         operator_list and property_list are turned into their real arrays.
9738
9739         Although we could probably perform this operation earlier, for
9740         good error reporting we need to keep the lists and remove the
9741         lists for longer than required.
9742
9743         This optimization was triggered by Paolo profiling the compiler
9744         speed on the output of `gen-sample-program.pl' perl script. 
9745
9746         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
9747         not crash in methods like MemberLookupFailed that use this field.  
9748
9749         This problem arises when the compiler fails to resolve a type
9750         during interface type definition for example.
9751
9752 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
9753
9754         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
9755         inherit from System.Object, so we have to stop at null, not only
9756         when reaching System.Object.
9757
9758 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
9759
9760         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
9761         DeclaredOnly because the parent indexer might have had a different
9762         name, but did not loop until the top of the hierarchy was reached.
9763
9764         The problem this one fixes is 35492: when a class implemented an
9765         indexer from an interface, we were getting the interface method
9766         (which was abstract) and we were flagging an error (can not invoke
9767         abstract method).
9768
9769         This also keeps bug 33089 functioning, and test-148 functioning.
9770
9771         * typemanager.cs (IsSpecialMethod): The correct way of figuring
9772         out if a method is special is to see if it is declared in a
9773         property or event, or whether it is one of the predefined operator
9774         names.   This should fix correctly #36804.
9775
9776 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
9777
9778         The goal here is to remove the dependency on EmptyCast.Peel ().
9779         Killing it completely.
9780
9781         The problem is that currently in a number of places where
9782         constants are expected, we have to "probe" for an EmptyCast, and
9783         Peel, which is not the correct thing to do, as this will be
9784         repetitive and will likely lead to errors. 
9785
9786         The idea is to remove any EmptyCasts that are used in casts that
9787         can be reduced to constants, so we only have to cope with
9788         constants. 
9789
9790         This bug hunt was triggered by Bug 37363 and the desire to remove
9791         the duplicate pattern where we were "peeling" emptycasts to check
9792         whether they were constants.  Now constants will always be
9793         constants.
9794
9795         * ecore.cs: Use an enumconstant here instead of wrapping with
9796         EmptyCast.  
9797
9798         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
9799         throwing me off.  By handling this we can get rid of a few hacks.
9800
9801         * statement.cs (Switch): Removed Peel() code.
9802
9803 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
9804
9805         * class.cs: Location information for error 508
9806
9807         * expression.cs (New.DoResolve): Add a guard against double
9808         resolution of an expression.  
9809
9810         The New DoResolve might be called twice when initializing field
9811         expressions (see EmitFieldInitializers, the call to
9812         GetInitializerExpression will perform a resolve on the expression,
9813         and later the assign will trigger another resolution
9814
9815         This leads to bugs (#37014)
9816
9817         * delegate.cs: The signature for EndInvoke should contain any ref
9818         or out parameters as well.  We were not doing this in the past. 
9819
9820         * class.cs (Field.Define): Do not overwrite the type definition
9821         inside the `volatile' group.  Turns out that volatile enumerations
9822         were changing the type here to perform a validity test, which
9823         broke conversions. 
9824
9825 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
9826
9827         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
9828         and structs, we do not want to load the instance variable
9829
9830         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
9831         enum_type has to be handled like an object reference (implicit
9832         conversions exists from this to object), but the regular IsClass
9833         and IsValueType tests will never return true for this one.
9834
9835         Also we use TypeManager.IsValueType instead of type.IsValueType,
9836         just for consistency with the rest of the code (this is only
9837         needed if we ever use the construct exposed by test-180.cs inside
9838         corlib, which we dont today).
9839
9840 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
9841
9842         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
9843         just InternalCall.
9844
9845 2003-02-09  Martin Baulig  <martin@ximian.com>
9846
9847         * namespace.cs (Namespace..ctor): Added SourceFile argument.
9848         (Namespace.DefineNamespaces): New static public method; this is
9849         called when we're compiling with debugging to add all namespaces
9850         to the symbol file.
9851
9852         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
9853         pass it to the Namespace's .ctor.
9854
9855         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
9856         and MethodBase arguments; pass the namespace ID to the symwriter;
9857         pass the MethodBase instead of the token to the symwriter.
9858         (SymbolWriter.DefineNamespace): New method to add a namespace to
9859         the symbol file.
9860
9861 2003-02-09  Martin Baulig  <martin@ximian.com>
9862
9863         * symbolwriter.cs: New file.  This is a wrapper around
9864         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
9865         methods here in near future.
9866
9867 2003-02-09  Martin Baulig  <martin@ximian.com>
9868
9869         * codegen.cs (EmitContext.Mark): Just pass the arguments to
9870         ILGenerator.MarkSequencePoint() which are actually used by the
9871         symbol writer.
9872
9873 2003-02-09  Martin Baulig  <martin@ximian.com>
9874
9875         * location.cs (SourceFile): New public sealed class.  This
9876         contains the name and an index which is used in the location's token.
9877         (Location): Reserve an appropriate number of bits in the token for
9878         the source file instead of walking over that list, this gives us a
9879         really huge performance improvement when compiling with debugging.
9880
9881         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
9882         `SourceFile' argument instead of a string.
9883         (Driver.ProcessFile): Add all the files via Location.AddFile(),
9884         but don't parse/tokenize here, we need to generate the list of all
9885         source files before we do that.
9886         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
9887         the files.
9888
9889         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
9890         instead of a string.
9891
9892         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
9893         of a string.
9894
9895 2003-02-09  Martin Baulig  <martin@ximian.com>
9896
9897         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
9898         filename on `#line default'.
9899
9900 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
9901
9902         * statement.cs: don't clear the pinned var when the fixed statement
9903         returns from the method (fixes bug#37752).
9904
9905 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
9906
9907         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
9908         to IsValueType.
9909
9910 2003-02-07  Martin Baulig  <martin@ximian.com>
9911
9912         * driver.cs: Removed the `--debug-args' command line argument.
9913
9914         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
9915         automatically by the AsssemblyBuilder.
9916         (CodeGen.InitializeSymbolWriter): We don't need to call any
9917         initialization function on the symbol writer anymore.  This method
9918         doesn't take any arguments.
9919
9920 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
9921
9922         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
9923         from referenced assemblies as well.
9924
9925 2003-02-02  Martin Baulig  <martin@ximian.com>
9926
9927         * class.cs (MethodData.Emit): Generate debugging info for external methods.
9928
9929 2003-02-02  Martin Baulig  <martin@ximian.com>
9930
9931         * class.cs (Constructor.Emit): Open the symbol writer before
9932         emitting the constructor initializer.
9933         (ConstructorInitializer.Emit): Call ec.Mark() to allow
9934         single-stepping through constructor initializers.
9935
9936 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
9937
9938         * class.cs: Handle error 549: do not allow virtual methods in
9939         sealed classes. 
9940
9941 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
9942
9943         * decl.cs: Check access levels when resolving types
9944
9945 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
9946
9947         * statement.cs: Add parameters and locals set in catch blocks that might 
9948         return to set vector
9949
9950 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
9951
9952         * class.cs (Operator): Set the SpecialName flags for operators.
9953
9954         * expression.cs (Invocation.DoResolve): Only block calls to
9955         accessors and operators on SpecialName methods.
9956
9957         (Cast.TryReduce): Handle conversions from char constants.
9958
9959
9960 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
9961
9962         * statement.cs: small memory and time optimization in FlowBranching.
9963
9964 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
9965
9966         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
9967         problem that the last fix but in the other sid (Set).
9968
9969         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
9970         access when there is no indexer in the hierarchy.
9971
9972 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
9973
9974         * class.cs: Combine some if statements.
9975
9976 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9977
9978         * driver.cs: fixed bug #37187.
9979
9980 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
9981
9982         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
9983         any indexer, it's needed to build a list with all the indexers in the
9984         hierarchy (AllGetters), else we have problems. Fixes #35653.
9985
9986 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
9987
9988         * class.cs (MethodData.Define): It is wrong for an interface
9989         implementation to be static in both cases: explicit and implicit.
9990         We were only handling this in one case.
9991
9992         Improve the if situation there to not have negations.
9993
9994         * class.cs (Field.Define): Turns out that we do not need to check
9995         the unsafe bit on field definition, only on usage.  Remove the test.
9996
9997 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9998
9999         * driver.cs: use assembly.Location instead of Codebase (the latest
10000         patch made mcs fail when using MS assemblies).
10001
10002 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
10003
10004         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
10005         get the path to *corlib.dll.
10006
10007 2003-01-21  Nick Drochak <ndrochak@gol.com>
10008
10009         * cs-tokenizer.cs:
10010         * pending.cs:
10011         * typemanager.cs: Remove compiler warnings
10012
10013 2003-01-20  Duncan Mak  <duncan@ximian.com>
10014
10015         * AssemblyInfo.cs: Bump the version number to 0.19.
10016
10017 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10018
10019         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
10020
10021 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
10022
10023         * class.cs (Constructor::Emit): Emit debugging info for constructors.
10024
10025 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
10026
10027         * cs-parser.jay: Small fix: we were not comparing the constructor
10028         name correctly.   Thanks to Zoltan for the initial pointer.
10029
10030 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
10031
10032         * cs-tokenizer.cs: Set file name when specified with #line
10033
10034 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
10035
10036         * cs-parser.jay: Only perform the constructor checks here if we
10037         are named like the class;  This will help provider a better
10038         error.  The constructor path is taken when a type definition is
10039         not found, but most likely the user forgot to add the type, so
10040         report that rather than the constructor error.
10041
10042 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
10043
10044         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
10045         allocations.
10046
10047 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
10048
10049         * cs-parser.jay: Add cleanup call.
10050
10051 2003-01-13  Duncan Mak  <duncan@ximian.com>
10052
10053         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
10054         consistent with other methods.
10055
10056 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
10057
10058         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
10059
10060 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
10061
10062         * attribute.cs: only set GuidAttr to true when we have a
10063         GuidAttribute.
10064
10065 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10066
10067         * ecore.cs:
10068         * expression.cs:
10069         * typemanager.cs: fixes to allow mcs compile corlib with the new
10070         Type.IsSubclassOf fix.
10071
10072 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
10073
10074         * expression.cs (LocalVariableReference.DoResolve): Classify a
10075         constant as a value, not as a variable.   Also, set the type for
10076         the variable.
10077
10078         * cs-parser.jay (fixed_statement): take a type instead of a
10079         pointer_type, so we can produce a better error message later.
10080
10081         * statement.cs (Fixed.Resolve): Flag types that are not pointers
10082         as an error.  
10083
10084         (For.DoEmit): Make inifinite loops have a
10085         non-conditional branch back.
10086
10087         (Fixed.DoEmit): First populate the pinned variables, then emit the
10088         statement, then clear the variables.  Before I was emitting the
10089         code once for each fixed piece.
10090
10091
10092 2003-01-08  Martin Baulig  <martin@ximian.com>
10093
10094         * statement.cs (FlowBranching.MergeChild): A break in a
10095         SWITCH_SECTION does not leave a loop.  Fixes #36155.
10096
10097 2003-01-08  Martin Baulig  <martin@ximian.com>
10098
10099         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
10100         lives in the same number space than `param_map'.  Fixes #36154.
10101
10102 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
10103
10104         * cs-parser.jay (constructor_declaration): Set the
10105         Constructor.ModFlags before probing for it.  This makes the
10106         compiler report 514, 515 and 132 (the code was there, but got
10107         broken). 
10108
10109         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
10110         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
10111         (GotoCase.Resolve): Set `Returns' to ALWAYS.
10112
10113 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
10114
10115         * enum.cs: create the enum static fields using the enum type.
10116
10117 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
10118
10119         * class.cs: don't try to create the ParamBuilder for the return
10120         type if it's not needed (and handle it breaking for the ms runtime
10121         anyway).
10122
10123 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
10124
10125         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
10126
10127 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
10128
10129         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
10130         the command.   This showed up while compiling the JANET source
10131         code, which used \r as its only newline separator.
10132
10133 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
10134
10135         * class.cs (Method.Define): If we are an operator (because it
10136         reuses our code), then set the SpecialName and HideBySig.  #36128
10137
10138 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
10139
10140         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
10141         exception, report error 120 `object reference required'.
10142
10143         * driver.cs: Add --pause option, used during to measure the size
10144         of the process as it goes with --timestamp.
10145
10146         * expression.cs (Invocation.DoResolve): Do not allow methods with
10147         SpecialName to be invoked.
10148
10149 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
10150
10151         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
10152         number before adding it.
10153
10154 2002-12-21  Ravi Pratap  <ravi@ximian.com>
10155
10156         * ecore.cs (StandardImplicitConversion): When in an unsafe
10157         context, we allow conversion between void * to any other pointer
10158         type. This fixes bug #35973.
10159
10160 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
10161
10162         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
10163         is not thrown when extensionless outputs are used 
10164
10165 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10166
10167         * rootcontext.cs: fixed compilation of corlib.
10168
10169 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
10170
10171         * attribute.cs (Attributes.Contains): Add new method.
10172
10173         * class.cs (MethodCore.LabelParameters): if the parameter is an
10174         `out' parameter, check that no attribute `[In]' has been passed.
10175
10176         * enum.cs: Handle the `value__' name in an enumeration.
10177
10178 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
10179
10180         * decl.cs: Added special case to allow overrides on "protected
10181         internal" methods
10182
10183 2002-12-18  Ravi Pratap  <ravi@ximian.com>
10184
10185         * attribute.cs (Attributes.AddAttributeSection): Rename to this
10186         since it makes much more sense.
10187
10188         (Attributes.ctor): Don't require a Location parameter.
10189
10190         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
10191
10192         * attribute.cs (ApplyAttributes): Remove extra Location parameters
10193         since we already have that information per attribute.
10194
10195         * everywhere : make appropriate changes.
10196
10197         * class.cs (LabelParameters): Write the code which actually
10198         applies attributes to the return type. We can't do this on the MS
10199         .NET runtime so we flag a warning in the case an exception is
10200         thrown.
10201
10202 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
10203
10204         * const.cs: Handle implicit null conversions here too.
10205
10206 2002-12-17  Ravi Pratap  <ravi@ximian.com>
10207
10208         * class.cs (MethodCore.LabelParameters): Remove the extra
10209         Type [] parameter since it is completely unnecessary. Instead
10210         pass in the method's attributes so that we can extract
10211         the "return" attribute.
10212
10213 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
10214
10215         * cs-parser.jay (parse): Use Report.Error to flag errors instead
10216         of ignoring it and letting the compile continue.
10217
10218         * typemanager.cs (ChangeType): use an extra argument to return an
10219         error condition instead of throwing an exception.
10220
10221 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
10222
10223         * expression.cs (Unary.TryReduce): mimic the code for the regular
10224         code path.  Perform an implicit cast in the cases where we can
10225         implicitly convert to one of the integral types, and then reduce
10226         based on that constant.   This fixes bug #35483.
10227
10228 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10229
10230         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
10231
10232 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10233
10234         * namespace.cs: fixed bug #35489.
10235
10236 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
10237
10238         * class.cs: Remove some dead code.
10239
10240         * cs-parser.jay: Estimate the number of methods needed
10241         (RootContext.MethodCount);
10242
10243         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
10244         numbers instead of StringBuilders.
10245
10246         * support.cs (PtrHashtable): Add constructor with initial size;
10247         We can now reduce reallocations of the method table.
10248
10249 2002-12-10  Ravi Pratap  <ravi@ximian.com>
10250
10251         * attribute.cs (ApplyAttributes): Keep track of the emitted
10252         attributes on a per-target basis. This fixes bug #35413.
10253
10254 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
10255
10256         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
10257         default to the Windows 1252 encoding.
10258
10259         (UnixParseOption): Support version, thanks to Alp for the missing
10260         pointer. 
10261
10262         * AssemblyInfo.cs: Add nice assembly information.
10263
10264         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
10265         (bug 35169).
10266
10267         * cs-parser.jay: Allow a trailing comma before the close bracked
10268         in the attribute_section production.
10269
10270         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
10271         address of the instance was being taken, I will take this out,
10272         because we take the address of the object immediately here.
10273
10274 2002-12-09  Ravi Pratap  <ravi@ximian.com>
10275
10276         * typemanager.cs (AreMultipleAllowed): Take care of the most
10277         obvious case where attribute type is not in the current assembly -
10278         stupid me ;-)
10279
10280 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
10281
10282         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
10283         definitions, instead of doing that afterwards.  
10284
10285         Also we use a nice little hack, depending on the constructor, we
10286         know if we are a "composed" name or a simple name.  Hence, we
10287         avoid the IndexOf test, and we avoid 
10288
10289         * codegen.cs: Add code to assist in a bug reporter to track down
10290         the source of a compiler crash. 
10291
10292 2002-12-07  Ravi Pratap  <ravi@ximian.com>
10293
10294         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
10295         types have been emitted for a given element and flag an error
10296         if something which does not have AllowMultiple set is used more
10297         than once.
10298
10299         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
10300         attribute types and their corresponding AllowMultiple properties
10301
10302         (AreMultipleAllowed): Check the property for a given type.
10303
10304         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
10305         property in the case we have a TypeContainer.
10306
10307         (Attributes.AddAttribute): Detect duplicates and just skip on
10308         adding them. This trivial fix catches a pretty gross error in our
10309         attribute emission - global attributes were being emitted twice!
10310
10311         Bugzilla bug #33187 is now fixed.
10312
10313 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
10314
10315         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
10316         instead of pp_and).
10317
10318         * expression.cs (Binary.ResolveOperator): I can only use the
10319         Concat (string, string, string) and Concat (string, string,
10320         string, string) if the child is actually a concatenation of
10321         strings. 
10322
10323 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
10324
10325         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
10326         context where we need a 2-character lookahead.
10327
10328         * pending.cs (PendingImplementation): Rework so we can keep track
10329         of interface types all the time, and flag those which were
10330         implemented by parents as optional.
10331
10332 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
10333
10334         * expression.cs (Binary.ResolveOperator): Use
10335         String.Concat(string,string,string) or
10336         String.Concat(string,string,string,string) when possible. 
10337
10338         * typemanager: More helper methods.
10339
10340
10341 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
10342
10343         * pending.cs: remove the bogus return from GetMissingInterfaces()
10344         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
10345
10346 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10347
10348         * namespace.cs: avoid duplicated 'using xxx' being added to
10349         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
10350         when we get more than one 'using' statement for the same namespace.
10351         Report a CS0105 warning for it.
10352
10353 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
10354
10355         * cs-tokenizer.cs (consume_identifier): use read directly, instead
10356         of calling getChar/putback, uses internal knowledge of it.    
10357
10358         (xtoken): Reorder tokenizer so most common patterns are checked
10359         first.  This reduces the compilation time in another 5% (from 8.11s
10360         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
10361
10362         The parsing time is 22% of the compilation in mcs, and from that
10363         64% is spent on the tokenization process.  
10364
10365         I tried using a binary search for keywords, but this is slower
10366         than the hashtable.  Another option would be to do a couple of
10367         things:
10368
10369                 * Not use a StringBuilder, instead use an array of chars,
10370                   with a set value.  Notice that this way we could catch
10371                   the 645 error without having to do it *afterwards*.
10372
10373                 * We could write a hand-parser to avoid the hashtable
10374                   compares altogether.
10375
10376         The identifier consumption process takes 37% of the tokenization
10377         time.  Another 15% is spent on is_number.  56% of the time spent
10378         on is_number is spent on Int64.Parse:
10379
10380                 * We could probably choose based on the string length to
10381                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
10382                   computations. 
10383
10384         Another 3% is spend on wrapping `xtoken' in the `token' function.
10385
10386         Handle 0xa0 as whitespace (#34752)
10387
10388 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
10389
10390         * typemanager.cs (IsCLRType): New routine to tell whether a type
10391         is one of the builtin types.  
10392
10393         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
10394         typecode in more places instead of doing pointer comparissions.
10395         We could leverage some knowledge about the way the typecodes are
10396         laid out.
10397
10398         New code to cache namespaces in assemblies, it is currently not
10399         invoked, to be used soon.
10400
10401         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
10402
10403         * expression.cs (Binary.ResolveOperator): specially handle
10404         strings, and do not perform user-defined operator overloading for
10405         built-in types.
10406
10407 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
10408
10409         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
10410         internalcall as it is a pretty simple operation;  Avoid whenever
10411         possible to call Char.IsLetter.
10412
10413         (consume_identifier): Cut by half the number of
10414         hashtable calls by merging the is_keyword and GetKeyword behavior.
10415
10416         Do not short-circuit, because if we do, we
10417         report errors (ie, #if false && true would produce an invalid
10418         directive error);
10419
10420
10421 2002-11-24  Martin Baulig  <martin@ximian.com>
10422
10423         * expression.cs (Cast.TryReduce): If we're in checked syntax,
10424         check constant ranges and report a CS0221.  Fixes #33186.
10425
10426 2002-11-24  Martin Baulig  <martin@ximian.com>
10427
10428         * cs-parser.jay: Make this work for uninitialized variable
10429         declarations in the `for' initializer.  Fixes #32416.
10430
10431 2002-11-24  Martin Baulig  <martin@ximian.com>
10432
10433         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
10434         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
10435
10436 2002-11-24  Martin Baulig  <martin@ximian.com>
10437
10438         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
10439         argument; if true, we also check for user-defined conversions.
10440         This is only needed if both arguments are of a user-defined type.
10441         Fixes #30443, added test-175.cs.
10442         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
10443
10444         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
10445
10446 2002-11-24  Martin Baulig  <martin@ximian.com>
10447
10448         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
10449         function to get the store opcode.
10450         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
10451         only emit the Ldelema if the store opcode is Stobj.  You must run
10452         both test-34 and test-167 to test this.  Fixes #34529.
10453
10454 2002-11-23  Martin Baulig  <martin@ximian.com>
10455
10456         * ecore.cs (Expression.MemberLookup): Added additional
10457         `qualifier_type' argument which is used when we're being called
10458         from MemberAccess.DoResolve() and null if we're called from a
10459         SimpleName lookup.
10460         (Expression.MemberLookupFailed): New method to report errors; this
10461         does the CS1540 check and reports the correct error message.
10462
10463         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
10464         argument for the CS1540 check and redone the way how we're dealing
10465         with private members.  See the comment in the source code for details.
10466         (FilterWithClosure): Reverted this back to revision 1.197; renamed
10467         `closure_start_type' to `closure_qualifier_type' and check whether
10468         it's not null.  It was not this filter being broken, it was just
10469         being called with the wrong arguments.
10470
10471         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
10472         and pass it the correct `qualifier_type'; this also does the error
10473         handling for us.
10474
10475 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
10476
10477         * expression.cs (Invocation.EmitParams): If the we are dealing
10478         with a non-built-in value type, load its address as well.
10479
10480         (ArrayCreation): Use a a pretty constant instead
10481         of the hardcoded value 2.   Use 6 instead of 2 for the number of
10482         static initializers.  
10483
10484         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
10485         because they are not really value types, just glorified integers. 
10486
10487         * driver.cs: Do not append .exe, the CSC compiler does not do it.
10488
10489         * ecore.cs: Remove redundant code for enumerations, make them use
10490         the same code path as everything else, fixes the casting issue
10491         with enumerations in Windows.Forms.
10492
10493         * attribute.cs: Do only cast to string if it is a string, the
10494         validation happens later.
10495
10496         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
10497         people upgrade their corlibs.
10498
10499         * ecore.cs: Oops, enumerations were not following the entire code path
10500
10501 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
10502
10503         * typemanager.cs (FilterWithClosure): Commented out the test for
10504         1540 in typemanager.cs, as it has problems when accessing
10505         protected methods from a parent class (see test-174.cs). 
10506
10507         * attribute.cs (Attribute.ValidateGuid): new method.
10508         (Attribute.Resolve): Use above.
10509
10510 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
10511
10512         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
10513
10514         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
10515         handling for enumerations, as we only needed the TypeContainer
10516         functionality to begin with (this is required for the fix below to
10517         work for enums that reference constants in a container class for
10518         example). 
10519
10520         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
10521
10522         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
10523         a valid TypeBuilder to perform lookups on.o
10524
10525         * class.cs (InheritableMemberSignatureCompare): Use true in the
10526         call to GetGetMethod and GetSetMethod, because we are comparing
10527         the signature, and we need to get the methods *even* if they are
10528         private. 
10529
10530         (PropertyBase.CheckBase): ditto.
10531
10532         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
10533         GotoCase.Resolve): Use Peel on EmpytCasts.
10534
10535         * ecore.cs (EmptyCast): drop child, add Peel method.
10536
10537 2002-11-17  Martin Baulig  <martin@ximian.com>
10538
10539         * ecore.cs (EmptyCast.Child): New public property.
10540
10541         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
10542         label resolved to an EmptyCast.  Fixes #34162.
10543         (GotoCase.Resolve): Likewise.
10544         (Block.EmitMeta): Likewise.
10545
10546 2002-11-17  Martin Baulig  <martin@ximian.com>
10547
10548         * expression.cs (Invocation.BetterConversion): Prefer int over
10549         uint; short over ushort; long over ulong for integer literals.
10550         Use ImplicitConversionExists instead of StandardConversionExists
10551         since we also need to check for user-defined implicit conversions.
10552         Fixes #34165.  Added test-173.cs.
10553
10554 2002-11-16  Martin Baulig  <martin@ximian.com>
10555
10556         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
10557         with the `true' and `false' literals.  Fixes #33151.
10558
10559 2002-11-16  Martin Baulig  <martin@ximian.com>
10560
10561         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
10562         October 22nd; don't do the cs1540 check for static members.
10563
10564         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
10565         now using our own filter here and doing the cs1540 check again.
10566
10567 2002-11-16  Martin Baulig  <martin@ximian.com>
10568
10569         * support.cs (InternalParameters): Don't crash if we don't have
10570         any fixed parameters.  Fixes #33532.
10571
10572 2002-11-16  Martin Baulig  <martin@ximian.com>
10573
10574         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
10575         when looking up static methods to make this work on Windows.
10576         Fixes #33773.
10577
10578 2002-11-16  Martin Baulig  <martin@ximian.com>
10579
10580         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
10581         a setter rather than using PropertyInfo.CanWrite.
10582
10583 2002-11-15  Nick Drochak  <ndrochak@gol.com>
10584
10585         * class.cs: Allow acces to block member by subclasses. Fixes build
10586         breaker.
10587
10588 2002-11-14  Martin Baulig  <martin@ximian.com>
10589
10590         * class.cs (Constructor.Emit): Added the extern/block check.
10591         Fixes bug #33678.
10592
10593 2002-11-14  Martin Baulig  <martin@ximian.com>
10594
10595         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
10596         iteration while looking for indexers, this is needed because the
10597         indexer may have a different name in our base classes.  Fixed the
10598         error reporting (no indexers at all, not get accessor, no
10599         overloaded match).  Fixes bug #33089.
10600         (IndexerAccess.DoResolveLValue): Likewise.
10601
10602 2002-11-14  Martin Baulig  <martin@ximian.com>
10603
10604         * class.cs (PropertyBase.CheckBase): Make this work for multiple
10605         indexers.  Fixes the first part of bug #33089.
10606         (MethodSignature.InheritableMemberSignatureCompare): Added support
10607         for properties.
10608
10609 2002-11-13  Ravi Pratap  <ravi@ximian.com>
10610
10611         * attribute.cs (Attribute.Resolve): Catch the
10612         NullReferenceException and report it since it isn't supposed to
10613         happen. 
10614
10615 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
10616
10617         * expression.cs (Binary.EmitBranchable): Also handle the cases for
10618         LogicalOr and LogicalAnd that can benefit from recursively
10619         handling EmitBranchable.  The code now should be nice for Paolo.
10620
10621 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
10622
10623         * typemanager.cs (LookupType): Added a negative-hit hashtable for
10624         the Type lookups, as we perform quite a number of lookups on
10625         non-Types.  This can be removed once we can deterministically tell
10626         whether we have a type or a namespace in advance.
10627
10628         But this might require special hacks from our corlib.
10629
10630         * TODO: updated.
10631
10632         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
10633         and double which avoids a conversion from an integer to a double.
10634
10635         * expression.cs: tiny optimization, avoid calling IsConstant,
10636         because it effectively performs the lookup twice.
10637
10638 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
10639
10640         But a bogus return here to keep the semantics of the old code
10641         until the Mono runtime is fixed.
10642
10643         * pending.cs (GetMissingInterfaces): New method used to remove all
10644         the interfaces that are already implemented by our parent
10645         classes from the list of pending methods. 
10646
10647         * interface.cs: Add checks for calls after ResolveTypeExpr.
10648
10649 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
10650
10651         * class.cs (Class.Emit): Report warning 67: event not used if the
10652         warning level is beyond 3.
10653
10654         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
10655         being a NullLiteral.
10656
10657         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
10658         specifiers. 
10659
10660         * class.cs (TypeContainer.GetClassBases): Cover a missing code
10661         path that might fail if a type can not be resolved.
10662
10663         * expression.cs (Binary.Emit): Emit unsigned versions of the
10664         operators. 
10665
10666         * driver.cs: use error 5.
10667
10668 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
10669
10670         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
10671
10672 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
10673
10674         * cs-parser.jay (switch_section): A beautiful patch from Martin
10675         Baulig that fixed 33094.
10676
10677 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
10678
10679         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
10680         Check whether the base is abstract and report an error if so.
10681
10682         * expression.cs (IndexerAccess.DoResolveLValue,
10683         IndexerAccess.DoResolve): ditto. 
10684
10685         (Invocation.DoResolve): ditto.
10686
10687         (Invocation.FullMethodDesc): Improve the report string.
10688
10689         * statement.cs (Block): Eliminate IsVariableDefined as it is
10690         basically just a wrapper for GetVariableInfo.
10691
10692         * ecore.cs (SimpleName): Use new 
10693
10694         * support.cs (ReflectionParamter.ParameterType): We unwrap the
10695         type, as we return the actual parameter ref/unref state on a
10696         different call.
10697
10698 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
10699
10700         * support.cs: Return proper flags REF/OUT fixing the previous
10701         commit.  
10702
10703         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
10704         not used to mean `ref' but `ref or out' in ParameterReference
10705
10706         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
10707         full type signature instead of calling TypeManger.CSharpName
10708         ourselves. 
10709
10710         * support.cs (InternalParameters.ParameterDesc): Do not compare
10711         directly to the modflags, because REF/OUT will actually be bitsets
10712         if set. 
10713
10714         * delegate.cs (VerifyMethod): Check also the modifiers.
10715
10716         * cs-tokenizer.cs: Fix bug where floating point values with an
10717         exponent where a sign was missing was ignored.
10718
10719         * driver.cs: Allow multiple assemblies to be specified in a single
10720         /r: argument
10721
10722 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
10723
10724         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
10725         because identifiers after a parenthesis would end up in this kind
10726         of production, and we needed to desamiguate it for having casts
10727         like:
10728
10729                 (UserDefinedType *) xxx
10730
10731 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
10732
10733         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
10734         we should set on the Bindingflags.NonPublic, but not turn on
10735         private_ok.  private_ok controls whether a Private member is
10736         returned (this is chekced on the filter routine), while the
10737         BindingFlags.NonPublic just controls whether private/protected
10738         will be allowed.   This fixes the problem part of the problem of
10739         private properties being allowed to be used in derived classes.
10740
10741         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
10742         so we can call the children DoResolveLValue method (this will
10743         properly signal errors on lvalue assignments to base properties)
10744
10745         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
10746         getter are null, and we have a property info, we know that this
10747         happened because the lookup failed, so we report an error 122 for
10748         protection level violation.
10749
10750         We also silently return if setter and getter are null in the
10751         resolve functions, this condition only happens if we have flagged
10752         the error before.  This is the other half of the problem. 
10753
10754         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
10755         not have accessibility information, that is why we were returning
10756         true in the filter function in typemanager.cs.
10757
10758         To properly report 122 (property is inaccessible because of its
10759         protection level) correctly, we report this error in ResolveAccess
10760         by failing if both the setter and the getter are lacking (ie, the
10761         lookup failed). 
10762
10763         DoResolve and DoLResolve have been modified to check for both
10764         setter/getter being null and returning silently, the reason being
10765         that I did not want to put the knowledge about this error in upper
10766         layers, like:
10767
10768         int old = Report.Errors;
10769         x = new PropertyExpr (...);
10770         if (old != Report.Errors)
10771                 return null;
10772         else
10773                 return x;
10774
10775         So the property expr is returned, but it is invalid, so the error
10776         will be flagged during the resolve process. 
10777
10778         * class.cs: Remove InheritablePropertySignatureCompare from the
10779         class, as we no longer depend on the property signature to compute
10780         whether it is possible to implement a method or not.
10781
10782         The reason is that calling PropertyInfo.GetGetMethod will return
10783         null (in .NET, in Mono it works, and we should change this), in
10784         cases where the Get Method does not exist in that particular
10785         class.
10786
10787         So this code:
10788
10789         class X { public virtual int A { get { return 1; } } }
10790         class Y : X { }
10791         class Z : Y { public override int A { get { return 2; } } }
10792
10793         Would fail in Z because the parent (Y) would not have the property
10794         defined.  So we avoid this completely now (because the alternative
10795         fix was ugly and slow), and we now depend exclusively on the
10796         method names.
10797
10798         (PropertyBase.CheckBase): Use a method-base mechanism to find our
10799         reference method, instead of using the property.
10800
10801         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
10802         routines are gone now.
10803
10804         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
10805         names, they were incorrectly named.
10806
10807         * cs-tokenizer.cs: Return are more gentle token on failure. 
10808
10809         * pending.cs (PendingImplementation.InterfaceMethod): This routine
10810         had an out-of-sync index variable, which caused it to remove from
10811         the list of pending methods the wrong method sometimes.
10812
10813 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
10814
10815         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
10816         CanWrite, because those refer to this particular instance of the
10817         property, and do not take into account the fact that we can
10818         override single members of a property.
10819
10820         Constructor requires an EmitContext.  The resolution process does
10821         not happen here, but we need to compute the accessors before,
10822         because the resolution does not always happen for properties.
10823
10824         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
10825         subclass, before we did not update this flag, but we did update
10826         bindingflags. 
10827
10828         (GetAccessors): Drop this routine, as it did not work in the
10829         presence of partially overwritten set/get methods. 
10830
10831         Notice that this broke the cs1540 detection, but that will require
10832         more thinking. 
10833
10834 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10835
10836         * class.cs:
10837         * codegen.cs:
10838         * driver.cs: issue a warning instead of an error if we don't support
10839         debugging for the platform. Also ignore a couple of errors that may
10840         arise when trying to write the symbols. Undo my previous patch.
10841
10842 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10843
10844         * driver.cs: ignore /debug switch except for Unix platforms.
10845
10846 2002-10-23  Nick Drochak  <ndrochak@gol.com>
10847
10848         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
10849
10850 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
10851
10852         * driver.cs: Do not make mcs-debug conditional, so we do not break
10853         builds that use it.
10854
10855         * statement.cs (UsageVector.MergeChildren): I would like Martin to
10856         review this patch.  But basically after all the children variables
10857         have been merged, the value of "Breaks" was not being set to
10858         new_breaks for Switch blocks.  I think that it should be set after
10859         it has executed.  Currently I set this to the value of new_breaks,
10860         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
10861         conservative, but I do not understand this code very well.
10862
10863         I did not break anything in the build, so that is good ;-)
10864
10865         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
10866
10867 2002-10-20  Mark Crichton  <crichton@gimp.org>
10868
10869         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
10870
10871 2002-10-20  Nick Drochak  <ndrochak@gol.com>
10872
10873         * cfold.cs: Fixed compile blocker.
10874
10875 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
10876
10877         * driver.cs: I was chekcing the key, not the file.
10878
10879 2002-10-19  Ravi Pratap  <ravi@ximian.com>
10880
10881         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
10882         message that we were generating - we just need to silently return
10883         a null.
10884
10885 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
10886
10887         * class.cs (Event.Define): Change my previous commit, as this
10888         breaks the debugger.  This is a temporary hack, as it seems like
10889         the compiler is generating events incorrectly to begin with.
10890
10891         * expression.cs (Binary.ResolveOperator): Added support for 
10892         "U operator - (E x, E y)"
10893
10894         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
10895         y)".
10896
10897         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
10898         init-only variables, but this path did not take into account that
10899         there might be also instance readonly variables.  Correct this
10900         problem. 
10901
10902         This fixes bug 32253
10903
10904         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
10905         delegates as well.
10906
10907         * driver.cs: Change the extension for modules to `netmodule'
10908
10909         * cs-parser.jay: Improved slightly the location tracking for
10910         the debugger symbols.
10911
10912         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
10913         modifiers that were specified instead of the hardcoded value
10914         (FamAndAssem).  This was basically ignoring the static modifier,
10915         and others.  Fixes 32429.
10916
10917         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
10918         fixed a bug in the process (32476)
10919
10920         * expression.cs (ArrayAccess.EmitAssign): Patch from
10921         hwang_rob@yahoo.ca that fixes bug 31834.3
10922
10923 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
10924
10925         * driver.cs: Make the module extension .netmodule.
10926
10927 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
10928
10929         * driver.cs: Report an error if the resource file is not found
10930         instead of crashing.
10931
10932         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
10933         false, like Emit does.
10934
10935 2002-10-16  Nick Drochak  <ndrochak@gol.com>
10936
10937         * typemanager.cs: Remove unused private member.  Also reported mcs
10938         bug to report this as a warning like csc.
10939
10940 2002-10-15  Martin Baulig  <martin@gnome.org>
10941
10942         * statement.cs (Statement.Emit): Made this a virtual method; emits
10943         the line number info and calls DoEmit().
10944         (Statement.DoEmit): New protected abstract method, formerly knows
10945         as Statement.Emit().
10946
10947         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
10948
10949 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
10950
10951         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
10952         have fixed a remaining problem: not every AddXXXX was adding a
10953         fully qualified name.  
10954
10955         Now everyone registers a fully qualified name in the DeclSpace as
10956         being defined instead of the partial name.  
10957
10958         Downsides: we are slower than we need to be due to the excess
10959         copies and the names being registered this way.  
10960
10961         The reason for this is that we currently depend (on the corlib
10962         bootstrap for instance) that types are fully qualified, because
10963         we dump all the types in the namespace, and we should really have
10964         types inserted into the proper namespace, so we can only store the
10965         basenames in the defined_names array.
10966
10967 2002-10-10  Martin Baulig  <martin@gnome.org>
10968
10969         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
10970         from bug #31834, see the bug report for a testcase which is
10971         miscompiled.
10972
10973 2002-10-10  Martin Baulig  <martin@gnome.org>
10974
10975         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
10976         flow analysis code for this.
10977
10978         * statement.cs (Do, While, For): Tell the flow analysis code about
10979         infinite loops.
10980         (FlowBranching.UsageVector): Added support for infinite loops.
10981         (Block.Resolve): Moved the dead code elimination here and use flow
10982         analysis to do it.
10983
10984 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
10985
10986         * class.cs (Field.Define): Catch cycles on struct type
10987         definitions. 
10988
10989         * typemanager.cs (IsUnmanagedtype): Do not recursively check
10990         fields if the fields are static.  We only need to check instance
10991         fields. 
10992
10993         * expression.cs (As.DoResolve): Test for reference type.
10994
10995         * statement.cs (Using.ResolveExpression): Use
10996         ConvertImplicitRequired, not ConvertImplicit which reports an
10997         error on failture
10998         (Using.ResolveLocalVariableDecls): ditto.
10999
11000         * expression.cs (Binary.ResolveOperator): Report errors in a few
11001         places where we had to.
11002
11003         * typemanager.cs (IsUnmanagedtype): Finish implementation.
11004
11005 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
11006
11007         * expression.cs: Use StoreFromPtr instead of extracting the type
11008         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
11009
11010         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
11011         an enumeration value to a System.Enum, but System.Enum is not a
11012         value type, but an class type, so we need to box.
11013
11014         (Expression.ConvertExplicit): One codepath could return
11015         errors but not flag them.  Fix this.  Fixes #31853
11016
11017         * parameter.cs (Resolve): Do not allow void as a parameter type.
11018
11019 2002-10-06  Martin Baulig  <martin@gnome.org>
11020
11021         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
11022         if it's a class type and not a struct.  Fixes #31815.
11023
11024 2002-10-06  Martin Baulig  <martin@gnome.org>
11025
11026         * statement.cs: Reworked the flow analysis code a bit to make it
11027         usable for dead code elimination.
11028
11029 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11030
11031         * cs-parser.jay: allow empty source files. Fixes bug #31781.
11032
11033 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
11034
11035         * expression.cs (ComposedCast.DoResolveType): A quick workaround
11036         to fix the test 165, will investigate deeper.
11037
11038 2002-10-04  Martin Baulig  <martin@gnome.org>
11039
11040         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
11041         finally blocks actually work.
11042         (Try.Resolve): We don't need to create a sibling for `finally' if
11043         there is no finally block.
11044
11045 2002-10-04  Martin Baulig  <martin@gnome.org>
11046
11047         * class.cs (Constructor.Define): The default accessibility for a
11048         non-default constructor is private, not public.
11049
11050 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
11051
11052         * class.cs (Constructor): Make AllowedModifiers public, add
11053         EXTERN.
11054
11055         * cs-parser.jay: Perform the modifiers test here, as the
11056         constructor for the Constructor class usually receives a zero
11057         because of the way we create it (first we create, later we
11058         customize, and we were never checking the modifiers).
11059
11060         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
11061         is a version of LookupTypeReflection that includes the type-name
11062         cache.  This can be used as a fast path for functions that know
11063         the fully qualified name and are only calling into *.GetType() to
11064         obtain a composed type.
11065
11066         This is also used by TypeManager.LookupType during its type
11067         composition.
11068
11069         (LookupType): We now also track the real type name, as sometimes
11070         we can get a quey for the real type name from things like
11071         ComposedCast.  This fixes bug 31422.
11072
11073         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
11074         complete type fullname, it does not have to go through the type
11075         resolution system to obtain the composed version of the type (for
11076         obtaining arrays or pointers).
11077
11078         (Conditional.Emit): Use the EmitBoolExpression to
11079         generate nicer code, as requested by Paolo.
11080
11081         (ArrayCreation.CheckIndices): Use the patch from
11082         hwang_rob@yahoo.ca to validate the array initializers. 
11083
11084 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
11085
11086         * class.cs (ConstructorInitializer.Emit): simplify code by using
11087         Invocation.EmitCall, and at the same time, fix the bugs in calling
11088         parent constructors that took variable arguments. 
11089
11090         * ecore.cs (Expression.ConvertNumericExplicit,
11091         Expression.ImplicitNumericConversion): Remove the code that
11092         manually wrapped decimal (InternalTypeConstructor call is now gone
11093         as well).
11094
11095         * expression.cs (Cast.TryReduce): Also handle decimal types when
11096         trying to perform a constant fold on the type.
11097
11098         * typemanager.cs (IsUnmanagedtype): Partially implemented.
11099
11100         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
11101         that only turned off an error report, and did nothing else. 
11102
11103 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
11104
11105         * driver.cs: Handle and ignore /fullpaths
11106
11107 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
11108
11109         * expression.cs (Binary.ResolveOperator): Catch the case where
11110         DoNumericPromotions returns true, 
11111
11112         (Binary.DoNumericPromotions): Simplify the code, and the tests.
11113
11114 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
11115
11116         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
11117         report error 70.
11118
11119 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
11120
11121         * ecore.cs (ConvertNumericExplicit): It is not enough that the
11122         conversion exists, but it is also required that the conversion be
11123         performed.  This manifested in "(Type64Enum) 2".  
11124
11125         * class.cs (TypeManager.AddMethod): The fix is not to change
11126         AddEnum, because that one was using a fully qualified name (every
11127         DeclSpace derivative does), but to change the AddMethod routine
11128         that was using an un-namespaced name.  This now correctly reports
11129         the duplicated name.
11130
11131         Revert patch until I can properly fix it.  The issue
11132         is that we have a shared Type space across all namespaces
11133         currently, which is wrong.
11134
11135         Options include making the Namespace a DeclSpace, and merge
11136         current_namespace/current_container in the parser.
11137
11138 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
11139
11140         * cs-parser.jay: Improve error reporting when we get a different
11141         kind of expression in local_variable_type and
11142         local_variable_pointer_type. 
11143
11144         Propagate this to avoid missleading errors being reported.
11145
11146         * ecore.cs (ImplicitReferenceConversion): treat
11147         TypeManager.value_type as a target just like object_type.   As
11148         code like this:
11149
11150         ValueType v = 1;
11151
11152         Is valid, and needs to result in the int 1 being boxed before it
11153         is assigned to the value type v.
11154
11155         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
11156         to validate the enumeration name.
11157
11158         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
11159         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
11160         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
11161
11162         * ecore.cs (TryImplicitIntConversion): When doing an
11163         implicit-enumeration-conversion, check if the type is 64-bits and
11164         perform a conversion before passing to EnumConstant.
11165
11166 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
11167
11168         * decl.cs (Error_AmbiguousTypeReference); New routine used to
11169         report ambiguous type references.  Unlike the MS version, we
11170         report what the ambiguity is.   Innovation at work ;-)
11171
11172         (DeclSpace.FindType): Require a location argument to
11173         display when we display an ambiguous error.
11174
11175         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
11176
11177         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
11178
11179         * expression.cs (EmitDynamicInitializers): Apply patch from
11180         hwang_rob@yahoo.ca that fixes the order in which we emit our
11181         initializers. 
11182
11183 2002-09-21  Martin Baulig  <martin@gnome.org>
11184
11185         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
11186         delegate takes no arguments.
11187
11188 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
11189
11190         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
11191         from integers.
11192
11193         * expression.cs: Extract the underlying type.
11194
11195         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
11196
11197         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
11198
11199 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
11200
11201         * class.cs (TypeContainer.DefineType): We can not use the nice
11202         PackingSize with the size set to 1 DefineType method, because it
11203         will not allow us to define the interfaces that the struct
11204         implements.
11205
11206         This completes the fixing of bug 27287
11207
11208         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
11209         means also structs.  This fixes part of the problem. 
11210         (Expresion.ImplicitReferenceConversionExists): ditto.
11211
11212         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
11213         error if there were no errors reported during the type lookup
11214         process, to avoid duplicates or redundant errors.  Without this
11215         you would get an ambiguous errors plus a type not found.  We have
11216         beaten the user enough with the first error.  
11217
11218         (DeclSparce.FindType): Emit a warning if we have an ambiguous
11219         reference. 
11220
11221         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
11222         during the resolution process, stop the lookup, this avoids
11223         repeated error reports (same error twice).
11224
11225         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
11226
11227         * typemanager.cs (LookupType): Redo the type lookup code to match
11228         the needs of System.Reflection.  
11229
11230         The issue is that System.Reflection requires references to nested
11231         types to begin with a "+" sign instead of a dot.  So toplevel
11232         types look like: "NameSpace.TopLevelClass", and nested ones look
11233         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
11234         levels. 
11235
11236 2002-09-19  Martin Baulig  <martin@gnome.org>
11237
11238         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
11239         says that a method always returns or always throws an exception,
11240         don't report the CS0161.
11241
11242         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
11243         set `Returns = new_returns'.
11244
11245 2002-09-19  Martin Baulig  <martin@gnome.org>
11246
11247         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
11248         to an enum constant, check for a CS0176.
11249
11250 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
11251
11252         * class.cs (TypeContainer.CheckPairedOperators): Now we check
11253         for operators that must be in pairs and report errors.
11254
11255         * ecore.cs (SimpleName.DoResolveType): During the initial type
11256         resolution process, when we define types recursively, we must
11257         check first for types in our current scope before we perform
11258         lookups in the enclosing scopes.
11259
11260         * expression.cs (MakeByteBlob): Handle Decimal blobs.
11261
11262         (Invocation.VerifyArgumentsCompat): Call
11263         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
11264         I thought we were supposed to always call this, but there are a
11265         few places in the code where we dont do it.
11266
11267 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
11268
11269         * driver.cs: Add support in -linkres and -resource to specify the
11270         name of the identifier.
11271
11272 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
11273
11274         * ecore.cs (StandardConversionExists): Sync with the conversion
11275         code: allow anything-* to void* conversions.
11276
11277         (FindMostSpecificSource): Use an Expression argument
11278         instead of a Type, because we might be handed over a Literal which
11279         gets a few more implicit conversions that plain types do not.  So
11280         this information was being lost.
11281
11282         Also, we drop the temporary type-holder expression when not
11283         required.
11284
11285 2002-09-17  Martin Baulig  <martin@gnome.org>
11286
11287         * class.cs (PropertyBase.CheckBase): Don't check the base class if
11288         this is an explicit interface implementation.
11289
11290 2002-09-17  Martin Baulig  <martin@gnome.org>
11291
11292         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
11293         different `IndexerName' attributes.
11294
11295         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
11296         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
11297         virtual CommonResolve().
11298
11299 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
11300
11301         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
11302         and convert that to the UnderlyingType.
11303
11304         * statement.cs (Foreach.Resolve): Indexers are just like variables
11305         or PropertyAccesses.
11306
11307         * cs-tokenizer.cs (consume_string): Track line numbers and columns
11308         inside quoted strings, we were not doing this before.
11309
11310 2002-09-16  Martin Baulig  <martin@gnome.org>
11311
11312         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
11313         resolve it.  This is needed for the definite assignment check of the
11314         instance expression, fixes bug #29846.
11315         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
11316
11317 2002-09-16  Nick Drochak  <ndrochak@gol.com>
11318
11319         * parameter.cs: Fix compile error.  Cannot reference static member
11320         from an instance object.  Is this an mcs bug?
11321
11322 2002-09-14  Martin Baulig  <martin@gnome.org>
11323
11324         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
11325         multiple times.  Fixes bug #30295, added test-166.cs.
11326
11327 2002-09-14  Martin Baulig  <martin@gnome.org>
11328
11329         * statement.cs (Block.Emit): Don't emit unreachable code.
11330         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
11331         `break' statements.
11332         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
11333
11334 2002-09-14  Martin Baulig  <martin@gnome.org>
11335
11336         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
11337         is set.
11338
11339 2002-09-14  Martin Baulig  <martin@gnome.org>
11340
11341         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
11342         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
11343         be false on the ms runtime.
11344
11345 2002-09-13  Martin Baulig  <martin@gnome.org>
11346
11347         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
11348         the CS0038 error message.
11349
11350 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
11351
11352         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
11353         constant inside, return it.
11354
11355 2002-09-12  Martin Baulig  <martin@gnome.org>
11356
11357         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
11358         implicit conversion can be done between enum types.
11359
11360         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
11361         check whether an implicit conversion to the current enum's UnderlyingType
11362         exists and report an error if not.
11363
11364         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
11365         without debugging support.
11366
11367         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
11368         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
11369
11370 2002-09-12  Martin Baulig  <martin@gnome.org>
11371
11372         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
11373
11374         * ecore.cs (IMemberExpr.DeclaringType): New property.
11375         (SimpleName.SimpleNameResolve): Check whether we're accessing a
11376         nonstatic member of an outer type (CS0038).
11377
11378 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
11379
11380         * driver.cs: Activate the using-error detector at warning level
11381         4 (at least for MS-compatible APIs).
11382
11383         * namespace.cs (VerifyUsing): Small buglett fix.
11384
11385         * pending.cs (PendingImplementation): pass the container pointer. 
11386
11387         * interface.cs (GetMethods): Allow for recursive definition.  Long
11388         term, I would like to move every type to support recursive
11389         definitions, not the current ordering mechanism that we have right
11390         now.
11391
11392         The situation is this: Attributes are handled before interfaces,
11393         so we can apply attributes to interfaces.  But some attributes
11394         implement interfaces, we will now handle the simple cases
11395         (recursive definitions will just get an error).  
11396
11397         * parameter.cs: Only invalidate types at the end if we fail to
11398         lookup all types.  
11399
11400 2002-09-09  Martin Baulig  <martin@gnome.org>
11401
11402         * ecore.cs (PropertyExpr.Emit): Also check for
11403         TypeManager.system_int_array_get_length so this'll also work when
11404         compiling corlib.  Fixes #30003.
11405
11406 2002-09-09  Martin Baulig  <martin@gnome.org>
11407
11408         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
11409         and throw an exception if we can't get the type's size.  Fixed #30040,
11410         added test-165.cs.
11411
11412 2002-09-09  Martin Baulig  <martin@gnome.org>
11413
11414         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
11415
11416         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
11417         context.  Fixes bug #30027.
11418
11419         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
11420         virtual functions.  Fixes bug #30043, added test-164.cs.
11421
11422 2002-09-08  Ravi Pratap  <ravi@ximian.com>
11423
11424         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
11425
11426 2002-09-08  Nick Drochak  <ndrochak@gol.com>
11427
11428         * driver.cs: Use an object to get the windows codepage since it's not a
11429         static property.
11430
11431 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
11432
11433         * statement.cs (For.Emit): for infinite loops (test == null)
11434         return whether there is a break inside, not always "true".
11435
11436         * namespace.cs (UsingEntry): New struct to hold the name of the
11437         using definition, the location where it is defined, and whether it
11438         has been used in a successful type lookup.
11439
11440         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
11441         strings.
11442
11443         * decl.cs: ditto.
11444
11445 2002-09-06  Ravi Pratap  <ravi@ximian.com>
11446
11447         * attribute.cs : Fix incorrect code which relied on catching
11448         a NullReferenceException to detect a null being passed in
11449         where an object was expected.
11450
11451 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
11452
11453         * statement.cs (Try): flag the catch variable as assigned
11454
11455         * expression.cs (Cast): Simplified by using ResolveType instead of
11456         manually resolving.
11457
11458         * statement.cs (Catch): Fix bug by using ResolveType.
11459
11460 2002-09-06  Ravi Pratap  <ravi@ximian.com>
11461
11462         * expression.cs (BetterConversion): Special case for when we have
11463         a NullLiteral as the argument and we have to choose between string
11464         and object types - we choose string the way csc does.
11465
11466         * attribute.cs (Attribute.Resolve): Catch the
11467         NullReferenceException and report error #182 since the Mono
11468         runtime no more has the bug and having this exception raised means
11469         we tried to select a constructor which takes an object and is
11470         passed a null.
11471
11472 2002-09-05  Ravi Pratap  <ravi@ximian.com>
11473
11474         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
11475         message (1502, 1503) when we can't locate a method after overload
11476         resolution. This is much more informative and closes the bug
11477         Miguel reported.
11478
11479         * interface.cs (PopulateMethod): Return if there are no argument
11480         types. Fixes a NullReferenceException bug.
11481
11482         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
11483         expressions too. Previously we were checking only in one place for
11484         positional arguments leaving out named arguments.
11485
11486         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
11487         type to the enum type is not allowed. Remove code corresponding to
11488         that.
11489
11490         (ConvertNumericExplicit): Allow explicit conversions from
11491         the underlying type to enum type. This precisely follows the spec
11492         and closes a bug filed by Gonzalo.
11493
11494 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11495
11496         * compiler.csproj:
11497         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
11498
11499 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
11500
11501         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
11502         it was important that we stored the right value after the
11503         reduction in `converted'.
11504
11505 2002-09-04  Martin Baulig  <martin@gnome.org>
11506
11507         * location.cs (Location.SymbolDocument): Use full pathnames for the
11508         source files.
11509
11510 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
11511
11512         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
11513         of the expression resolve mechanism, because that will catch the
11514         SimpleName error failures.
11515
11516         (Conditional): If we can not resolve the
11517         expression, return, do not crash.
11518
11519 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11520
11521         * cs-tokenizer.cs:
11522         (location): display token name instead of its number.
11523
11524 2002-08-28  Martin Baulig  <martin@gnome.org>
11525
11526         * expression.cs (Binary.ResolveOperator): Don't silently return
11527         but return an error if an operator cannot be applied between two
11528         enum types.
11529
11530 2002-08-28  Martin Baulig  <martin@gnome.org>
11531
11532         * class.cs (Constructor.Define): Set the permission attributes
11533         correctly instead of making all constructors public.
11534
11535 2002-08-28  Martin Baulig  <martin@gnome.org>
11536
11537         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
11538         for private members before reporting a CS0103; if we find anything,
11539         it's a CS0122.
11540
11541 2002-08-28  Martin Baulig  <martin@gnome.org>
11542
11543         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
11544         to check whether `closure_start_type == closure_invocation_type',
11545         we also need to check whether `m.DeclaringType == closure_invocation_type'
11546         before bypassing the permission checks.  We might be accessing
11547         protected/private members from the base class.
11548         (TypeManager.RealMemberLookup): Only set private_ok if private
11549         members were requested via BindingFlags.NonPublic.
11550
11551         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
11552
11553         * expression.cs (MemberAccess.ResolveMemberAccess): Set
11554         MethodGroupExpr.IsExplicitImpl if appropriate.
11555         (Invocation.DoResolve): Don't report the CS0120 for explicit
11556         interface implementations.
11557
11558 2002-08-27  Martin Baulig  <martin@gnome.org>
11559
11560         * expression.cs (Invocation.DoResolve): If this is a static
11561         method and we don't have an InstanceExpression, we must report
11562         a CS0120.
11563
11564 2002-08-25  Martin Baulig  <martin@gnome.org>
11565
11566         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
11567         `==' between a valuetype and an object.
11568
11569 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
11570
11571         * ecore.cs (TypeExpr): Provide a ToString method.
11572
11573 2002-08-24  Martin Baulig  <martin@gnome.org>
11574
11575         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
11576         now called proggie.dbg and it's a binary file.
11577
11578 2002-08-23  Martin Baulig  <martin@gnome.org>
11579
11580         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
11581
11582 2002-08-23  Martin Baulig  <martin@gnome.org>
11583
11584         * struct.cs (MyStructInfo.ctor): Make this work with empty
11585         structs; it's not allowed to use foreach() on null.
11586
11587 2002-08-23  Martin Baulig  <martin@gnome.org>
11588
11589         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
11590         writer the full pathname of the generated assembly.
11591
11592 2002-08-23  Martin Baulig  <martin@gnome.org>
11593
11594         * statements.cs (FlowBranching.UsageVector.MergeChildren):
11595         A `finally' block never returns or breaks; improved handling of
11596         unreachable code.
11597
11598 2002-08-23  Martin Baulig  <martin@gnome.org>
11599
11600         * statement.cs (Throw.Resolve): Allow `throw null'.
11601
11602 2002-08-23  Martin Baulig  <martin@gnome.org>
11603
11604         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
11605         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
11606         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
11607         MemberLookup would return a wrong event if this is an explicit
11608         interface implementation and the class has an event with the same
11609         name.
11610
11611 2002-08-23  Martin Baulig  <martin@gnome.org>
11612
11613         * statement.cs (Block.AddChildVariableNames): New public method.
11614         (Block.AddChildVariableName): Likewise.
11615         (Block.IsVariableNameUsedInChildBlock): Likewise.
11616         (Block.AddVariable): Check whether a variable name has already
11617         been used in a child block.
11618
11619         * cs-parser.jay (declare_local_variables): Mark all variable names
11620         from the current block as being used in a child block in the
11621         implicit block.
11622
11623 2002-08-23  Martin Baulig  <martin@gnome.org>
11624
11625         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
11626         find the symbol writer.
11627
11628         * driver.cs: csc also allows the arguments to /define being
11629         separated by commas, not only by semicolons.
11630
11631 2002-08-23  Martin Baulig  <martin@gnome.org>
11632
11633         * interface.cs (Interface.GetMembers): Added static check for events.
11634
11635 2002-08-15  Martin Baulig  <martin@gnome.org>
11636
11637         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
11638         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
11639
11640         * ecore.cs (Expression.MemberLookup): Added documentation and explained
11641         why the MethodData.EmitDestructor() change was necessary.
11642
11643 2002-08-20  Martin Baulig  <martin@gnome.org>
11644
11645         * class.cs (TypeContainer.FindMembers): Added static check for events.
11646
11647         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
11648
11649         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
11650         use Type.GetEvents(), not Type.FindMembers().
11651
11652 2002-08-20  Martin Baulig  <martin@gnome.org>
11653
11654         * decl.cs (MemberCache): Added a special method cache which will
11655         be used for method-only searched.  This ensures that a method
11656         search will return a MethodInfo with the correct ReflectedType for
11657         inherited methods.      
11658
11659 2002-08-20  Martin Baulig  <martin@gnome.org>
11660
11661         * decl.cs (DeclSpace.FindMembers): Made this public.
11662
11663 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11664
11665         * delegate.cs: fixed build on windows.
11666         [FIXME:  Filed as bug #29150: MCS must report these errors.]
11667
11668 2002-08-19  Ravi Pratap  <ravi@ximian.com>
11669
11670         * ecore.cs (StandardConversionExists): Return a false
11671         if we are trying to convert the void type to anything else
11672         since that is not allowed.
11673
11674         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
11675         we flag error 70 in the event an event is trying to be accessed
11676         directly from outside the declaring type.
11677
11678 2002-08-20  Martin Baulig  <martin@gnome.org>
11679
11680         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
11681         MemberCache from typemanager.cs to decl.cs.
11682
11683 2002-08-19  Martin Baulig  <martin@gnome.org>
11684
11685         * class.cs (TypeContainer): Implement IMemberContainer.
11686         (TypeContainer.DefineMembers): Create the MemberCache.
11687         (TypeContainer.FindMembers): Do better BindingFlags checking; only
11688         return public members if BindingFlags.Public was given, check
11689         whether members are static.
11690
11691 2002-08-16  Martin Baulig  <martin@gnome.org>
11692
11693         * decl.cs (DeclSpace.Define): Splitted this in Define and
11694         DefineMembers.  DefineMembers is called first and initializes the
11695         MemberCache.
11696
11697         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
11698         DefineMembers() on all our DeclSpaces.
11699
11700         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
11701         but call DefineMembers() on all nested interfaces.  We call their
11702         Define() in our new Define() function.
11703
11704         * interface.cs (Interface): Implement IMemberContainer.
11705         (Interface.Define): Moved all code except the attribute stuf to
11706         DefineMembers().
11707         (Interface.DefineMembers): Initialize the member cache.
11708
11709         * typemanager.cs (IMemberFinder): Removed this interface, we don't
11710         need this anymore since we can use MemberCache.FindMembers directly.
11711
11712 2002-08-19  Martin Baulig  <martin@gnome.org>
11713
11714         * typemanager.cs (MemberCache): When creating the cache for an
11715         interface type, add all inherited members.
11716         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
11717         to `out bool used_cache' and documented it.
11718         (TypeManager.MemberLookup): If we already used the cache in the first
11719         iteration, we don't need to do the interfaces check.
11720
11721 2002-08-19  Martin Baulig  <martin@gnome.org>
11722
11723         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
11724         here from IMemberFinder and don't implement this interface anymore.
11725         (DeclSpace.MemberCache): Moved here from IMemberFinder.
11726
11727         * typemanager.cs (IMemberFinder): This interface is now only used by
11728         classes which actually support the member cache.
11729         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
11730         since we only put DeclSpaces into this Hashtable.
11731         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
11732         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
11733
11734 2002-08-16  Martin Baulig  <martin@gnome.org>
11735
11736         * typemanager.cs (ICachingMemberFinder): Removed.
11737         (IMemberFinder.MemberCache): New property.
11738         (TypeManager.FindMembers): Merged this with RealFindMembers().
11739         This function will never be called from TypeManager.MemberLookup()
11740         so we can't use the cache here, just the IMemberFinder.
11741         (TypeManager.MemberLookup_FindMembers): Check whether the
11742         IMemberFinder has a MemberCache and call the cache's FindMembers
11743         function.
11744         (MemberCache): Rewrote larger parts of this yet another time and
11745         cleaned it up a bit.
11746
11747 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
11748
11749         * driver.cs (LoadArgs): Support quoting.
11750
11751         (Usage): Show the CSC-like command line arguments.
11752
11753         Improved a few error messages.
11754
11755 2002-08-15  Martin Baulig  <martin@gnome.org>
11756
11757         * typemanager.cs (IMemberContainer.Type): New property.
11758         (IMemberContainer.IsInterface): New property.
11759
11760         The following changes are conditional to BROKEN_RUNTIME, which is
11761         defined at the top of the file.
11762
11763         * typemanager.cs (MemberCache.MemberCache): Don't add the base
11764         class'es members, but add all members from TypeHandle.ObjectType
11765         if we're an interface.
11766         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
11767         is the current type.
11768         (MemberCache.CacheEntry.Container): Removed this field.
11769         (TypeHandle.GetMembers): Include inherited members.
11770
11771 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11772
11773         * typemanager.cs: fixed compilation and added a comment on a field that
11774         is never used.
11775
11776 2002-08-15  Martin Baulig  <martin@gnome.org>
11777
11778         * class.cs (ConstructorInitializer.Resolve): In the
11779         Expression.MemberLookup call, use the queried_type as
11780         invocation_type.
11781
11782         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
11783         declared' attribute, it's always true.
11784         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
11785         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
11786         temporary wrapper for FindMembers which tells MemberLookup whether
11787         members from the base classes are included in the return value.
11788         This will go away soon.
11789         (TypeManager.MemberLookup): Use this temporary hack here; once the
11790         new MemberCache is completed, we don't need to do the DeclaredOnly
11791         looping here anymore since the MemberCache will take care of this.
11792         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
11793         (MemberCache): When creating the MemberCache for a class, get
11794         members from the current class and all its base classes.
11795         (MemberCache.CacheEntry.Container): New field.  This is a
11796         temporary hack until the Mono runtime is fixed to distinguish
11797         between ReflectedType and DeclaringType.  It allows us to use MCS
11798         with both the MS runtime and the unfixed Mono runtime without
11799         problems and without accecting performance.
11800         (MemberCache.SearchMembers): The DeclaredOnly looping from
11801         TypeManager.MemberLookup is now done here.      
11802
11803 2002-08-14  Martin Baulig  <martin@gnome.org>
11804
11805         * statement.cs (MyStructInfo.MyStructInfo): Don't call
11806         Type.GetFields on dynamic types but get the fields from the
11807         corresponding TypeContainer.
11808         (MyStructInfo.GetStructInfo): Added check for enum types.
11809
11810         * typemanager.cs (MemberList.IsSynchronized): Implemented.
11811         (MemberList.SyncRoot): Implemented.
11812         (TypeManager.FilterWithClosure): No need to check permissions if
11813         closure_start_type == closure_invocation_type, don't crash if
11814         closure_invocation_type is null.
11815
11816 2002-08-13  Martin Baulig  <martin@gnome.org>
11817
11818         Rewrote TypeContainer.FindMembers to use a member cache.  This
11819         gives us a speed increase of about 35% for the self-hosting MCS
11820         build and of about 15-20% for the class libs (both on GNU/Linux).
11821
11822         * report.cs (Timer): New class to get enhanced profiling.  This
11823         whole class is "TIMER" conditional since it remarkably slows down
11824         compilation speed.
11825
11826         * class.cs (MemberList): New class.  This is an IList wrapper
11827         which we're now using instead of passing MemberInfo[]'s around to
11828         avoid copying this array unnecessarily.
11829         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
11830         (ICachingMemberFinder, IMemberContainer): New interface.
11831         (TypeManager.FilterWithClosure): If `criteria' is null, the name
11832         has already been checked, otherwise use it for the name comparision.
11833         (TypeManager.FindMembers): Renamed to RealMemberFinder and
11834         provided wrapper which tries to use ICachingMemberFinder.FindMembers
11835         if possible.  Returns a MemberList, not a MemberInfo [].
11836         (TypeHandle): New class, implements IMemberContainer.  We create
11837         one instance of this class per type, it contains a MemberCache
11838         which is used to do the member lookups.
11839         (MemberCache): New class.  Each instance of this class contains
11840         all members of a type and a name-based hash table.
11841         (MemberCache.FindMembers): This is our new member lookup
11842         function.  First, it looks up all members of the requested name in
11843         the hash table.  Then, it walks this list and sorts out all
11844         applicable members and returns them.
11845
11846 2002-08-13  Martin Baulig  <martin@gnome.org>
11847
11848         In addition to a nice code cleanup, this gives us a performance
11849         increase of about 1.4% on GNU/Linux - not much, but it's already
11850         half a second for the self-hosting MCS compilation.
11851
11852         * typemanager.cs (IMemberFinder): New interface.  It is used by
11853         TypeManager.FindMembers to call FindMembers on a TypeContainer,
11854         Enum, Delegate or Interface.
11855         (TypeManager.finder_to_member_finder): New PtrHashtable.
11856         (TypeManager.finder_to_container): Removed.
11857         (TypeManager.finder_to_delegate): Removed.
11858         (TypeManager.finder_to_interface): Removed.
11859         (TypeManager.finder_to_enum): Removed.
11860
11861         * interface.cs (Interface): Implement IMemberFinder.
11862
11863         * delegate.cs (Delegate): Implement IMemberFinder.
11864
11865         * enum.cs (Enum): Implement IMemberFinder.
11866
11867         * class.cs (TypeContainer): Implement IMemberFinder.
11868
11869 2002-08-12  Martin Baulig  <martin@gnome.org>
11870
11871         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
11872
11873 2002-08-12  Martin Baulig  <martin@gnome.org>
11874
11875         * ecore.cs (ITypeExpression): New interface for expressions which
11876         resolve to a type.
11877         (TypeExpression): Renamed to TypeLookupExpression.
11878         (Expression.DoResolve): If we're doing a types-only lookup, the
11879         expression must implement the ITypeExpression interface and we
11880         call DoResolveType() on it.
11881         (SimpleName): Implement the new ITypeExpression interface.
11882         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
11883         hack, the situation that we're only looking up types can't happen
11884         anymore when this method is called.  Moved the type lookup code to
11885         DoResolveType() and call it.
11886         (SimpleName.DoResolveType): This ITypeExpression interface method
11887         is now doing the types-only lookup.
11888         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
11889         (ResolveFlags): Added MaskExprClass.
11890
11891         * expression.cs (MemberAccess): Implement the ITypeExpression
11892         interface.
11893         (MemberAccess.DoResolve): Added support for a types-only lookup
11894         when we're called via ITypeExpression.DoResolveType().
11895         (ComposedCast): Implement the ITypeExpression interface.
11896
11897         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
11898         Expression.Resolve() with ResolveFlags.Type instead.
11899
11900 2002-08-12  Martin Baulig  <martin@gnome.org>
11901
11902         * interface.cs (Interface.Define): Apply attributes.
11903
11904         * attribute.cs (Attribute.ApplyAttributes): Added support for
11905         interface attributes.
11906
11907 2002-08-11  Martin Baulig  <martin@gnome.org>
11908
11909         * statement.cs (Block.Emit): Only check the "this" variable if we
11910         do not always throw an exception.
11911
11912         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
11913         whether the property has a set accessor.
11914
11915 2002-08-11  Martin Baulig  <martin@gnome.org>
11916
11917         Added control flow analysis support for structs.
11918
11919         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
11920         with control flow analysis turned off.
11921         (IVariable): New interface.
11922         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
11923         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
11924         (FieldExpr.DoResolve): Resolve the instance expression with flow
11925         analysis turned off and do the definite assignment check after the
11926         resolving when we know what the expression will resolve to.
11927
11928         * expression.cs (LocalVariableReference, ParameterReference):
11929         Implement the new IVariable interface, only call the flow analysis
11930         code if ec.DoFlowAnalysis is true.
11931         (This): Added constructor which takes a Block argument.  Implement
11932         the new IVariable interface.
11933         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
11934         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
11935         This does the definite assignment checks for struct members.
11936
11937         * class.cs (Constructor.Emit): If this is a non-static `struct'
11938         constructor which doesn't have any initializer, call
11939         Block.AddThisVariable() to tell the flow analysis code that all
11940         struct elements must be initialized before control returns from
11941         the constructor.
11942
11943         * statement.cs (MyStructInfo): New public class.
11944         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
11945         argument to this indexer.  If non-zero, check an individual struct
11946         member, not the whole struct.
11947         (FlowBranching.CheckOutParameters): Check struct members.
11948         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
11949         overloaded versions of these methods which take an additional
11950         `int field_idx' argument to check struct members.
11951         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
11952         overloaded versions of these methods which take an additional
11953         `string field_name' argument to check struct member.s
11954         (VariableInfo): Implement the IVariable interface.
11955         (VariableInfo.StructInfo): New public property.  Returns the
11956         MyStructInfo instance of the variable if it's a struct or null.
11957         (Block.AddThisVariable): New public method.  This is called from
11958         Constructor.Emit() for non-static `struct' constructor which do
11959         not have any initializer.  It creates a special variable for the
11960         "this" instance variable which will be checked by the flow
11961         analysis code to ensure that all of the struct's fields are
11962         initialized before control returns from the constructor.
11963         (UsageVector): Added support for struct members.  If a
11964         variable/parameter is a struct with N members, we reserve a slot
11965         in the usage vector for each member.  A struct is considered fully
11966         initialized if either the struct itself (slot 0) or all its
11967         members are initialized.
11968
11969 2002-08-08  Martin Baulig  <martin@gnome.org>
11970
11971         * driver.cs (Driver.MainDriver): Only report an error CS5001
11972         if there were no compilation errors.
11973
11974         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
11975         `UnsafeContext' property to determine whether the parent is in
11976         unsafe context rather than checking the parent's ModFlags:
11977         classes nested in an unsafe class are unsafe as well.
11978
11979 2002-08-08  Martin Baulig  <martin@gnome.org>
11980
11981         * statement.cs (UsageVector.MergeChildren): Distinguish between
11982         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
11983         we return.  Added test17() and test18() to test-154.cs.
11984
11985 2002-08-08  Martin Baulig  <martin@gnome.org>
11986
11987         * typemanager.cs (TypeManager.FilterWithClosure): If we have
11988         Family access, make sure the invoking type isn't a subclass of the
11989         queried type (that'd be a CS1540).
11990
11991         * ecore.cs (Expression.MemberLookup): Added overloaded version of
11992         this method which takes an additional `Type invocation_type'.
11993
11994         * expression.cs (BaseAccess.DoResolve): Use the base type as
11995         invocation and query type.
11996         (MemberAccess.DoResolve): If the lookup failed and we're about to
11997         report a CS0122, try a lookup with the ec.ContainerType - if this
11998         succeeds, we must report a CS1540.
11999
12000 2002-08-08  Martin Baulig  <martin@gnome.org>
12001
12002         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
12003         (MethodGroupExpr): Implement the IMemberExpr interface.
12004
12005         * expression (MemberAccess.ResolveMemberAccess): No need to have
12006         any special code for MethodGroupExprs anymore, they're now
12007         IMemberExprs.   
12008
12009 2002-08-08  Martin Baulig  <martin@gnome.org>
12010
12011         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
12012         Family, FamANDAssem and FamORAssem permissions.
12013         (TypeManager.IsSubclassOrNestedChildOf): New public method.
12014
12015 2002-08-08  Martin Baulig  <martin@gnome.org>
12016
12017         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
12018         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
12019         or loop block.
12020
12021 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
12022
12023         * driver.cs: implemented /resource option to embed managed resources.
12024
12025 2002-08-07  Martin Baulig  <martin@gnome.org>
12026
12027         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
12028         (FieldBase.HasFieldInitializer): New public property.
12029         (FieldBase.GetInitializerExpression): New public method.  Resolves and
12030         returns the field initializer and makes sure it is only resolved once.
12031         (TypeContainer.EmitFieldInitializers): Call
12032         FieldBase.GetInitializerExpression to get the initializer, this ensures
12033         that it isn't resolved multiple times.
12034
12035         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
12036         the resolving process (SimpleName/MemberLookup) that we're currently
12037         emitting a field initializer (which must not access any instance members,
12038         this is an error CS0236).
12039
12040         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
12041         argument, if the `IsFieldInitializer' flag is set, we must report and
12042         error CS0236 and not an error CS0120.   
12043
12044 2002-08-07  Martin Baulig  <martin@gnome.org>
12045
12046         * ecore.cs (IMemberExpr): New public interface.
12047         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
12048         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
12049         if the expression is an IMemberExpr.
12050
12051         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
12052         to be null, implicitly default to `this' if we're non-static in
12053         this case.  Simplified the code a lot by using the new IMemberExpr
12054         interface.  Also fixed bug #28176 here.
12055
12056 2002-08-06  Martin Baulig  <martin@gnome.org>
12057
12058         * cs-parser.jay (SimpleLookup): Removed.  We need to create
12059         ParameterReferences during semantic analysis so that we can do a
12060         type-only search when resolving Cast, TypeOf and SizeOf.
12061         (block): Pass the `current_local_parameters' to the Block's
12062         constructor.
12063
12064         * class.cs (ConstructorInitializer): Added `Parameters parameters'
12065         argument to the constructor.
12066         (ConstructorInitializer.Resolve): Create a temporary implicit
12067         block with the parameters.
12068
12069         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
12070         references here if we aren't doing a type-only search.
12071
12072         * statement.cs (Block): Added constructor which takes a
12073         `Parameters parameters' argument.
12074         (Block.Parameters): New public property.
12075
12076         * support.cs (InternalParameters.Parameters): Renamed `parameters'
12077         to `Parameters' and made it public readonly.
12078
12079 2002-08-06  Martin Baulig  <martin@gnome.org>
12080
12081         * ecore.cs (Expression.Warning): Made this public as well.
12082
12083         * report.cs (Report.Debug): Print the contents of collections.
12084
12085 2002-08-06  Martin Baulig  <martin@gnome.org>
12086
12087         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
12088         used to tell Resolve() which kinds of expressions it may return.
12089         (Expression.Resolve): Added overloaded version of this method which
12090         takes a `ResolveFlags flags' argument.  This can be used to tell
12091         Resolve() which kinds of expressions it may return.  Reports a
12092         CS0118 on error.
12093         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
12094         ResolveFlags.SimpleName.
12095         (Expression.Error118): Added overloaded version of this method which
12096         takes a `ResolveFlags flags' argument.  It uses the flags to determine
12097         which kinds of expressions are allowed.
12098
12099         * expression.cs (Argument.ResolveMethodGroup): New public method.
12100         Resolves an argument, but allows a MethodGroup to be returned.
12101         This is used when invoking a delegate.
12102
12103         * TODO: Updated a bit.
12104
12105 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12106
12107         Fixed compilation with csc.
12108
12109         * ecore.cs: Expression.Error made public. Is this correct? Should
12110         Warning be made public too?
12111
12112         * expression.cs: use ea.Location instead of ea.loc.
12113         [FIXME:  Filed as bug #28607: MCS must report these errors.]
12114
12115 2002-08-06  Martin Baulig  <martin@gnome.org>
12116
12117         * ecore.cs (Expression.loc): Moved the location here instead of
12118         duplicating it in all derived classes.
12119         (Expression.Location): New public property.
12120         (Expression.Error, Expression.Warning): Made them non-static and
12121         removed the location argument.
12122         (Expression.Warning): Added overloaded version which takes an
12123         `int level' argument.
12124         (Expression.Error118): Make this non-static and removed the
12125         expression and location arguments.
12126         (TypeExpr): Added location argument to the constructor.
12127
12128         * expression.cs (StaticCallExpr): Added location argument to
12129         the constructor.
12130         (Indirection, PointerArithmetic): Likewise.
12131         (CheckedExpr, UnCheckedExpr): Likewise.
12132         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
12133         (StringPtr): Likewise.
12134
12135
12136 2002-08-05  Martin Baulig  <martin@gnome.org>
12137
12138         * expression.cs (BaseAccess.DoResolve): Actually report errors.
12139
12140         * assign.cs (Assign.DoResolve): Check whether the source
12141         expression is a value or variable.
12142
12143         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
12144         while resolving the corresponding blocks.
12145
12146         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
12147         an error, don't silently return null.
12148
12149         * statement.cs (Block.AddVariable): Do the error reporting here
12150         and distinguish between CS0128 and CS0136.
12151         (Block.DoResolve): Report all unused labels (warning CS0164).
12152         (LabeledStatement): Pass the location to the constructor.
12153         (LabeledStatement.HasBeenReferenced): New property.
12154         (LabeledStatement.Resolve): Set it to true here.
12155
12156         * statement.cs (Return.Emit): Return success even after reporting
12157         a type mismatch error (CS0126 or CS0127), this is what csc does and
12158         it avoids confusing the users with any consecutive errors.
12159
12160 2002-08-05  Martin Baulig  <martin@gnome.org>
12161
12162         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
12163
12164         * const.cs (Const.LookupConstantValue): Catch circular definitions.
12165
12166         * expression.cs (MemberAccess.DoResolve): Silently return if an
12167         error has already been reported.
12168
12169         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
12170         error has already been reported.
12171
12172 2002-08-05  Martin Baulig  <martin@gnome.org>
12173
12174         * statement.cs (UsageVector): Only initialize the `parameters'
12175         vector if we actually have any "out" parameters.
12176
12177 2002-08-05  Martin Baulig  <martin@gnome.org>
12178
12179         * expression.cs (Binary.ResolveOperator): When combining delegates,
12180         they must have the same type.
12181
12182 2002-08-05  Martin Baulig  <martin@gnome.org>
12183
12184         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
12185         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
12186         work with the ms runtime and we also don't need it: if we're a
12187         PropertyBuilder and not in the `indexer_arguments' hash, then we
12188         are a property and not an indexer.
12189
12190         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
12191         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
12192         since the latter one doesn't work with the ms runtime.
12193
12194 2002-08-03  Martin Baulig  <martin@gnome.org>
12195
12196         Fixed bugs #27998 and #22735.
12197
12198         * class.cs (Method.IsOperator): New public field.
12199         (Method.CheckBase): Report CS0111 if there's already a method
12200         with the same parameters in the current class.  Report CS0508 when
12201         attempting to change the return type of an inherited method.
12202         (MethodData.Emit): Report CS0179 if a method doesn't have a body
12203         and it's not marked abstract or extern.
12204         (PropertyBase): New abstract base class for Property and Indexer.
12205         (PropertyBase.CheckBase): Moved here from Property and made it work
12206         for indexers.
12207         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
12208         the same so we can reuse it there.
12209         (Property, Indexer): Derive from PropertyBase.
12210         (MethodSignature.inheritable_property_signature_filter): New delegate
12211         to find properties and indexers.
12212
12213         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
12214         argument and improved error reporting.
12215
12216         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
12217         EmptyReadOnlyParameters and made it a property.
12218
12219         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
12220         version of this method which takes a `PropertyInfo indexer'.
12221         (TypeManager.RegisterIndexer): New method.
12222
12223         * class.cs: Added myself as author of this file :-)
12224
12225 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12226
12227         * class.cs: fixed compilation on windoze.
12228
12229 2002-08-03  Martin Baulig  <martin@gnome.org>
12230
12231         * interface.cs (Interface.GetInterfaceBases): Check whether all
12232         base interfaces are at least as accessible than the current one.
12233
12234         * class.cs (TypeContainer.GetClassBases): Check whether base types
12235         are at least as accessible than the current type.
12236         (TypeContainer.AsAccessible): Implemented and made non-static.
12237         (MemberBase.CheckParameters): Report errors if the accessibility
12238         checks fail.
12239
12240         * delegate.cs (Delegate.Delegate): The default visibility is
12241         internal for top-level types and private for nested types.
12242         (Delegate.Define): Report errors if the accessibility checks fail.
12243
12244         * enum.cs (Enum.Enum): The default visibility is internal for
12245         top-level types and private for nested types.
12246         (Enum.DefineType): Compute the correct visibility.
12247
12248         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
12249         function which takes a `bool is_toplevel' instead of a TypeContainer.
12250
12251         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
12252         builtin type.
12253
12254 2002-08-02  Martin Baulig  <martin@gnome.org>
12255
12256         * expression.cs (LocalVariableReferenc): Added constructor which
12257         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
12258         (LocalVariableReference.IsReadOnly): New property.
12259         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
12260         variable is readonly, use our own readonly flag to do this; you can
12261         use the new constructor to get a writable reference to a read-only
12262         variable.
12263
12264         * cs-parser.jay (foreach_statement, using_statement): Get a writable
12265         reference to the local variable.
12266
12267 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
12268
12269         * rootcontext.cs (ResolveCore): Also include System.Exception
12270
12271         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
12272         we reach an EmptyStatement.
12273
12274         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
12275         is also fine.
12276
12277         * expression.cs (Binary.ResolveOperator): Check error result in
12278         two places.
12279
12280         use brtrue/brfalse directly and avoid compares to null.
12281
12282 2002-08-02  Martin Baulig  <martin@gnome.org>
12283
12284         * class.cs (TypeContainer.Define): Define all nested interfaces here.
12285         Fixes bug #28407, added test-155.cs.
12286
12287 2002-08-01  Martin Baulig  <martin@gnome.org>
12288
12289         * class.cs (Event.EmitDefaultMethod): Make this work with static
12290         events.  Fixes #28311, added verify-3.cs.
12291
12292 2002-08-01  Martin Baulig  <martin@gnome.org>
12293
12294         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
12295         `is_disposable' fields.
12296         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
12297         `hm.is_disposable' if we're using the collection pattern.
12298         (Foreach.EmitCollectionForeach): Use the correct type for the
12299         enumerator's local variable, only emit the try/finally block if
12300         necessary (fixes #27713).
12301
12302 2002-08-01  Martin Baulig  <martin@gnome.org>
12303
12304         * ecore.cs (Expression.report118): Renamed to Error118 and made
12305         it public static.
12306
12307         * statement.cs (Throw.Resolve): Check whether the expression is of
12308         the correct type (CS0118) and whether the type derives from
12309         System.Exception (CS0155).
12310         (Catch.Resolve): New method.  Do the type lookup here and check
12311         whether it derives from System.Exception (CS0155).
12312         (Catch.CatchType, Catch.IsGeneral): New public properties.
12313
12314         * typemanager.cs (TypeManager.exception_type): Added.
12315
12316 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
12317
12318         * driver.cs: Updated About function.
12319
12320 2002-07-31  Martin Baulig  <martin@gnome.org>
12321
12322         Implemented Control Flow Analysis.
12323
12324         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
12325         (EmitContext.CurrentBranching): Added.
12326         (EmitContext.StartFlowBranching): Added.
12327         (EmitContext.EndFlowBranching): Added.
12328         (EmitContext.KillFlowBranching): Added.
12329         (EmitContext.IsVariableAssigned): Added.
12330         (EmitContext.SetVariableAssigned): Added.
12331         (EmitContext.IsParameterAssigned): Added.
12332         (EmitContext.SetParameterAssigned): Added.
12333         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
12334         Added control flow analysis stuff here.
12335
12336         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
12337         resolve the expression as lvalue.
12338         (LocalVariableReference.DoResolve): Check whether the variable has
12339         already been assigned.
12340         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
12341         the parameter as assigned here.
12342         (ParameterReference.DoResolve): Check whether the parameter has already
12343         been assigned.
12344         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
12345         expression as lvalue.
12346
12347         * statement.cs (FlowBranching): New class for the flow analysis code.
12348         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
12349         (LabeledStatement.IsDefined): New public property.
12350         (LabeledStatement.AddUsageVector): New public method to tell flow
12351         analyis that the label may be reached via a forward jump.
12352         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
12353         flow analysis.
12354         (VariableInfo.Number): New public field.  This is used by flow analysis
12355         to number all locals of a block.
12356         (Block.CountVariables): New public property.  This is the number of
12357         local variables in this block (including the locals from all parent
12358         blocks).
12359         (Block.EmitMeta): Number all the variables.
12360
12361         * statement.cs: Added flow analysis support to all classes.
12362
12363 2002-07-31  Martin Baulig  <martin@gnome.org>
12364
12365         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
12366         To get debugging messages, compile mcs with /define:MCS_DEBUG and
12367         then use this argument.
12368
12369         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
12370
12371         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
12372         use this to specify /define options.
12373
12374 2002-07-29  Martin Baulig  <martin@gnome.org>
12375
12376         * statement.cs (Fixed): Moved all code that does variable lookups
12377         and resolvings from Emit to Resolve.
12378
12379         * statement.cs (For): Moved all code that does variable lookups
12380         and resolvings from Emit to Resolve.
12381
12382         * statement.cs (Using): Moved all code that does variable lookups
12383         and resolvings from Emit to Resolve.
12384
12385 2002-07-29  Martin Baulig  <martin@gnome.org>
12386
12387         * attribute.cs (Attribute.Resolve): Explicitly catch a
12388         System.NullReferenceException when creating the
12389         CustromAttributeBuilder and report a different warning message.
12390
12391 2002-07-29  Martin Baulig  <martin@gnome.org>
12392
12393         * support.cs (ParameterData.ParameterName): Added method to
12394         get the name of a parameter.
12395
12396         * typemanager.cs (TypeManager.IsValueType): New public method.
12397
12398 2002-07-29  Martin Baulig  <martin@gnome.org>
12399
12400         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
12401         is a flag which specifies that it's either ref or out.
12402         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
12403         the out parameter to `out Parameter.Modifier mod', also set the
12404         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
12405
12406         * support.cs (InternalParameters.ParameterModifier): Distinguish
12407         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
12408         Parameter.Modifier.ISBYREF flag if it's either ref or out.
12409
12410         * expression.cs (Argument.GetParameterModifier): Distinguish
12411         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
12412         Parameter.Modifier.ISBYREF flag if it's either ref or out.
12413
12414 2002-07-29  Martin Baulig  <martin@gnome.org>
12415
12416         * expression.cs (ParameterReference.ParameterReference): Added
12417         `Location loc' argument to the constructor.
12418
12419         * cs-parser.jay: Pass location to ParameterReference.
12420
12421 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
12422
12423         * statement.cs (Try): Initialize the location.
12424
12425         * cs-parser.jay: pass location to Try.
12426
12427         * expression.cs (Unary.Reduce): Change the prototype to return
12428         whether a constant fold could be performed or not.  The result is
12429         returned in an out parameters.  In the case of Indirection and
12430         AddressOf, we want to perform the full tests.
12431
12432 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
12433
12434         * statement.cs (Statement.Emit): Flag dead code.
12435
12436 2002-07-27  Andrew Birkett  <andy@nobugs.org>
12437
12438         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
12439
12440 2002-07-27  Martin Baulig  <martin@gnome.org>
12441
12442         * class.cs (MethodData.Define): Put back call to
12443         TypeManager.AddMethod(), accidentally commented this out.
12444
12445         * report.cs (Debug): New public method to print debugging information,
12446         this is `[Conditional ("DEBUG")]'.
12447
12448 2002-07-26  Martin Baulig  <martin@gnome.org>
12449
12450         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
12451         (switch_statement): Push the current_block to the switch_stack and
12452         pop it again when we're done with the switch.
12453         (switch_section): The new block is a child of the current_block.
12454         Fixes bug #24007, added test-152.cs.
12455
12456 2002-07-27  Martin Baulig  <martin@gnome.org>
12457
12458         * expression.cs (Invocation.EmitArguments): When calling a varargs
12459         function with only its fixed arguments, we need to pass an empty
12460         array.
12461
12462 2002-07-27  Martin Baulig  <martin@gnome.org>
12463
12464         Mono 0.13 has been released.
12465
12466 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
12467
12468         * driver.cs: Rename --resource to --linkres, because that is what
12469         we do currently, we dont support --resource yet.
12470
12471         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
12472
12473 2002-07-25  Martin Baulig  <martin@gnome.org>
12474
12475         * class.cs (MethodData): New public class.  This is a `method builder'
12476         class for a method or one accessor of a Property/Indexer/Event.
12477         (MethodData.GetMethodFlags): Moved here from MemberBase.
12478         (MethodData.ApplyAttributes): Likewise.
12479         (MethodData.ApplyObsoleteAttribute): Likewise.
12480         (MethodData.ApplyConditionalAttribute): Likewise.
12481         (MethodData.ApplyDllImportAttribute): Likewise.
12482         (MethodData.CheckAbstractAndExternal): Likewise.
12483         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
12484         (MethodData.Emit): Formerly known as Method.Emit().
12485         (MemberBase): Moved everything which was specific to a single
12486         accessor/method to MethodData.
12487         (Method): Create a new MethodData and call Define() and Emit() on it.
12488         (Property, Indexer, Event): Create a new MethodData objects for each
12489         accessor and call Define() and Emit() on them.
12490
12491 2002-07-25  Martin Baulig  <martin@gnome.org>
12492
12493         Made MethodCore derive from MemberBase to reuse the code from there.
12494         MemberBase now also checks for attributes.
12495
12496         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
12497         (MemberBase.GetMethodFlags): Moved here from class Method and marked
12498         as virtual.
12499         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
12500         `CallingConventions cc' and `Attributes opt_attrs' arguments.
12501         (MemberBase.ApplyAttributes): New virtual method; applies the
12502         attributes to a method or accessor.
12503         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
12504         (MemberBase.ApplyConditionalAttribute): Likewise.
12505         (MemberBase.ApplyDllImportAttribute): Likewise.
12506         (MemberBase.CheckAbstractAndExternal): Likewise.
12507         (MethodCore.ParameterTypes): This is now a property instead of a
12508         method, it's initialized from DoDefineParameters().
12509         (MethodCore.ParameterInfo): Removed the set accessor.
12510         (MethodCore.DoDefineParameters): New protected virtual method to
12511         initialize ParameterTypes and ParameterInfo.
12512         (Method.GetReturnType): We can now simply return the MemberType.
12513         (Method.GetMethodFlags): Override the MemberBase version and add
12514         the conditional flags.
12515         (Method.CheckBase): Moved some code from Define() here, call
12516         DoDefineParameters() here.
12517         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
12518         here to avoid some larger code duplication.
12519         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
12520         ensure that abstract and external accessors don't declare a body.
12521
12522         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
12523         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
12524         lookup in the attribute's parent classes, so we need to abort as soon
12525         as we found the first match.
12526         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
12527         the attribute has no arguments.
12528
12529         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
12530         of a Method.
12531
12532 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12533
12534         * cs-parser.jay: reverted previous patch.
12535
12536 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12537
12538         * cs-parser.jay: fixed bug #22119.
12539
12540 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12541
12542         * attribute.cs: fixed compilation. The error was:
12543         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
12544         be assigned to before control leaves the current method."
12545         [FIXME:  Filed as bug #28186: MCS must report this error.]
12546
12547 2002-07-25  Martin Baulig  <martin@gnome.org>
12548
12549         * attribute.cs (Attribute.Conditional_GetConditionName): New static
12550         method to pull the condition name ouf of a Conditional attribute.
12551         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
12552         the obsolete message and error flag out of an Obsolete attribute.
12553
12554         * class.cs (Method.GetMethodFlags): New public method to get the
12555         TypeManager.MethodFlags for this method.
12556         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
12557         private methods.
12558         (Method.Define): Get and apply the Obsolete and Conditional attributes;
12559         if we're overriding a virtual function, set the new private variable
12560         `parent_method'; call the new TypeManager.AddMethod().
12561
12562         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
12563         the MethodBuilder and the Method in a PtrHashtable.
12564         (TypeManager.builder_to_method): Added for this purpose.
12565         (TypeManager.MethodFlags): Added IsObsoleteError.
12566         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
12567         Obsolete and Conditional arguments in MethodBuilders.  If we discover
12568         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
12569         the message from the attribute.
12570
12571 2002-07-24  Martin Baulig  <martin@gnome.org>
12572
12573         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
12574         preprocessor directives, ensure that the argument to #define/#undef is
12575         exactly one identifier and that it's actually an identifier.
12576
12577         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
12578         did not work ....
12579
12580 2002-07-24  Martin Baulig  <martin@gnome.org>
12581
12582         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
12583         initialize it to TypeManager.object_type in the constructor.
12584         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
12585         of the `hm.get_current' method if we're using the collection pattern.
12586         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
12587         for the explicit conversion to make it work when we're using the collection
12588         pattern and the `Current' property has a different return type than `object'.
12589         Fixes #27713.
12590
12591 2002-07-24  Martin Baulig  <martin@gnome.org>
12592
12593         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
12594         does not match, but don't report any errors.  This method is called in
12595         order for all methods in a MethodGroupExpr until a matching method is
12596         found, so we don't want to bail out if the first method doesn't match.
12597         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
12598         matches, report the 123.  Fixes #28070.
12599
12600 2002-07-24  Martin Baulig  <martin@gnome.org>
12601
12602         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
12603         TypeManager.TypeToCoreType() to the top of the method so the
12604         following equality checks will work.  Fixes #28107.
12605
12606 2002-07-24  Martin Baulig  <martin@gnome.org>
12607
12608         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
12609         operand is of type uint, and the other operand is of type sbyte,
12610         short or int, the operands are converted to type long." -
12611         Actually do what this comment already told us.  Fixes bug #28106,
12612         added test-150.cs.
12613
12614 2002-07-24  Martin Baulig  <martin@gnome.org>
12615
12616         * class.cs (MethodBase): New abstract class.  This is now a base
12617         class for Property, Indexer and Event to avoid some code duplication
12618         in their Define() and DefineMethods() methods.
12619         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
12620         generic methods for Define() and DefineMethods().
12621         (FieldBase): Derive from MemberBase, not MemberCore.
12622         (Property): Derive from MemberBase, not MemberCore.
12623         (Property.DefineMethod): Moved all the code from this method to the
12624         new MethodBase.DefineAccessor(), just call it with appropriate
12625         argumetnts.
12626         (Property.Define): Call the new Property.DoDefine(), this does some
12627         sanity checks and we don't need to duplicate the code everywhere.
12628         (Event): Derive from MemberBase, not MemberCore.
12629         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
12630         accessors, this will also make them work with interface events.
12631         (Indexer): Derive from MemberBase, not MemberCore.
12632         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
12633         (Indexer.Define): Use the new MethodBase functions.
12634
12635         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
12636         argument to the constructor.
12637         (Interface.FindMembers): Added support for interface events.
12638         (Interface.PopluateEvent): Implemented.
12639
12640         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
12641
12642 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
12643
12644         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
12645         but this is required to check for a method name being the same as
12646         the containing class.  
12647
12648         Handle this now.
12649
12650 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12651
12652         * interface.cs: initialize variable.
12653
12654 2002-07-23  Martin Baulig  <martin@gnome.org>
12655
12656         Implemented the IndexerName attribute in interfaces.
12657
12658         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
12659         name if this is an explicit interface implementation.
12660         (Indexer.InterfaceIndexerName): New public variable.  If we're
12661         implementing an interface indexer, this is the IndexerName in that
12662         interface.  Otherwise, it's the IndexerName.
12663         (Indexer.DefineMethod): If we're implementing interface indexer,
12664         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
12665         and Pending.ImplementIndexer methods.
12666         (Indexer.Define): Also define the PropertyBuilder if we're
12667         implementing an interface indexer and this is neither an explicit
12668         interface implementation nor do the IndexerName match the one in
12669         the interface.
12670
12671         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
12672         If a method is defined here, then we always need to create a proxy
12673         for it.  This is used when implementing interface indexers.
12674         (Pending.IsInterfaceIndexer): New public method.
12675         (Pending.ImplementIndexer): New public method.
12676         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
12677         This is used when implementing interface indexers to define a proxy
12678         if necessary.
12679         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
12680         define a proxy if necessary.
12681
12682         * interface.cs (Interface.IndexerName): New public variable.
12683         (Interface.PopulateIndexer): Set the IndexerName.
12684         (Interface.DefineIndexers): New private method.  Populate all the
12685         indexers and make sure their IndexerNames match.
12686
12687         * typemanager.cs (IndexerPropertyName): Added support for interface
12688         indexers.
12689
12690 2002-07-22  Martin Baulig  <martin@gnome.org>
12691
12692         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
12693         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
12694         ret if HasReturnLabel.
12695         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
12696         variables.
12697
12698         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
12699         and set the ec.LoopBeginTryCatchLevel.
12700         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
12701         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
12702         the current ec.TryCatchLevel, the branch goes out of an exception
12703         block.  In this case, we need to use Leave and not Br.
12704
12705 2002-07-22  Martin Baulig  <martin@gnome.org>
12706
12707         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
12708         block unless the block does not always return or it is contained in
12709         another try { ... } catch { ... } block.  Fixes bug #26506.
12710         Added verify-1.cs to the test suite.
12711
12712 2002-07-22  Martin Baulig  <martin@gnome.org>
12713
12714         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
12715         then we do not always return.  Fixes bug #24985.
12716
12717 2002-07-22  Martin Baulig  <martin@gnome.org>
12718
12719         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
12720         lookup on a per-class level; ie. walk up the class hierarchy until we
12721         found at least one applicable method, then choose the best among them.
12722         Fixes bug #24463 and test-29.cs.
12723
12724 2002-07-22  Martin Baulig  <martin@gnome.org>
12725
12726         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
12727         return types of the methods.  The return type is not part of the
12728         signature and we must not check it to make the `new' modifier work.
12729         Fixes bug #27999, also added test-147.cs.
12730         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
12731
12732         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
12733         on the method's return type.
12734
12735 2002-07-21  Martin Baulig  <martin@gnome.org>
12736
12737         * assign.cs: Make this work if the rightmost source is a constant and
12738         we need to do an implicit type conversion.  Also adding a few more tests
12739         to test-38.cs which should have caught this.
12740
12741         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
12742         target in the makefile for this.  The makefile.gnu is primarily intended
12743         for end-users who don't want to debug the compiler.
12744
12745 2002-07-21  Martin Baulig  <martin@gnome.org>
12746
12747         * assign.cs: Improved the Assign class so it can now handle embedded
12748         assignments (X = Y = Z = something).  As a side-effect this'll now also
12749         consume less local variables.  test-38.cs now passes with MCS, added
12750         a few new test cases to that test.
12751
12752 2002-07-20  Martin Baulig  <martin@gnome.org>
12753
12754         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
12755         instructions.  Fixes bug #27977, also added test-146.cs.
12756
12757 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12758
12759         * cs-tokenizer.cs: fixed getHex ().
12760
12761 2002-07-19  Martin Baulig  <martin@gnome.org>
12762
12763         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
12764         not Type.GetType() to lookup the array type.  This is needed when
12765         we're constructing an array of a user-defined type.
12766         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
12767         single-dimensional arrays, but also for single-dimensial arrays of
12768         type decimal.
12769
12770 2002-07-19  Martin Baulig  <martin@gnome.org>
12771
12772         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
12773         this function is called, it's not allowed to share LocalBuilders
12774         among ILGenerators.
12775
12776 2002-07-19  Martin Baulig  <martin@gnome.org>
12777
12778         * expression.cs (Argument.Resolve): Report an error 118 when trying
12779         to pass a type as argument.
12780
12781 2002-07-18  Martin Baulig  <martin@gnome.org>
12782
12783         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
12784         Conv_R_Un for the signed `long' type.
12785
12786 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
12787
12788         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
12789         `expr' for the temporary result, as that will fail if we do
12790         multiple resolves on the same expression.
12791
12792 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
12793
12794         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
12795         ec.TypeContainer for looking up aliases. 
12796
12797         * class.cs (TypeContainer): Remove LookupAlias from here.
12798
12799         * decl.cs (DeclSpace); Move here.
12800
12801 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
12802
12803         * class.cs (FindMembers): Only call filter if the constructor
12804         bulider is not null.
12805
12806         Also handle delegates in `NestedTypes' now.  Now we will perform
12807         type lookups using the standard resolution process.  This also
12808         fixes a bug.
12809
12810         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
12811         This uses Expressions (the limited kind that can be parsed by the
12812         tree) instead of strings.
12813
12814         * expression.cs (ComposedCast.ToString): Implement, used to flag
12815         errors since now we have to render expressions.
12816
12817         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
12818         FormArrayType. 
12819
12820         * ecore.cs (SimpleName.ToString): ditto.
12821
12822         * cs-parser.jay: Instead of using strings to assemble types, use
12823         Expressions to assemble the type (using SimpleName, ComposedCast,
12824         MemberAccess).  This should fix the type lookups in declarations,
12825         because we were using a different code path for this.
12826
12827         * statement.cs (Block.Resolve): Continue processing statements
12828         even when there is an error.
12829
12830 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
12831
12832         * class.cs (Event.Define): Also remove the `remove' method from
12833         the list of pending items.
12834
12835         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
12836         generate more compact code. 
12837
12838 2002-07-17  Martin Baulig  <martin@gnome.org>
12839
12840         * const.cs (Const.LookupConstantValue): Add support for constant
12841         `unchecked' and `checked' expressions.
12842         Also adding test case test-140.cs for this.
12843
12844 2002-07-17  Martin Baulig  <martin@gnome.org>
12845
12846         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
12847         check whether mi.ReturnType implements the IEnumerator interface; the
12848         `==' and the IsAssignableFrom() will fail in this situation.
12849
12850 2002-07-16  Ravi Pratap  <ravi@ximian.com>
12851
12852         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
12853         here too.
12854
12855 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
12856
12857         * expression.cs: fixed bug #27811.
12858
12859 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
12860
12861         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
12862         Molaro: when we are a ref, the value already contains a pointer
12863         value, do not take the address of it.
12864
12865 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
12866         * removed mb-parser.jay and mb-tokenizer.cs
12867
12868 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
12869
12870         * expression.cs: check against the building corlib void type.
12871
12872 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
12873
12874         * ecore.cs: fix for valuetype static readonly fields: when 
12875         initializing them, we need their address, not the address of a copy.
12876
12877 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
12878
12879         * typemanager.cs: register also enum_type in corlib.
12880
12881 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
12882
12883         * class.cs: allow calling this (but not base) initializers in structs.
12884
12885 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
12886
12887         * ecore.cs: make sure we compare against the building base types
12888         in GetTypeSize ().
12889
12890 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
12891
12892         * typemanager.cs: fix TypeToCoreType() to handle void and object
12893         (corlib gets no more typerefs after this change).
12894
12895 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
12896
12897         * expression.cs (ArrayCreation.EmitArrayArguments): use
12898         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
12899
12900         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
12901         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
12902         array indexes, the runtime actually forbids them.
12903
12904         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
12905         for array arguments here.
12906
12907         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
12908         instead of the default for ValueTypes.
12909
12910         (New.DoEmit): Use IsValueType instead of
12911         IsSubclassOf (value_type)
12912         (New.DoResolve): ditto.
12913         (Invocation.EmitCall): ditto.
12914
12915         * assign.cs (Assign): ditto.
12916
12917         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
12918         Statements *are* currently doing part of their resolution during
12919         Emit.  
12920
12921         Expressions do always resolve during resolve, but statements are
12922         only required to propagate resolution to their children.
12923
12924 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
12925
12926         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
12927
12928         (LoadAssembly): Do not add the dll if it is already specified
12929
12930         (MainDriver): Add the System directory to the link path at the end,
12931         after all the other -L arguments. 
12932
12933         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
12934         wrong opcode for loading bytes and bools (ldelem.i1 instead of
12935         ldelem.u1) and using the opposite for sbytes.
12936
12937         This fixes Digger, and we can finally run it.
12938
12939         * driver.cs (UnixParseOption): Move the option parsing here.  
12940         (CSCParseOption): Implement CSC-like parsing of options.
12941
12942         We now support both modes of operation, the old Unix way, and the
12943         new CSC-like way.  This should help those who wanted to make cross
12944         platform makefiles.
12945
12946         The only thing broken is that /r:, /reference: and /lib: are not
12947         implemented, because I want to make those have the same semantics
12948         as the CSC compiler has, and kill once and for all the confussion
12949         around this.   Will be doing this tomorrow.
12950
12951         * statement.cs (Unsafe.Resolve): The state is checked during
12952         resolve, not emit, so we have to set the flags for IsUnsfe here.
12953
12954 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12955
12956         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
12957         not catch the Error_ObjectRefRequired in SimpleName (as it is
12958         possible to have a class/instance variable name that later gets
12959         deambiguated), we have to check this here.      
12960
12961 2002-07-10  Ravi Pratap  <ravi@ximian.com>
12962
12963         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
12964         make static and put into Expression.
12965
12966         (Event.Define): Register the private field of the event with the 
12967         TypeManager so that GetFieldFromEvent can get at it.
12968
12969         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
12970         keep track of the private field associated with an event which
12971         has no accessors.
12972
12973         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
12974         private field.
12975
12976         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
12977
12978 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
12979
12980         * expression.cs (Binary.EmitBranchable): this routine emits the
12981         Binary expression in a branchable context.  This basically means:
12982         we need to branch somewhere, not just get the value on the stack.
12983
12984         This works together with Statement.EmitBoolExpression.
12985
12986         * statement.cs (Statement.EmitBoolExpression): Use
12987         EmitBranchable. 
12988
12989 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
12990
12991         * statement.cs (For): Reduce the number of jumps in loops.
12992
12993         (For): Implement loop inversion for the For statement.
12994
12995         (Break): We can be breaking out of a Try/Catch controlled section
12996         (foreach might have an implicit try/catch clause), so we need to
12997         use Leave instead of Br.
12998
12999         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
13000         now).  If the instace expression supports IMemoryLocation, we use
13001         the AddressOf method from the IMemoryLocation to extract the
13002         address instead of emitting the instance.
13003
13004         This showed up with `This', as we were emitting the instance
13005         always (Emit) instead of the Address of This.  Particularly
13006         interesting when This is a value type, as we dont want the Emit
13007         effect (which was to load the object).
13008
13009 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
13010
13011         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
13012
13013         * statement.cs (Checked): Set the CheckedState during the resolve
13014         process too, as the ConvCast operations track the checked state on
13015         the resolve process, and not emit.
13016
13017         * cs-parser.jay (namespace_member_declaration): Flag that we have
13018         found a declaration when we do.  This is used to flag error 1529
13019
13020         * driver.cs: Report ok when we display the help only.
13021
13022 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
13023
13024         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
13025
13026 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
13027
13028         * cs-tokenizer.cs (define): We also have to track locally the
13029         defines.  AllDefines is just used for the Conditional Attribute,
13030         but we also need the local defines for the current source code. 
13031
13032 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
13033
13034         * statement.cs (While, For, Do): These loops can exit through a
13035         Break statement, use this information to tell whether the
13036         statement is the last piece of code.
13037
13038         (Break): Flag that we break.
13039
13040         * codegen.cs (EmitContexts): New `Breaks' state variable.
13041
13042 2002-07-03  Martin Baulig  <martin@gnome.org>
13043
13044         * class.cs (TypeContainer.MethodModifiersValid): Allow override
13045         modifiers in method declarations in structs.  Otherwise, you won't
13046         be able to override things like Object.Equals().
13047
13048 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
13049
13050         * class.cs (Method, Property, Indexer): Do not allow the public
13051         modifier to be used in explicit interface implementations.
13052
13053         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
13054         override modifiers in method declarations in structs
13055
13056 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
13057
13058         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
13059         integer or real overflow, report an error
13060
13061 2002-07-02  Martin Baulig  <martin@gnome.org>
13062
13063         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
13064         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
13065         to tell the runtime about our newly created System.Object and
13066         System.ValueType types.
13067
13068 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
13069
13070         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
13071         struct instead of Ldarg/Starg.
13072
13073 2002-07-02  Martin Baulig  <martin@gnome.org>
13074
13075         * expression.cs (Indirection.Indirection): Call
13076         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
13077
13078 2002-07-02  Martin Baulig  <martin@gnome.org>
13079
13080         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
13081         ValueType, call TypeManager.TypeToCoreType() on it.
13082         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
13083         the OpCodes.Newarr argument.
13084
13085 2002-07-02  Martin Baulig  <martin@gnome.org>
13086
13087         * expression.cs (Invocation.EmitCall): When compiling corlib,
13088         replace all calls to the system's System.Array type to calls to
13089         the newly created one.
13090
13091         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
13092         System.Array methods.
13093         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
13094         from the system's System.Array type which must be replaced.
13095
13096 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
13097
13098         * typemanager.cs: load unverifiable_code_ctor so we can build
13099         corlib using the correct type. Avoid using GetTypeCode() with
13100         TypeBuilders.
13101         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
13102         TypeManager.object_type to allow building corlib.
13103
13104 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
13105
13106         * ecore.cs: handle System.Enum separately in LoadFromPtr().
13107
13108 2002-07-01  Martin Baulig  <martin@gnome.org>
13109
13110         * class.cs: Make the last change actually work, we need to check
13111         whether `ifaces != null' to avoid a crash.
13112
13113 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
13114
13115         * class.cs: when we build structs without fields that implement
13116         interfaces, we need to add the interfaces separately, since there is
13117         no API to both set the size and add the interfaces at type creation
13118         time.
13119
13120 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
13121
13122         * expression.cs: the dimension arguments to the array constructors
13123         need to be converted if they are a long.
13124
13125 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
13126
13127         * class.cs: don't emit ldarg.0 if there is no parent constructor
13128         (fixes showstopper for corlib).
13129
13130 2002-06-29  Martin Baulig  <martin@gnome.org>
13131
13132         MCS now compiles corlib on GNU/Linux :-)
13133
13134         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
13135         ie. check for MethodImplOptions.InternalCall.
13136
13137         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
13138         and TypeManager.attribute_type are null, so we must explicitly check
13139         whether parent is not null to find out whether it's an attribute type.
13140         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
13141         and SetBuilder, not only if the property is neither abstract nor external.
13142         This is necessary to set the MethodImplOptions on the accessor methods.
13143         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
13144         SetBuilder, see Property.Emit().
13145
13146         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
13147         populate "System.Object", "System.ValueType" and "System.Attribute" since
13148         they've already been populated from BootCorlib_PopulateCoreTypes().
13149
13150 2002-06-29  Martin Baulig  <martin@gnome.org>
13151
13152         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
13153         is the NullLiteral, we also need to make sure that target_type is not
13154         an enum type.   
13155
13156 2002-06-29  Martin Baulig  <martin@gnome.org>
13157
13158         * rootcontext.cs (RootContext.ResolveCore): We must initialize
13159         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
13160         before calling BootstrapCorlib_ResolveDelegate ().
13161
13162 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
13163
13164         * statement.cs: fixed build-breaker. All tests passed ok.
13165
13166 2002-06-27  Martin Baulig  <martin@gnome.org>
13167
13168         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
13169         for System.Decimal when compiling corlib.
13170
13171 2002-06-27  Martin Baulig  <martin@gnome.org>
13172
13173         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
13174         switch blocks which contain nothing but a default clause.
13175
13176 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
13177
13178        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
13179
13180 2002-06-27  Martin Baulig  <martin@gnome.org>
13181
13182         * ecore.cs (PropertyExpr.PropertyExpr): Call
13183         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
13184
13185         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
13186         is already a TypeBuilder.
13187
13188 2002-06-27  Martin Baulig  <martin@gnome.org>
13189
13190         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
13191         `target_type == TypeManager.array_type', not IsAssignableFrom() in
13192         the "from an array-type to System.Array" case.  This makes it work
13193         when compiling corlib.
13194
13195 2002-06-27  Martin Baulig  <martin@gnome.org>
13196
13197         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
13198         non-static PropertyExpr, set its InstanceExpression.  This makes
13199         the `ICollection.Count' property work in System/Array.cs.
13200
13201 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
13202
13203         * driver.cs: Made error handling more consistent.  Errors now
13204         tracked by Report class, so many methods which used to return int
13205         now return void.  Main() now prints success/failure and 
13206         errors/warnings message.
13207
13208         Renamed '--probe' compiler argument to '--expect-error'.  Removed
13209         the magic number return values (123 and 124).  Now, if the
13210         expected error occurs, the compiler exits with success (exit value
13211         0).  If the compilation completes without seeing that particular
13212         error, the compiler exits with failure (exit value 1).  The
13213         makefile in mcs/errors has been changed to handle the new behaviour.
13214
13215         * report.cs: Made 'expected error' number a property and renamed
13216         it from 'Probe' to 'ExpectedError'.
13217
13218         * genericparser.cs: Removed error handling support, since it is
13219         now all done by Report class.
13220
13221         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
13222         class, so parse() no longer returns an int.
13223
13224         * namespace.cs: Use Report.Error instead of GenericParser.error
13225
13226 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
13227
13228         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
13229         TypeContainer.AddOperator): At the front of the list put the
13230         explicit implementations, so they get resolved/defined first. 
13231
13232 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
13233
13234         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
13235         interface type is implemented by this TypeContainer.  Used during
13236         explicit interface implementation.
13237
13238         (Property.Define, Indexer.Define, Method.Define): Validate that
13239         the given interface in the explicit implementation is one of the
13240         base classes for the containing type.
13241
13242         Also if we are explicitly implementing an interface, but there is
13243         no match in the pending implementation table, report an error.
13244
13245         (Property.Define): Only define the property if we are
13246         not explicitly implementing a property from an interface.  Use the
13247         correct name also for those properties (the same CSC uses,
13248         although that is really not needed).
13249
13250         (Property.Emit): Do not emit attributes for explicitly implemented
13251         properties, as there is no TypeBuilder.
13252
13253         (Indexer.Emit): ditto.
13254
13255         Hiding then means that we do not really *implement* a pending
13256         implementation, which makes code fail.
13257
13258 2002-06-22  Martin Baulig  <martin@gnome.org>
13259
13260         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
13261         the return value of Object.GetType().  [FIXME: we need to do this whenever
13262         we get a type back from the reflection library].
13263
13264 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
13265
13266         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
13267
13268 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
13269
13270         * attribute.cs: Return null if we can not look up the type.
13271
13272         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
13273         the interface types found.
13274
13275         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
13276         interface types found.
13277
13278         * typemanager.cs (GetInterfaces): Make this routine returns alll
13279         the interfaces and work around the lame differences between
13280         System.Type and System.Reflection.Emit.TypeBuilder in the results
13281         result for GetInterfaces.
13282
13283         (ExpandInterfaces): Given an array of interface types, expand and
13284         eliminate repeated ocurrences of an interface.  This expands in
13285         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
13286         be IA, IB, IC.
13287
13288 2002-06-21  Martin Baulig  <martin@gnome.org>
13289
13290         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
13291         on System.Enum.
13292
13293 2002-06-21  Martin Baulig  <martin@gnome.org>
13294
13295         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
13296         and called with one of the core types, return the corresponding typebuilder for
13297         that type.
13298
13299         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
13300         element type.
13301
13302 2002-06-21  Martin Baulig  <martin@gnome.org>
13303
13304         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
13305         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
13306         (Expression.ConvertReferenceExplicit): Likewise.
13307
13308         * expression.cs (ElementAccess.DoResolve): Likewise.
13309         (ElementAccess.DoResolveLValue): Likewise.
13310
13311 2002-06-10  Martin Baulig  <martin@gnome.org>
13312
13313         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
13314         add the "value" parameter to the parameter list.
13315
13316         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
13317         to our caller.
13318
13319 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
13320
13321         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
13322         the argument to an int, uint, long or ulong, per the spec.  Also
13323         catch negative constants in array creation.
13324
13325 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
13326
13327         * class.cs: do not allow the same interface to appear twice in
13328         the definition list.
13329
13330 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
13331
13332         * ecore.cs: don't use ldlen with System.Array.
13333
13334 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
13335
13336         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
13337
13338 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
13339
13340         * modifiers.cs: produce correct field attributes for protected
13341         internal. Easy fix so miguel can work on ther harder stuff:-)
13342
13343 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
13344
13345         * pending.cs: New file.  Move the code from class.cs here.
13346         Support clearning the pending flag for all methods (when not doing
13347         explicit interface implementation).
13348
13349 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
13350
13351         * rootcontext.cs: added a couple more types needed to bootstrap.
13352
13353 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
13354
13355         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
13356         constructor in the type, instead of any constructor in the type
13357         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
13358         a bug in the Mono runtime when applying the params attribute). 
13359
13360 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
13361         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
13362
13363 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
13364
13365         * expression.cs (Unary.ResolveOperator): Use TypeManager
13366         to resolve the type.
13367
13368 2002-06-13  Ravi Pratap  <ravi@ximian.com>
13369
13370         * cs-parser.jay (enum_member_declaration): Pass in the attributes
13371         attached.
13372
13373         * enum.cs (AddEnumMember): Add support to store the attributes associated 
13374         with each member too.
13375
13376         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
13377         field builders too - this takes care of the enum member case.
13378
13379 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
13380
13381         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
13382         address-of operator on both value types and pointers.
13383
13384 2002-06-10  Martin Baulig  <martin@gnome.org>
13385
13386         * interface.cs (Interface.PopulateIndexer): Add the indexer's
13387         PropertyBuilder to the `property_builders' list.
13388
13389         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
13390         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
13391         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
13392         find any indexers which are inherited from an interface.
13393
13394 2002-06-09  Martin Baulig  <martin@gnome.org>
13395
13396         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
13397         the same type as the constant if necessary.  There's also a test-130.cs
13398         for this.
13399
13400         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
13401
13402         * typemanager.cs (TypeManager.ChangeType): Previously known as
13403         Enum.ChangeEnumType().
13404
13405 2002-06-09  Martin Baulig  <martin@gnome.org>
13406
13407         * expression.cs (Cast.TryReduce): Added support for consts.
13408
13409 2002-06-08  Ravi Pratap  <ravi@ximian.com>
13410
13411         * class.cs (Accessor): Hold attributes information so we can pass
13412         it along.
13413
13414         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
13415         Modify to pass in attributes attached to the methods.
13416
13417         (add_accessor_declaration, remove_accessor_declaration): Ditto.
13418
13419         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
13420         to handle the Accessor kind :-)
13421
13422         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
13423
13424 2002-06-08  Martin Baulig  <martin@gnome.org>
13425
13426         * expression.cs (Unary.TryReduceNegative): Added support for
13427         ULongConstants.
13428
13429 2002-06-08  Martin Baulig  <martin@gnome.org>
13430
13431         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
13432         name can't be found in the `defined_names' - the caller will do a
13433         MemberLookup in this case and thus find methods in System.Enum
13434         such as Enum.IsDefined().
13435
13436 2002-06-08  Martin Baulig  <martin@gnome.org>
13437
13438         * enum.cs (Enum.ChangeEnumType): This is a custom version of
13439         Convert.ChangeType() which works with TypeBuilder created types.
13440         (Enum.LookupEnumValue, Enum.Define): Use it here.
13441
13442         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
13443         `TypeBuilder.BaseType != null' check.
13444         (TypeContainer.FindMembers): Only lookup parent members if we
13445         actually have a parent.
13446         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
13447         (ConstructorInitializer.Resolve): Likewise.
13448
13449         * interface.cs (Interface.FindMembers): Added
13450         `TypeBuilder.BaseType != null' check.
13451
13452         * rootcontext.cs (RootContext.ResolveCore): Added
13453         "System.Runtime.CompilerServices.IndexerNameAttribute" to
13454         classes_second_stage.
13455
13456         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
13457         debug_type and trace_type when compiling with --nostdlib.       
13458
13459 2002-06-07  Martin Baulig  <martin@gnome.org>
13460
13461         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
13462         (AddField): Set it to true when adding a non-static field.
13463         (DefineType): Use `have_nonstatic_fields' to find out whether we
13464         have non-static fields, not `Fields != null'.
13465
13466 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
13467
13468         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
13469         dereferencing a null on the static-field code path)
13470
13471 2002-05-30  Martin Baulig  <martin@gnome.org>
13472
13473         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
13474         to take command line arguments.  Use reflection to call the new
13475         custom `Initialize' function on the symbol writer and pass it the
13476         command line arguments.
13477
13478         * driver.cs (--debug-args): New command line argument to pass command
13479         line arguments to the symbol writer.
13480
13481 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
13482
13483         * assign.cs (DoResolve): Forgot to do the implicit conversion to
13484         the target type for indexers and properties.  Thanks to Joe for
13485         catching this.
13486
13487 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
13488
13489         * typemanager.cs (MethodFlags): returns the method flags
13490         (Obsolete/ShouldIgnore) that control warning emission and whether
13491         the invocation should be made, or ignored. 
13492
13493         * expression.cs (Invocation.Emit): Remove previous hack, we should
13494         not do this on matching a base type, we should do this based on an attribute
13495
13496         Only emit calls to System.Diagnostics.Debug and
13497         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
13498         on the command line.
13499
13500         * rootcontext.cs: Global settings for tracing and debugging.
13501
13502         * cs-tokenizer.cs (define): New utility function to track
13503         defines.   Set the global settings for TRACE and DEBUG if found.
13504
13505 2002-05-25  Ravi Pratap  <ravi@ximian.com>
13506
13507         * interface.cs (Populate*): Pass in the TypeContainer as well as
13508         the DeclSpace as parameters so that we can create EmitContexts and
13509         then use that to apply attributes etc.
13510
13511         (PopulateMethod, PopulateEvent, PopulateProperty)
13512         (PopulateIndexer): Apply attributes everywhere.
13513
13514         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
13515         etc.
13516
13517         (ApplyAttributes): Update accordingly.
13518
13519         We now apply interface attributes for all members too.
13520
13521 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
13522
13523         * class.cs (Indexer.Define); Correctly check if we are explicit
13524         implementation (instead of checking the Name for a ".", we
13525         directly look up if the InterfaceType was specified).
13526
13527         Delay the creation of the PropertyBuilder.
13528
13529         Only create the PropertyBuilder if we are not an explicit
13530         interface implementation.   This means that explicit interface
13531         implementation members do not participate in regular function
13532         lookups, and hence fixes another major ambiguity problem in
13533         overload resolution (that was the visible effect).
13534
13535         (DefineMethod): Return whether we are doing an interface
13536         implementation. 
13537
13538         * typemanager.cs: Temporary hack until we get attributes in
13539         interfaces (Ravi is working on that) and we get IndexerName
13540         support in interfaces.
13541
13542         * interface.cs: Register the indexers as properties.
13543
13544         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
13545         warning, I have verified that this is a bug in the .NET runtime
13546         (JavaScript suffers of the same problem).
13547
13548         * typemanager.cs (MemberLookup): When looking up members for
13549         interfaces, the parent of an interface is the implicit
13550         System.Object (so we succeed in searches of Object methods in an
13551         interface method invocation.  Example:  IEnumerable x;  x.ToString
13552         ()) 
13553
13554 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
13555
13556         * class.cs (Event): Events should also register if they do
13557         implement the methods that an interface requires.
13558
13559         * typemanager.cs (MemberLookup); use the new GetInterfaces
13560         method. 
13561
13562         (GetInterfaces): The code used to lookup interfaces for a type is
13563         used in more than one place, factor it here. 
13564
13565         * driver.cs: Track the errors at the bottom of the file, we kept
13566         on going.
13567
13568         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
13569         instance if the method we are calling is static!
13570
13571 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
13572
13573         * attribute.cs (ApplyAttributes): Make this function filter out
13574         the IndexerName attribute (as that attribute in reality is never
13575         applied) and return the string constant for the IndexerName
13576         attribute. 
13577
13578         * class.cs (TypeContainer.Emit): Validate that all the indexers
13579         have the same IndexerName attribute, and if so, set the
13580         DefaultName attribute on the class. 
13581
13582         * typemanager.cs: The return value might contain other stuff (not
13583         only methods).  For instance, consider a method with an "Item"
13584         property and an Item method.
13585
13586         * class.cs: If there is a problem with the parameter types,
13587         return. 
13588
13589 2002-05-24  Ravi Pratap  <ravi@ximian.com>
13590
13591         * ecore.cs (ImplicitConversionExists): Wrapper function which also
13592         looks at user defined conversion after making a call to 
13593         StandardConversionExists - we need this for overload resolution.
13594
13595         * expression.cs : Update accordingly the various method calls.
13596
13597         This fixes 2 bugs filed against implicit user defined conversions 
13598
13599 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
13600
13601         * statement.cs: Track the result of the assignment.
13602
13603 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
13604
13605         * expression.cs (MemberAccess): Improved error reporting for
13606         inaccessible members.
13607
13608 2002-05-22  Martin Baulig  <martin@gnome.org>
13609
13610         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
13611         itself with debugging support.
13612
13613 2002-05-22  Martin Baulig  <martin@gnome.org>
13614
13615         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
13616         Removed, this isn't needed anymore.
13617
13618 2002-05-20  Martin Baulig  <martin@gnome.org>
13619
13620         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
13621         be underlying type for an enum.
13622
13623 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
13624
13625         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
13626         that splits out the loading of just the core types.
13627
13628         * rootcontext.cs (ResolveCore): Split the struct resolution in
13629         two, so we can load the enumeration underlying types before any
13630         enums are used.
13631
13632         * expression.cs (Is): Bandaid until we fix properly Switch (see
13633         bug #24985 for details).
13634
13635         * typemanager.cs (ImplementsInterface): The hashtable will contain
13636         a null if there are no interfaces implemented.
13637
13638 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
13639
13640         * cs-parser.jay (indexer_declarator): It is fine to have array
13641         parameters
13642
13643 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
13644
13645         * typemanager.cs: (RegisterBuilder): New function used to register
13646         TypeBuilders that implement interfaces.  Since
13647         TypeBuilder.GetInterfaces (as usual) does not work with lame
13648         Reflection.Emit. 
13649         (AddUserType): register interfaces.
13650
13651         (ImplementsInterface): Use the builder_to_ifaces hash if we are
13652         dealing with TypeBuilder.  Also, arrays are showing up as
13653         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
13654         methods can not be invoked on them!
13655
13656         * ecore.cs (ExplicitReferenceConversionExists): Made public.
13657         (ImplicitReferenceConversionExists): Split out from
13658         StandardConversionExists. 
13659
13660         * expression.cs (As): We were only implementing one of the three
13661         cases for the as operator.  We now implement them all.
13662         (Is): Implement the various other cases for Is as well.
13663
13664         * typemanager.cs (CACHE): New define used to control if we want or
13665         not the FindMembers cache.  Seems to have a negative impact on
13666         performance currently
13667
13668         (MemberLookup): Nested types have full acess to
13669         enclosing type members
13670
13671         Remove code that coped with instance/static returns for events, we
13672         now catch this in RealFindMembers.
13673
13674         (RealFindMembers): only perform static lookup if the instance
13675         lookup did not return a type or an event.  
13676
13677 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
13678
13679         * assign.cs (CompoundAssign): We pass more semantic information
13680         now to Compound Assignments than we did before: now we have all
13681         the information at hand, and now we resolve the target *before* we
13682         do the expression expansion, which allows the "CacheValue" method
13683         to have the effect we intended (before, a [x] += 1 would generate
13684         two differen ArrayAccess expressions from the ElementAccess,
13685         during the resolution process).
13686
13687         (CompoundAssign.DoResolve): Resolve target and original_source here.
13688
13689 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
13690
13691         * expression.cs (ArrayAccess): dropped debugging information. 
13692
13693         * typemanager.cs: Small bug fix: I was always returning i_members,
13694         instead of one of i_members or s_members (depending on which had
13695         the content).
13696
13697         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
13698         method is invoked before any code generation takes place, and it
13699         is a mechanism to inform that the expression will be invoked more
13700         than once, and that the method should use temporary values to
13701         avoid having side effects
13702
13703         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
13704
13705         * ecore.cs (Expression.CacheTemporaries): Provide empty default
13706         implementation.
13707
13708         * expression.cs (Indirection, ArrayAccess): Add support for
13709         CacheTemporaries in these two bad boys. 
13710
13711         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
13712         ldobj or ldind_ref.  
13713         (StoreFromPtr): Handle stobj as well.
13714
13715         * expression.cs (UnaryMutator): Share more code.
13716
13717         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
13718         down: I was not tracking the Filter function as well, which
13719         was affecting the results of the cache.
13720
13721 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
13722
13723         * attribute.cs: Remove the hack to handle the CharSet property on
13724         StructLayouts. 
13725
13726 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
13727
13728         * attribute.cs (DoResolve): More uglyness, we now only try to
13729         resolve the attribute partially, to extract the CharSet
13730         information (only if we are a StructLayout attribute).  Otherwise 
13731
13732         (GetExtraTypeInfo): Add some code to conditionally kill in the
13733         future this.   I am more and more convinced that the .NET
13734         framework has special code to handle the attribute setting on
13735         certain elements.
13736
13737         * expression.cs (IsParamsMethodApplicable): Revert my previous
13738         foreach change here, it was wrong.
13739
13740 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
13741
13742         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
13743         (pp_expr): do not abort on unknown input, just return.
13744         (eval): abort if there are pending chars.
13745
13746         * attribute.cs (Attribute.Resolve): Positional parameters are
13747         optional.  Deal with that case.
13748
13749         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
13750         the Ansi/Unicode/Auto information for the type.
13751
13752         (TypeContainer.DefineType): instantiate the EmitContext here, as
13753         we will be using it during the type definition (to resolve
13754         attributes) and during the emit phase.
13755
13756         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
13757         to pull type information out of the attributes
13758
13759         (Attribute.Resolve): track the constructor builder, and allow for
13760         multiple invocations (structs and classes will use this).
13761
13762         * ecore.cs (MemberLookupFinal): new version with all the
13763         parameters customizable.
13764
13765         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
13766         constructors.  Return if the result value is null (as the error
13767         would have been flagged already by MemberLookupFinal)
13768
13769         Do not allow instances of abstract classes or interfaces to be
13770         created.
13771
13772         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
13773         We have to compare the assembly property here when dealing with
13774         FamANDAssem and Assembly access modifiers, because we might be
13775         creating an assembly from *modules* (that means that we are not
13776         getting TypeBuilders for types defined in other modules that are
13777         part of this assembly).
13778
13779         (Method.Emit): If the method is marked abstract and has a body,
13780         emit an error. 
13781
13782         (TypeContainer.DefineMembers): If both the defined member and the
13783         parent name match are methods, then do not emit any warnings: let
13784         the Method.Define routine take care of flagging warnings.  But if
13785         there is a mismatch (method overrides something else, or method is
13786         overriwritten by something, then emit warning).
13787
13788         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
13789         set to null, this means `do not check for the return type on the
13790         signature'. 
13791
13792         (Method.Define): set the return type for the method signature to
13793         null, so that we get methods with the same name and parameters and
13794         different return types.  This is used to flag warning 114 (you are
13795         hiding a method, and you probably want to use the new/override
13796         keywords instead).
13797
13798         * typemanager.cs (MemberLookup): Implemented proper access
13799         control, closing a long standing set of bug reports.  The problem
13800         was that the Framework only has two bits: Public and NonPublic,
13801         and NonPublic includes private and protected methods, but we need
13802         to enforce the FamANDAssem, FamOrAssem and Family. 
13803
13804 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
13805
13806         * statement.cs (GotoCase): Return true: Ammounts to giving up
13807         knowledge on whether we return or not, and letting the other case
13808         be responsible for it.
13809
13810 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
13811
13812         * driver.cs: Do not load directories for each file processed, only
13813         do it if there is a pattern.
13814
13815         * ecore.cs: Report readonly assigns here as well, as we might have
13816         been resolved only by MemberAccess.
13817
13818         (SimpleName.SimpleNameResolve): Also be useful for LValue
13819         resolution.   We need this to propagate assign to local readonly variables
13820
13821         * typemanager.cs: Use a ptrhashtable for the criteria, because we
13822         do not want to reuse potential criteria memory.
13823
13824         * class.cs (MyEventBuilder): Set reflected_type;
13825
13826         * ecore.cs (Constantify): Added support for constifying bools.
13827
13828         (RootContext.LookupType): Added a cache for values looked up in
13829         the declaration space.
13830
13831         * typemanager.cs (FindMembers): Now is a front-end to
13832         RealFindMembers, and provides a two-level hashtable-based cache to
13833         the request.  
13834
13835         15% performance improvement: from 22.5 to 19.2 seconds.
13836
13837         * expression.cs (IsParamsMethodApplicable): use foreach.
13838         (Invocation.DoResolve): ditto.
13839         (New.DoResolve): ditto.
13840         (ArrayCreation.DoResolve): ditto.
13841
13842         * ecore.cs (FindMostEncompassingType): use foreach.
13843
13844         * delegate.cs (NewDelegate.DoResolve): Use foreach
13845
13846         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
13847         (RemoveMethods): use foreach.
13848
13849         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
13850         nested foreach statements instead of for, and also break out of
13851         the inner loop once a match is found.
13852
13853         (Invocation.OverloadResolve): Use foreach, simplify the code. 
13854
13855 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
13856
13857         * cfold.cs (BinaryFold): During an enumeration evaluation context,
13858         we actually unwrap the expression to allow for extra information
13859         to be extracted. 
13860
13861         * expression.cs: Use Shr_Un on unsigned operations. 
13862
13863 2002-05-08  Ravi Pratap  <ravi@ximian.com>
13864
13865         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
13866         applicable operators was not being considered correctly. This closes
13867         the bug Miguel reported.
13868
13869 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
13870
13871         * attribute.cs: check that the type derives from System.Attribute
13872         and report the correct error in that case (moved the duplicate code to
13873         its own method, too).
13874
13875 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
13876
13877         * attribute.cs: lookup attribute type name as the spec says: first the
13878         bare attribute name and then name + "Attribute" (nant compiles with
13879         mcs after this fix).
13880
13881 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
13882
13883         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
13884         Because of the way we parse things, we should try to see if a
13885         UIntConstant can fit in an integer.
13886
13887 2002-05-07  Ravi Pratap  <ravi@ximian.com>
13888
13889         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
13890         when we are in an explicit context.
13891
13892         (ConvertReferenceExplicit): When converting from Iface type S to Class
13893         T make sure the rules are implemented as an OR.
13894
13895         * parameter.cs (ParameterType): Make it a property for now although the
13896         purpose really isn't anything immediate.
13897
13898         * expression.cs (Is*Applicable): Do better checking on the parameter type
13899         of a ref/out parameter. The ones from the system assemblies are already 
13900         marked with the correct type so we don't need to do any correction.
13901
13902         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
13903         the object type is standard too so include that.
13904
13905 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13906
13907         * ecore.cs (StandardConversionExists): Augment with missing code:
13908         deal with IntConstant, LongConstants and Enumerations.
13909
13910         * assign.cs: Report the error, instead of failing silently
13911
13912         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
13913         typecontainer that they are declared, because the
13914         typecontainer/namespace will have the list of using clauses that
13915         need to be applied.
13916
13917         Assembly Attributes were escaping the normal registration
13918         mechanism. 
13919
13920         (EmitCode): Apply attributes within an EmitContext that represents
13921         the container they were declared on.
13922
13923         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
13924
13925 2002-05-06  Ravi Pratap  <ravi@ximian.com>
13926
13927         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
13928         Revamp completely - make much cleaner as we now operate only
13929         on a set of Types.
13930
13931         (FindMostSpecificSource, FindMostSpecificTarget): New methods
13932         to implement the logic detailed in the spec more correctly.
13933
13934         (UserDefinedConversion): Update accordingly.
13935
13936 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13937
13938         * statement.cs: Return flow analysis information up.
13939
13940         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
13941         and the default.
13942
13943         (token): Do not consume an extra character before calling
13944         decimal_digits.
13945
13946 2002-05-06  Piers Haken <piersh@friskit.com>
13947
13948         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
13949
13950 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
13951
13952         * class.cs (Constructor.Emit): Set the IsStatic flag in the
13953         EmitContext during the instance constructor initializer
13954         resolution, to stop access to instance variables.
13955
13956         This is mandated by the spec, last paragraph of the `constructor
13957         initializers' section. 
13958
13959 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
13960
13961         * cs-parser.jay, class.cs (Accessor): new class used to represent
13962         an accessor (get or set).  In the past we used `null' to represent
13963         a missing accessor.  But this is ambiguous because there was no
13964         way to tell in abstract indexers/properties if one of them was
13965         specified.
13966
13967         Now there is a way of addressing that.
13968
13969         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
13970         instead of FindMembers.
13971
13972         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
13973         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
13974
13975         * attribute.cs: Treat indexers and properties as the same in terms
13976         of applying attributes
13977
13978         * ecore.cs (FindMostEncompassedType): Use statically initialized
13979         EmptyExpressions()s like we do elsewhere to avoid creating useless
13980         objects (and we take this out of the tight loop).
13981
13982         (GetConversionOperators): Move the code to extract the actual
13983         operators to a separate routine to clean things up.
13984
13985 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
13986
13987         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
13988         events are always registered FieldBuilders.
13989
13990         * class.cs (FieldBase): New class shared by Fields 
13991
13992         * delegate.cs: If we are a toplevel delegate, use our full name.
13993         If we are a nested delegate, then only use our tail name.
13994
13995 2002-05-02  Ravi Pratap  <ravi@ximian.com>
13996
13997         * expression.cs (IsApplicable): Ensure that we add the "&" to
13998         ref/out types before comparing it with the type of the argument.
13999
14000         (IsParamsMethodApplicable): Ditto.
14001
14002         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
14003         silly me ;-)
14004
14005         * delegate.cs : Handle the case when we have more than one applicable
14006         method. Flag an error only when we finish checking all.
14007
14008 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
14009
14010         * expression.cs: Add support for boolean static initializers.
14011
14012 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
14013
14014         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
14015
14016         * parameter.cs (ComputeParameterTypes,
14017         ComputeAndDefineParameterTypes): Better error handling: now we
14018         clear the `types' cache if we fail during any of the type lookups.
14019         We also return the status code correctly to our caller
14020
14021         * delegate.cs: If we fail to define a delegate, abort the extra
14022         steps. 
14023
14024         * expression.cs (Binary.ResolveOperator): for
14025         operator==(object,object) and operator !=(object, object) we also
14026         have to verify that there is an implicit conversion from one to
14027         the other.
14028
14029         (ArrayAccess.DoResolve): Array Access can operate on
14030         non-variables. 
14031
14032 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
14033
14034         * assign.cs (CompoundAssign): A new class used as a "flag" that
14035         the assignment actually is happening as part of a compound
14036         assignment operator.
14037
14038         During compound assignment, a few new rules exist to enable things
14039         like:
14040
14041         byte b |= 1 + 2
14042
14043         From the spec:
14044
14045         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
14046         to the type of x) if y is implicitly convertible to the type of x,
14047         and the operator is a builtin operator and the return type of the
14048         operator is explicitly convertible to the type of x. 
14049
14050         * rootcontext.cs: Reset warning level to 2.  4 catches various
14051         "interesting" features in mcs, we must clean this up at some
14052         point, but currently am trying to kill other bugs ;-)
14053
14054         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
14055         in container classes as well.  
14056
14057         * expression.cs (Binary.ResolveOperator): Handle string case
14058         before anything else (as operator overloading does emit an error
14059         before doing anything else).
14060
14061         This code could go away when we move to a table driven model, but
14062         i could not come up with a good plan last night.
14063
14064 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
14065
14066         * typemanager.cs (CSharpName): reimplementation using regex.
14067         * class.cs: added null check for fields in Emit
14068         * rootcontext.cs: set warninglevel to 4
14069
14070 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
14071
14072         * typemanager.cs (CSharpName): reimplemented with Lupus
14073         suggestion.
14074
14075 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
14076
14077         * statement.cs (If): correclty implement Resolve, because we were
14078         not catching sem errors in there.  The same process is needed
14079         everywhere else. 
14080         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
14081
14082
14083         (Statement.Warning_DeadCodeFound): Factorize code.
14084         (While): Report dead code here too.
14085
14086         (Statement): Added Resolve virtual method to allow
14087         for resolution split from the emit code.
14088
14089 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
14090
14091         * statement.cs (EmitBoolExpression): No longer try to resolve the
14092         expression here.    
14093         (MakeBoolean): New utility function that resolve, implicitly
14094         converts to boolean and tags the expression. 
14095
14096
14097         (If, Do): Implement dead code elimination.
14098         (While): Implement loop inversion
14099
14100         (Do, While, For, If): Resolve the expression prior to calling our
14101         code generation.
14102
14103 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
14104
14105         * class.cs:
14106           - added method Report28 (warning: program has more than one entry point)
14107           - added method IsEntryPoint, implements paragraph 10.1 of the spec
14108           - modified method Method.Define, the part at the end of the method
14109
14110         * rootcontext.cs: added static public Location EntryPointLocation;
14111           
14112         * ../errors/cs0028.cs : Add test case for the above warning.              
14113
14114         * typemanager.cs:
14115           - modified method CSharpName to allow arrays of primitive type to
14116             be printed nicely (e.g. instead of System.Int32[][] it now prints
14117             int[][])
14118           - added method CSharpSignature: returns the signature of a method
14119             in string format to be used in reporting errors, warnings, etc.
14120
14121         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
14122         with String.Empty.
14123
14124 2002-04-26  Ravi Pratap  <ravi@ximian.com>
14125
14126         * delegate.cs (Define): Fix extremely silly bug where I was
14127         setting the type of the 'object' parameter of the BeginInvoke
14128         method to System.IAsyncResult instead of System.Object ;-)
14129
14130 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
14131
14132         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
14133         here. 
14134
14135         (Constructor.Emit): return if we fail to initialize the
14136         constructor.  Another door closed!  
14137
14138         * expression.cs (New.DoResolve): Improve error message (from -6 to
14139         1501).  Use DeclaredOnly lookup to find the exact constructor.
14140
14141         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
14142         loop.  This is useful.
14143
14144         * cs-parser.jay: Adjust the default parameters so that destructors
14145         have the proper signature.
14146
14147 2002-04-26  Martin Baulig  <martin@gnome.org>
14148
14149         * driver.cs (LoadAssembly): If `assembly' contains any characters
14150         which are only valid in path names and not in assembly names
14151         (currently slash, backslash and point), use Assembly.LoadFrom ()
14152         instead of Assembly.Load () on the `assembly' (before iteration
14153         over the link_paths).
14154
14155 2002-04-26  Martin Baulig  <martin@gnome.org>
14156
14157         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
14158
14159 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
14160
14161         * class.cs (Property): use the new typemanager.MemberLookup
14162
14163         (TypeContainer.MemberLookup): Implement using the
14164         TypeManager.MemberLookup now. 
14165
14166         * typemanager.cs: Make MemberLookup a function of the TypeManager,
14167         and return MemberInfos, so that these can be used without an
14168         EmitContext (what we had before).
14169
14170 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
14171
14172         * expression.cs: Fix the case where the argument to params if the
14173         type of the params.  I omitted handling this before.   Fixed
14174
14175 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
14176
14177         * driver.cs: Call BootCorlib_PopulateCoreType
14178
14179         * class.cs (Property.CheckBase): Check for properties only, not
14180         for all members. 
14181
14182         * interface.cs: Temporary hack: try/catch around the
14183         CustomAttributeBuilder, because I am getting an exception that I
14184         do not understand.
14185
14186         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
14187         types whose definitions are required to be there (attributes are
14188         defined before standard types).
14189
14190         Compute definitions as we boot the various types, as they are used
14191         immediately (value_type class will need object_type, but if we do
14192         not initialize object_type, we will pass a null, which will let
14193         the runtime pick the System.Object from the existing corlib, which
14194         is not what we want).
14195
14196 2002-04-22  Patrik Torstensson <totte@labs2.com>
14197
14198         * cs-tokenizer.cs: fixed a number of trim() issues.
14199
14200 2002-04-22  Ravi Pratap  <ravi@ximian.com>
14201
14202         * expression.cs (Argument.Type): Ensure that we return the correct
14203         type when we have out or ref parameters [in which case we 
14204         append a "&"].
14205
14206 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
14207
14208         * class.cs (Property, Indexer): Allow extern modifier in there. 
14209
14210         * typemanager.cs (InitBaseTypes): Initializes object_type and
14211         value_type, since those will be used early on during the bootstrap
14212         process to compile corlib.
14213
14214         (InitCoreTypes): Move code from here to InitBaseTypes.
14215
14216 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
14217
14218         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
14219         single-dimension arrays as using the ldlen opcode.  
14220
14221         Daniel Lewis discovered this optimization.  
14222
14223         * typemanager.cs: Add signature for System.Array::get_Length
14224
14225 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
14226
14227         * statement.cs: report the error when the foreach does not apply to an
14228         array nor a collection.
14229
14230 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
14231
14232         * expression.cs: Add implicit conversions to the operator ~.
14233
14234         * constant.cs (DecimalConstant.Emit): Emit decimal value.
14235
14236         * typemanager.cs: Locate the decimal constructor.
14237
14238 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
14239
14240         * attribute.cs: use the new property of TypeOf.
14241         * expression.cs: added 'get' property around typearg.
14242
14243         These changes fix a build breaker reported by NickD. Is this the
14244         correct way to fix?  If not, please, revert my changes and make it
14245         work :-).
14246
14247 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
14248
14249         * attribute.cs: Add support for typeof in attribute invocations.
14250         I am not sure that this is right though.
14251
14252 2002-04-14  Duncan Mak  <duncan@ximian.com>
14253
14254         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
14255         Binary.Operator.Division case.
14256
14257 2002-04-13  Ravi Pratap  <ravi@ximian.com>
14258
14259         * class.cs (DefineType): Ensure that we do a proper check on
14260         attribute types and also register it with the TypeManager.
14261
14262         (TypeContainer.Targets): The default for attribute types is
14263         AttributeTargets.All.
14264
14265         * attribute.cs (ApplyAttributes): Registering the attribute type
14266         is done elsewhere, not when we discover we have a Usage attribute.
14267
14268 2002-04-12  Ravi Pratap  <ravi@ximian.com>
14269
14270         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
14271         and get rid of is_delegate parameter.
14272
14273         * everywhere : update.
14274
14275 2002-04-12  Ravi Pratap  <ravi@ximian.com>
14276
14277         * cs-parser.jay (compilation_unit): Revamp completely to use
14278         some new ideas that I got from Rhys' grammar to solve the problems
14279         with assembly level attributes.
14280
14281         (outer_declaration): New grammar production.
14282
14283         (attribute_sections): Add.
14284
14285         (opt_attributes): Base on attribute_sections
14286
14287         (namespace_declaration): Allow opt_attributes to tackle the case
14288         when we have assembly level attributes - we are clever in this
14289         regard now ;-)
14290
14291         * attribute.cs (ApplyAttributes): Do not worry about assembly 
14292         attributes in the non-global context.
14293
14294         * rootcontext.cs (AddGlobalAttributes): Go back to using this
14295         instead of SetGlobalAttributes.
14296
14297         * class.cs, rootcontext.cs : Ensure we define and generate 
14298         attribute types before anything else.
14299
14300         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
14301         and flag the new error -20 for the case when the attribute type
14302         does not have valid targets specified. csc does not catch this.
14303
14304         * ../errors/errors.txt : update for error # -20
14305
14306 2002-04-11  Ravi Pratap  <ravi@ximian.com>
14307
14308         * support.cs (InternalParameters.ParameterModifier): Do some null
14309         checking and return sane values.
14310
14311         * class.cs (Method.Define): If we are a PInvoke method, ensure
14312         that we are static and extern. Report error # 601
14313
14314         * ../errors/cs0601.cs : Add test case for the above error.
14315
14316 2002-04-07  Ravi Pratap  <ravi@ximian.com>
14317
14318         * rootcontext.cs (attribute_types): We need to keep type of
14319         all attribute types separately and emit code for them first.
14320
14321         (RegisterAttribute) : Implement.
14322
14323         * class.cs (DefineType): Check if the current Type is a custom
14324         attribute type and register it accordingly.
14325
14326         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
14327         adding the first attribute twice and rename to
14328
14329         (SetGlobalAttributes): this.
14330
14331         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
14332         lookups.
14333
14334         * attribute.cs (ApplyAttributes): Take an additional argument telling us
14335         if we are processing global arguments. Hmm, I am unsure of this.
14336
14337 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
14338
14339         * expression.cs: added static array of strings to avoid calling
14340         Enum.ToString () for Operator in Binary. Significant recover of
14341         performance.
14342
14343 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
14344
14345         * class.cs (FindMembers): Allow the Builders of the various
14346         members to be null.  If they are skip them.  This only happens
14347         during the PInvoke declaration.
14348
14349 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
14350
14351         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
14352         failure, so we do not keep going afterwards.
14353
14354         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
14355         wanted to pass `false' as the `is_delegate' argument.  If this is
14356         the case, why not use delegate_type == null to mean `is_delegate =
14357         false' and anything else as is_delegate = true.
14358
14359 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
14360
14361         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
14362         code for the section, not the beginning of the tests.
14363
14364 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
14365
14366         * cfold.cs: Handle operator + (Enum x, Underlying x) 
14367
14368         * expression.cs (Binary): same.  Warn about errors where we have
14369         Enum/Enum in operator + as well.
14370
14371 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
14372
14373         * statement.cs:
14374                 - added support for switch(bool)
14375                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
14376                 - add TableSwitchEmit() to handle table-based switch statements
14377
14378 2002-04-05  Ravi Pratap  <ravi@ximian.com>
14379
14380         * expression.cs (Invocation.OverloadResolve): Factor out code which
14381         does parameter compatibility checking with arguments so that we can 
14382         re-use the code even from Delegate.VerifyApplicability
14383
14384         (VerifyArgumentsCompat): Move above code here.
14385
14386         * delegate.cs (VerifyApplicability): Get rid of duplicate code
14387         and instead make a call to the above method.
14388
14389 2002-03-31  Ravi Pratap  <ravi@ximian.com>
14390
14391         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
14392         We use it to keep track of classes which are attribute types.
14393
14394 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
14395
14396         * delegate.cs (Delegate.Define): Correctly define the types in the
14397         presence of fixed and array parameters.
14398
14399         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
14400         doing FindMembers.
14401
14402         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
14403         include NonPublic after the first iteration.
14404
14405         * class.cs (Indexer.CheckBase): Only check if both parents are
14406         non-null. 
14407
14408         * cs-parser.jay (accessor_body): If empty, set to null.
14409
14410         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
14411         same code path here to resolve constants names that we did have in
14412         MemberAccess.DoResolve.  There is too much code duplicated here.
14413
14414 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
14415
14416         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
14417
14418         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
14419         to MakeUnionSet.
14420
14421         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
14422         tokens, numbers and strings.
14423
14424         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
14425         parenthesis.
14426
14427         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
14428         asyncronous parameters and the regular parameters.  
14429
14430         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
14431         specify the target directory.
14432
14433         * expression.cs: (This.DoResolve): Simplify
14434         (As.Emit): Optimize, do not generate IsInst if the expression is
14435         always of the given type.
14436
14437         (Is.DoResolve): Bug fix, we were reporting both always/never for
14438         the is expression.
14439
14440         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
14441         creating too many unnecessary arrays.
14442
14443 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
14444
14445         * class.cs (EmitFieldInitializer): Use Assign expression to assign
14446         fields instead of rolling our own initializer.   Takes care of all
14447         implicit conversions, and drops unnecessary static checks/argument.
14448
14449 2002-03-31  Dick Porter  <dick@ximian.com>
14450
14451         * driver.cs: use the GetDirectories() return values properly, and
14452         use "/" as path separator.
14453
14454 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
14455
14456         * expression.cs (Unary): Optimize - - expr into expr.
14457         (Binary): Optimize a + (-b) into a -b.
14458
14459         * codegen.cs (CodeGen): Made all methods static.
14460
14461 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
14462
14463         * rootcontext.cs: 
14464
14465         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
14466         TypeBuilder property.
14467
14468         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
14469         instead. 
14470
14471         * tree.cs: Removed the various RecordXXXX, and replaced with a
14472         single RecordDecl.  Removed all the accessor methods, and just
14473         left a single access point Type 
14474
14475         * enum.cs: Rename DefineEnum to DefineType.
14476
14477         * decl.cs: New abstract method `DefineType' used to unify the
14478         Defines for Enumerations, Interfaces, TypeContainers and
14479         Delegates.
14480
14481         (FindType): Moved LookupInterfaceOrClass here.  Moved the
14482         LookupBaseClasses method that used to live in class.cs and
14483         interface.cs here, and renamed to FindType.
14484
14485         * delegate.cs: Implement DefineType.  Take advantage of the
14486         refactored pattern for locating the parent builder without taking
14487         the parent_builder argument (which we know does not work if we are
14488         nested, and triggering a toplevel definition).
14489
14490 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
14491
14492         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
14493         accessibility of a member has changed during override and report
14494         an error if so.
14495
14496         * class.cs (Method.Define, Property.Define): Only complain on
14497         overrides if the method is private, any other accessibility is
14498         fine (and since we just checked the permission is the same, we are
14499         good to go).
14500
14501         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
14502         and elif are processed always.  The other pre-processing
14503         directives are only processed if we are "taking" the path
14504
14505 2002-03-29  Martin Baulig  <martin@gnome.org>
14506
14507         * class.cs (Method.Emit): Only emit symbolic debugging info if the
14508         current location is not Null.
14509
14510         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
14511         a separate method so we can profile it.
14512
14513         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
14514         `span.Seconds' are just seconds, but no minutes or hours.
14515         (MainDriver): Profile the CodeGen.SaveSymbols calls.
14516
14517 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
14518
14519         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
14520         Remove the gratuitous set of Final:
14521
14522                                 // If an interface implementation, then we can set Final.
14523                                 if (((flags & MethodAttributes.Abstract) == 0) &&
14524                                     implementing.DeclaringType.IsInterface)
14525                                         flags |= MethodAttributes.Final;
14526
14527         I do not know what I was smoking when I used that.
14528
14529
14530         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
14531         step into fixing the name resolution issues for delegates and
14532         unifying the toplevel name resolution.
14533
14534 2002-03-28  Martin Baulig  <martin@gnome.org>
14535
14536         * class.cs (Method.Emit): If we have a symbol writer, call its
14537         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
14538         tell it about the current method.
14539
14540         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
14541         writer that we're going to emit the first byte of IL code for a new
14542         statement (a new source line).
14543         (EmitContext.EmitTopBlock): If we have a symbol writer, call
14544         EmitContext.Mark() before emitting any code.
14545
14546         * location.cs (SymbolDocument): Return null when we're Null.
14547
14548         * statement.cs (Statement): Moved the `Location loc' variable here.
14549         (Statement.EmitBoolExpression): If we have a symbol writer, call
14550         ec.Mark() before emitting any code to tell it that we're at the
14551         beginning of a new statement.
14552         (StatementExpression): Added `Location' argument to the constructor.
14553         (Block): Added public readonly variable `StartLocation' and public
14554         variable `EndLocation'.  The latter is to be set using SetEndLocation().
14555         (Block): Added constructor which takes a start and end location.
14556         (Block.SetEndLocation): New method. This sets the end location.
14557         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
14558         local variables we create.
14559         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
14560         each statement and do also mark the begin and end of the block.
14561
14562         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
14563         tell it the current lexer.Location, use Location.Null for the end of the
14564         block.
14565         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
14566         current block, set its end location using SetEndLocation().
14567         (statement_expression): StatementExpression constructor now takes the
14568         lexer.Location as additional argument.
14569         (for_statement, declare_local_variables): Likewise.
14570         (declare_local_variables): When creating a new implicit block, use the
14571         new Block constructor and pass it the lexer.Location.
14572
14573 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
14574
14575         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
14576         members also on the parent interfaces recursively.
14577
14578 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
14579
14580         * report.cs: Use new formats, since Gonzalo finished the missing
14581         bits. 
14582
14583         * expression.cs (Binary.ResolveOperator): added missing operator|
14584         operator& and operator^ for bool/bool.
14585
14586         * cs-parser.jay: CheckDef now takes a Location argument that is
14587         used to report errors more precisly (instead of reporting the end
14588         of a definition, we try to track something which is a lot closer
14589         to the source of the problem).
14590
14591         * cs-tokenizer.cs: Track global token use, so we can properly flag
14592         the use of #define/#undef after the first token has been seen.
14593
14594         Also, rename the reportXXXX to Error_DescriptiveName
14595
14596         * decl.cs (DeclSpace.IsTopLevel): Move property here from
14597         TypeContainer, so that Enum and Interface can use this too.
14598
14599         * class.cs (TypeContainer.LookupInterfaceOrClass,
14600         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
14601         `builder' argument.  Typically this was used to pass the parent
14602         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
14603         the definition).  
14604
14605         The problem is that a nested class could trigger the definition of
14606         a toplevel class, and the builder would be obviously wrong in that
14607         case. 
14608
14609         So we drop this argument, and we compute dynamically the
14610         TypeBuilder/ModuleBuilder (the correct information was available
14611         to us anyways from DeclSpace.Parent)
14612
14613         * interface.cs (Interface.DefineInterface): Drop builder
14614         parameter cleanup like class.cs
14615
14616         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
14617         like class.cs
14618
14619         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
14620         values. 
14621
14622         (Try.Emit): Propagate the returns value from the statement.
14623
14624         (Return.Emit): Even if we are leavning 
14625
14626         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
14627
14628         * modifiers.cs: Fix the computation of MethodAttributes flags.
14629
14630 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
14631
14632         * driver.cs: allow compilation of files that start with '/'.
14633         Add a default case when checking the argument of --target.
14634
14635 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
14636
14637         * interface.cs: Implement the same search algorithm for types in
14638         the interface code.
14639
14640         * delegate.cs: Do not allow multiple definition.
14641
14642         * Recovered ChangeLog that got accidentally amputated
14643
14644         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
14645
14646         * rootcontext.cs: Load manually enum to allow core classes to
14647         contain enumerations.
14648
14649         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
14650         Update to new static methods in TypeManager.
14651
14652         * typemanager.cs (GetMethod, GetConstructor): Use our
14653         implementation of FindMembers to find the members, since during
14654         corlib compilation, the types are TypeBuilders and GetMethod and
14655         GetConstructor do not work.
14656
14657         Make all methods in TypeManager static.
14658
14659         (InitCodeHelpers): Split the functionality from
14660         the InitCodeTypes function.
14661
14662         * driver.cs: Call InitCodeHelpers after we have populated the
14663         types. 
14664
14665         * cs-parser.jay (delegate_declaration): we did not used to compute
14666         the delegate name correctly for void delegates.
14667
14668 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
14669
14670         * rootcontext.cs (RootContext): Init the interface_resolve_order
14671         and type_container_resolve_order always.
14672
14673         (ResolveCore, BootstrapCorlib_ResolveClass,
14674         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
14675         compiler when compiling with --nostdlib
14676
14677         * class.cs (TypeContainer.DefineType): Check that our parent is
14678         not null.  This test is most important when we are bootstraping
14679         the core types.
14680
14681         * codegen.cs: Split out the symbol writing code.
14682
14683 2002-03-25  Martin Baulig  <martin@gnome.org>
14684
14685         * driver.cs (-g): Made -g an alias for --debug.
14686
14687 2002-03-24  Martin Baulig  <martin@gnome.org>
14688
14689         * codegen.cs (SymbolWriter): New public variable. Returns the
14690         current symbol writer.
14691         (CodeGen): Added `bool want_debugging_support' argument to the
14692          constructor. If true, tell the ModuleBuild that we want debugging
14693         support and ask it for the ISymbolWriter.
14694         (Save): If we have a symbol writer, call it's Close() method after
14695         saving the assembly.
14696
14697         * driver.c (--debug): New command line argument to create a
14698         debugger information file.
14699
14700         * location.cs (SymbolDocument): New public property. Returns an
14701         ISymbolDocumentWriter object for the current source file or null
14702         if we don't have a symbol writer.
14703
14704 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
14705
14706         * driver.cs (LoadAssembly): Correctly return when all the paths
14707         have been tried and not before.
14708
14709         * statement.cs (Switch.Emit): return the actual coverage for this
14710         statement (returns/not-returns)
14711
14712         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
14713         switch of the statement if we are the last switch section.  That
14714         kills two problems: try/catch problems (we used to emit an empty
14715         nop at the end) and switch statements where all branches would
14716         return. 
14717
14718 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
14719
14720         * driver.cs: Add default assemblies (the equivalent to the
14721         Microsoft CSC.RSP file)
14722
14723         * cs-tokenizer.cs: When updating `cols and setting it to zero,
14724         also update tokens_seen and set it to false.
14725
14726         * driver.cs: Implement --recurse for Mike.
14727
14728         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
14729         correctly splitting out the paths.
14730
14731 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
14732
14733         * interface.cs (Interface.PopulateProperty): Instead of using
14734         `parent' as the declaration space for the set parameters, use
14735         `this' 
14736
14737         * support.cs (InternalParameters): InternalParameters constructor
14738         takes a DeclSpace instead of a TypeContainer.
14739
14740         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
14741         types are being initialized, load the address of it before calling
14742         the function.  
14743
14744         (New): Provide a mechanism to disable the generation of local
14745         value type temporaries when the caller will be providing us with
14746         an address to store it.
14747
14748         (ArrayCreation.EmitDynamicInitializers): Use it.
14749
14750 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
14751
14752         * expression.cs (Invocation.EmitArguments): Only probe for array
14753         property if there is more than one argument.  Sorry about that.
14754
14755         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
14756         empty param arrays.
14757
14758         * class.cs (Method.LabelParameters): Fix incorrect code path that
14759         prevented the `ParamArrayAttribute' from being applied to the
14760         params attribute.
14761
14762 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
14763
14764         * support.cs (ReflectionParameters): Correctly compute whether the
14765         last argument is a params array.  Fixes the problem with
14766         string.Split ('a')
14767
14768         * typemanager.cs: Make the assemblies array always be non-null
14769         (empty, but non-null)
14770
14771         * tree.cs (RecordDecl): New function that abstracts the recording
14772         of names.  This reports error 101, and provides a pointer to the
14773         previous declaration.  Fixes a crash in the compiler.
14774
14775         * cs-parser.jay (constructor_declaration): Update to new grammar,
14776         and provide a constructor_body that can be empty.
14777
14778 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
14779
14780         * driver.cs: Add support for --resources.
14781
14782         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
14783         Make all types for the various array helper methods be integer.
14784
14785         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
14786         CheckState to ConvCast.
14787
14788         (ConvCast): Now it takes a `checked' state argument, to avoid
14789         depending on the emit context for the conversion, and just using
14790         the resolve time setting.
14791
14792         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
14793         instead of Invocation.EmitArguments.  We do not emit the original
14794         arguments, instead we emit those which have been converted to
14795         unsigned int expressions.
14796
14797         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
14798
14799         * codegen.cs: ditto.
14800
14801         * expression.cs (LocalVariableReference): Drop the use of the
14802         Store function that depended on the variable index.
14803
14804         * statement.cs (VariableInfo): Drop the `Idx' property from this
14805         class, as this is not taking into account the indexes for
14806         temporaries tat we generate during the execution, getting the
14807         indexes wrong.
14808
14809         * class.cs: First emit class initializers, then call the parent
14810         constructor. 
14811
14812         * expression.cs (Binary): Fix opcode emision.
14813         (UnaryMutator.EmitCode): Support checked code generation
14814
14815         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
14816         matches for events for both the Static and Instance scans,
14817         pointing to the same element.   Fix that.
14818
14819 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
14820
14821         * rootcontext.cs (ResolveTree): Always set the
14822         interface_resolve_order, because nested interfaces will be calling
14823         into us.
14824
14825         * class.cs (GetInterfaceOrClass): Track the same resolution
14826         process used by TypeManager.LookupType.  This fixes the nested
14827         type lookups in class declarations (separate path from
14828         LookupType). 
14829
14830         (TypeContainer.DefineType): Also define nested interfaces.
14831         (TypeContainer.RegisterOrder): New public function used to
14832         register the order in which child interfaces need to be closed.
14833
14834         Nested interfaces need to be closed after their parents have been
14835         created. 
14836
14837         * interface.cs (InterfaceAttr): Put all the logic for computing
14838         the interface attribute here. 
14839
14840         (DefineInterface): Register our interface order with the
14841         RootContext or with the TypeContainer depending on the case.
14842
14843 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14844
14845         * cs-parser.jay: rework foreach statement to work with the new
14846         changes to the policy on SimpleNames.
14847
14848         * report.cs: support Stacktrace on warnings as well.
14849
14850         * makefile: drop --unsafe and /unsafe from the compile.
14851
14852 2002-03-13  Ravi Pratap  <ravi@ximian.com>
14853
14854         * ecore.cs (StandardConversionExists): Modify to take an Expression
14855         as the first parameter. Ensure we do null -> reference type conversion
14856         checking.
14857
14858         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
14859         temporary Expression objects.
14860
14861 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
14862
14863         * interface.cs: workaround bug in method overloading resolution
14864         (there is already a bugzilla bug for it).
14865
14866 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
14867
14868         We could also solve this problem by having a separate path for
14869         performing type lookups, instead of DoResolve, we could have a
14870         ResolveType entry point, and only participating pieces of the
14871         production (simplename, deref, array) would implement this. 
14872
14873         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
14874         signal SimpleName to only resolve type names and not attempt to
14875         resolve anything else.
14876
14877         * expression.cs (Cast): Set the flag.
14878
14879         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
14880
14881         * class.cs: Only report 108 if there is no `new' modifier.
14882
14883         * cs-parser.jay: rework foreach statement to work with the new
14884         changes to the policy on SimpleNames.
14885         
14886         * report.cs: support Stacktrace on warnings as well.
14887
14888         * makefile: drop --unsafe and /unsafe from the compile.
14889
14890 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
14891
14892         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14893         lookups here, instead of doing that at parse time.  This means
14894         that our grammar will not introduce `LocalVariableReferences' as
14895         expressions at this point.  That solves the problem of code like
14896         this:
14897
14898         class X {
14899            static void Main ()
14900            { int X = 1;
14901             { X x = null }}}
14902
14903         This is only half the fix.  The full fix requires parameters to
14904         also be handled in this way.
14905
14906         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
14907         makes the use more obvious of the DeclSpace.  The
14908         ec.TypeContainer.TypeBuilder is now only used to pull the
14909         TypeBuilder for it.
14910
14911         My theory is that I can get rid of the TypeBuilder completely from
14912         the EmitContext, and have typecasts where it is used (from
14913         DeclSpace to where it matters).  
14914
14915         The only pending problem is that the code that implements Aliases
14916         is on TypeContainer, and probably should go in DeclSpace.
14917
14918         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
14919         lookups here, instead of doing that at parse time.  This means
14920         that our grammar will not introduce `LocalVariableReferences' as
14921         expressions at this point.  That solves the problem of code like
14922         this:
14923
14924         class X {
14925            static void Main ()
14926            { int X = 1;
14927             { X x = null }}}
14928
14929         This is only half the fix.  The full fix requires parameters to
14930         also be handled in this way.
14931
14932         * class.cs (Property.DefineMethod): When implementing an interface
14933         method, set newslot, when implementing an abstract method, do not
14934         set the flag (before we tried never setting it, or always setting
14935         it, which is the difference).
14936         (Indexer.DefineMethod): same.
14937         (Method.DefineMethod): same.
14938
14939         * ecore.cs: Only set the status used flag if we get back a Field.
14940
14941         * attribute.cs: Temporary hack, so Paolo can keep working.
14942
14943 2002-03-08  Ravi Pratap  <ravi@ximian.com>
14944
14945         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
14946         the unmanaged type in the case we have a MarshalAs attribute.
14947
14948         (Resolve): Handle the case when we are parsing the special MarshalAs
14949         attribute [we need to store the unmanaged type to use later]
14950
14951         * typemanager.cs (marshal_as_attr_type): Built in type for the 
14952         MarshalAs Attribute.
14953
14954         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
14955         on parameters and accordingly set the marshalling info.
14956
14957 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
14958
14959         * class.cs: Optimizing slightly by removing redundant code after
14960         we switched to the `NoTypes' return value.
14961         (Property.DefineMethod): use NoTypes here too.
14962
14963         This fixes the bug I introduced in my last batch of changes.
14964
14965 2002-03-05  Ravi Pratap  <ravi@ximian.com>
14966
14967         * tree.cs (RecordEnum): Add. We now keep track of enums too.
14968
14969         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
14970         Enums since those are types too. 
14971
14972         * cs-parser.jay (enum_declaration): Record enums as we parse them.
14973
14974         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
14975         thanks to a call during the lookup process.
14976
14977 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
14978
14979         * statement.cs (Foreach): Lots of work to accomodate a particular
14980         kind of foreach statement that I had not kept in mind.  It is
14981         possible to have foreachs on classes that provide a GetEnumerator
14982         method that return objects that implement the "pattern" for using
14983         a foreach, there is no need to support GetEnumerator
14984         specifically. 
14985
14986         This is needed to compile nant.
14987
14988         * decl.cs: Only report 114 if the member is not `Finalize' and if
14989         the warning level is at least 2.
14990
14991         * class.cs: Moved the compare function from Method to
14992         MethodSignature. 
14993
14994         (MethodSignature.InheritableMemberSignatureCompare): Add new
14995         filter function that is used to extract inheritable methods from a
14996         class. 
14997
14998         (Method.Define): Use the new `inheritable_method_signature_filter'
14999         delegate
15000
15001         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
15002         command. 
15003
15004 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
15005
15006         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
15007
15008         * cs-parser.jay: Add opt_semicolon to the interface declaration.
15009
15010         * expression.cs: Pass location information to
15011         ConvertImplicitStandard. 
15012
15013         * class.cs: Added debugging code to track return values from
15014         interfaces. 
15015
15016 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
15017
15018         * expression.cs (Is.DoResolve): If either side of the `is' is an
15019         interface, do not flag the warning.
15020
15021         * ecore.cs (ImplicitReferenceConversion): We need a separate test
15022         for interfaces
15023
15024         * report.cs: Allow for --fatal to be used with --probe.
15025
15026         * typemanager.cs (NoTypes): Move the definition for the empty Type
15027         array here. 
15028
15029         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
15030         properties. 
15031         (TypeContainer.DefineProxy): New function used to proxy to parent
15032         implementations when implementing interfaces.
15033         (TypeContainer.ParentImplements): used to lookup if our parent
15034         implements a public function that is required by an interface.
15035         (TypeContainer.VerifyPendingMethods): Hook this up.
15036
15037         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
15038         `modules' and `assemblies' arraylists into arrays.  We only grow
15039         these are the very early start up of the program, so this improves
15040         the speedof LookupType (nicely measured).
15041
15042         * expression.cs (MakeByteBlob): Replaced unsafe code with
15043         BitConverter, as suggested by Paolo.
15044
15045         * cfold.cs (ConstantFold.Binary): Special case: perform constant
15046         folding of string concatenation, but if either side is a string,
15047         and the other is not, then return null, and let the runtime use
15048         the concatenation on the string plus the object (using
15049         `Object.ToString'). 
15050
15051 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
15052
15053         Constant Folding has been implemented now.
15054
15055         * expression.cs (Unary.Reduce): Do not throw an exception, catch
15056         the error instead on types that are not supported in one's
15057         complement. 
15058
15059         * constant.cs (Constant and all children): New set of functions to
15060         perform implict and explicit conversions.
15061
15062         * ecore.cs (EnumConstant): Implement the new functions to perform
15063         conversion by proxying to the child expression.
15064
15065         * codegen.cs: (ConstantCheckState): Constant evaluation has its
15066         own separate setting that can not be turned off from the command
15067         line using --unchecked or --checked and is only controlled using
15068         the checked/unchecked statements and expressions.  This setting is
15069         used by the constant folder to flag errors.
15070
15071         * expression.cs (CheckedExpr, UncheckedExpr): Set the
15072         ConstantCheckState as well.   
15073
15074         During Resolve, they also have to flag the state, because the
15075         constant folder runs completely in the Resolve phase.
15076
15077         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
15078         well.
15079
15080 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
15081
15082         * cfold.cs: New file, this file contains the constant folder.
15083
15084         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
15085         argument to track whether we are using the resulting address to
15086         load or store a value and provide better error messages. 
15087
15088         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
15089         new AddressOf arguments.
15090
15091         * statement.cs (Foreach.EmitCollectionForeach): Update
15092
15093         * expression.cs (Argument.Emit): Call AddressOf with proper
15094         arguments to track usage.
15095
15096         (New.DoEmit): Call AddressOf with new arguments.
15097
15098         (Unary.Emit): Adjust AddressOf call.
15099
15100 2002-03-01  Ravi Pratap  <ravi@ximian.com>
15101
15102         * cs-parser.jay (member_access): Change the case for pre-defined types
15103         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
15104         this suggestion.
15105
15106         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
15107         a method body.
15108
15109         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
15110         essentially like methods and apply attributes like MethodImplOptions to them too.
15111
15112         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
15113         not being null.
15114
15115         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
15116         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
15117         is the DeclSpace.
15118
15119         * Update code everywhere accordingly.
15120
15121         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
15122
15123         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
15124
15125 2002-02-28  Ravi Pratap  <ravi@ximian.com>
15126
15127         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
15128         try performing lookups against those instead of jumping straight into using
15129         the 'using' clauses.
15130
15131         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
15132
15133         (LookupType): Perform lookups in implicit parents too.
15134
15135         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
15136         sequence as RootContext.LookupType. 
15137
15138         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
15139         the various cases of namespace lookups into this method.
15140
15141 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
15142
15143         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
15144         in positional arguments)
15145
15146         * class.cs (Operator): Update the AllowedModifiers to contain
15147         extern. 
15148
15149         * cs-parser.jay: Update operator declaration to allow for the
15150         operator body to be empty.
15151
15152         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
15153         values. 
15154
15155 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
15156
15157         * class.cs (Method.Emit): Label parameters.
15158
15159         * driver.cs: Return 1 or 0 as the program exit code.
15160
15161 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
15162
15163         * expression.cs: Special case the `null' object when trying to
15164         auto-compute the type, as anything can be explicitly converted to
15165         that. 
15166
15167         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
15168         spotting this Paolo.
15169
15170         (Expression.ImplicitNumericConversion): Perform comparissions of
15171         the type using the underlying type in the case of an enumeration
15172         rather than using the enumeration type for the compare.
15173
15174         Cope with the underlying == type case, which is not possible to
15175         catch before. 
15176
15177         (Expression.ConvertNumericExplicit): Perform comparissions of
15178         the type using the underlying type in the case of an enumeration
15179         rather than using the enumeration type for the compare.
15180
15181         * driver.cs: If the user does not supply an extension, assume .exe
15182
15183         * cs-parser.jay (if_statement): Rewrote so that we can track the
15184         location for the if statement.
15185
15186         * expression.cs (Binary.ConstantFold): Only concat strings when
15187         the operation is "+", not everything ;-)
15188
15189         * statement.cs (Statement.EmitBoolExpression): Take a location
15190         argument. 
15191         (If, While, Do): Track location.
15192
15193         * expression.cs (Binary.ResolveOperator): In the object + string
15194         case, I was missing a call to ConvertImplicit
15195
15196 2002-02-25  Ravi Pratap  <ravi@ximian.com>
15197
15198         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
15199         Location arguments. Ensure we use RootContext.LookupType to do our work
15200         and not try to do a direct Type.GetType and ModuleBuilder.GetType
15201
15202         * interface.cs (PopulateMethod): Handle the type of the parameter being
15203         null gracefully.
15204
15205         * expression.cs (Invocation.BetterFunction): Handle the case when we 
15206         have a params method with no fixed arguments and a call is made with no
15207         arguments.
15208
15209 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
15210
15211         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
15212         the verbatim-string-literal
15213
15214         * support.cs (InternalParameters.ParameterModifier): handle null
15215         fixed parameters.
15216         (InternalParameters.ParameterType): ditto.
15217
15218         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
15219         duplicating the name of the variable parameter.
15220         (GetParameterByName): Fix bug where we were not looking up array
15221         paramters if they were the only present (thanks Paolo!).
15222         (GetParameterInfo): We only have an empty set of types if both
15223         fixed and array are set to null.
15224         (GetParameterInfo-idx): Handle FixedParameter == null
15225
15226         * cs-parser.jay: Handle the case where there is no catch
15227         statements (missing null test).
15228
15229 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
15230
15231         * driver.cs (MainDriver): Be conservative on our command line
15232         handling.
15233
15234         Catch DirectoryNotFoundException when calling GetFiles.
15235
15236         (SplitPathAndPattern): Used to split the input specification into
15237         a path and a pattern that we can feed to Directory.GetFiles.
15238
15239 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
15240
15241         * statement.cs (Fixed): Implement the last case of the Fixed
15242         statement (string handling).
15243
15244         * expression.cs (StringPtr): New class used to return a char * to
15245         a string;  Used by the Fixed statement.
15246
15247         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
15248
15249         * expression.cs (Binary.ResolveOperator): Remove redundant
15250         MemberLookup pn parent type.
15251         Optimize union call, we do not need a union if the types are the same.
15252         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
15253         type.
15254
15255         Specialize the use of MemberLookup everywhere, instead of using
15256         the default settings. 
15257
15258         (StackAlloc): Implement stackalloc keyword.
15259
15260         * cs-parser.jay: Add rule to parse stackalloc.
15261
15262         * driver.cs: Handle /h, /help, /?
15263
15264         * expression.cs (MakeByteBlob): Removed the hacks we had in place
15265         before we supported unsafe code.
15266
15267         * makefile: add --unsafe to the self compilation of mcs.
15268
15269 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
15270
15271         * expression.cs (PointerArithmetic): New class that is used to
15272         perform pointer arithmetic.
15273         (Binary.Resolve): Handle pointer arithmetic
15274         Handle pointer comparission.
15275         (ArrayPtr): Utility expression class that is used to take the
15276         address of an array.
15277
15278         (ElementAccess): Implement array access for pointers
15279
15280         * statement.cs (Fixed): Implement fixed statement for arrays, we
15281         are missing one more case before we are done.
15282
15283         * expression.cs (Indirection): Implement EmitAssign and set the
15284         ExprClass to Variable.  This allows pointer dereferences to be
15285         treated as variables, and to have values assigned to them.
15286
15287         * ecore.cs (Expression.StoreFromPtr): New utility function to
15288         store values dereferencing.
15289
15290 2002-02-20  Ravi Pratap  <ravi@ximian.com>
15291
15292         * expression.cs (Binary.ResolveOperator): Ensure that we are
15293         not trying to operate on a void type - this fixes the reported
15294         bug.
15295
15296         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
15297         the parent implementation is sealed.
15298
15299         * ../errors/cs0239.cs : Add.
15300
15301         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
15302
15303         * typemanager.cs (unverifiable_code_type): Corresponds to 
15304         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
15305         which have unsafe code in them.
15306
15307         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
15308         unsafe context.
15309
15310 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
15311
15312         * cs-tokenizer.cs: Add support for @"litreal strings"
15313
15314         Make tokenizer accept pre-processor directives
15315         on any column (remove the old C-like limitation). 
15316
15317         * rootcontext.cs (EmitCode): Emit any global attributes.
15318         (AddGlobalAttributes): Used to keep track of assembly attributes. 
15319
15320         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
15321
15322         * cs-parser.jay: Add support for global attributes.  
15323
15324 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
15325
15326         * expression.cs (Indirection): New helper class.  Unary will
15327         create Indirection classes to be able to implement the
15328         IMemoryLocation interface on it.
15329
15330 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
15331
15332         * cs-parser.jay (fixed_statement): reference the right statement.
15333
15334         * statement.cs (Fixed.Emit): Finish implementing the fixed
15335         statement for the &x case.
15336
15337 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
15338
15339         * class.cs (Property.Define, Method.Define): Remove newslot when
15340         `implementing'.  
15341
15342         * modifiers.cs: My use of NewSlot when `Abstract' was set was
15343         wrong.  NewSlot should only be used if the `new' keyword is present.
15344
15345         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
15346         locating our system dir.  Sorry about this.
15347
15348 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
15349
15350         * driver.cs (GetSystemDir): Compute correctly the location of our
15351         system assemblies.  I was using the compiler directory instead of
15352         the library directory.
15353
15354 2002-02-13  Ravi Pratap  <ravi@ximian.com>
15355
15356         * expression.cs (BetterFunction): Put back in what Miguel commented out
15357         since it is the correct fix. The problem is elsewhere ;-)
15358
15359         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
15360         parameters of the parms method are themselves compatible or not !
15361
15362         (StandardConversionExists): Fix very dangerous bug where we were forgetting
15363         to check that a class implements an interface before saying that an implicit
15364         conversion was allowed. Use ImplementsInterface to do the checking.
15365
15366 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
15367
15368         * class.cs (Method.Define): Track whether we are an explicit
15369         implementation or not.  And only call DefineMethodOverride if we
15370         are an explicit implementation.
15371
15372         (Property.DefineMethod): Ditto.
15373
15374 2002-02-11  Ravi Pratap  <ravi@ximian.com>
15375
15376         * expression.cs (BetterFunction): Catch hideous bug which was
15377          preventing us from detecting ambiguous calls due to implicit casts i.e
15378         cs0121.
15379
15380 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
15381
15382         * support.cs (Pair): Remove un-needed method.  I figured why I was
15383         getting the error in cs-parser.jay, the variable in a foreach loop
15384         is readonly, and the compiler does not really treat this as a variable.
15385
15386         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
15387         instead of EQUALS in grammar.  
15388
15389         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
15390
15391         * expression.cs (Unary.DoResolve): Check whether the argument is
15392         managed or not.
15393
15394 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
15395
15396         * support.cs: Api for Pair to set a value.  Despite the fact that
15397         the variables are public the MS C# compiler refuses to compile
15398         code that accesses the field if the variable is part of a foreach
15399         statement. 
15400
15401         * statement.cs (Fixed): Begin implementation of the fixed
15402         statement.
15403
15404         (Block.AddVariable): Return the VariableInfo on success and null
15405         on failure instead of true/false. 
15406
15407         * cs-parser.jay (foreach): Catch errors on variables already
15408         defined (we were ignoring this value before) and properly unwind
15409         the block hierarchy
15410
15411         (fixed_statement): grammar for the fixed statement.
15412
15413 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
15414
15415         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
15416         pointer types to be incretemented.
15417
15418         (SizeOf): Implement.
15419
15420         * cs-parser.jay (pointer_member_access): Implement
15421         expr->IDENTIFIER production.
15422
15423         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
15424         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
15425         on safe contexts.
15426
15427         (Unary): Implement indirection.
15428
15429         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
15430         use in non-unsafe context).
15431
15432         (SimpleName.DoResolve): Check for pointers in field access on safe
15433         contexts. 
15434
15435         (Expression.LoadFromPtr): Factor the load-indirect code in this
15436         function.  This was duplicated in UnboxCast and ParameterReference
15437
15438 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
15439
15440         * expression.cs (ComposedCast): report an error if a pointer cast
15441         is used in a safe region.
15442
15443         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
15444         pointer type casts in unsafe context.
15445
15446         * codegen.cs (EmitContext): Set up IsUnsafe.
15447
15448         * cs-parser.jay (non_expression_type): Add productions for pointer
15449         casts. 
15450
15451         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
15452         code.  We should not use force into static mode if the method is
15453         not virtual.  Fixes bug in MIS
15454
15455         * statement.cs (Do.Emit, While.Emit, For.Emit,
15456         Statement.EmitBoolExpression): Add support to Do and While to
15457         propagate infinite loop as `I do return' semantics.
15458
15459         Improve the For case to also test for boolean constants.
15460
15461         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
15462         to the list of attributes we can add.
15463
15464         Remove `EmitContext' argument.
15465
15466         * class.cs (Method.Define): Apply parameter attributes.
15467         (Constructor.Define): Apply parameter attributes.
15468         (MethodCore.LabelParameters): Move here the core of labeling
15469         parameters. 
15470
15471         * support.cs (ReflectionParameters.ParameterModifier,
15472         InternalParameters.ParameterModifier): Use IsByRef on the type and
15473         only return the OUT bit for these parameters instead of in/out/ref
15474         flags.
15475
15476         This is because I miss-understood things.  The ParameterInfo.IsIn
15477         and IsOut represent whether the parameter has the [In] and [Out]
15478         attributes set.  
15479
15480 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
15481
15482         * ecore.cs (FieldExpr.Emit): Release temporaries.
15483
15484         * assign.cs (LocalTemporary.Release): new function.
15485
15486         * codegen.cs (EmitContext.GetTemporaryStorage,
15487         EmitContext.FreeTemporaryStorage): Rework the way we deal with
15488         temporary storage.  Now we can "put back" localbuilders when we
15489         are done with them
15490
15491 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
15492
15493         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
15494         need to make a copy of the variable to generate verifiable code.
15495
15496 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
15497
15498         * driver.cs: Compute dynamically the system directory.
15499
15500         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
15501         Slower, but more generally useful.  Used by the abstract
15502         registering implementation. 
15503
15504         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
15505         the rules for the special rule on Type/instances.  First check if
15506         we have the same name, and if so, try that special static path
15507         rather than the instance path.
15508
15509 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
15510
15511         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
15512         for, while and if.
15513
15514         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
15515         Enum, ValueType, Delegate or Array for non-corlib compiles.
15516
15517         * cs-tokenizer.cs: Catch long identifiers (645)
15518
15519         * typemanager.cs (IndexerPropetyName): Ravi never tested this
15520         piece of code.
15521
15522         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
15523         fix, we were returning too early, so we were not registering
15524         pending methods from abstract classes.
15525
15526         Do not register pending methods if the class is abstract.
15527
15528         * expression.cs (Conditional.DoResolve): Report circular implicit
15529         conversions when we neecd to compute it for conditional
15530         expressions. 
15531
15532         (Is.DoResolve): If the expression is always of the provided type,
15533         flag warning 183.  If the expression can not ever be of the
15534         provided type flag warning 184.
15535
15536         * class.cs: Catch 169 as well.
15537
15538         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
15539         read. 
15540
15541 2002-01-18  Nick Drochak  <ndrochak@gol.com>
15542
15543         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
15544
15545 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
15546
15547         * interface.cs: (PopulateMethod): Check for pointers being defined
15548         only if the unsafe context is active.
15549         (PopulateProperty): ditto.
15550         (PopulateIndexer): ditto.
15551
15552         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
15553         specified.  If pointers are present, make sure that they are
15554         present in an unsafe context.
15555         (Constructor, Constructor.Define): ditto.
15556         (Field, Field.Define): ditto.
15557         (Property, Property.Define): ditto.
15558         (Event, Event.Define): ditto.
15559
15560         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
15561         hashtable if there are classes or structs defined.
15562
15563         * expression.cs (LocalVariableReference.DoResolve): Simplify this
15564         code, as the constant resolution moved.
15565
15566         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
15567         the metadata, so we can flag error 133. 
15568
15569         * decl.cs (MemberCore.UnsafeOK): New function to test that a
15570         pointer is being declared in an unsafe context.
15571
15572 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
15573
15574         * modifiers.cs (Modifiers.Check): Require a Location argument.
15575         Report error 227 for Unsafe use.
15576
15577         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
15578
15579         * statement.cs (For.Emit): If the test is null, then report that
15580         we do `return', as we wont reach anything afterwards.
15581
15582         (Switch.SwitchGoverningType): Track the expression that matched
15583         the conversion.
15584
15585         * driver.cs: Allow negative numbers as an error code to flag.
15586
15587         * cs-parser.jay: Handle 1551.
15588
15589         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
15590
15591 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
15592
15593         * cs-parser.jay: Report 1518 (type declaration can only contain
15594         class, struct, interface, enum or delegate)
15595
15596         (switch_label): Report 1523 (keywords `case' or `default' must
15597         preced code)
15598
15599         (opt_switch_sections): Report 1522 (empty switch)
15600
15601         * driver.cs: Report 1515 (response file specified multiple times)
15602         Report 1516 (Source file specified multiple times).
15603
15604         * expression.cs (Argument.Resolve): Signal 1510
15605
15606         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
15607         access not allowed in static code)
15608
15609 2002-01-11  Ravi Pratap  <ravi@ximian.com>
15610
15611         * typemanager.cs (IsPointerType): Utility method which we are going
15612         to need a lot.
15613
15614         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
15615         the object type, so we take care of that.
15616
15617         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
15618
15619         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
15620         added to non-params parameters :-)
15621
15622         * typemanager.cs (CSharpName): Include 'void' type too. 
15623
15624         (void_ptr_type): Include in the set of core types.
15625
15626         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
15627         duplicating code.
15628
15629         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
15630         an unsafe context.
15631
15632         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
15633         completely forgotten about it.
15634
15635 2002-01-10  Ravi Pratap  <ravi@ximian.com>
15636
15637         * cs-parser.jay (pointer_type): Add. This begins our implementation
15638         of parsing rules for unsafe code.
15639
15640         (unsafe_statement): Implement.
15641
15642         (embedded_statement): Modify to include the above.
15643
15644         * statement.cs (Unsafe): Implement new class for unsafe blocks.
15645
15646         * codegen.cs (EmitContext.InUnsafe): Add. This determines
15647         if the current context is an unsafe one.
15648
15649         * cs-parser.jay (local_variable_pointer_type): Since local variable types
15650         are handled differently, we need separate rules for them.
15651
15652         (local_variable_declaration): Update to use local_variable_pointer_type
15653         to allow variable declarations of unmanaged pointer types.
15654
15655         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
15656         in unsafe contexts.
15657
15658         * ../errors/cs0214.cs : Add.
15659
15660 2002-01-16  Nick Drochak  <ndrochak@gol.com>
15661
15662         * makefile: remove 'response' file when cleaning.
15663
15664 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
15665
15666         * cs-parser.jay: Report 1524.
15667
15668 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
15669
15670         * typemanager.cs (RegisterMethod): drop checking if we have
15671         registered this from here
15672
15673 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
15674
15675         * class.cs (Method.EmitDestructor): Implement calling our base
15676         destructor. 
15677
15678         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
15679         value of InFinally.
15680
15681         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
15682         this routine and will wrap the call in a try/catch block.  Deal
15683         with the case.
15684
15685 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
15686
15687         * ecore.cs (Expression.MemberLookup): instead of taking a
15688         parameter `same_type' that was used to tell whether we could
15689         access private members we compute our containing type from the
15690         EmitContext.
15691
15692         (FieldExpr): Added partial support for volatile fields.  This does
15693         not work for volatile fields exposed from assemblies, as I can not
15694         figure out how to extract the modreq from it.
15695
15696         Updated all the source files to use this.
15697
15698         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
15699         because it is referenced by MemberLookup very often. 
15700
15701 2002-01-09  Ravi Pratap  <ravi@ximian.com>
15702
15703         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
15704         TypeBuilder.GetCustomAttributes to retrieve what we need.
15705
15706         Get rid of redundant default_member_attr_type as this is the same as
15707         default_member_type which already exists.
15708
15709         * interface.cs, attribute.cs : Update accordingly.
15710
15711 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
15712
15713         * typemanager.cs: Enable IndexerPropertyName again.  It does not
15714         work for TYpeBuilders though.  Ravi, can you please fix this?
15715
15716         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
15717
15718         * expression.cs (Argument.Emit): Handle the case of ref objects
15719         being passed to ref functions;  
15720
15721         (ParameterReference.EmitLoad): Loads the content of the pointer
15722         without dereferencing.
15723
15724 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
15725
15726         * cs-tokenizer.cs: Implemented the pre-processing expressions.
15727
15728 2002-01-08  Ravi Pratap  <ravi@ximian.com>
15729
15730         * class.cs (Indexer.DefineMethod): Incorporate the interface
15731         type in the name of the method if we are doing explicit interface
15732         implementation.
15733
15734         * expression.cs (ConversionExists): Remove as it is completely obsolete.
15735
15736         (BetterConversion): Fix extremely trivial bug where we were referring to
15737         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
15738         again !
15739
15740         * ../errors/bug16.cs : Add although we have fixed it.
15741
15742 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
15743
15744         * expression.cs (BaseIndexer): Begin implementation.
15745
15746         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
15747
15748         * cs-parser.jay (indexer_declarator): Use qualified_identifier
15749         production directly to remove a shift/reduce, and implement
15750         explicit interface implementation.
15751
15752         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
15753         after a floating point suffix.
15754
15755         * expression.cs (DoNumericPromotions): Improved the conversion for
15756         uint/uint.  If we have a constant, we avoid doing a typecast to a
15757         larger type.
15758
15759         * class.cs (Indexer): Implement explicit interface implementation
15760         for indexers.
15761
15762 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
15763
15764         * class.cs: make the default instance constructor public and hidebysig.
15765
15766 2001-01-03  Ravi Pratap  <ravi@ximian.com>
15767
15768         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
15769         so we can call it from elsewhere.
15770
15771         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
15772         we emit it internally if the class has a defined indexer; otherwise the user
15773         emits it by decorating the class definition with the DefaultMemberAttribute.
15774
15775         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
15776         attribute is not used on a type which defines an indexer.
15777
15778         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
15779         character when we skip whitespace.
15780
15781         * ../errors/cs0646.cs : Add.
15782
15783 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
15784
15785         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
15786         again. 
15787
15788         * makefile: Add practical target `mcs3.exe' which builds the third
15789         generation compiler. 
15790
15791         * expression.cs (New): Fix structures constructor calling.
15792
15793         * class.cs (Property, Method, Indexer): Emit Final flag on the
15794         method if we are an interface implementation and we are not
15795         abstract. 
15796
15797         * ecore.cs (PropertyExpr): New public field `IsBase', tells
15798         whether this property is referencing a `base' method.
15799
15800         * expression.cs (Invocation.EmitCall): take an extra argument:
15801         is_base, this is used to determine whether the `call' or
15802         `callvirt' opcode should be used.
15803
15804
15805         * delegate.cs: update EmitCall.
15806
15807         * class.cs (Method.Define): Set NewSlot for the cases where we are
15808         not implementing an interface method.
15809
15810         (Property.Define): ditto.
15811
15812 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
15813
15814         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
15815         'r'.  Allows mcs to parse itself fully.
15816
15817 2002-01-02  Ravi Pratap  <ravi@ximian.com>
15818
15819         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
15820         of the number of initializers that require the InitializeArray method.
15821
15822         (CheckIndices): Store the Expression in all cases - not the plain value. Also
15823         update the above field where necessary.
15824
15825         (MakeByteBlob): Update accordingly.
15826
15827         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
15828         greater than 2.
15829
15830         (EmitDynamicInitializers): Update in accordance with the new optimization.
15831
15832         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
15833         same OpCode applies.
15834
15835         * cs-parser.jay : Fix some glaring errors I introduced.
15836
15837 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
15838
15839         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
15840         so that we can check for name clashes there too.
15841
15842         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
15843         for interface indexers.
15844
15845         * interfaces.cs (Define): Emit the default member attribute.
15846
15847         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
15848         variable was being referred to while setting the value ;-)
15849
15850 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
15851
15852         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
15853         byte-by-byte information when we know the data is zero.
15854
15855         Make the block always a multiple of 4, because
15856         DefineInitializedData has a bug.
15857
15858         * assign.cs: Fix, we should assign from the temporary, not from
15859         the source. 
15860
15861         * expression.cs (MakeByteBlob): Fix my incorrect code.
15862
15863 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
15864
15865         * typemanager.cs (EnumToUnderlying): This function is used to get
15866         the underlying type from an enumeration, because it does not
15867         always work. 
15868
15869         * constant.cs: Use the I4_S form for values between -128 and 127.
15870
15871         * statement.cs (Block.LookupLabel): Looks up a label.
15872         (Block): Drop support for labeled blocks.
15873
15874         (LabeledStatement): New kind of statement that represents a label
15875         only.
15876
15877         (Goto): Finally implement this bad boy.
15878
15879         * cs-parser.jay: Update to reflect new mechanism to implement
15880         labels.
15881
15882 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
15883
15884         * codegen.cs (EmitContext.This): a codegen property that keeps the
15885         a single instance of this instead of creating many different this
15886         instances. 
15887
15888         * delegate.cs (Delegate.DoResolve): Update to use the property;
15889
15890         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
15891
15892         * expression.cs (BaseAccess.DoResolve): Ditto.
15893
15894 2001-12-29  Ravi Pratap  <ravi@ximian.com>
15895
15896         * typemanager.cs (methodimpl_attr_type): Add to hold the type
15897         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
15898
15899         (InitCoreTypes): Update accordingly.
15900
15901         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
15902         so we can quickly store the state.
15903
15904         (ApplyAttributes): Set the correct implementation flags
15905         for InternalCall methods.
15906
15907 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
15908
15909         * expression.cs (EmitCall): if a method is not virtual, then do
15910         not use callvirt on it.
15911
15912         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
15913         user defined stuff) requires the use of stobj, which takes an
15914         address on the stack instead of an array and an index.  So emit
15915         the Ldelema operation for it.
15916
15917         (EmitStoreOpcode): Use stobj for valuetypes.
15918
15919         (UnaryMutator.EmitCode): Use the right 1 value depending on
15920         whether we are dealing with int64/uint64, float or doubles.
15921
15922         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
15923         constructors that I implemented last night.
15924
15925         (Constructor.IsDefault): Fix to work properly for static
15926         constructors.
15927
15928         * cs-parser.jay (CheckDef): report method signature errors.
15929         Update error number 103 to be 132.
15930
15931         * decl.cs: New AdditionResult enumeration value: MethodExists.
15932         Although we do this check for methods later on in the semantic
15933         analysis, catching repeated default constructors is so easy that
15934         we catch these here. 
15935
15936         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
15937         promotions code.
15938
15939         (ParameterReference.EmitAssign, Emit): handle
15940         bools as bytes.
15941
15942         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
15943         (ArrayAccess.EmitStoreOpcode): ditto.
15944
15945         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
15946
15947         * expression.cs (MakeByteBlob): Complete all the missing types
15948         (uint, short, ushort, byte, sbyte)
15949
15950         * class.cs: Only init instance field initializers on instance
15951         constructors. 
15952
15953         Rename `constructors' to instance_constructors. 
15954
15955         (TypeContainer.AddConstructor): Only add constructors to the list
15956         if it is not static.
15957
15958         Make sure that we handle default_static_constructor independently
15959         everywhere where we handle instance_constructors
15960
15961 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
15962
15963         * class.cs: Do not lookup or create a base initializer for a
15964         static constructor.
15965
15966         (ConstructorInitializer.Resolve): use the proper type to lookup
15967         for constructors.
15968
15969         * cs-parser.jay: Report error 1585 (modifiers between type and name).
15970
15971         * enum.cs, interface.cs: Remove CloseType, this is taken care by
15972         in DeclSpace. 
15973
15974         * decl.cs: CloseType is now an virtual method, the default
15975         implementation just closes this type.
15976
15977 2001-12-28  Ravi Pratap  <ravi@ximian.com>
15978
15979         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
15980         to PreserveSig by default. Also emit HideBySig on such methods.
15981
15982         Basically, set the defaults to standard values.
15983
15984         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
15985         argument, if candidate is better, it can't be worse than the best !
15986
15987         (Invocation): Re-write bits to differentiate between methods being
15988         applicable in their expanded form and their normal form - for params
15989         methods of course.
15990
15991         Get rid of use_standard everywhere as only standard conversions are allowed
15992         in overload resolution. 
15993
15994         More spec conformance.
15995
15996 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
15997
15998         * driver.cs: Add --timestamp, to see where the compiler spends
15999         most of its time.
16000
16001         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
16002         `this' in static code.
16003
16004         (SimpleName.DoResolve): Implement in terms of a helper function
16005         that allows static-references to be passed upstream to
16006         MemberAccess.
16007
16008         (Expression.ResolveWithSimpleName): Resolve specially simple
16009         names when called by MemberAccess to implement the special
16010         semantics. 
16011
16012         (Expression.ImplicitReferenceConversion): Handle conversions from
16013         Null to reference types before others, as Null's type is
16014         System.Object. 
16015
16016         * expression.cs (Invocation.EmitCall): Handle the special case of
16017         calling methods declared on a reference type from a ValueType
16018         (Base classes System.Object and System.Enum)
16019
16020         (MemberAccess.Resolve): Only perform lookups on Enumerations if
16021         the left hand side is a TypeExpr, not on every enumeration. 
16022
16023         (Binary.Resolve): If types are reference types, then do a cast to
16024         object on operators != and == of both arguments.
16025
16026         * typemanager.cs (FindMembers): Extract instance and static
16027         members if requested.
16028
16029         * interface.cs (PopulateProperty): Use void_type instead of null
16030         as the return type for the setter method.
16031
16032         (PopulateIndexer): ditto.
16033
16034 2001-12-27  Ravi Pratap  <ravi@ximian.com>
16035
16036         * support.cs (ReflectionParameters): Fix minor bug where we
16037         were examining the wrong parameter for the ParamArray attribute.
16038
16039         Cope with requests for the type of the parameter at position
16040         greater than the params parameter's. We now return the element
16041         type of the params array as that makes more sense.
16042
16043         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
16044         accordingly as we no longer have to extract the element type
16045         ourselves.
16046
16047         (Invocation.OverloadResolve): Update.
16048
16049 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
16050
16051         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
16052         against IEnumerator, test whether the return value is a descendant
16053         of the IEnumerator interface.
16054
16055         * class.cs (Indexer.Define): Use an auxiliary method to implement
16056         the other bits of the method definition.  Begin support for
16057         explicit interface implementation.
16058
16059         (Property.DefineMethod): Use TypeManager.void_type instead of null
16060         for an empty return value.
16061
16062 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
16063
16064         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
16065         dealing with a FieldExpr which is composed of a FieldBuilder, in
16066         the code path we did extract the constant, but we should have
16067         obtained the underlying value to be able to cast it (otherwise we
16068         end up in an infinite loop, this is what Ravi was running into).
16069
16070         (ArrayCreation.UpdateIndices): Arrays might be empty.
16071
16072         (MemberAccess.ResolveMemberAccess): Add support for section
16073         14.5.4.1 that deals with the special case of E.I when E is a type
16074         and something else, that I can be a reference to a static member.
16075
16076         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
16077         handle a particular array type to create byte blobs, it is just
16078         something we dont generate byteblobs for.
16079
16080         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
16081         arguments. 
16082
16083         * location.cs (Push): remove the key from the hashtable that we
16084         are about to add.   This happens for empty files.
16085
16086         * driver.cs: Dispose files after we have parsed them.
16087
16088         (tokenize): new function that only runs the tokenizer on its
16089         input, for speed testing.
16090
16091 2001-12-26  Ravi Pratap  <ravi@ximian.com>
16092
16093         * class.cs (Event.Define): Define the private field only if there
16094         are no accessors defined.
16095
16096         * expression.cs (ResolveMemberAccess): If there is no associated
16097         field with the event, that means we have an event defined with its
16098         own accessors and we should flag error cs0070 since transforming
16099         ourselves into a field is not valid in that case.
16100
16101         * ecore.cs (SimpleName.DoResolve): Same as above.
16102
16103         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
16104         and charset to sane values.
16105
16106 2001-12-25  Ravi Pratap  <ravi@ximian.com>
16107
16108         * assign.cs (DoResolve): Perform check on events only if they 
16109         are being accessed outside the declaring type.
16110
16111         * cs-parser.jay (event_declarations): Update rules to correctly
16112         set the type of the implicit parameter etc.
16113
16114         (add_accessor, remove_accessor): Set current local parameters.
16115
16116         * expression.cs (Binary): For delegate addition and subtraction,
16117         cast the return value from the method into the appropriate delegate
16118         type.
16119
16120 2001-12-24  Ravi Pratap  <ravi@ximian.com>
16121
16122         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
16123         of these as the workaround is unnecessary.
16124
16125         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
16126         delegate data - none of that is needed at all.
16127
16128         Re-write bits to extract the instance expression and the delegate method
16129         correctly.
16130
16131         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
16132         on delegates too.
16133
16134         * attribute.cs (ApplyAttributes): New method to take care of common tasks
16135         of attaching attributes instead of duplicating code everywhere.
16136
16137         * everywhere : Update code to do attribute emission using the above method.
16138
16139 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
16140
16141         * expression.cs (IsParamsMethodApplicable): if there are not
16142         parameters, return immediately.
16143
16144         * ecore.cs: The 0 literal can be implicity converted to an enum
16145         type. 
16146
16147         (SimpleName.DoResolve): First lookup the type, then lookup the
16148         members. 
16149
16150         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
16151         want to get its address.  If the InstanceExpression is not
16152         addressable, store the result in a temporary variable, then get
16153         the address of it.
16154
16155         * codegen.cs: Only display 219 errors on warning level or above. 
16156
16157         * expression.cs (ArrayAccess): Make it implement the
16158         IMemoryLocation interface.
16159
16160         (Binary.DoResolve): handle the operator == (object a, object b)
16161         and operator != (object a, object b) without incurring into a
16162         BoxedCast (because 5 != o should never be performed).
16163
16164         Handle binary enumerator operators.
16165
16166         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
16167         value type, otherwise use Ldelem_ref.
16168
16169         Use precomputed names;
16170
16171         (AddressOf): Implement address of
16172
16173         * cs-parser.jay (labeled_statement): Fix recursive block
16174         addition by reworking the production.
16175
16176         * expression.cs (New.DoEmit): New has a special case:
16177                 
16178                  If we are dealing with a ValueType, we have a few
16179                  situations to deal with:
16180                 
16181                     * The target of New is a ValueType variable, that is
16182                       easy, we just pass this as the variable reference
16183                 
16184                     * The target of New is being passed as an argument,
16185                       to a boxing operation or a function that takes a
16186                       ValueType.
16187                 
16188                       In this case, we need to create a temporary variable
16189                       that is the argument of New.
16190
16191
16192 2001-12-23  Ravi Pratap  <ravi@ximian.com>
16193
16194         * rootcontext.cs (LookupType): Check that current_type is not null before
16195         going about looking at nested types.
16196
16197         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
16198         not implement the IAssignMethod interface any more.
16199
16200         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
16201         where we tranform them into FieldExprs if they are being resolved from within
16202         the declaring type.
16203
16204         * ecore.cs (SimpleName.DoResolve): Do the same here.
16205
16206         * assign.cs (DoResolve, Emit): Clean up code considerably. 
16207
16208         * ../errors/bug10.cs : Add.
16209
16210         * ../errors/cs0070.cs : Add.
16211
16212         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
16213
16214         * assign.cs : Get rid of EventIsLocal everywhere.
16215
16216 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
16217
16218         * ecore.cs (ConvertIntLiteral): finished the implementation.
16219
16220         * statement.cs (SwitchLabel): Convert the value we are using as a
16221         key before looking up the table.
16222
16223 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
16224
16225         * codegen.cs (EmitTopBlock): Require a Location argument now.
16226
16227         * cs-parser.jay (constructor_declarator): We need to setup
16228         current_local_parameters before we parse the
16229         opt_constructor_initializer, to allow the variables to be bound
16230         to the constructor arguments.
16231
16232         * rootcontext.cs (LookupType): First lookup nested classes in our
16233         class and our parents before we go looking outside our class.
16234
16235         * expression.cs (ConstantFold): Extract/debox the values at the
16236         beginnning. 
16237
16238         * rootcontext.cs (EmitCode): Resolve the constants first before we
16239         resolve the types.  This is not really needed, but it helps debugging.
16240
16241         * statement.cs: report location.
16242
16243         * cs-parser.jay: pass location to throw statement.
16244
16245         * driver.cs: Small bug fix.
16246
16247         * report.cs: Updated format to be 4-zero filled digits.
16248
16249 2001-12-22  Ravi Pratap  <ravi@ximian.com>
16250
16251         * expression.cs (CheckIndices): Fix minor bug where the wrong
16252         variable was being referred to ;-)
16253
16254         (DoEmit): Do not call EmitStaticInitializers when the 
16255         underlying type is System.Object.
16256
16257 2001-12-21  Ravi Pratap  <ravi@ximian.com>
16258
16259         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
16260         and do the usual workaround for SRE.
16261
16262         * class.cs (MyEventBuilder.EventType): New member to get at the type
16263         of the event, quickly.
16264
16265         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
16266
16267         * assign.cs (Assign.DoResolve): Handle the case when the target
16268         is an EventExpr and perform the necessary checks.
16269
16270         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
16271         interface.
16272
16273         (SimpleName.MemberStaticCheck): Include check for EventExpr.
16274
16275         (EventExpr): Set the type in the constructor itself since we 
16276         are meant to be born fully resolved.
16277
16278         (EventExpr.Define): Revert code I wrote earlier.
16279                 
16280         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
16281         instance expression is null. The instance expression is a This in that case
16282         or a null, depending on whether it is a static method or not.
16283
16284         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
16285         refers to more than one method.
16286
16287         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
16288         and accordingly flag errors.
16289
16290 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
16291
16292         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
16293
16294 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
16295
16296         * location.cs (ToString): Provide useful rutine.
16297
16298 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
16299
16300         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
16301         objects, return the actual integral boxed.
16302
16303         * statement.cs (SwitchLabel): define an ILLabel for each
16304         SwitchLabel. 
16305
16306         (Switch.CheckSwitch): If the value is a Literal, extract
16307         the underlying literal.
16308
16309         Also in the unused hashtable we had, add the SwitchLabel so we can
16310         quickly look this value up.
16311
16312         * constant.cs: Implement a bunch of new constants.  Rewrite
16313         Literal based on this.  Made changes everywhere to adapt to this.
16314
16315         * expression.cs (Expression.MakeByteBlob): Optimize routine by
16316         dereferencing array only once, and also copes with enumrations.
16317
16318         bytes are two bytes wide, not one.
16319
16320         (Cast): Perform constant conversions.
16321
16322         * ecore.cs (TryImplicitIntConversion): Return literals instead of
16323         wrappers to the literals here.
16324
16325         * expression.cs (DoNumericPromotions): long literals can converted
16326         to ulong implicity (this is taken care of elsewhere, but I was
16327         missing this spot).
16328
16329         * ecore.cs (Expression.Literalize): Make the return type Literal,
16330         to improve type checking.
16331
16332         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
16333
16334 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
16335
16336         * literal.cs: Revert code from ravi that checked the bounds.  The
16337         bounds are sane by the definition of the type itself. 
16338
16339         * typemanager.cs: Fix implementation of ImplementsInterface.  We
16340         need to actually look up in our parent hierarchy for interfaces
16341         implemented. 
16342
16343         * const.cs: Use the underlying type for enumerations
16344
16345         * delegate.cs: Compute the basename for the delegate creation,
16346         that should fix the delegate test case, and restore the correct
16347         Type Lookup semantics in rootcontext
16348
16349         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
16350         referencing a nested type with the Reflection API is using the "+"
16351         sign. 
16352
16353         * cs-parser.jay: Do not require EOF token at the end.
16354
16355 2001-12-20  Ravi Pratap  <ravi@ximian.com>
16356
16357         * rootcontext.cs (LookupType): Concatenate type names with
16358         a '.' instead of a '+' The test suite passes again.
16359
16360         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
16361         field of the enumeration.
16362
16363         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
16364         the case when the member is an EventExpr.
16365
16366         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
16367         static has an associated instance expression.
16368
16369         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
16370
16371         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
16372
16373         * class.cs (Event.Define): Register event and perform appropriate checks
16374         for error #111.
16375
16376         We define the Add and Remove methods even if the use provides none because
16377         in that case, we provide default implementations ourselves.
16378
16379         Define a private field of the type of the event. This is done by the CSC compiler
16380         and we should be doing it too ;-)
16381
16382         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
16383         More methods we use in code we generate.
16384
16385         (multicast_delegate_type, delegate_type): Two separate types since the distinction
16386         is important.
16387
16388         (InitCoreTypes): Update accordingly for the above.
16389
16390         * class.cs (Event.Emit): Generate code for default accessors that we provide
16391
16392         (EmitDefaultMethod): Do the job in the above.
16393
16394         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
16395         appropriate place.
16396
16397 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
16398
16399         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
16400         builders even if we were missing one.
16401
16402         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
16403         pass the Basename as our class name instead of the Name.  The
16404         basename will be correctly composed for us.
16405
16406         * parameter.cs (Paramters): Now takes a Location argument.
16407
16408         * decl.cs (DeclSpace.LookupType): Removed convenience function and
16409         make all the code call directly LookupType in RootContext and take
16410         this chance to pass the Location information everywhere.
16411
16412         * Everywhere: pass Location information.
16413
16414 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
16415
16416         * class.cs (Constructor.Define): Updated way of detecting the
16417         length of the parameters.
16418
16419         (TypeContainer.DefineType): Use basename as the type name for
16420         nested types.
16421
16422         (TypeContainer.Define): Do not recursively define types here, as
16423         definition is taken care in order by the RootContext.
16424
16425         * tree.cs: Keep track of namespaces in a per-file basis.
16426
16427         * parameter.cs (Parameter.ComputeSignature): Update to use
16428         DeclSpace. 
16429
16430         (Parameters.GetSignature): ditto.
16431
16432         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
16433         instead of a TypeContainer.
16434
16435         (Interface.SemanticAnalysis): Use `this' instead of our parent to
16436         resolve names.  Because we need to be resolve in our context, not
16437         our parents.
16438
16439         * driver.cs: Implement response files.
16440
16441         * class.cs (TypeContainer.DefineType): If we are defined, do not
16442         redefine ourselves.
16443
16444         (Event.Emit): Emit the code for add/remove handlers.
16445         (Event.Define): Save the MethodBuilders for add/remove.
16446
16447         * typemanager.cs: Use pair here too.
16448
16449         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
16450         DictionaryEntry requires the first argument to be non-null.  
16451
16452         (enum_declaration): Compute full name for registering the
16453         enumeration.
16454
16455         (delegate_declaration): Instead of using
16456         formal_parameter_list, use opt_formal_parameter_list as the list
16457         can be empty.
16458
16459         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
16460         (EventParsing): New property that controls whether `add' and
16461         `remove' are returned as tokens or identifiers (for events);
16462
16463 2001-12-19  Ravi Pratap  <ravi@ximian.com>
16464
16465         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
16466         use MyEventBuilder only and let it wrap the real builder for us.
16467
16468         (MyEventBuilder): Revamp constructor etc.
16469
16470         Implement all operations that we perform on EventBuilder in precisely the same
16471         way here too.
16472
16473         (FindMembers): Update to use the EventBuilder member.
16474
16475         (Event.Emit): Update accordingly.
16476
16477 2001-12-18  Ravi Pratap  <ravi@ximian.com>
16478
16479         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
16480         by calling the appropriate methods.
16481
16482         (GetCustomAttributes): Make stubs as they cannot possibly do anything
16483         useful.
16484
16485         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
16486
16487 2001-12-17  Ravi Pratap  <ravi@ximian.com>
16488
16489         * delegate.cs (Delegate.Populate): Check that the return type
16490         and various parameters types are indeed accessible.
16491
16492         * class.cs (Constructor.Define): Same here.
16493
16494         (Field.Define): Ditto.
16495
16496         (Event.Define): Ditto.
16497
16498         (Operator.Define): Check that the underlying Method defined itself
16499         correctly - so it's MethodBuilder should not be null.
16500
16501         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
16502         expression happens to be null.
16503
16504         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
16505         members but as of now we don't seem to be able to do anything really useful with it.
16506
16507         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
16508         not the EventBuilder.
16509
16510 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
16511
16512         * cs-tokenizer.cs: Add support for defines.
16513         Add support for #if, #elif, #else, #endif
16514
16515         (eval_var): evaluates a variable.
16516         (eval): stubbed for evaluating functions.
16517
16518         * cs-parser.jay: Pass the defines information
16519
16520         * driver.cs: Add --define command line option.
16521
16522         * decl.cs: Move MemberCore here.
16523
16524         Make it the base class for DeclSpace.  This allows us to catch and
16525         report 108 and 109 for everything now.
16526
16527         * class.cs (TypeContainer.Define): Extract all the members
16528         before populating and emit the warning 108 (new keyword required
16529         to override) instead of having each member implement this.
16530
16531         (MemberCore.Define): New abstract method, we will be using this in
16532         the warning reporting engine in Populate.
16533
16534         (Operator.Define): Adjust to new MemberCore protocol. 
16535
16536         * const.cs (Const): This does not derive from Expression, it is a
16537         temporary object we use to create fields, it is a MemberCore. 
16538
16539         * class.cs (Method.Define): Allow the entry point to be in a
16540         specific class.
16541
16542         * driver.cs: Rewrite the argument handler to clean it up a bit.
16543
16544         * rootcontext.cs: Made it just an auxiliary namespace feature by
16545         making everything static.
16546
16547         * driver.cs: Adapt code to use RootContext type name instead of
16548         instance variable.
16549
16550         * delegate.cs: Remove RootContext argument.
16551
16552         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
16553         argument. 
16554
16555         * class.cs (Event.Define): The lookup can fail.
16556
16557         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
16558
16559         * expression.cs: Resolve the this instance before invoking the code.
16560
16561 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
16562
16563         * cs-parser.jay: Add a production in element_access that allows
16564         the thing to become a "type" reference.  This way we can parse
16565         things like "(string [])" as a type.
16566
16567         Note that this still does not handle the more complex rules of
16568         casts. 
16569
16570
16571         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
16572
16573         * ecore.cs: (CopyNewMethods): new utility function used to
16574         assemble the list of methods from running FindMembers.
16575
16576         (MemberLookup): Rework FindMembers so that 
16577
16578 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
16579
16580         * class.cs (TypeContainer): Remove Delegates who fail to be
16581         defined.
16582
16583         * delegate.cs (Populate): Verify that we dont get null return
16584         values.   TODO: Check for AsAccessible.
16585
16586         * cs-parser.jay: Use basename to emit error 574 (destructor should
16587         have the same name as container class), not the full name.
16588
16589         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
16590         possible representation.  
16591
16592         Also implements integer type suffixes U and L.
16593
16594 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
16595
16596         * expression.cs (ArrayCreation.DoResolve): We need to do the
16597         argument resolution *always*.
16598
16599         * decl.cs: Make this hold the namespace.  Hold the root context as
16600         well.
16601         (LookupType): Move here.
16602
16603         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
16604
16605         * location.cs (Row, Name): Fixed the code, it was always returning
16606         references to the first file.
16607
16608         * interface.cs: Register properties defined through interfaces.
16609
16610         * driver.cs: Add support for globbing on the command line
16611
16612         * class.cs (Field): Make it derive from MemberCore as well.
16613         (Event): ditto.
16614
16615 2001-12-15  Ravi Pratap  <ravi@ximian.com>
16616
16617         * class.cs (Event::Define): Check that the type of the event is a delegate
16618         type else flag error #66.
16619
16620         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
16621         same.
16622
16623         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
16624         values of EntryPoint, CharSet etc etc.
16625
16626         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
16627
16628         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
16629         be null and we should ignore this. I am not sure if this is really clean. Apparently,
16630         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
16631         which needs this to do its work.
16632
16633         * ../errors/cs0066.cs : Add.
16634
16635 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
16636
16637         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
16638         helper functions.
16639
16640         * class.cs: (MethodSignature.MethodSignature): Removed hack that
16641         clears out the parameters field.
16642         (MemberSignatureCompare): Cleanup
16643
16644         (MemberCore): New base class used to share code between MethodCore
16645         and Property.
16646
16647         (RegisterRequiredImplementations) BindingFlags.Public requires
16648         either BindingFlags.Instace or Static.  Use instance here.
16649
16650         (Property): Refactored code to cope better with the full spec.
16651
16652         * parameter.cs (GetParameterInfo): Return an empty array instead
16653         of null on error.
16654
16655         * class.cs (Property): Abstract or extern properties have no bodies.
16656
16657         * parameter.cs (GetParameterInfo): return a zero-sized array.
16658
16659         * class.cs (TypeContainer.MethodModifiersValid): Move all the
16660         method modifier validation to the typecontainer so we can reuse
16661         this on properties.
16662
16663         (MethodCore.ParameterTypes): return an empty sized array of types.
16664
16665         (Property.Define): Test property modifier validity.
16666
16667         Add tests for sealed/override too.
16668
16669         (Method.Emit): abstract or extern methods have no bodies.
16670
16671 2001-12-14  Ravi Pratap  <ravi@ximian.com>
16672
16673         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
16674         thing.
16675
16676         (Method::Define, ::Emit): Modify accordingly.
16677
16678         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
16679
16680         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
16681
16682         * makefile: Pass in /unsafe.
16683
16684 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
16685
16686         * class.cs (MakeKey): Kill routine.
16687
16688         * class.cs (TypeContainer.Define): Correctly define explicit
16689         method implementations (they require the full interface name plus
16690         the method name).
16691
16692         * typemanager.cs: Deply the PtrHashtable here and stop using the
16693         lame keys.  Things work so much better.
16694
16695         This of course broke everyone who depended on `RegisterMethod' to
16696         do the `test for existance' test.  This has to be done elsewhere.
16697
16698         * support.cs (PtrHashtable): A hashtable that avoid comparing with
16699         the object stupid Equals method (because, that like fails all over
16700         the place).  We still do not use it.
16701
16702         * class.cs (TypeContainer.SetRequiredInterface,
16703         TypeContainer.RequireMethods): Killed these two routines and moved
16704         all the functionality to RegisterRequiredImplementations.
16705
16706         (TypeContainer.RegisterRequiredImplementations): This routine now
16707         registers all the implementations required in an array for the
16708         interfaces and abstract methods.  We use an array of structures
16709         which can be computed ahead of time to reduce memory usage and we
16710         also assume that lookups are cheap as most classes will not
16711         implement too many interfaces.
16712
16713         We also avoid creating too many MethodSignatures.
16714
16715         (TypeContainer.IsInterfaceMethod): Update and optionally does not
16716         clear the "pending" bit if we find that there are problems with
16717         the declaration.
16718
16719         (TypeContainer.VerifyPendingMethods): Update to report errors of
16720         methods that look like implementations but are not.
16721
16722         (TypeContainer.Define): Add support for explicit interface method
16723         implementation. 
16724
16725 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
16726
16727         * typemanager.cs: Keep track of the parameters here instead of
16728         being a feature of the TypeContainer.
16729
16730         * class.cs: Drop the registration of parameters here, as
16731         InterfaceMethods are also interface declarations.
16732
16733         * delegate.cs: Register methods with the TypeManager not only with
16734         the TypeContainer.  This code was buggy.
16735
16736         * interface.cs: Full registation here.
16737
16738 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
16739
16740         * expression.cs: Remove reducer for binary expressions, it can not
16741         be done this way.
16742
16743         * const.cs: Put here the code that used to go into constant.cs
16744
16745         * constant.cs: Put here the code for constants, this is a new base
16746         class for Literals.
16747
16748         * literal.cs: Make Literal derive from Constant.
16749
16750 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
16751
16752         * statement.cs (Return.Emit): Report error 157 if the user
16753         attempts to return from a finally block.
16754
16755         (Return.Emit): Instead of emitting a return, jump to the end of
16756         the function.
16757
16758         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
16759         LocalBuilder to store the result of the function.  ReturnLabel is
16760         the target where we jump.
16761
16762
16763 2001-12-09  Radek Doulik  <rodo@ximian.com>
16764
16765         * cs-parser.jay: remember alias in current namespace
16766
16767         * ecore.cs (SimpleName::DoResolve): use aliases for types or
16768         namespaces
16769
16770         * class.cs (LookupAlias): lookup alias in my_namespace
16771
16772         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
16773         aliases hashtable
16774         (LookupAlias): lookup alias in this and if needed in parent
16775         namespaces
16776
16777 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
16778
16779         * support.cs: 
16780
16781         * rootcontext.cs: (ModuleBuilder) Made static, first step into
16782         making things static.  I need this to avoid passing the
16783         TypeContainer when calling ParameterType.
16784
16785         * support.cs (InternalParameters.ParameterType): Remove ugly hack
16786         that did string manipulation to compute the type and then call
16787         GetType.  Use Parameter.ParameterType instead.
16788
16789         * cs-tokenizer.cs: Consume the suffix for floating values.
16790
16791         * expression.cs (ParameterReference): figure out whether this is a
16792         reference parameter or not.  Kill an extra variable by computing
16793         the arg_idx during emission.
16794
16795         * parameter.cs (Parameters.GetParameterInfo): New overloaded
16796         function that returns whether a parameter is an out/ref value or not.
16797
16798         (Parameter.ParameterType): The type of the parameter (base,
16799         without ref/out applied).
16800
16801         (Parameter.Resolve): Perform resolution here.
16802         (Parameter.ExternalType): The full type (with ref/out applied).
16803
16804         * statement.cs (Using.Emit, Using.EmitExpression): Implement
16805         support for expressions on the using statement.
16806
16807 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
16808
16809         * statement.cs (Using.EmitLocalVariableDecls): Split the
16810         localvariable handling of the using statement.
16811
16812         (Block.EmitMeta): Keep track of variable count across blocks.  We
16813         were reusing slots on separate branches of blocks.
16814
16815         (Try.Emit): Emit the general code block, we were not emitting it. 
16816
16817         Check the type of the declaration to be an IDisposable or
16818         something that can be implicity converted to it. 
16819
16820         Emit conversions if required.
16821
16822         * ecore.cs (EmptyExpression): New utility class.
16823         (Expression.ImplicitConversionExists): New utility function.
16824
16825 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
16826
16827         * statement.cs (Using): Implement.
16828
16829         * expression.cs (LocalVariableReference): Support read only variables.
16830
16831         * statement.cs: Remove the explicit emit for the Leave opcode.
16832         (VariableInfo): Add a readonly field.
16833
16834 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
16835
16836         * ecore.cs (ConvCast): new class used to encapsulate the various
16837         explicit integer conversions that works in both checked and
16838         unchecked contexts.
16839
16840         (Expression.ConvertNumericExplicit): Use new ConvCast class to
16841         properly generate the overflow opcodes.
16842
16843 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16844
16845         * statement.cs: The correct type for the EmptyExpression is the
16846         element_type, not the variable type.  Ravi pointed this out.
16847
16848 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16849
16850         * class.cs (Method::Define): Handle PInvoke methods specially
16851         by using DefinePInvokeMethod instead of the usual one.
16852
16853         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
16854         above to do the task of extracting information and defining the method.
16855
16856 2001-12-04  Ravi Pratap  <ravi@ximian.com>
16857
16858         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
16859         of the condition for string type.
16860
16861         (Emit): Move that here. 
16862
16863         (ArrayCreation::CheckIndices): Keep string literals in their expression
16864         form.
16865
16866         (EmitDynamicInitializers): Handle strings appropriately.
16867
16868 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
16869
16870         * codegen.cs (EmitContext): Replace multiple variables with a
16871         single pointer to the current Switch statement.
16872
16873         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
16874         EmitContext.
16875
16876 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16877
16878         * statement.cs 
16879
16880         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
16881         default'.
16882
16883         (Foreach.Emit): Foreach on arrays was not setting
16884         up the loop variables (for break/continue).
16885
16886         (GotoCase): Semi-implented.
16887
16888 2001-12-03  Ravi Pratap  <ravi@ximian.com>
16889
16890         * attribute.cs (CheckAttribute): Handle system attributes by using
16891         Attribute.GetAttributes to examine information we need.
16892
16893         (GetValidPlaces): Same here.
16894
16895         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
16896
16897         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
16898
16899         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
16900
16901         (Method::Define): Set appropriate flags if we have a DllImport attribute.
16902
16903         (Method::Emit): Handle the case when we are a PInvoke method.
16904
16905 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
16906
16907         * expression.cs: Use ResolveWithSimpleName on compound names.
16908
16909 2001-12-02  Ravi Pratap  <ravi@ximian.com>
16910
16911         * constant.cs (EmitConstant): Make sure we resolve the associated expression
16912         before trying to reduce it.
16913
16914         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
16915
16916         * constant.cs (LookupConstantValue): Implement.
16917
16918         (EmitConstant): Use the above in emitting the constant.
16919
16920         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
16921         that are user-defined by doing a LookupConstantValue on them.
16922
16923         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
16924         too, like above.
16925
16926 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
16927
16928         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
16929
16930         (BaseAccess.DoResolve): Implement.
16931
16932         (MemberAccess.DoResolve): Split this routine into a
16933         ResolveMemberAccess routine that can be used independently
16934
16935 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
16936
16937         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
16938         As that share bits of the implementation.  Is returns a boolean,
16939         while As returns the Type that is being probed.
16940
16941 2001-12-01  Ravi Pratap  <ravi@ximian.com>
16942
16943         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
16944         instead of a Literal - much easier.
16945
16946         (EnumInTransit): Remove - utterly useless :-)
16947
16948         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
16949
16950         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
16951
16952         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
16953         chain when we have no associated expression.
16954
16955 2001-11-30  Ravi Pratap  <ravi@ximian.com>
16956
16957         * constant.cs (Define): Use Location while reporting the errror.
16958
16959         Also emit a warning when 'new' is used and there is no inherited
16960         member to hide.
16961
16962         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
16963         populated.
16964
16965         (LookupEnumValue): Implement to lookup an enum member's value and define it
16966         if necessary.
16967
16968         (Populate): Re-write accordingly to use the above routine.
16969
16970 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
16971
16972         * expression.cs (This): Fix prototype for DoResolveLValue to
16973         override the base class DoResolveLValue.
16974
16975         * cs-parser.cs: Report errors cs574 and cs575 (destructor
16976         declarations) 
16977
16978         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
16979         (we need to load the address of the field here).  This fixes
16980         test-22. 
16981
16982         (FieldExpr.DoResolveLValue): Call the DoResolve
16983         function to initialize the Instance expression.
16984
16985         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
16986         correctly the GetEnumerator operation on a value type.
16987
16988         * cs-parser.jay: Add more simple parsing error catches.
16989
16990         * statement.cs (Switch): Add support for string switches.
16991         Handle null specially.
16992
16993         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
16994
16995 2001-11-28  Ravi Pratap  <ravi@ximian.com>
16996
16997         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
16998
16999         (declare_local_constant): New helper function.
17000
17001         * statement.cs (AddConstant): Keep a separate record of constants
17002
17003         (IsConstant): Implement to determine if a variable is a constant.
17004
17005         (GetConstantExpression): Implement.
17006
17007         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
17008
17009         * statement.cs (IsVariableDefined): Re-write.
17010
17011 2001-11-27  Ravi Pratap  <ravi@ximian.com>
17012
17013         * class.cs (TypeContainer::FindMembers): Look for constants
17014         in the case when we are looking for MemberTypes.Field
17015
17016         * expression.cs (MemberAccess::DoResolve): Check that in the
17017         case we are a FieldExpr and a Literal, we are not being accessed
17018         by an instance reference.
17019
17020         * cs-parser.jay (local_constant_declaration): Implement.
17021
17022         (declaration_statement): Implement for constant declarations.
17023
17024 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
17025
17026         * statement.cs (Switch): Catch double defaults.
17027
17028         (Switch): More work on the switch() statement
17029         implementation.  It works for integral values now, need to finish
17030         string support.
17031
17032
17033 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
17034
17035         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
17036         integer literals into other integer literals.  To be used by
17037         switch. 
17038
17039 2001-11-24  Ravi Pratap  <ravi@ximian.com>
17040
17041         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
17042         some memory.
17043
17044         (EmitDynamicInitializers): Cope with the above since we extract data
17045         directly from ArrayData now.
17046
17047         (ExpectInitializers): Keep track of whether initializers are mandatory
17048         or not.
17049
17050         (Bounds): Make it a hashtable to prevent the same dimension being 
17051         recorded for every element in that dimension.
17052
17053         (EmitDynamicInitializers): Fix bug which prevented the Set array method
17054         from being found.
17055
17056         Also fix bug which was causing the indices to be emitted in the reverse
17057         order.
17058
17059 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
17060
17061         * expression.cs (ArrayCreation): Implement the bits that Ravi left
17062         unfinished.  They do not work, because the underlying code is
17063         sloppy.
17064
17065 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
17066
17067         * cs-parser.jay: Remove bogus fixme.
17068
17069         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
17070         on Switch statement.
17071
17072 2001-11-23  Ravi Pratap  <ravi@ximian.com>
17073
17074         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
17075         the same. 
17076
17077         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
17078         parameter. Apparently, any expression is allowed. 
17079
17080         (ValidateInitializers): Update accordingly.
17081
17082         (CheckIndices): Fix some tricky bugs thanks to recursion.
17083
17084         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
17085         I was being completely brain-dead.
17086
17087         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
17088         and re-write acordingly.
17089
17090         (DelegateInvocation): Re-write accordingly.
17091
17092         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
17093
17094         (MakeByteBlob): Handle types more correctly.
17095
17096         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
17097         initialization from expressions but it is incomplete because I am a complete
17098         Dodo :-|
17099
17100 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
17101
17102         * statement.cs (If.Emit): Fix a bug that generated incorrect code
17103         on If.  Basically, we have to return `true' (ie, we do return to
17104         our caller) only if both branches of the if return.
17105
17106         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
17107         short-circuit operators, handle them as short circuit operators. 
17108
17109         (Cast.DoResolve): Resolve type.
17110         (Cast.Cast): Take an expression as the target type.
17111
17112         * cs-parser.jay (cast_expression): Remove old hack that only
17113         allowed a limited set of types to be handled.  Now we take a
17114         unary_expression and we resolve to a type during semantic
17115         analysis.
17116
17117         Use the grammar productions from Rhys to handle casts (this is
17118         not complete like Rhys syntax yet, we fail to handle that corner
17119         case that C# has regarding (-x), but we will get there.
17120
17121 2001-11-22  Ravi Pratap  <ravi@ximian.com>
17122
17123         * class.cs (EmitFieldInitializer): Take care of the case when we have a
17124         field which is an array type.
17125
17126         * cs-parser.jay (declare_local_variables): Support array initialization too.
17127
17128         * typemanager.cs (MakeKey): Implement.
17129
17130         (everywhere): Use the above appropriately.
17131
17132         * cs-parser.jay (for_statement): Update for array initialization while
17133         declaring variables.
17134
17135         * ecore.cs : The error message was correct, it's the variable's names that
17136         were misleading ;-) Make the code more readable.
17137
17138         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
17139         the correct type etc.
17140
17141         (ConvertExplicit): Handle Enum types by examining the underlying type.
17142
17143 2001-11-21  Ravi Pratap  <ravi@ximian.com>
17144
17145         * parameter.cs (GetCallingConvention): Always return
17146         CallingConventions.Standard for now.
17147
17148 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
17149
17150         * expression.cs (Binary.ResolveOperator): Update the values of `l'
17151         and `r' after calling DoNumericPromotions.
17152
17153         * ecore.cs: Fix error message (the types were in the wrong order).
17154
17155         * statement.cs (Foreach.ProbeCollectionType): Need to pass
17156         BindingFlags.Instance as well 
17157
17158         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
17159         implicit int literal conversion in an empty cast so that we
17160         propagate the right type upstream.
17161
17162         (UnboxCast): new class used to unbox value types.
17163         (Expression.ConvertExplicit): Add explicit type conversions done
17164         by unboxing.
17165
17166         (Expression.ImplicitNumericConversion): Oops, forgot to test for
17167         the target type before applying the implicit LongLiterals to ULong
17168         literal cast.
17169
17170 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
17171
17172         * cs-parser.jay (for_statement): Reworked the way For works: now
17173         we declare manually any variables that are introduced in
17174         for_initializer to solve the problem of having out-of-band code
17175         emition (that is what got for broken).
17176
17177         (declaration_statement): Perform the actual variable declaration
17178         that used to be done in local_variable_declaration here.
17179
17180         (local_variable_declaration): Do not declare anything, just pass
17181         the information on a DictionaryEntry
17182
17183 2001-11-20  Ravi Pratap  <ravi@ximian.com>
17184
17185         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
17186         re-write of the logic to now make it recursive.
17187
17188         (UpdateIndices): Re-write accordingly.
17189
17190         Store element data in a separate ArrayData list in the above methods.
17191
17192         (MakeByteBlob): Implement to dump the array data into a byte array.
17193
17194 2001-11-19  Ravi Pratap  <ravi@ximian.com>
17195
17196         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
17197         into CheckIndices.
17198
17199         * constant.cs (Define): Implement.
17200
17201         (EmitConstant): Re-write fully.
17202
17203         Pass in location info.
17204
17205         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
17206         respectively.
17207
17208         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
17209         DictionaryEntry since we need location info too.
17210
17211         (constant_declaration): Update accordingly.
17212
17213         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
17214         code into another method : UpdateIndices.
17215
17216 2001-11-18  Ravi Pratap  <ravi@ximian.com>
17217
17218         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
17219         some type checking etc.
17220
17221 2001-11-17  Ravi Pratap  <ravi@ximian.com>
17222
17223         * expression.cs (ArrayCreation::ValidateInitializers): Implement
17224         bits to provide dimension info if the user skips doing that.
17225
17226         Update second constructor to store the rank correctly.
17227
17228 2001-11-16  Ravi Pratap  <ravi@ximian.com>
17229
17230         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
17231         and try to implement.
17232
17233         * ../errors/cs0150.cs : Add.
17234
17235         * ../errors/cs0178.cs : Add.
17236
17237 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
17238
17239         * statement.cs: Implement foreach on multi-dimensional arrays. 
17240
17241         * parameter.cs (Parameters.GetParameterByName): Also lookup the
17242         name of the params argument.
17243
17244         * expression.cs: Use EmitStoreOpcode to get the right opcode while
17245         initializing the array.
17246
17247         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
17248         we can use this elsewhere.
17249
17250         * statement.cs: Finish implementation of foreach for single
17251         dimension arrays.
17252
17253         * cs-parser.jay: Use an out-of-band stack to pass information
17254         around, I wonder why I need this.
17255
17256         foreach_block: Make the new foreach_block the current_block.
17257
17258         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
17259         function used to return a static Parameters structure.  Used for
17260         empty parameters, as those are created very frequently.
17261
17262         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
17263
17264 2001-11-15  Ravi Pratap  <ravi@ximian.com>
17265
17266         * interface.cs : Default modifier is private, not public. The
17267         make verify test passes again.
17268
17269 2001-11-15  Ravi Pratap  <ravi@ximian.com>
17270
17271         * support.cs (ReflectionParameters): Fix logic to determine
17272         whether the last parameter is a params one. Test 9 passes again.
17273
17274         * delegate.cs (Populate): Register the builders we define with
17275         RegisterParameterForBuilder. Test 19 passes again.
17276
17277         * cs-parser.jay (property_declaration): Reference $6 instead
17278         of $$ to get at the location.
17279
17280         (indexer_declaration): Similar stuff.
17281
17282         (attribute): Ditto.
17283
17284         * class.cs (Property): Register parameters for the Get and Set methods
17285         if they exist. Test 23 passes again.
17286
17287         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
17288         call to EmitArguments as we are sure there aren't any params arguments. 
17289         Test 32 passes again.
17290
17291         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
17292         IndexOutOfRangeException. 
17293
17294         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
17295         Test 33 now passes again.
17296
17297 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
17298
17299         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
17300         broke a bunch of things.  Will have to come up with a better way
17301         of tracking locations.
17302
17303         * statement.cs: Implemented foreach for single dimension arrays.
17304
17305 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
17306
17307         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
17308         an error.  This removes the lookup from the critical path.
17309
17310         * cs-parser.jay: Removed use of temporary_loc, which is completely
17311         broken. 
17312
17313 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
17314
17315         * support.cs (ReflectionParameters.ParameterModifier): Report
17316         whether the argument is a PARAMS argument or not.
17317
17318         * class.cs: Set the attribute `ParamArrayAttribute' on the
17319         parameter argument.
17320
17321         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
17322         and cons_param_array_attribute (ConstructorInfo for
17323         ParamArrayAttribute)., 
17324
17325         * codegen.cs: Emit the return using the `Return' statement, that
17326         way we can report the error correctly for missing return values. 
17327
17328         * class.cs (Method.Emit): Clean up.
17329
17330         * expression.cs (Argument.Resolve): Take another argument: the
17331         location where this argument is used.  Notice that this is not
17332         part of the "Argument" class as to reduce the size of the
17333         structure (we know the approximate location anyways).
17334
17335         Test if the argument is a variable-reference, if not, then
17336         complain with a 206.
17337
17338         (Argument.Emit): Emit addresses of variables.
17339
17340         (Argument.FullDesc): Simplify.
17341
17342         (Invocation.DoResolve): Update for Argument.Resolve.
17343
17344         (ElementAccess.DoResolve): ditto.
17345
17346         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
17347         method should be virtual, as this method is always virtual.
17348
17349         (NewDelegate.DoResolve): Update for Argument.Resolve.
17350
17351         * class.cs (ConstructorInitializer.DoResolve): ditto.
17352
17353         * attribute.cs (Attribute.Resolve): ditto.
17354
17355 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
17356
17357         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
17358
17359         * expression.cs (ParameterReference): Drop IStackStorage and implement
17360         IAssignMethod instead. 
17361
17362         (LocalVariableReference): ditto.
17363
17364         * ecore.cs (FieldExpr): Drop IStackStorage and implement
17365         IAssignMethod instead. 
17366
17367 2001-11-13  Miguel de Icaza <miguel@ximian.com>
17368
17369         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
17370         enumerations that are used in heavily used structures derive from
17371         byte in a laughable and pathetic attempt to reduce memory usage.
17372         This is the kind of pre-optimzations that you should not do at
17373         home without adult supervision.
17374
17375         * expression.cs (UnaryMutator): New class, used to handle ++ and
17376         -- separatedly from the other unary operators.  Cleans up the
17377         code, and kills the ExpressionStatement dependency in Unary.
17378
17379         (Unary): Removed `method' and `Arguments' from this class, making
17380         it smaller, and moving it all to SimpleCall, so I can reuse this
17381         code in other locations and avoid creating a lot of transient data
17382         strucutres when not required.
17383
17384         * cs-parser.jay: Adjust for new changes.
17385
17386 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
17387
17388         * enum.cs (Enum.Populate): If there is a failure during
17389         definition, return
17390
17391         * cs-parser.jay (opt_enum_base): we used to catch type errors
17392         here, but this is really incorrect.  The type error should be
17393         catched during semantic analysis.
17394
17395 2001-12-11  Ravi Pratap  <ravi@ximian.com>
17396
17397         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
17398         current_local_parameters as expected since I, in my stupidity, had forgotten
17399         to do this :-)
17400
17401         * attribute.cs (GetValidPlaces): Fix stupid bug.
17402
17403         * class.cs (Method::Emit): Perform check on applicability of attributes.
17404
17405         (Constructor::Emit): Ditto.
17406
17407         (Field::Emit): Ditto.
17408
17409         (Field.Location): Store location information.
17410
17411         (Property, Event, Indexer, Operator): Ditto.
17412
17413         * cs-parser.jay (field_declaration): Pass in location for each field.
17414
17415         * ../errors/cs0592.cs : Add.
17416
17417 2001-11-12  Ravi Pratap  <ravi@ximian.com>
17418
17419         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
17420
17421         (InitCoreTypes): Update accordingly.
17422
17423         (RegisterAttrType, LookupAttr): Implement.
17424
17425         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
17426         info about the same.
17427
17428         (Resolve): Update to populate the above as necessary.
17429
17430         (Error592): Helper.
17431
17432         (GetValidPlaces): Helper to the above.
17433
17434         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
17435
17436         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
17437
17438 2001-11-12  Ravi Pratap  <ravi@ximian.com>
17439
17440         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
17441
17442         * ../errors/cs0617.cs : Add.
17443
17444 2001-11-11  Ravi Pratap  <ravi@ximian.com>
17445
17446         * enum.cs (Emit): Rename to Populate to be more consistent with what
17447         we expect it to do and when exactly it is called.
17448
17449         * class.cs, rootcontext.cs : Update accordingly.
17450
17451         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
17452         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
17453
17454         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
17455
17456         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
17457         of a fieldinfo using the above, when dealing with a FieldBuilder.
17458
17459 2001-11-10  Ravi Pratap  <ravi@ximian.com>
17460
17461         * ../errors/cs0031.cs : Add.
17462
17463         * ../errors/cs1008.cs : Add.
17464
17465         * ../errrors/cs0543.cs : Add.
17466
17467         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
17468         enum type.
17469
17470         (FindMembers): Implement.
17471
17472         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
17473         enums and delegates too.
17474
17475         (enum_types): Rename to builder_to_enum.
17476
17477         (delegate_types): Rename to builder_to_delegate.
17478
17479         * delegate.cs (FindMembers): Implement.
17480
17481 2001-11-09  Ravi Pratap  <ravi@ximian.com>
17482
17483         * typemanager.cs (IsEnumType): Implement.
17484
17485         * enum.cs (Emit): Re-write parts to account for the underlying type
17486         better and perform checking etc.
17487
17488         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
17489         of the underlying type.
17490
17491         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
17492         value
17493
17494         * enum.cs (error31): Helper to report error #31.
17495
17496         * cs-parser.jay (enum_declaration): Store location of each member too.
17497
17498         * enum.cs (member_to_location): New hashtable. 
17499
17500         (AddEnumMember): Update location hashtable.
17501
17502         (Emit): Use the location of each member while reporting errors.
17503
17504 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
17505
17506         * cs-parser.jay: A for_initializer if is a
17507         local_variable_declaration really ammount to have an implicit
17508         block with the variable declaration and no initializer for for.
17509
17510         * statement.cs (For.Emit): Cope with null initializers.
17511
17512         This fixes the infinite loop on for initializers.
17513
17514 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
17515
17516         * enum.cs: More cleanup.
17517
17518         * ecore.cs: Remove dead code.
17519
17520         * class.cs (Property.Emit): More simplification.
17521         (Event.Emit): ditto.
17522
17523         Reworked to have less levels of indentation.
17524
17525 2001-11-08  Ravi Pratap  <ravi@ximian.com>
17526
17527         * class.cs (Property): Emit attributes.
17528
17529         (Field): Ditto.
17530
17531         (Event): Ditto.
17532
17533         (Indexer): Ditto.
17534
17535         (Operator): Ditto.
17536
17537         * enum.cs (Emit): Ditto.
17538
17539         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
17540         Enums too.
17541
17542         * class.cs (Field, Event, etc.): Move attribute generation into the
17543         Emit method everywhere.
17544
17545         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
17546         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
17547         as we had no way of defining nested enums !
17548
17549         * rootcontext.cs : Adjust code accordingly.
17550
17551         * typemanager.cs (AddEnumType): To keep track of enum types separately.
17552
17553 2001-11-07  Ravi Pratap  <ravi@ximian.com>
17554
17555         * expression.cs (EvalConstantExpression): Move into ecore.cs
17556
17557         * enum.cs (Enum): Rename some members and make them public and readonly
17558         according to our convention.
17559
17560         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
17561         nothing else.
17562
17563         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
17564
17565         (Enum::Emit): Write a simple version for now which doesn't try to compute
17566         expressions. I shall modify this to be more robust in just a while.
17567
17568         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
17569
17570         (TypeContainer::CloseType): Create the Enum types too.
17571
17572         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
17573
17574         * expression.cs (EvalConstantExpression): Get rid of completely.
17575
17576         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
17577         user-defined values and other cases.
17578
17579         (IsValidEnumLiteral): Helper function.
17580
17581         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
17582         out there in the case we had a literal FieldExpr.
17583
17584         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
17585
17586         (Literalize): Revamp a bit to take two arguments.
17587
17588         (EnumLiteral): New class which derives from Literal to wrap enum literals.
17589
17590 2001-11-06  Ravi Pratap  <ravi@ximian.com>
17591
17592         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
17593
17594         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
17595
17596         (Resolve): Use the above to ensure we have proper initializers.
17597
17598 2001-11-05  Ravi Pratap  <ravi@ximian.com>
17599
17600         * expression.cs (Expression::EvalConstantExpression): New method to 
17601         evaluate constant expressions.
17602
17603         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
17604
17605 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
17606
17607         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
17608         in an array.
17609
17610         (Binary.ResolveOperator): Handle operator != (object a, object b)
17611         and operator == (object a, object b);
17612
17613         (Binary.DoNumericPromotions): Indicate whether the numeric
17614         promotion was possible.
17615
17616         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
17617         Implement.  
17618
17619         Made the ArrayAccess implement interface IAssignMethod instead of
17620         IStackStore as the order in which arguments are passed reflects
17621         this.
17622
17623         * assign.cs: Instead of using expr.ExprClass to select the way of
17624         assinging, probe for the IStackStore/IAssignMethod interfaces.
17625
17626         * typemanager.cs: Load InitializeArray definition.
17627
17628         * rootcontext.cs (RootContext.MakeStaticData): Used to define
17629         static data that can be used to initialize arrays. 
17630
17631 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
17632
17633         * expression.cs: Handle operator== and operator!= for booleans.
17634
17635         (Conditioal.Reduce): Implement reducer for the ?: operator.
17636
17637         (Conditional.Resolve): Implement dead code elimination.
17638
17639         (Binary.Resolve): Catch string literals and return a new
17640         concatenated string.
17641
17642         (Unary.Reduce): Implement reduction of unary expressions.
17643
17644         * ecore.cs: Split out the expression core handling here.
17645
17646         (Expression.Reduce): New method used to perform constant folding
17647         and CSE.  This is needed to support constant-expressions. 
17648
17649         * statement.cs (Statement.EmitBoolExpression): Pass true and false
17650         targets, and optimize for !x.
17651
17652 2001-11-04  Ravi Pratap  <ravi@ximian.com>
17653
17654         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
17655         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
17656         set custom atttributes.
17657
17658         * literal.cs (Literal::GetValue): New abstract method to return the actual
17659         value of the literal, cast as an object.
17660
17661         (*Literal): Implement GetValue method.
17662
17663         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
17664         expressions to the arraylist but objects of type Argument.
17665
17666         * class.cs (TypeContainer::Emit): Emit our attributes too.
17667
17668         (Method::Emit, Constructor::Emit): Ditto.
17669
17670         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
17671         to be ignoring earlier.
17672
17673 2001-11-03  Ravi Pratap  <ravi@ximian.com>
17674
17675         * attribute.cs (AttributeSection::Define): Implement to do the business
17676         of constructing a CustomAttributeBuilder.
17677
17678         (Attribute): New trivial class. Increases readability of code.  
17679
17680         * cs-parser.jay : Update accordingly.
17681
17682         (positional_argument_list, named_argument_list, named_argument): New rules
17683
17684         (attribute_arguments): Use the above so that we are more correct.
17685
17686 2001-11-02  Ravi Pratap  <ravi@ximian.com>
17687
17688         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
17689         to perform all checks for a method with a params parameter.
17690
17691         (Invocation::OverloadResolve): Update to use the above method and therefore
17692         cope correctly with params method invocations.
17693
17694         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
17695         params too.
17696
17697         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
17698         constructors in our parent too because we can't afford to miss out on 
17699         protected ones ;-)
17700
17701         * attribute.cs (AttributeSection): New name for the class Attribute
17702
17703         Other trivial changes to improve readability.
17704
17705         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
17706         use the new class names.
17707
17708 2001-11-01  Ravi Pratap  <ravi@ximian.com>
17709
17710         * class.cs (Method::Define): Complete definition for params types too
17711
17712         (Indexer::Define): Ditto.
17713
17714         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
17715         Cope everywhere with a request for info about the array parameter.
17716
17717 2001-11-01  Ravi Pratap  <ravi@ximian.com>
17718
17719         * tree.cs (RecordNamespace): Fix up to check for the correct key.
17720
17721         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
17722         local_variable_type to extract the string corresponding to the type.
17723
17724         (local_variable_type): Fixup the action to use the new helper method.
17725
17726         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
17727         go.
17728
17729         * expression.cs : Clean out code which uses the above.
17730
17731 2001-10-31  Ravi Pratap  <ravi@ximian.com>
17732
17733         * typemanager.cs (RegisterMethod): Check if we already have an existing key
17734         and bale out if necessary by returning a false.
17735
17736         (RegisterProperty): Ditto.
17737
17738         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
17739         and print out appropriate error messages.
17740
17741         * interface.cs (everywhere): Ditto.
17742
17743         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
17744         location to constructor.
17745
17746         * class.cs (Property, Event, Indexer): Update accordingly.
17747
17748         * ../errors/cs111.cs : Added.
17749
17750         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
17751         of a method, as laid down by the spec.
17752
17753         (Invocation::OverloadResolve): Use the above method.
17754
17755 2001-10-31  Ravi Pratap  <ravi@ximian.com>
17756
17757         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
17758         now take a TypeContainer and a Parameters object.
17759
17760         (ParameterData): Modify return type of ParameterModifier method to be 
17761         Parameter.Modifier and not a string.
17762
17763         (ReflectionParameters, InternalParameters): Update accordingly.
17764
17765         * expression.cs (Argument::GetParameterModifier): Same here.
17766
17767         * support.cs (InternalParameters::ParameterType): Find a better way of determining
17768         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
17769         symbol in it at all so maybe this is only for now.
17770
17771 2001-10-30  Ravi Pratap  <ravi@ximian.com>
17772
17773         * support.cs (InternalParameters): Constructor now takes an extra argument 
17774         which is the actual Parameters class.
17775
17776         (ParameterDesc): Update to provide info on ref/out modifiers.
17777
17778         * class.cs (everywhere): Update call to InternalParameters to pass in
17779         the second argument too.
17780
17781         * support.cs (ParameterData): Add ParameterModifier, which is a method 
17782         to return the modifier info [ref/out etc]
17783
17784         (InternalParameters, ReflectionParameters): Implement the above.
17785
17786         * expression.cs (Argument::ParameterModifier): Similar function to return
17787         info about the argument's modifiers.
17788
17789         (Invocation::OverloadResolve): Update to take into account matching modifiers 
17790         too.
17791
17792         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
17793         a new SetFormalParameters object which we pass to InternalParameters.
17794
17795 2001-10-30  Ravi Pratap  <ravi@ximian.com>
17796
17797         * expression.cs (NewArray): Merge into the ArrayCreation class.
17798
17799 2001-10-29  Ravi Pratap  <ravi@ximian.com>
17800
17801         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
17802         NewUserdefinedArray into one as there wasn't much of a use in having
17803         two separate ones.
17804
17805         * expression.cs (Argument): Change field's name to ArgType from Type.
17806
17807         (Type): New readonly property which returns the proper type, taking into 
17808         account ref/out modifiers.
17809
17810         (everywhere): Adjust code accordingly for the above.
17811
17812         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
17813         whether we are emitting for a ref or out parameter.
17814
17815         * expression.cs (Argument::Emit): Use the above field to set the state.
17816
17817         (LocalVariableReference::Emit): Update to honour the flag and emit the
17818         right stuff.
17819
17820         * parameter.cs (Attributes): Set the correct flags for ref parameters.
17821
17822         * expression.cs (Argument::FullDesc): New function to provide a full desc.
17823
17824         * support.cs (ParameterData): Add method ParameterDesc to the interface.
17825
17826         (ReflectionParameters, InternalParameters): Implement the above method.
17827
17828         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
17829         reporting errors.
17830
17831         (Invocation::FullMethodDesc): Ditto. 
17832
17833 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
17834
17835         * cs-parser.jay: Add extra production for the second form of array
17836         creation. 
17837
17838         * expression.cs (ArrayCreation): Update to reflect the above
17839         change. 
17840
17841         * Small changes to prepare for Array initialization.
17842
17843 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
17844
17845         * typemanager.cs (ImplementsInterface): interface might be null;
17846         Deal with this problem;
17847
17848         Also, we do store negative hits on the cache (null values), so use
17849         this instead of calling t.GetInterfaces on the type everytime.
17850
17851 2001-10-28  Ravi Pratap  <ravi@ximian.com>
17852
17853         * typemanager.cs (IsBuiltinType): New method to help determine the same.
17854
17855         * expression.cs (New::DoResolve): Get rid of array creation code and instead
17856         split functionality out into different classes.
17857
17858         (New::FormArrayType): Move into NewBuiltinArray.
17859
17860         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
17861         quite useless.
17862
17863         (NewBuiltinArray): New class to handle creation of built-in arrays.
17864
17865         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
17866         account creation of one-dimensional arrays.
17867
17868         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
17869
17870         (NewUserdefinedArray::DoResolve): Implement.
17871
17872         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
17873
17874         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
17875         we maintain inside the TypeManager. This is necessary to perform lookups on the
17876         module builder.
17877
17878         (LookupType): Update to perform GetType on the module builders too.     
17879
17880         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
17881
17882         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
17883
17884 2001-10-23  Ravi Pratap  <ravi@ximian.com>
17885
17886         * expression.cs (New::DoResolve): Implement guts of array creation.
17887
17888         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
17889
17890 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
17891
17892         * expression.cs: Fix bug I introduced lsat night that broke
17893         Delegates. 
17894
17895         (Expression.Resolve): Report a 246 error (can not resolve name)
17896         if we find a SimpleName in the stream.
17897
17898         (Expression.ResolveLValue): Ditto.
17899
17900         (Expression.ResolveWithSimpleName): This function is a variant of
17901         ResolveName, this one allows SimpleNames to be returned without a
17902         warning.  The only consumer of SimpleNames is MemberAccess
17903
17904 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
17905
17906         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
17907         might arrive here.  I have my doubts that this is correct.
17908
17909         * statement.cs (Lock): Implement lock statement.
17910
17911         * cs-parser.jay: Small fixes to support `lock' and `using'
17912
17913         * cs-tokenizer.cs: Remove extra space
17914
17915         * driver.cs: New flag --checked, allows to turn on integer math
17916         checking. 
17917
17918         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
17919         Threading.Monitor.Exit 
17920
17921 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
17922
17923         * expression.cs (IndexerAccess::DoResolveLValue): Set the
17924         Expression Class to be IndexerAccess.
17925
17926         Notice that Indexer::DoResolve sets the eclass to Value.
17927
17928 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
17929
17930         * class.cs (TypeContainer::Emit): Emit code for indexers.
17931
17932         * assign.cs (IAssignMethod): New interface implemented by Indexers
17933         and Properties for handling assignment.
17934
17935         (Assign::Emit): Simplify and reuse code. 
17936
17937         * expression.cs (IndexerAccess, PropertyExpr): Implement
17938         IAssignMethod, clean up old code. 
17939
17940 2001-10-22  Ravi Pratap  <ravi@ximian.com>
17941
17942         * typemanager.cs (ImplementsInterface): New method to determine if a type
17943         implements a given interface. Provides a nice cache too.
17944
17945         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
17946         method.
17947
17948         (ConvertReferenceExplicit): Ditto.
17949
17950         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
17951         various methods, with correct names etc.
17952
17953         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
17954         Operator.UnaryNegation.
17955
17956         * cs-parser.jay (operator_declarator): Be a little clever in the case where
17957         we have a unary plus or minus operator.
17958
17959         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
17960         UnaryMinus.
17961
17962         * everywhere : update accordingly.
17963
17964         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
17965         respectively.
17966
17967         * class.cs (Method::Define): For the case where we are implementing a method
17968         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
17969         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
17970
17971 2001-10-21  Ravi Pratap  <ravi@ximian.com>
17972
17973         * interface.cs (FindMembers): Implement to work around S.R.E
17974         lameness.
17975
17976         * typemanager.cs (IsInterfaceType): Implement.
17977
17978         (FindMembers): Update to handle interface types too.
17979
17980         * expression.cs (ImplicitReferenceConversion): Re-write bits which
17981         use IsAssignableFrom as that is not correct - it doesn't work.
17982
17983         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
17984         and accordingly override EmitStatement.
17985
17986         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
17987         using the correct logic :-)
17988
17989 2001-10-19  Ravi Pratap  <ravi@ximian.com>
17990
17991         * ../errors/cs-11.cs : Add to demonstrate error -11 
17992
17993 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
17994
17995         * assign.cs (Assign::Resolve): Resolve right hand side first, and
17996         then pass this as a hint to ResolveLValue.
17997
17998         * expression.cs (FieldExpr): Add Location information
17999
18000         (FieldExpr::LValueResolve): Report assignment to readonly
18001         variable. 
18002
18003         (Expression::ExprClassFromMemberInfo): Pass location information.
18004
18005         (Expression::ResolveLValue): Add new method that resolves an
18006         LValue. 
18007
18008         (Expression::DoResolveLValue): Default invocation calls
18009         DoResolve. 
18010
18011         (Indexers): New class used to keep track of indexers in a given
18012         Type. 
18013
18014         (IStackStore): Renamed from LValue, as it did not really describe
18015         what this did.  Also ResolveLValue is gone from this interface and
18016         now is part of Expression.
18017
18018         (ElementAccess): Depending on the element access type
18019
18020         * typemanager.cs: Add `indexer_name_type' as a Core type
18021         (System.Runtime.CompilerServices.IndexerNameAttribute)
18022
18023         * statement.cs (Goto): Take a location.
18024
18025 2001-10-18  Ravi Pratap  <ravi@ximian.com>
18026
18027         * delegate.cs (Delegate::VerifyDelegate): New method to verify
18028         if two delegates are compatible.
18029
18030         (NewDelegate::DoResolve): Update to take care of the case when
18031         we instantiate a delegate from another delegate.
18032
18033         * typemanager.cs (FindMembers): Don't even try to look up members
18034         of Delegate types for now.
18035
18036 2001-10-18  Ravi Pratap  <ravi@ximian.com>
18037
18038         * delegate.cs (NewDelegate): New class to take care of delegate
18039         instantiation.
18040
18041         * expression.cs (New): Split the delegate related code out into 
18042         the NewDelegate class.
18043
18044         * delegate.cs (DelegateInvocation): New class to handle delegate 
18045         invocation.
18046
18047         * expression.cs (Invocation): Split out delegate related code into
18048         the DelegateInvocation class.
18049
18050 2001-10-17  Ravi Pratap  <ravi@ximian.com>
18051
18052         * expression.cs (New::DoResolve): Implement delegate creation fully
18053         and according to the spec.
18054
18055         (New::DoEmit): Update to handle delegates differently.
18056
18057         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
18058         because of which we were printing out arguments in reverse order !
18059
18060         * delegate.cs (VerifyMethod): Implement to check if the given method
18061         matches the delegate.
18062
18063         (FullDelegateDesc): Implement.
18064
18065         (VerifyApplicability): Implement.
18066
18067         * expression.cs (Invocation::DoResolve): Update to accordingly handle
18068         delegate invocations too.
18069
18070         (Invocation::Emit): Ditto.
18071
18072         * ../errors/cs1593.cs : Added.
18073
18074         * ../errors/cs1594.cs : Added.
18075
18076         * delegate.cs (InstanceExpression, TargetMethod): New properties.
18077
18078 2001-10-16  Ravi Pratap  <ravi@ximian.com>
18079
18080         * typemanager.cs (intptr_type): Core type for System.IntPtr
18081
18082         (InitCoreTypes): Update for the same.
18083
18084         (iasyncresult_type, asynccallback_type): Ditto.
18085
18086         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
18087         correct.
18088
18089         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
18090         too.
18091
18092         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
18093         the builders for the 4 members of a delegate type :-)
18094
18095         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
18096         type.
18097
18098         * expression.cs (New::DoResolve): Implement guts for delegate creation.
18099
18100         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
18101
18102 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
18103
18104         * statement.cs (Break::Emit): Implement.   
18105         (Continue::Emit): Implement.
18106
18107         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
18108         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
18109         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
18110         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
18111         end loop
18112
18113         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
18114         properties that track the label for the current loop (begin of the
18115         loop and end of the loop).
18116
18117 2001-10-15  Ravi Pratap  <ravi@ximian.com>
18118
18119         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
18120         use of emitting anything at all.
18121
18122         * class.cs, rootcontext.cs : Get rid of calls to the same.
18123
18124         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
18125
18126         (Populate): Define the constructor correctly and set the implementation
18127         attributes.
18128
18129         * typemanager.cs (delegate_types): New hashtable to hold delegates that
18130         have been defined.
18131
18132         (AddDelegateType): Implement.
18133
18134         (IsDelegateType): Implement helper method.
18135
18136         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
18137
18138         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
18139         and accordingly handle it.
18140
18141         * delegate.cs (Populate): Take TypeContainer argument.
18142         Implement bits to define the Invoke method. However, I still haven't figured out
18143         how to take care of the native int bit :-(
18144
18145         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
18146         Qualify the name of the delegate, not its return type !
18147
18148         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
18149         conversion.
18150
18151         (StandardConversionExists): Checking for array types turns out to be recursive.
18152
18153         (ConvertReferenceExplicit): Implement array conversion.
18154
18155         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
18156
18157 2001-10-12  Ravi Pratap  <ravi@ximian.com>
18158
18159         * cs-parser.jay (delegate_declaration): Store the fully qualified
18160         name as it is a type declaration.
18161
18162         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
18163         readonly.
18164
18165         (DefineDelegate): Renamed from Define. Does the same thing essentially,
18166         as TypeContainer::DefineType.
18167
18168         (Populate): Method in which all the definition of the various methods (Invoke)
18169         etc is done.
18170
18171         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
18172         see.
18173
18174         (CloseDelegate): Finally creates the delegate.
18175
18176         * class.cs (TypeContainer::DefineType): Update to define delegates.
18177         (Populate, Emit and CloseType): Do the same thing here too.
18178
18179         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
18180         delegates in all these operations.
18181
18182 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
18183
18184         * expression.cs: LocalTemporary: a new expression used to
18185         reference a temporary that has been created.
18186
18187         * assign.cs: Handle PropertyAccess back here, so that we can
18188         provide the proper semantic access to properties.
18189
18190         * expression.cs (Expression::ConvertReferenceExplicit): Implement
18191         a few more explicit conversions. 
18192
18193         * modifiers.cs: `NEW' modifier maps to HideBySig.
18194
18195         * expression.cs (PropertyExpr): Make this into an
18196         ExpressionStatement, and support the EmitStatement code path. 
18197
18198         Perform get/set error checking, clean up the interface.
18199
18200         * assign.cs: recognize PropertyExprs as targets, and if so, turn
18201         them into toplevel access objects.
18202
18203 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
18204
18205         * expression.cs: PropertyExpr::PropertyExpr: use work around the
18206         SRE.
18207
18208         * typemanager.cs: Keep track here of our PropertyBuilders again to
18209         work around lameness in SRE.
18210
18211 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
18212
18213         * expression.cs (LValue::LValueResolve): New method in the
18214         interface, used to perform a second resolution pass for LValues. 
18215
18216         (This::DoResolve): Catch the use of this in static methods.
18217
18218         (This::LValueResolve): Implement.
18219
18220         (This::Store): Remove warning, assigning to `this' in structures
18221         is 
18222
18223         (Invocation::Emit): Deal with invocation of
18224         methods on value types.  We need to pass the address to structure
18225         methods rather than the object itself.  (The equivalent code to
18226         emit "this" for structures leaves the entire structure on the
18227         stack instead of a pointer to it). 
18228
18229         (ParameterReference::DoResolve): Compute the real index for the
18230         argument based on whether the method takes or not a `this' pointer
18231         (ie, the method is static).
18232
18233         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
18234         value types returned from functions when we need to invoke a
18235         method on the sturcture.
18236
18237
18238 2001-10-11  Ravi Pratap  <ravi@ximian.com>
18239
18240         * class.cs (TypeContainer::DefineType): Method to actually do the business of
18241         defining the type in the Modulebuilder or Typebuilder. This is to take
18242         care of nested types which need to be defined on the TypeBuilder using
18243         DefineNestedMethod.
18244
18245         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
18246         methods in RootContext, only ported to be part of TypeContainer.
18247
18248         (TypeContainer::GetInterfaceOrClass): Ditto.
18249
18250         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
18251
18252         * interface.cs (Interface::DefineInterface): New method. Does exactly
18253         what RootContext.CreateInterface did earlier, only it takes care of nested types 
18254         too.
18255
18256         (Interface::GetInterfaces): Move from RootContext here and port.
18257
18258         (Interface::GetInterfaceByName): Same here.
18259
18260         * rootcontext.cs (ResolveTree): Re-write.
18261
18262         (PopulateTypes): Re-write.
18263
18264         * class.cs (TypeContainer::Populate): Populate nested types too.
18265         (TypeContainer::Emit): Emit nested members too.
18266
18267         * typemanager.cs (AddUserType): Do not make use of the FullName property,
18268         instead just use the name argument passed in as it is already fully
18269         qualified.
18270
18271         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
18272         to TypeContainer mapping to see if a type is user-defined.
18273
18274         * class.cs (TypeContainer::CloseType): Implement. 
18275
18276         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
18277         the default constructor.
18278
18279         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
18280         twice.
18281
18282         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
18283
18284         * interface.cs (CloseType): Create the type here.
18285
18286         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
18287         the hierarchy.
18288
18289         Remove all the methods which are now in TypeContainer.
18290
18291 2001-10-10  Ravi Pratap  <ravi@ximian.com>
18292
18293         * delegate.cs (Define): Re-write bits to define the delegate
18294         correctly.
18295
18296 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
18297
18298         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
18299
18300         * expression.cs (ImplicitReferenceConversion): handle null as well
18301         as a source to convert to any reference type.
18302
18303         * statement.cs (Return): Perform any implicit conversions to
18304         expected return type.  
18305
18306         Validate use of return statement.  
18307
18308         * codegen.cs (EmitContext): Pass the expected return type here.
18309
18310         * class.cs (Method, Constructor, Property): Pass expected return
18311         type to EmitContext.
18312
18313 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
18314
18315         * expression.cs: Make DoResolve take an EmitContext instead of a
18316         TypeContainer.
18317
18318         Replaced `l' and `location' for `loc', for consistency.
18319
18320         (Error, Warning): Remove unneeded Tc argument.
18321
18322         * assign.cs, literal.cs, constant.cs: Update to new calling
18323         convention. 
18324
18325         * codegen.cs: EmitContext now contains a flag indicating whether
18326         code is being generated in a static method or not.
18327
18328         * cs-parser.jay: DecomposeQI, new function that replaces the old
18329         QualifiedIdentifier.  Now we always decompose the assembled
18330         strings from qualified_identifier productions into a group of
18331         memberaccesses.
18332
18333 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
18334
18335         * rootcontext.cs: Deal with field-less struct types correctly now
18336         by passing the size option to Define Type.
18337
18338         * class.cs: Removed hack that created one static field. 
18339
18340 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
18341
18342         * statement.cs: Moved most of the code generation here. 
18343
18344 2001-10-09  Ravi Pratap  <ravi@ximian.com>
18345
18346         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
18347         seem very right.
18348
18349         (ElementAccess): Remove useless bits for now - keep checks as the spec
18350         says.
18351
18352 2001-10-08  Ravi Pratap  <ravi@ximian.com>
18353
18354         * expression.cs (ElementAccess::DoResolve): Remove my crap code
18355         and start performing checks according to the spec.
18356
18357 2001-10-07  Ravi Pratap  <ravi@ximian.com>
18358
18359         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
18360         rank_specifiers instead.
18361
18362         (rank_specifiers): Change the order in which the rank specifiers are stored
18363
18364         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
18365
18366         * expression.cs (ElementAccess): Implement the LValue interface too.
18367
18368 2001-10-06  Ravi Pratap  <ravi@ximian.com>
18369
18370         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
18371         except that user defined conversions are not included.
18372
18373         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
18374         perform the conversion of the return type, if necessary.
18375
18376         (New::DoResolve): Check whether we are creating an array or an object
18377         and accordingly do the needful.
18378
18379         (New::Emit): Same here.
18380
18381         (New::DoResolve): Implement guts of array creation.
18382
18383         (New::FormLookupType): Helper function.
18384
18385 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
18386
18387         * codegen.cs: Removed most of the code generation here, and move the
18388         corresponding code generation bits to the statement classes. 
18389
18390         Added support for try/catch/finalize and throw.
18391
18392         * cs-parser.jay: Added support for try/catch/finalize.
18393
18394         * class.cs: Catch static methods having the flags override,
18395         virtual or abstract.
18396
18397         * expression.cs (UserCast): This user cast was not really doing
18398         what it was supposed to do.  Which is to be born in fully resolved
18399         state.  Parts of the resolution were being performed at Emit time! 
18400
18401         Fixed this code.
18402
18403 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
18404
18405         * expression.cs: Implicity convert the result from UserCast.
18406
18407 2001-10-05  Ravi Pratap  <ravi@ximian.com>
18408
18409         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
18410         prevented it from working correctly. 
18411
18412         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
18413         merely ConvertImplicit.
18414
18415 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
18416
18417         * typemanager.cs: Make the LookupTypeContainer function static,
18418         and not per-instance.  
18419
18420         * class.cs: Make static FindMembers (the one that takes a Type
18421         argument). 
18422
18423         * codegen.cs: Add EmitForeach here.
18424
18425         * cs-parser.jay: Make foreach a toplevel object instead of the
18426         inline expansion, as we need to perform semantic analysis on it. 
18427
18428 2001-10-05  Ravi Pratap  <ravi@ximian.com>
18429
18430         * expression.cs (Expression::ImplicitUserConversion): Rename to
18431         UserDefinedConversion.
18432
18433         (Expression::UserDefinedConversion): Take an extra argument specifying 
18434         whether we look for explicit user conversions too.
18435
18436         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
18437
18438         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
18439
18440         (ExplicitUserConversion): Make it a call to UserDefinedConversion
18441         with the appropriate arguments.
18442
18443         * cs-parser.jay (cast_expression): Record location too.
18444
18445         * expression.cs (Cast): Record location info.
18446
18447         (Expression::ConvertExplicit): Take location argument.
18448
18449         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
18450         to determine if we are doing explicit conversions.
18451
18452         (UserCast::Emit): Update accordingly.
18453
18454         (Expression::ConvertExplicit): Report an error if everything fails.
18455
18456         * ../errors/cs0030.cs : Add.
18457
18458 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
18459
18460         * modifiers.cs: If the ABSTRACT keyword is present, also set the
18461         virtual and newslot bits. 
18462
18463         * class.cs (TypeContainer::RegisterRequiredImplementations):
18464         Record methods we need.
18465
18466         (TypeContainer::MakeKey): Helper function to make keys for
18467         MethodBases, since the Methodbase key is useless.
18468
18469         (TypeContainer::Populate): Call RegisterRequiredImplementations
18470         before defining the methods.   
18471
18472         Create a mapping for method_builders_to_methods ahead of time
18473         instead of inside a tight loop.
18474
18475         (::RequireMethods):  Accept an object as the data to set into the
18476         hashtable so we can report interface vs abstract method mismatch.
18477
18478 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
18479
18480         * report.cs: Make all of it static.
18481
18482         * rootcontext.cs: Drop object_type and value_type computations, as
18483         we have those in the TypeManager anyways.
18484
18485         Drop report instance variable too, now it is a global.
18486
18487         * driver.cs: Use try/catch on command line handling.
18488
18489         Add --probe option to debug the error reporting system with a test
18490         suite. 
18491
18492         * report.cs: Add support for exiting program when a probe
18493         condition is reached.
18494
18495 2001-10-03  Ravi Pratap  <ravi@ximian.com>
18496
18497         * expression.cs (Binary::DoNumericPromotions): Fix the case when
18498         we do a forcible conversion regardless of type, to check if 
18499         ForceConversion returns a null.
18500
18501         (Binary::error19): Use location to report error.
18502
18503         (Unary::error23): Use location here too.
18504
18505         * ../errors/cs0019.cs : Check in.
18506
18507         * ../errors/cs0023.cs : Check in.
18508
18509         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
18510         case of a non-null MethodInfo object with a length of 0 !
18511
18512         (Binary::ResolveOperator): Flag error if overload resolution fails to find
18513         an applicable member - according to the spec :-)
18514         Also fix logic to find members in base types.
18515
18516         (Unary::ResolveOperator): Same here.
18517
18518         (Unary::report23): Change name to error23 and make first argument a TypeContainer
18519         as I was getting thoroughly confused between this and error19 :-)
18520
18521         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
18522         (::FindMostEncompassedType): Implement.
18523         (::FindMostEncompassingType): Implement.
18524         (::StandardConversionExists): Implement.
18525
18526         (UserImplicitCast): Re-vamp. We now need info about most specific
18527         source and target types so that we can do the necessary conversions.
18528
18529         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
18530         mathematical union with no duplicates.
18531
18532 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
18533
18534         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
18535         in order from base classes to child classes, so that we can in
18536         child classes look up in our parent for method names and
18537         attributes (required for handling abstract, virtual, new, override
18538         constructs: we need to instrospect our base class, and if we dont
18539         populate the classes in order, the introspection might be
18540         incorrect.  For example, a method could query its parent before
18541         the parent has any methods and would determine that the parent has
18542         no abstract methods (while it could have had them)).
18543
18544         (RootContext::CreateType): Record the order in which we define the
18545         classes.
18546
18547 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
18548
18549         * class.cs (TypeContainer::Populate): Also method definitions can
18550         fail now, keep track of this.
18551
18552         (TypeContainer::FindMembers): Implement support for
18553         DeclaredOnly/noDeclaredOnly flag.
18554
18555         (Constructor::Emit) Return the ConstructorBuilder.
18556
18557         (Method::Emit) Return the MethodBuilder. 
18558         Check for abstract or virtual methods to be public.
18559
18560         * rootcontext.cs (RootContext::CreateType): Register all the
18561         abstract methods required for the class to be complete and the
18562         interface methods that must be implemented. 
18563
18564         * cs-parser.jay: Report error 501 (method requires body if it is
18565         not marked abstract or extern).
18566
18567         * expression.cs (TypeOf::Emit): Implement.
18568
18569         * typemanager.cs: runtime_handle_type, new global type.
18570
18571         * class.cs (Property::Emit): Generate code for properties.
18572
18573 2001-10-02  Ravi Pratap  <ravi@ximian.com>
18574
18575         * expression.cs (Unary::ResolveOperator): Find operators on base type
18576         too - we now conform exactly to the spec.
18577
18578         (Binary::ResolveOperator): Same here.
18579
18580         * class.cs (Operator::Define): Fix minor quirk in the tests.
18581
18582         * ../errors/cs0215.cs : Added.
18583
18584         * ../errors/cs0556.cs : Added.
18585
18586         * ../errors/cs0555.cs : Added.
18587
18588 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
18589
18590         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
18591         single integer which is really efficient
18592
18593 2001-10-01  Ravi Pratap  <ravi@ximian.com>
18594
18595         *  expression.cs (Expression::ImplicitUserConversion): Use location
18596         even in the case when we are examining True operators.
18597  
18598         * class.cs (Operator::Define): Perform extensive checks to conform
18599         with the rules for operator overloading in the spec.
18600
18601         * expression.cs (Expression::ImplicitReferenceConversion): Implement
18602         some of the other conversions mentioned in the spec.
18603
18604         * typemanager.cs (array_type): New static member for the System.Array built-in
18605         type.
18606
18607         (cloneable_interface): For System.ICloneable interface.
18608
18609         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
18610         we start resolving the tree and populating types.
18611
18612         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
18613  
18614 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
18615
18616         * expression.cs (Expression::ExprClassFromMemberInfo,
18617         Expression::Literalize): Create literal expressions from
18618         FieldInfos which are literals.
18619
18620         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
18621         type casts, because they were wrong.  The test suite in tests
18622         caught these ones.
18623
18624         (ImplicitNumericConversion): ushort to ulong requires a widening
18625         cast. 
18626
18627         Int32 constant to long requires widening cast as well.
18628
18629         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
18630         for integers because the type on the stack is not i4.
18631
18632 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
18633
18634         * expression.cs (report118): require location argument. 
18635
18636         * parameter.cs: Do not dereference potential null value.
18637
18638         * class.cs: Catch methods that lack the `new' keyword when
18639         overriding a name.  Report warnings when `new' is used without
18640         anything being there to override.
18641
18642         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
18643
18644         * class.cs: Only add constructor to hashtable if it is non-null
18645         (as now constructors can fail on define).
18646
18647         (TypeManager, Class, Struct): Take location arguments.
18648
18649         Catch field instance initialization in structs as errors.
18650
18651         accepting_filter: a new filter for FindMembers that is static so
18652         that we dont create an instance per invocation.
18653
18654         (Constructor::Define): Catch errors where a struct constructor is
18655         parameterless 
18656
18657         * cs-parser.jay: Pass location information for various new
18658         constructs. 
18659
18660         * delegate.cs (Delegate): take a location argument.
18661
18662         * driver.cs: Do not call EmitCode if there were problesm in the
18663         Definition of the types, as many Builders wont be there. 
18664
18665         * decl.cs (Decl::Decl): Require a location argument.
18666
18667         * cs-tokenizer.cs: Handle properly hex constants that can not fit
18668         into integers, and find the most appropiate integer for it.
18669
18670         * literal.cs: Implement ULongLiteral.
18671
18672         * rootcontext.cs: Provide better information about the location of
18673         failure when CreateType fails.
18674
18675 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
18676
18677         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
18678         as well.
18679
18680         * expression.cs (Binary::CheckShiftArguments): Add missing type
18681         computation.
18682         (Binary::ResolveOperator): Add type to the logical and and logical
18683         or, Bitwise And/Or and Exclusive Or code paths, it was missing
18684         before.
18685
18686         (Binary::DoNumericPromotions): In the case where either argument
18687         is ulong (and most signed types combined with ulong cause an
18688         error) perform implicit integer constant conversions as well.
18689
18690 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
18691
18692         * expression.cs (UserImplicitCast): Method should always be
18693         non-null. 
18694         (Invocation::BetterConversion): Simplified test for IntLiteral.
18695
18696         (Expression::ImplicitNumericConversion): Split this routine out.
18697         Put the code that performs implicit constant integer conversions
18698         here. 
18699
18700         (Expression::Resolve): Become a wrapper around DoResolve so we can
18701         check eclass and type being set after resolve.
18702
18703         (Invocation::Badness): Remove this dead function
18704
18705         (Binary::ResolveOperator): Do not compute the expensive argumnets
18706         unless we have a union for it.
18707
18708         (Probe::Emit): Is needs to do an isinst and then
18709         compare against null.
18710
18711         (::CanConvert): Added Location argument.  If the Location argument
18712         is null (Location.Null), then we do not report errors.  This is
18713         used by the `probe' mechanism of the Explicit conversion.  We do
18714         not want to generate an error for something that the user
18715         explicitly requested to be casted.  But the pipeline for an
18716         explicit cast first tests for potential implicit casts.
18717
18718         So for now, if the Location is null, it means `Probe only' to
18719         avoid adding another argument.   Might have to revise this
18720         strategy later.
18721
18722         (ClassCast): New class used to type cast objects into arbitrary
18723         classes (used in Explicit Reference Conversions).
18724
18725         Implement `as' as well.
18726
18727         Reverted all the patches from Ravi below: they were broken:
18728
18729                 * The use of `level' as a mechanism to stop recursive
18730                   invocations is wrong.  That was there just to catch the
18731                   bug with a strack trace but not as a way of addressing
18732                   the problem.
18733
18734                   To fix the problem we have to *understand* what is going
18735                   on and the interactions and come up with a plan, not
18736                   just get things going.
18737
18738                 * The use of the type conversion cache that I proposed
18739                   last night had an open topic: How does this work across
18740                   protection domains.  A user defined conversion might not
18741                   be public in the location where we are applying the
18742                   conversion, a different conversion might be selected
18743                   (ie, private A->B (better) but public B->A (worse),
18744                   inside A, A->B applies, but outside it, B->A will
18745                   apply).
18746
18747                 * On top of that (ie, even if the above is solved),
18748                   conversions in a cache need to be abstract.  Ie, `To
18749                   convert from an Int to a Short use an OpcodeCast', not
18750                   `To convert from an Int to a Short use the OpcodeCast on
18751                   the variable 5' (which is what this patch was doing).
18752
18753 2001-09-28  Ravi Pratap  <ravi@ximian.com>
18754
18755         * expression.cs (Invocation::ConversionExists): Re-write to use
18756         the conversion cache
18757
18758         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
18759         cache all conversions done, not just user-defined ones.
18760
18761         (Invocation::BetterConversion): The real culprit. Use ConversionExists
18762         to determine if a conversion exists instead of acutually trying to 
18763         perform the conversion. It's faster too.
18764
18765         (Expression::ConvertExplicit): Modify to use ConversionExists to check
18766         and only then attempt the implicit conversion.
18767
18768 2001-09-28  Ravi Pratap  <ravi@ximian.com>
18769
18770         * expression.cs (ConvertImplicit): Use a cache for conversions
18771         already found. Check level of recursion and bail out if necessary.
18772
18773 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
18774
18775         * typemanager.cs (string_concat_string_string, string_concat_object_object):
18776         Export standard methods that we expect for string operations.
18777
18778         * statement.cs (Block::UsageWarning): Track usage of variables and
18779         report the errors for not used variables.
18780
18781         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
18782         operator. 
18783
18784 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
18785
18786         * codegen.cs: remove unnneded code 
18787
18788         * expression.cs: Removed BuiltinTypeAccess class
18789
18790         Fix the order in which implicit conversions are
18791         done.  
18792
18793         The previous fixed dropped support for boxed conversions (adding a
18794         test to the test suite now)
18795
18796         (UserImplicitCast::CanConvert): Remove test for source being null,
18797         that code is broken.  We should not feed a null to begin with, if
18798         we do, then we should track the bug where the problem originates
18799         and not try to cover it up here.
18800
18801         Return a resolved expression of type UserImplicitCast on success
18802         rather than true/false.  Ravi: this is what I was talking about,
18803         the pattern is to use a static method as a "constructor" for
18804         objects. 
18805
18806         Also, do not create arguments until the very last minute,
18807         otherwise we always create the arguments even for lookups that
18808         will never be performed. 
18809
18810         (UserImplicitCast::Resolve): Eliminate, objects of type
18811         UserImplicitCast are born in a fully resolved state. 
18812
18813         * typemanager.cs (InitCoreTypes): Init also value_type
18814         (System.ValueType). 
18815
18816         * expression.cs (Cast::Resolve): First resolve the child expression.
18817
18818         (LValue): Add new method AddressOf to be used by
18819         the `&' operator.  
18820
18821         Change the argument of Store to take an EmitContext instead of an
18822         ILGenerator, because things like FieldExpr need to be able to call
18823         their children expression to generate the instance code. 
18824
18825         (Expression::Error, Expression::Warning): Sugar functions for
18826         reporting errors.
18827
18828         (Expression::MemberLookup): Accept a TypeContainer instead of a
18829         Report as the first argument.
18830
18831         (Expression::ResolvePrimary): Killed.  I still want to improve
18832         this as currently the code is just not right.
18833
18834         (Expression::ResolveMemberAccess): Simplify, but it is still
18835         wrong. 
18836
18837         (Unary::Resolve): Catch errors in AddressOf operators.
18838
18839         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
18840         index to a byte for the short-version, or the compiler will choose
18841         the wrong Emit call, which generates the wrong data.
18842
18843         (ParameterReference::Emit, ::Store): same.
18844
18845         (FieldExpr::AddressOf): Implement.
18846
18847         * typemanager.cs: TypeManager: made public variable instead of
18848         property.
18849
18850         * driver.cs: document --fatal.
18851
18852         * report.cs (ErrorMessage, WarningMessage): new names for the old
18853         Error and Warning classes.
18854
18855         * cs-parser.jay (member_access): Turn built-in access to types
18856         into a normal simplename
18857
18858 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18859
18860         * expression.cs (Invocation::BetterConversion): Fix to cope
18861         with q being null, since this was introducing a bug.
18862
18863         * expression.cs (ConvertImplicit): Do built-in conversions first.
18864
18865 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18866
18867         * expression.cs (UserImplicitCast::Resolve): Fix bug.
18868
18869 2001-09-27  Ravi Pratap  <ravi@ximian.com>
18870
18871         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
18872         I had introduced long ago (what's new ?).
18873
18874         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
18875         the work of all the checking. 
18876         (ConvertImplicit): Call CanConvert and only then create object if necessary.
18877         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
18878
18879         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
18880         that is the right way. 
18881
18882         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
18883         overloading resolution. Use everywhere instead of cutting and pasting code.
18884
18885         (Binary::ResolveOperator): Use MakeUnionSet.
18886
18887         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
18888         we have to convert to bool types. Not complete yet.
18889
18890 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
18891
18892         * typemanager.cs (TypeManager::CSharpName): support ushort.
18893
18894         * expression.cs (Expression::TryImplicitIntConversion): Attempts
18895         to provide an expression that performsn an implicit constant int
18896         conversion (section 6.1.6).
18897         (Expression::ConvertImplicitRequired): Reworked to include
18898         implicit constant expression conversions.
18899
18900         (Expression::ConvertNumericExplicit): Finished.
18901
18902         (Invocation::Emit): If InstanceExpression is null, then it means
18903         that we perform a call on this.
18904
18905 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18906
18907         * expression.cs (Unary::Emit): Remove some dead code.
18908         (Probe): Implement Resolve and Emit for `is'.
18909         (Expression::ConvertImplicitRequired): Attempt to do constant
18910         expression conversions here.  Maybe should be moved to
18911         ConvertImplicit, but I am not sure.
18912         (Expression::ImplicitLongConstantConversionPossible,
18913         Expression::ImplicitIntConstantConversionPossible): New functions
18914         that tell whether is it possible to apply an implicit constant
18915         expression conversion.
18916
18917         (ConvertNumericExplicit): Started work on explicit numeric
18918         conversions.
18919
18920         * cs-parser.jay: Update operator constants.
18921
18922         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
18923         (Parameters::GetSignature): Hook up VerifyArgs here.
18924         (Parameters::VerifyArgs): Verifies that no two arguments have the
18925         same name. 
18926
18927         * class.cs (Operator): Update the operator names to reflect the
18928         ones that the spec expects (as we are just stringizing the
18929         operator names).
18930
18931         * expression.cs (Unary::ResolveOperator): Fix bug: Use
18932         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
18933         previous usage did only work for our methods.
18934         (Expression::ConvertImplicit): Handle decimal implicit numeric
18935         conversions as well.
18936         (Expression::InternalTypeConstructor): Used to invoke constructors
18937         on internal types for default promotions.
18938
18939         (Unary::Emit): Implement special handling for the pre/post
18940         increment/decrement for overloaded operators, as they need to have
18941         the same semantics as the other operators.
18942
18943         (Binary::ResolveOperator): ditto.
18944         (Invocation::ConversionExists): ditto.
18945         (UserImplicitCast::Resolve): ditto.
18946
18947 2001-09-26  Ravi Pratap  <ravi@ximian.com>
18948
18949         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
18950         operator, return after emitting body. Regression tests pass again !
18951
18952         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
18953         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
18954         (Invocation::OverloadResolve): Ditto.
18955         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
18956
18957         * everywhere : update calls to the above methods accordingly.
18958
18959 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
18960
18961         * assign.cs (Assign): Make it inherit from ExpressionStatement.
18962
18963         * expression.cs (ExpressionStatement): New base class used for
18964         expressions that can appear in statements, so that we can provide
18965         an alternate path to generate expression that do not leave a value
18966         on the stack.
18967
18968         (Expression::Emit, and all the derivatives): We no longer return
18969         whether a value is left on the stack or not.  Every expression
18970         after being emitted leaves a single value on the stack.
18971
18972         * codegen.cs (EmitContext::EmitStatementExpression): Use the
18973         facilties of ExpressionStatement if possible.
18974
18975         * cs-parser.jay: Update statement_expression.
18976
18977 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
18978
18979         * driver.cs: Change the wording of message
18980
18981 2001-09-25  Ravi Pratap  <ravi@ximian.com>
18982
18983         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
18984         the type of the expression to the return type of the method if
18985         we have an overloaded operator match ! The regression tests pass again !
18986         (Unary::ResolveOperator): Ditto.
18987
18988         * expression.cs (Invocation::ConversionExists): Correct the member lookup
18989         to find "op_Implicit", not "implicit" ;-)
18990         (UserImplicitCast): New class to take care of user-defined implicit conversions.
18991         (ConvertImplicit, ForceConversion): Take TypeContainer argument
18992
18993         * everywhere : Correct calls to the above accordingly.
18994
18995         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
18996         (ConvertImplicit): Do user-defined conversion if it exists.
18997
18998 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
18999
19000         * assign.cs: track location.
19001         (Resolve): Use implicit conversions on assignment.
19002
19003         * literal.cs: Oops.  Not good, Emit of short access values should
19004         pass (Bytes) or the wrong argument will be selected.
19005
19006         * expression.cs (Unary::Emit): Emit code for -expr.
19007
19008         (Unary::ResolveOperator): Handle `Substract' for non-constants
19009         (substract from zero from the non-constants).
19010         Deal with Doubles as well. 
19011
19012         (Expression::ConvertImplicitRequired): New routine that reports an
19013         error if no implicit conversion exists. 
19014
19015         (Invocation::OverloadResolve): Store the converted implicit
19016         expressions if we make them
19017
19018 2001-09-24  Ravi Pratap  <ravi@ximian.com>
19019
19020         * class.cs (ConstructorInitializer): Take a Location argument.
19021         (ConstructorBaseInitializer): Same here.
19022         (ConstructorThisInitializer): Same here.
19023
19024         * cs-parser.jay : Update all calls accordingly.
19025
19026         * expression.cs (Unary, Binary, New): Take location argument.
19027         Update accordingly everywhere.
19028
19029         * cs-parser.jay : Update all calls to the above to take a location
19030         argument.
19031
19032         * class.cs : Ditto.
19033
19034 2001-09-24  Ravi Pratap  <ravi@ximian.com>
19035
19036         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
19037         (Invocation::BetterConversion): Same here
19038         (Invocation::ConversionExists): Ditto.
19039
19040         (Invocation::ConversionExists): Implement.
19041
19042 2001-09-22  Ravi Pratap  <ravi@ximian.com>
19043
19044         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
19045         Also take an additional TypeContainer argument.
19046
19047         * All over : Pass in TypeContainer as argument to OverloadResolve.
19048
19049         * typemanager.cs (CSharpName): Update to check for the string type and return
19050         that too.
19051
19052         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
19053         a given method.
19054
19055 2001-09-21  Ravi Pratap  <ravi@ximian.com>
19056
19057         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
19058         (Invocation::BetterFunction): Implement.
19059         (Invocation::BetterConversion): Implement.
19060         (Invocation::ConversionExists): Skeleton, no implementation yet.
19061
19062         Okay, things work fine !
19063
19064 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
19065
19066         * typemanager.cs: declare and load enum_type, delegate_type and
19067         void_type. 
19068
19069         * expression.cs (Expression::Emit): Now emit returns a value that
19070         tells whether a value is left on the stack or not.  This strategy
19071         might be reveted tomorrow with a mechanism that would address
19072         multiple assignments.
19073         (Expression::report118): Utility routine to report mismatches on
19074         the ExprClass.
19075
19076         (Unary::Report23): Report impossible type/operator combination
19077         utility function.
19078
19079         (Unary::IsIncrementableNumber): Whether the type can be
19080         incremented or decremented with add.
19081         (Unary::ResolveOperator): Also allow enumerations to be bitwise
19082         complemented. 
19083         (Unary::ResolveOperator): Implement ++, !, ~,
19084
19085         (Invocation::Emit): Deal with new Emit convetion.
19086
19087         * All Expression derivatives: Updated their Emit method to return
19088         whether they leave values on the stack or not.
19089
19090         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
19091         stack for expressions that are statements. 
19092
19093 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
19094
19095         * expression.cs (LValue): New interface.  Must be implemented by
19096         LValue objects.
19097         (LocalVariableReference, ParameterReference, FieldExpr): Implement
19098         LValue interface.
19099
19100         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
19101         interface for generating code, simplifies the code.
19102
19103 2001-09-20  Ravi Pratap  <ravi@ximian.com>
19104
19105         * expression.cs (everywhere): Comment out return statements in ::Resolve
19106         methods to avoid the warnings.
19107
19108 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
19109
19110         * driver.cs (parse): Report error 2001 if we can not open the
19111         source file.
19112
19113         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
19114         not resolve it.
19115
19116         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
19117         object. 
19118
19119         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
19120         otherwise nested blocks end up with the same index.
19121
19122         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
19123
19124         * expression.cs:  Instead of having FIXMEs in the Resolve
19125         functions, throw exceptions so it is obvious that we are facing a
19126         bug. 
19127
19128         * cs-parser.jay (invocation_expression): Pass Location information.
19129
19130         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
19131         Use a basename for those routines because .NET does not like paths
19132         on them. 
19133
19134         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
19135         already defined.
19136
19137 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
19138
19139         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
19140         are loading the correct data types (throws an exception if not).
19141         (TypeManager::InitCoreTypes): Use CoreLookupType
19142
19143         * expression.cs (Unary::ResolveOperator): return the child
19144         expression for expressions which are just +expr.
19145         (Unary::ResolveOperator): Return negative literals for -LITERAL
19146         expressions (otherwise they are Unary {Literal}).
19147         (Invocation::Badness): Take into account `Implicit constant
19148         expression conversions'.
19149
19150         * literal.cs (LongLiteral): Implement long literal class.
19151         (IntLiteral): export the `Value' of the intliteral. 
19152
19153 2001-09-19  Ravi Pratap  <ravi@ximian.com>
19154
19155         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
19156
19157         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
19158         instead of 'Operator'
19159
19160         * expression.cs (Binary::ResolveOperator): Update accordingly.
19161         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
19162         and 'Minus'
19163
19164         * cs-parser.jay (unary_expression): Update to use the new names.
19165
19166         * gen-treedump.cs (GetUnary): Same here.
19167
19168         * expression.cs (Unary::Resolve): Implement.
19169         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
19170         operators are found instead of making noise ;-)
19171         (Unary::ResolveOperator): New method to do precisely the same thing which
19172         Binary::ResolveOperator does for Binary expressions.
19173         (Unary.method, .Arguments): Add.
19174         (Unary::OperName): Implement.   
19175         (Unary::ForceConversion): Copy and Paste !
19176
19177         * class.cs (Operator::Define): Fix a small bug for the case when we have 
19178         a unary operator.
19179
19180         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
19181         for the inbuilt operators. Only overloading works for now ;-)
19182
19183 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
19184
19185         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
19186         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
19187
19188         * expression.cs (This::Emit): Implement. 
19189         (This::Resolve): Implement.
19190         (TypeOf:Resolve): Implement.
19191         (Expression::ResolveSimpleName): Add an implicit this to instance
19192         field references. 
19193         (MemberAccess::Resolve): Deal with Parameters and Fields. 
19194         Bind instance variable to Field expressions.
19195         (FieldExpr::Instance): New field used to track the expression that
19196         represents the object instance.
19197         (FieldExpr::Resolve): Track potential errors from MemberLookup not
19198         binding 
19199         (FieldExpr::Emit): Implement.
19200
19201         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
19202         the last instruction contains a return opcode to avoid generating
19203         the last `ret' instruction (this generates correct code, and it is
19204         nice to pass the peverify output).
19205
19206         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
19207         initializer for static and instance variables.
19208         (Constructor::Emit): Allow initializer to be null in the case of
19209         static constructors.  Only emit initializer for instance
19210         constructors. 
19211
19212         (TypeContainer::FindMembers): Return a null array if there are no
19213         matches.
19214
19215         Also fix the code for the MemberTypes.Method branch, as it was not
19216         scanning that for operators (or tried to access null variables before).
19217
19218         * assign.cs (Assign::Emit): Handle instance and static fields. 
19219
19220         * TODO: Updated.
19221
19222         * driver.cs: Stop compilation if there are parse errors.
19223
19224         * cs-parser.jay (constructor_declaration): Provide default base
19225         initializer for non-static constructors.
19226         (constructor_declarator): Do not provide a default base
19227         initializers if none was specified.
19228         Catch the fact that constructors should not have parameters.
19229
19230         * class.cs: Do not emit parent class initializers for static
19231         constructors, that should be flagged as an error.
19232
19233 2001-09-18  Ravi Pratap  <ravi@ximian.com>
19234
19235         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
19236         Move back code into TypeContainer::Populate.
19237
19238 2001-09-18  Ravi Pratap  <ravi@ximian.com>
19239
19240         * class.cs (TypeContainer::AddConstructor): Fix the check to
19241         compare against Name, not Basename. 
19242         (Operator::OpType): Change Plus and Minus to Add and Subtract.
19243
19244         * cs-parser.jay : Update accordingly.
19245
19246         * class.cs (TypeContainer::FindMembers): For the case where we are searching
19247         for methods, don't forget to look into the operators too.
19248         (RegisterMethodBuilder): Helper method to take care of this for
19249         methods, constructors and operators.
19250         (Operator::Define): Completely revamp.
19251         (Operator.OperatorMethod, MethodName): New fields.
19252         (TypeContainer::Populate): Move the registering of builders into
19253         RegisterMethodBuilder.
19254         (Operator::Emit): Re-write.
19255
19256         * expression.cs (Binary::Emit): Comment out code path to emit method
19257         invocation stuff for the case when we have a user defined operator. I am
19258         just not able to get it right !
19259
19260 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
19261
19262         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
19263         argument. 
19264
19265         (Expression::MemberLookup): Provide a version that allows to
19266         specify the MemberTypes and BindingFlags. 
19267
19268         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
19269         so it was not fetching variable information from outer blocks.
19270
19271         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
19272         Beforefieldinit as it was buggy.
19273
19274         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
19275         that Ravi put here.  
19276
19277         * class.cs (Constructor::Emit): Only emit if block is not null.
19278         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
19279         deal with this by semantically definining it as if the user had
19280         done it.
19281
19282         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
19283         constructors as we now "emit" them at a higher level.
19284
19285         (TypeContainer::DefineDefaultConstructor): Used to define the
19286         default constructors if none was provided.
19287
19288         (ConstructorInitializer): Add methods Resolve and Emit. 
19289
19290         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
19291
19292 2001-09-17  Ravi Pratap  <ravi@ximian.com>
19293
19294         * class.cs (TypeContainer::EmitDefaultConstructor): Register
19295         the default constructor builder with our hashtable for methodbuilders
19296         to methodcores.
19297
19298         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
19299         and argument_count is 0 in which case we have a match.
19300         (Binary::ResolveOperator): More null checking and miscellaneous coding
19301         style cleanup.
19302
19303 2001-09-17  Ravi Pratap  <ravi@ximian.com>
19304
19305         * rootcontext.cs (IsNameSpace): Compare against null.
19306
19307         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
19308
19309         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
19310         and Unary::Operator.
19311
19312         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
19313         accordingly.
19314
19315         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
19316         we have overloaded operators.
19317         (Binary::ResolveOperator): Implement the part which does the operator overload
19318         resolution.
19319
19320         * class.cs (Operator::Emit): Implement.
19321         (TypeContainer::Emit): Emit the operators we have too.
19322
19323         * expression.cs (Binary::Emit): Update to emit the appropriate code for
19324         the case when we have a user-defined operator.
19325
19326 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
19327
19328         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
19329
19330 2001-09-16  Ravi Pratap  <ravi@ximian.com>
19331
19332         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
19333         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
19334         (Constructor::Emit): Implement.
19335         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
19336         if we have no work to do. 
19337         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
19338         Emit method.
19339
19340         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
19341         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
19342
19343         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
19344         of parent.parent.
19345
19346 2001-09-15  Ravi Pratap  <ravi@ximian.com>
19347
19348         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
19349         in the source.
19350         (Tree::RecordNamespace): Method to do what the name says ;-)
19351         (Tree::Namespaces): Property to get at the namespaces hashtable.
19352
19353         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
19354         keep track.
19355
19356         * rootcontext.cs (IsNamespace): Fixed it :-)
19357
19358 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
19359
19360         * class.cs (TypeContainer::FindMembers): Add support for
19361         constructors. 
19362         (MethodCore): New class that encapsulates both the shared aspects
19363         of a Constructor and a Method.  
19364         (Method, Constructor): Factored pieces into MethodCore.
19365
19366         * driver.cs: Added --fatal which makes errors throw exceptions.
19367         Load System assembly as well as part of the standard library.
19368
19369         * report.cs: Allow throwing exceptions on errors for debugging.
19370
19371         * modifiers.cs: Do not use `parent', instead use the real type
19372         container to evaluate permission settings.
19373
19374         * class.cs: Put Ravi's patch back in.  He is right, and we will
19375         have to cope with the
19376
19377 2001-09-14  Ravi Pratap  <ravi@ximian.com>
19378
19379         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
19380         FamORAssem, not FamANDAssem.
19381
19382 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
19383
19384         * driver.cs: Added --parse option that only parses its input files
19385         and terminates.
19386
19387         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
19388         incorrect.  IsTopLevel is not used to tell whether an object is
19389         root_types or not (that can be achieved by testing this ==
19390         root_types).  But to see if this is a top-level *class* (not
19391         necessarly our "toplevel" container). 
19392
19393 2001-09-14  Ravi Pratap  <ravi@ximian.com>
19394
19395         * enum.cs (Enum::Define): Modify to call the Lookup method on the
19396         parent instead of a direct call to GetType.
19397
19398 2001-09-14  Ravi Pratap  <ravi@ximian.com>
19399
19400         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
19401         Modifiers.TypeAttr. This should just be a call to that method.
19402
19403         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
19404         object so that we can determine if we are top-level or not.
19405
19406         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
19407         TypeContainer too.
19408
19409         * enum.cs (Enum::Define): Ditto.
19410
19411         * modifiers.cs (FieldAttr): Re-write.
19412
19413         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
19414         (TypeContainer::HaveStaticConstructor): New property to provide access
19415         to precisely that info.
19416
19417         * modifiers.cs (MethodAttr): Re-write.
19418         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
19419
19420         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
19421         of top-level types as claimed.
19422
19423 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
19424
19425         * expression.cs (MemberLookup): Fruitless attempt to lookup
19426         constructors.  Maybe I need to emit default constructors?  That
19427         might be it (currently .NET emits this for me automatically).
19428         (Invocation::OverloadResolve): Cope with Arguments == null.
19429         (Invocation::EmitArguments): new function, shared by the new
19430         constructor and us.
19431         (Invocation::Emit): Handle static and instance methods.  Emit
19432         proper call instruction for virtual or non-virtual invocations.
19433         (New::Emit): Implement.
19434         (New::Resolve): Implement.
19435         (MemberAccess:Resolve): Implement.
19436         (MethodGroupExpr::InstanceExpression): used conforming to the spec
19437         to track instances.
19438         (FieldExpr::Resolve): Set type.
19439
19440         * support.cs: Handle empty arguments.
19441                 
19442         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
19443         SimpleLookup): Auxiliary routines to help parse a qualifier
19444         identifier.  
19445
19446         Update qualifier_identifier rule.
19447
19448         * codegen.cs: Removed debugging messages.
19449
19450         * class.cs: Make this a global thing, this acts just as a "key" to
19451         objects that we might have around.
19452
19453         (Populate): Only initialize method_builders_to_methods once.
19454
19455         * expression.cs (PropertyExpr): Initialize type from the
19456         PropertyType. 
19457
19458         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
19459         Resolve pattern.  Attempt to implicitly convert value to boolean.
19460         Emit code.
19461
19462         * expression.cs: Set the type for the int32/int32 argument case.
19463         (Binary::ResolveOperator): Set the return type to boolean for
19464         comparission operators
19465
19466         * typemanager.cs: Remove debugging print code.
19467
19468         (Invocation::Resolve): resolve type.
19469
19470         * class.cs: Allocate a MemberInfo of the correct size, as the code
19471         elsewhere depends on the test to reflect the correct contents.
19472
19473         (Method::) Keep track of parameters, due to System.Reflection holes
19474
19475         (TypeContainer::Populate): Keep track of MethodBuilders to Method
19476         mapping here.
19477
19478         (TypeContainer::FindMembers): Use ArrayList and then copy an array
19479         of the exact size and return that.
19480
19481         (Class::LookupMethodByBuilder): New function that maps
19482         MethodBuilders to its methods.  Required to locate the information
19483         on methods because System.Reflection bit us again.
19484
19485         * support.cs: New file, contains an interface ParameterData and
19486         two implementations: ReflectionParameters and InternalParameters
19487         used to access Parameter information.  We will need to grow this
19488         as required.
19489
19490         * expression.cs (Invocation::GetParameterData): implement a cache
19491         and a wrapper around the ParameterData creation for methods. 
19492         (Invocation::OverloadResolve): Use new code.
19493
19494 2001-09-13  Ravi Pratap  <ravi@ximian.com>
19495
19496         * class.cs (TypeContainer::EmitField): Remove and move into 
19497         (Field::Define): here and modify accordingly.
19498         (Field.FieldBuilder): New member.
19499         (TypeContainer::Populate): Update accordingly.
19500         (TypeContainer::FindMembers): Implement.
19501
19502 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
19503
19504         * statement.cs: (VariableInfo::VariableType): New field to be
19505         initialized with the full type once it is resolved. 
19506
19507 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
19508
19509         * parameter.cs (GetParameterInfo): Use a type cache to compute
19510         things only once, and to reuse this information
19511
19512         * expression.cs (LocalVariableReference::Emit): Implement.
19513         (OpcodeCast::Emit): fix.
19514
19515         (ParameterReference::Resolve): Implement.
19516         (ParameterReference::Emit): Implement.
19517
19518         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
19519         that are expressions need to stay as Expressions.
19520
19521         * typemanager.cs (CSharpName): Returns the C# name of a type if
19522         possible. 
19523
19524         * expression.cs (Expression::ConvertImplicit): New function that
19525         implements implicit type conversions.
19526
19527         (Expression::ImplicitReferenceConversion): Implements implicit
19528         reference conversions.
19529
19530         (EmptyCast): New type for transparent casts.
19531
19532         (OpcodeCast): New type for casts of types that are performed with
19533         a sequence of bytecodes.
19534
19535         (BoxedCast): New type used for casting value types into reference
19536         types.  Emits a box opcode.
19537
19538         (Binary::DoNumericPromotions): Implements numeric promotions of
19539         and computation of the Binary::Type.
19540
19541         (Binary::EmitBranchable): Optimization.
19542
19543         (Binary::Emit): Implement code emission for expressions.
19544
19545         * typemanager.cs (TypeManager): Added two new core types: sbyte
19546         and byte.
19547
19548 2001-09-12  Ravi Pratap  <ravi@ximian.com>
19549
19550         * class.cs (TypeContainer::FindMembers): Method which does exactly
19551         what Type.FindMembers does, only we don't have to use reflection. No
19552         implementation yet.
19553
19554         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
19555         typecontainer objects as we need to get at them.
19556         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
19557
19558         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
19559         typecontainer object.
19560
19561         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
19562         of just a Report object.
19563
19564 2001-09-11  Ravi Pratap  <ravi@ximian.com>
19565
19566         * class.cs (Event::Define): Go back to using the prefixes "add_" and
19567         "remove_"
19568         (TypeContainer::Populate): Now define the delegates of the type too.
19569         (TypeContainer.Delegates): Property to access the list of delegates defined
19570         in the type.
19571
19572         * delegates.cs (Delegate::Define): Implement partially.
19573
19574         * modifiers.cs (TypeAttr): Handle more flags.
19575
19576 2001-09-11  Ravi Pratap  <ravi@ximian.com>
19577
19578         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
19579         and not <=
19580         (Operator::Define): Re-write logic to get types by using the LookupType method
19581         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
19582         (Indexer::Define): Ditto.
19583         (Event::Define): Ditto.
19584         (Property::Define): Ditto.
19585
19586 2001-09-10  Ravi Pratap  <ravi@ximian.com>
19587
19588         * class.cs (TypeContainer::Populate): Now define operators too. 
19589         (TypeContainer.Operators): New property to access the list of operators
19590         in a type.
19591         (Operator.OperatorMethodBuilder): New member to hold the method builder
19592         for the operator we are defining.
19593         (Operator::Define): Implement.
19594
19595 2001-09-10  Ravi Pratap  <ravi@ximian.com>
19596
19597         * class.cs (Event::Define): Make the prefixes of the accessor methods
19598         addOn_ and removeOn_ 
19599
19600         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
19601         of the location being passed in too. Ideally, this should go later since all
19602         error reporting should be done through the Report object.
19603
19604         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
19605         (Populate): Iterate thru the indexers we have and define them too.
19606         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
19607         for the get and set accessors.
19608         (Indexer::Define): Implement.
19609
19610 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
19611
19612         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
19613         my previous implementation, did not work.
19614
19615         * typemanager.cs: Add a couple of missing types (the longs).
19616
19617         * literal.cs: Use TypeManager.bool_type instead of getting it.
19618
19619         * expression.cs (EventExpr): New kind of expressions.
19620         (Expressio::ExprClassFromMemberInfo): finish
19621
19622 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
19623
19624         * assign.cs: Emit stores to static fields differently.
19625
19626 2001-09-08  Ravi Pratap  <ravi@ximian.com>
19627
19628         * Merge in changes and adjust code to tackle conflicts. Backed out my
19629         code in Assign::Resolve ;-) 
19630
19631 2001-09-08  Ravi Pratap  <ravi@ximian.com>
19632
19633         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
19634         instead Report.Error and also pass in the location.
19635         (CSharpParser::Lexer): New readonly property to return the reference
19636         to the Tokenizer object.
19637         (declare_local_variables): Use Report.Error with location instead of plain 
19638         old error.
19639         (CheckDef): Ditto.
19640
19641         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
19642         (Operator.CheckBinaryOperator): Ditto.
19643
19644         * cs-parser.jay (operator_declarator): Update accordingly.
19645
19646         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
19647         (CheckBinaryOperator): Same here.
19648
19649         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
19650         on the name without any prefixes of namespace names etc. This is because we
19651         already might have something already fully qualified like 
19652         'System.Console.WriteLine'
19653
19654         * assign.cs (Resolve): Begin implementation. Stuck ;-)
19655
19656 2001-09-07  Ravi Pratap  <ravi@ximian.com>
19657
19658         * cs-tokenizer.cs (location): Return a string which also contains
19659         the file name.
19660
19661         * expression.cs (ElementAccess): New class for expressions of the
19662         type 'element access.'
19663         (BaseAccess): New class for expressions of the type 'base access.'
19664         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
19665         respectively.
19666
19667         * cs-parser.jay (element_access): Implement action.
19668         (base_access): Implement actions.
19669         (checked_expression, unchecked_expression): Implement.
19670
19671         * cs-parser.jay (local_variable_type): Correct and implement.
19672         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
19673
19674         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
19675
19676         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
19677         name and the specifiers.
19678
19679         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
19680
19681         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
19682         making them all public ;-)
19683
19684         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
19685         class anyways.
19686
19687 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
19688
19689         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
19690         PropertyExprs.
19691         (FieldExpr, PropertyExprs): New resolved expressions.
19692         (SimpleName::MemberStaticCheck): Perform static checks for access
19693         to non-static fields on static methods. Maybe this should be
19694         generalized for MemberAccesses. 
19695         (SimpleName::ResolveSimpleName): More work on simple name
19696         resolution. 
19697
19698         * cs-parser.jay (primary_expression/qualified_identifier): track
19699         the parameter index.
19700
19701         * codegen.cs (CodeGen::Save): Catch save exception, report error.
19702         (EmitContext::EmitBoolExpression): Chain to expression generation
19703         instead of temporary hack.
19704         (::EmitStatementExpression): Put generic expression code generation.
19705
19706         * assign.cs (Assign::Emit): Implement variable assignments to
19707         local variables, parameters and fields.
19708
19709 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
19710
19711         * statement.cs (Block::GetVariableInfo): New method, returns the
19712         VariableInfo for a variable name in a block.
19713         (Block::GetVariableType): Implement in terms of GetVariableInfo
19714
19715         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
19716         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
19717
19718 2001-09-06  Ravi Pratap  <ravi@ximian.com>
19719
19720         * cs-parser.jay (operator_declaration): Continue on my quest : update
19721         to take attributes argument.
19722         (event_declaration): Ditto.
19723         (enum_declaration): Ditto.
19724         (indexer_declaration): Ditto.
19725
19726         * class.cs (Operator::Operator): Update constructor accordingly.
19727         (Event::Event): Ditto.
19728
19729         * delegate.cs (Delegate::Delegate): Same here.
19730
19731         * enum.cs (Enum::Enum): Same here.
19732
19733 2001-09-05  Ravi Pratap  <ravi@ximian.com>
19734
19735         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
19736
19737         * ../tests/cs0658.cs : New file to demonstrate error 0658.
19738
19739         * attribute.cs (Attributes): New class to encapsulate all attributes which were
19740         being passed around as an arraylist.
19741         (Attributes::AddAttribute): Method to add attribute sections.
19742
19743         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
19744         (struct_declaration): Update accordingly.
19745         (constant_declaration): Update.
19746         (field_declaration): Update.
19747         (method_header): Update.
19748         (fixed_parameter): Update.
19749         (parameter_array): Ditto.
19750         (property_declaration): Ditto.
19751         (destructor_declaration): Ditto.
19752
19753         * class.cs (Struct::Struct): Update constructors accordingly.
19754         (Class::Class): Ditto.
19755         (Field::Field): Ditto.
19756         (Method::Method): Ditto.
19757         (Property::Property): Ditto.
19758         (TypeContainer::OptAttribute): update property's return type.
19759
19760         * interface.cs (Interface.opt_attributes): New member.
19761         (Interface::Interface): Update to take the extra Attributes argument.
19762
19763         * parameter.cs (Parameter::Parameter): Ditto.
19764
19765         * constant.cs (Constant::Constant): Ditto.
19766
19767         * interface.cs (InterfaceMemberBase): New OptAttributes field.
19768         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
19769         the attributes as a parameter.
19770         (InterfaceProperty): Update constructor call.
19771         (InterfaceEvent): Ditto.
19772         (InterfaceMethod): Ditto.
19773         (InterfaceIndexer): Ditto.
19774
19775         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
19776         pass the attributes too.
19777         (interface_event_declaration): Ditto.
19778         (interface_property_declaration): Ditto.
19779         (interface_method_declaration): Ditto.
19780         (interface_declaration): Ditto.
19781
19782 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
19783
19784         * class.cs (Method::Define): Track the "static Main" definition to
19785         create an entry point. 
19786
19787         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
19788         EntryPoint if we find it. 
19789
19790         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
19791         (EmitContext::ig): Make this variable public.
19792
19793         * driver.cs: Make the default output file be the first file name
19794         with the .exe extension.  
19795
19796         Detect empty compilations
19797
19798         Handle various kinds of output targets.  Handle --target and
19799         rename -t to --dumper.
19800
19801         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
19802         methods inherited from Expression return now an Expression.  This
19803         will is used during the tree rewriting as we resolve them during
19804         semantic analysis.
19805
19806         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
19807         the spec.  Missing entirely is the information about
19808         accessability of elements of it.
19809
19810         (Expression::ExprClassFromMemberInfo): New constructor for
19811         Expressions that creates a fully initialized Expression based on
19812         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
19813         a Type.
19814
19815         (Invocation::Resolve): Begin implementing resolution of invocations.
19816
19817         * literal.cs (StringLiteral):  Implement Emit.
19818
19819 2001-09-05  Ravi Pratap  <ravi@ximian.com>
19820
19821         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
19822         member.
19823
19824 2001-09-04  Ravi Pratap  <ravi@ximian.com>
19825
19826         * cs-parser.jay (attribute_arguments): Implement actions.
19827         (attribute): Fix bug in production. Implement action.
19828         (attribute_list): Implement.
19829         (attribute_target): Implement.
19830         (attribute_target_specifier, opt_target_specifier): Implement
19831         (CheckAttributeTarget): New method to check if the attribute target
19832         is valid.
19833         (attribute_section): Implement.
19834         (opt_attributes): Implement.
19835
19836         * attribute.cs : New file to handle attributes.
19837         (Attribute): Class to hold attribute info.
19838
19839         * cs-parser.jay (opt_attribute_target_specifier): Remove production
19840         (attribute_section): Modify production to use 2 different rules to 
19841         achieve the same thing. 1 s/r conflict down !
19842         Clean out commented, useless, non-reducing dimension_separator rules.
19843
19844         * class.cs (TypeContainer.attributes): New member to hold list
19845         of attributes for a type.
19846         (Struct::Struct): Modify to take one more argument, the attribute list.
19847         (Class::Class): Ditto.
19848         (Field::Field): Ditto.
19849         (Method::Method): Ditto.
19850         (Property::Property): Ditto.
19851
19852         * cs-parser.jay (struct_declaration): Update constructor call to
19853         pass in the attributes too.
19854         (class_declaration): Ditto.
19855         (constant_declaration): Ditto.
19856         (field_declaration): Ditto.
19857         (method_header): Ditto.
19858         (fixed_parameter): Ditto.
19859         (parameter_array): Ditto.
19860         (property_declaration): Ditto.
19861
19862         * constant.cs (Constant::Constant): Update constructor similarly.
19863         Use System.Collections.
19864
19865         * parameter.cs (Parameter::Parameter): Update as above.
19866
19867 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19868
19869         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
19870         (TypeContainer.delegates): New member to hold list of delegates.
19871
19872         * cs-parser.jay (delegate_declaration): Implement the action correctly 
19873         this time as I seem to be on crack ;-)
19874
19875 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
19876
19877         * rootcontext.cs (RootContext::IsNamespace): new function, used to
19878         tell whether an identifier represents a namespace.
19879
19880         * expression.cs (NamespaceExpr): A namespace expression, used only
19881         temporarly during expression resolution.
19882         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
19883         utility functions to resolve names on expressions.
19884
19885 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
19886
19887         * codegen.cs: Add hook for StatementExpressions. 
19888
19889         * class.cs: Fix inverted test for static flag in methods.
19890
19891 2001-09-02  Ravi Pratap  <ravi@ximian.com>
19892
19893         * class.cs (Operator::CheckUnaryOperator): Correct error number used
19894         to make it coincide with MS' number.
19895         (Operator::CheckBinaryOperator): Ditto.
19896
19897         * ../errors/errors.txt : Remove error numbers added earlier.
19898
19899         * ../errors/cs1019.cs : Test case for error # 1019
19900
19901         * ../errros/cs1020.cs : Test case for error # 1020
19902
19903         * cs-parser.jay : Clean out commented cruft.
19904         (dimension_separators, dimension_separator): Comment out. Ostensibly not
19905         used anywhere - non-reducing rule.
19906         (namespace_declarations): Non-reducing rule - comment out.
19907
19908         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
19909         with TypeContainer::AddEnum.
19910
19911         * delegate.cs : New file for delegate handling classes.
19912         (Delegate): Class for declaring delegates.
19913
19914         * makefile : Update.
19915
19916         * cs-parser.jay (delegate_declaration): Implement.
19917
19918 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
19919
19920         * class.cs (Event::Define): Implement.
19921         (Event.EventBuilder): New member.
19922
19923         * class.cs (TypeContainer::Populate): Update to define all enums and events
19924         we have.
19925         (Events): New property for the events arraylist we hold. Shouldn't we move to using
19926         readonly fields for all these cases ?
19927
19928 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19929
19930         * class.cs (Property): Revamp to use the convention of making fields readonly.
19931         Accordingly modify code elsewhere.
19932
19933         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
19934         the Define method of the Property class.
19935
19936         * class.cs : Clean up applied patch and update references to variables etc. Fix 
19937         trivial bug.
19938         (TypeContainer::Populate): Update to define all the properties we have. Also
19939         define all enumerations.
19940
19941         * enum.cs (Define): Implement.
19942
19943 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
19944
19945         * cs-parser.jay (overloadable_operator): The semantic value is an
19946         enum of the Operator class.
19947         (operator_declarator): Implement actions.
19948         (operator_declaration): Implement.
19949
19950         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
19951         validity of definitions.
19952         (Operator::CheckBinaryOperator): Static method to check for binary operators
19953         (TypeContainer::AddOperator): New method to add an operator to a type.
19954
19955         * cs-parser.jay (indexer_declaration): Added line to actually call the
19956         AddIndexer method so it gets added ;-)
19957
19958         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
19959         already taken care of by the MS compiler ?  
19960
19961 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19962
19963         * class.cs (Operator): New class for operator declarations.
19964         (Operator::OpType): Enum for the various operators.
19965
19966 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
19967
19968         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
19969         ostensibly handle this in semantic analysis.
19970
19971         * cs-parser.jay (general_catch_clause): Comment out
19972         (specific_catch_clauses, specific_catch_clause): Ditto.
19973         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
19974         (catch_args, opt_catch_args): New productions.
19975         (catch_clause): Rewrite to use the new productions above
19976         (catch_clauses): Modify accordingly.
19977         (opt_catch_clauses): New production to use in try_statement
19978         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
19979         and re-write the code in the actions to extract the specific and
19980         general catch clauses by being a little smart ;-)
19981
19982         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
19983         Hooray, try and catch statements parse fine !
19984
19985 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19986
19987         * statement.cs (Block::GetVariableType): Fix logic to extract the type
19988         string from the hashtable of variables.
19989
19990         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
19991         I end up making that mistake ;-)
19992         (catch_clauses): Fixed gross error which made Key and Value of the 
19993         DictionaryEntry the same : $1 !!
19994
19995 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
19996
19997         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
19998
19999         * cs-parser.jay (event_declaration): Correct to remove the semicolon
20000         when the add and remove accessors are specified. 
20001
20002 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
20003
20004         * cs-parser.jay (IndexerDeclaration): New helper class to hold
20005         information about indexer_declarator.
20006         (indexer_declarator): Implement actions.
20007         (parsing_indexer): New local boolean used to keep track of whether
20008         we are parsing indexers or properties. This is necessary because 
20009         implicit_parameters come into picture even for the get accessor in the 
20010         case of an indexer.
20011         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
20012
20013         * class.cs (Indexer): New class for indexer declarations.
20014         (TypeContainer::AddIndexer): New method to add an indexer to a type.
20015         (TypeContainer::indexers): New member to hold list of indexers for the
20016         type.
20017
20018 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
20019
20020         * cs-parser.jay (add_accessor_declaration): Implement action.
20021         (remove_accessor_declaration): Implement action.
20022         (event_accessors_declaration): Implement
20023         (variable_declarators): swap statements for first rule - trivial.
20024
20025         * class.cs (Event): New class to hold information about event
20026         declarations.
20027         (TypeContainer::AddEvent): New method to add an event to a type
20028         (TypeContainer::events): New member to hold list of events.
20029
20030         * cs-parser.jay (event_declaration): Implement actions.
20031
20032 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
20033
20034         * cs-parser.jay (dim_separators): Implement. Make it a string
20035         concatenating all the commas together, just as they appear.
20036         (opt_dim_separators): Modify accordingly
20037         (rank_specifiers): Update accordingly. Basically do the same
20038         thing - instead, collect the brackets here.
20039         (opt_rank_sepcifiers): Modify accordingly.
20040         (array_type): Modify to actually return the complete type string
20041         instead of ignoring the rank_specifiers.
20042         (expression_list): Implement to collect the expressions
20043         (variable_initializer): Implement. We make it a list of expressions
20044         essentially so that we can handle the array_initializer case neatly too.
20045         (variable_initializer_list): Implement.
20046         (array_initializer): Make it a list of variable_initializers
20047         (opt_array_initializer): Modify accordingly.
20048
20049         * expression.cs (New::NType): Add enumeration to help us
20050         keep track of whether we have an object/delegate creation
20051         or an array creation.
20052         (New:NewType, New::Rank, New::Indices, New::Initializers): New
20053         members to hold data about array creation.
20054         (New:New): Modify to update NewType
20055         (New:New): New Overloaded contructor for the array creation
20056         case.
20057
20058         * cs-parser.jay (array_creation_expression): Implement to call
20059         the overloaded New constructor.
20060
20061 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
20062
20063         * class.cs (TypeContainer::Constructors): Return member
20064         constructors instead of returning null.
20065
20066 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
20067
20068         * typemanager.cs (InitCoreTypes): Initialize the various core
20069         types after we have populated the type manager with the user
20070         defined types (this distinction will be important later while
20071         compiling corlib.dll)
20072
20073         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
20074         on Expression Classification.  Now all expressions have a method
20075         `Resolve' and a method `Emit'.
20076
20077         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
20078         generation from working.     Also add some temporary debugging
20079         code. 
20080
20081 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
20082
20083         * codegen.cs: Lots of code generation pieces.  This is only the
20084         beginning, will continue tomorrow with more touches of polish.  We
20085         handle the fundamentals of if, while, do, for, return.  Others are
20086         trickier and I need to start working on invocations soon.
20087
20088         * gen-treedump.cs: Bug fix, use s.Increment here instead of
20089         s.InitStatement. 
20090
20091         * codegen.cs (EmitContext): New struct, used during code
20092         emission to keep a context.   Most of the code generation will be
20093         here. 
20094
20095         * cs-parser.jay: Add embedded blocks to the list of statements of
20096         this block.  So code generation proceeds in a top down fashion.
20097
20098 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
20099
20100         * statement.cs: Add support for multiple child blocks.
20101
20102 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
20103
20104         * codegen.cs (EmitCode): New function, will emit the code for a
20105         Block of code given a TypeContainer and its ILGenerator. 
20106
20107         * statement.cs (Block): Standard public readonly optimization.
20108         (Block::Block constructors): Link children. 
20109         (Block::Child): Child Linker.
20110         (Block::EmitVariables): Emits IL variable declarations.
20111
20112         * class.cs: Drop support for MethodGroups here, delay until
20113         Semantic Analysis.
20114         (Method::): Applied the same simplification that I did before, and
20115         move from Properties to public readonly fields.
20116         (Method::ParameterTypes): Returns the parameter types for the
20117         function, and implements a cache that will be useful later when I
20118         do error checking and the semantic analysis on the methods is
20119         performed.
20120         (Constructor::GetCallingConvention): Renamed from CallingConvetion
20121         and made a method, optional argument tells whether this is a class
20122         or a structure to apply the `has-this' bit.
20123         (Method::GetCallingConvention): Implement, returns the calling
20124         convention. 
20125         (Method::Define): Defines the type, a second pass is performed
20126         later to populate the methods.
20127
20128         (Constructor::ParameterTypes): implement a cache similar to the
20129         one on Method::ParameterTypes, useful later when we do semantic
20130         analysis. 
20131
20132         (TypeContainer::EmitMethod):  New method.  Emits methods.
20133
20134         * expression.cs: Removed MethodGroup class from here.
20135
20136         * parameter.cs (Parameters::GetCallingConvention): new method.
20137
20138 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
20139
20140         * class.cs (TypeContainer::Populate): Drop RootContext from the
20141         argument. 
20142
20143         (Constructor::CallingConvention): Returns the calling convention.
20144         (Constructor::ParameterTypes): Returns the constructor parameter
20145         types. 
20146
20147         (TypeContainer::AddConstructor): Keep track of default constructor
20148         and the default static constructor.
20149
20150         (Constructor::) Another class that starts using `public readonly'
20151         instead of properties. 
20152
20153         (Constructor::IsDefault): Whether this is a default constructor. 
20154
20155         (Field::) use readonly public fields instead of properties also.
20156
20157         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
20158         track of static constructors;  If none is used, turn on
20159         BeforeFieldInit in the TypeAttributes. 
20160
20161         * cs-parser.jay (opt_argument_list): now the return can be null
20162         for the cases where there are no arguments. 
20163
20164         (constructor_declarator): If there is no implicit `base' or
20165         `this', then invoke the default parent constructor. 
20166
20167         * modifiers.cs (MethodAttr): New static function maps a set of
20168         modifiers flags into a MethodAttributes enum
20169         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
20170         MethodAttr, TypeAttr to represent the various mappings where the
20171         modifiers are used.
20172         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
20173
20174 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
20175
20176         * parameter.cs (GetParameterInfo): Fix bug where there would be no
20177         method arguments.
20178
20179         * interface.cs (PopulateIndexer): Implemented the code generator
20180         for interface indexers.
20181
20182 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
20183
20184         * interface.cs (InterfaceMemberBase): Now we track the new status
20185         here.  
20186
20187         (PopulateProperty): Implement property population.  Woohoo!  Got
20188         Methods and Properties going today. 
20189
20190         Removed all the properties for interfaces, and replaced them with
20191         `public readonly' fields. 
20192
20193 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
20194
20195         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
20196         initialize their hashtables/arraylists only when they are needed
20197         instead of doing this always.
20198
20199         * parameter.cs: Handle refs and out parameters.
20200
20201         * cs-parser.jay: Use an ArrayList to construct the arguments
20202         instead of the ParameterCollection, and then cast that to a
20203         Parameter[] array.
20204
20205         * parameter.cs: Drop the use of ParameterCollection and use
20206         instead arrays of Parameters.
20207
20208         (GetParameterInfo): Use the Type, not the Name when resolving
20209         types. 
20210
20211 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
20212
20213         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
20214         and instead use public readonly fields.
20215
20216         * class.cs: Put back walking code for type containers.
20217
20218 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
20219
20220         * class.cs (MakeConstant): Code to define constants.
20221
20222         * rootcontext.cs (LookupType): New function.  Used to locate types 
20223
20224
20225 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
20226
20227         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
20228         this System.Reflection code is.  Kudos to Microsoft
20229
20230         * typemanager.cs: Implement a type cache and avoid loading all
20231         types at boot time.  Wrap in LookupType the internals.  This made
20232         the compiler so much faster.  Wow.  I rule!
20233
20234         * driver.cs: Make sure we always load mscorlib first (for
20235         debugging purposes, nothing really important).
20236
20237         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
20238         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
20239
20240         * rootcontext.cs: Lookup types on their namespace;  Lookup types
20241         on namespaces that have been imported using the `using' keyword.
20242
20243         * class.cs (TypeContainer::TypeAttr): Virtualize.
20244         (Class::TypeAttr): Return attributes suitable for this bad boy.
20245         (Struct::TypeAttr): ditto.
20246         Handle nested classes.
20247         (TypeContainer::) Remove all the type visiting code, it is now
20248         replaced with the rootcontext.cs code
20249
20250         * rootcontext.cs (GetClassBases): Added support for structs. 
20251
20252 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
20253
20254         * interface.cs, statement.cs, class.cs, parameter.cs,
20255         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
20256         Drop use of TypeRefs, and use strings instead.
20257
20258 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
20259
20260         * rootcontext.cs: 
20261
20262         * class.cs (Struct::Struct): set the SEALED flags after
20263         checking the modifiers.
20264         (TypeContainer::TypeAttr): new property, returns the
20265         TypeAttributes for a class.  
20266
20267         * cs-parser.jay (type_list): Oops, list production was creating a
20268         new list of base types.
20269
20270         * rootcontext.cs (StdLib): New property.
20271         (GetInterfaceTypeByName): returns an interface by type name, and
20272         encapsulates error handling here.
20273         (GetInterfaces): simplified.
20274         (ResolveTree): Encapsulated all the tree resolution here.
20275         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
20276         types. 
20277
20278         * driver.cs: Add support for --nostdlib, to avoid loading the
20279         default assemblies.
20280         (Main): Do not put tree resolution here. 
20281
20282         * rootcontext.cs: Beginning of the class resolution.
20283
20284 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
20285
20286         * rootcontext.cs: Provide better error reporting. 
20287
20288         * cs-parser.jay (interface_base): set our $$ to be interfaces.
20289
20290         * rootcontext.cs (CreateInterface): Handle the case where there
20291         are no parent interfaces.
20292
20293         (CloseTypes): Routine to flush types at the end.
20294         (CreateInterface): Track types.
20295         (GetInterfaces): Returns an array of Types from the list of
20296         defined interfaces.
20297
20298         * typemanager.c (AddUserType): Mechanism to track user types (puts
20299         the type on the global type hash, and allows us to close it at the
20300         end). 
20301
20302 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
20303
20304         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
20305         RecordInterface instead.
20306
20307         * cs-parser.jay: Updated to reflect changes above.
20308
20309         * decl.cs (Definition): Keep track of the TypeBuilder type that
20310         represents this type here.  Not sure we will use it in the long
20311         run, but wont hurt for now.
20312
20313         * driver.cs: Smaller changes to accomodate the new code.
20314
20315         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
20316         when done. 
20317
20318         * rootcontext.cs (CreateInterface):  New method, used to create
20319         the System.TypeBuilder type for interfaces.
20320         (ResolveInterfaces): new entry point to resolve the interface
20321         hierarchy. 
20322         (CodeGen): Property, used to keep track of the code generator.
20323
20324 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
20325
20326         * cs-parser.jay: Add a second production for delegate_declaration
20327         with `VOID'.
20328
20329         (enum_body): Put an opt_comma here instead of putting it on
20330         enum_body or enum_member_declarations so we can handle trailing
20331         commas on enumeration members.  Gets rid of a shift/reduce.
20332
20333         (type_list): Need a COMMA in the middle.
20334
20335         (indexer_declaration): Tell tokenizer to recognize get/set
20336
20337         * Remove old targets.
20338
20339         * Re-add the parser target.
20340
20341 2001-07-13  Simon Cozens <simon@simon-cozens.org>
20342
20343         * cs-parser.jay: Add precendence rules for a number of operators
20344         ot reduce the number of shift/reduce conflicts in the grammar.
20345
20346 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
20347
20348         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
20349         and put it here.
20350
20351         Get rid of old crufty code.
20352
20353         * rootcontext.cs: Use this to keep track of the parsed
20354         representation and the defined types available to the program. 
20355
20356         * gen-treedump.cs: adjust for new convention.
20357
20358         * type.cs: Split out the type manager, and the assembly builder
20359         from here. 
20360
20361         * typemanager.cs: the type manager will live here now.
20362
20363         * cil-codegen.cs: And the code generator here. 
20364
20365 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
20366
20367         * makefile: Fixed up for easy making.
20368
20369 2001-07-13  Simon Cozens <simon@simon-cozens.org>
20370
20371         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
20372         the 
20373
20374         (unary_expression): Expand pre_increment_expression and
20375         post_decrement_expression to reduce a shift/reduce.
20376
20377 2001-07-11  Simon Cozens
20378
20379         * cs-tokenizer.cs: Hex numbers should begin with a 0.
20380
20381         Improve allow_keyword_as_indent name.
20382
20383 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
20384
20385         * Adjustments for Beta2. 
20386
20387 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
20388
20389         * decl.cs: Added `Define' abstract method.
20390         (InTransit): new property, used to catch recursive definitions. 
20391
20392         * interface.cs: Implement `Define'. 
20393
20394         * modifiers.cs: Map Modifiers.constants to
20395         System.Reflection.TypeAttribute flags.
20396
20397         * class.cs: Keep track of types and user-defined types.
20398         (BuilderInit): New method for creating an assembly
20399         (ResolveType): New function to launch the resolution process, only
20400         used by interfaces for now.
20401
20402         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
20403         that are inserted into the name space. 
20404
20405 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
20406
20407         * ARGH.  I have screwed up my tree so many times due to the use of
20408         rsync rather than using CVS.  Going to fix this at once. 
20409
20410         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
20411         load types.
20412
20413 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
20414
20415         * Experiment successful: Use System.Type rather that our own
20416         version of Type.  
20417
20418 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
20419
20420         * cs-parser.jay: Removed nsAliases from here.
20421
20422         Use new namespaces, handle `using XXX;' 
20423
20424         * namespace.cs: Reimplemented namespace handling, use a recursive
20425         definition of the class.  Now we can keep track of using clauses
20426         and catch invalid using clauses.
20427
20428 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
20429
20430         * gen-treedump.cs: Adapted for all the renaming.
20431
20432         * expression.cs (Expression): this class now has a Type property
20433         which returns an expression Type.
20434
20435         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
20436         `Type', as this has a different meaning now in the base
20437
20438 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
20439
20440         * interface.cs, class.cs: Removed from all the sources the
20441         references to signature computation, as we can not do method
20442         signature computation during the parsing time, as we are not
20443         trying to solve at that point distinguishing:
20444
20445         class X {
20446                 void a (Blah x) {}
20447                 void a (NS.Blah x) {}
20448         }
20449
20450         Which depending on the context might be valid or not, as we do not
20451         know if Blah is the same thing as NS.Blah at that point.
20452
20453         * Redid everything so the code uses TypeRefs now instead of
20454         Types.  TypeRefs are just temporary type placeholders, that need
20455         to be resolved.  They initially have a pointer to a string and the
20456         current scope in which they are used.  This is used later by the
20457         compiler to resolve the reference to an actual Type. 
20458
20459         * DeclSpace is no longer a CIR.Type, and neither are
20460         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
20461         are all DeclSpaces, but no Types. 
20462
20463         * type.cs (TypeRefManager): This implements the TypeRef manager,
20464         which keeps track of all the types that need to be resolved after
20465         the parsing has finished. 
20466
20467 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
20468
20469         * ARGH.  We are going to have to store `foreach' as a class rather
20470         than resolving it, as we need to verify error 1579 after name
20471         resolution.   *OR* we could keep a flag that says `This request to
20472         IEnumerator comes from a foreach statement' which we can then use
20473         to generate the error.
20474
20475 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
20476
20477         * class.cs (TypeContainer.AddMethod): we now add methods to the
20478         MethodGroup instead of the method hashtable.  
20479
20480         * expression.cs: Add MethodGroup abstraction, which gets us one
20481         step closer to the specification in the way we handle method
20482         declarations.  
20483
20484         * cs-parser.jay (primary_expression): qualified_identifier now
20485         tried to match up an identifier to a local variable reference or
20486         to a parameter reference.
20487
20488         current_local_parameters is now a parser global variable that
20489         points to the current parameters for the block, used during name
20490         lookup.
20491
20492         (property_declaration): Now creates an implicit `value' argument to
20493         the set accessor.
20494
20495 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
20496
20497         * parameter.cs: Do not use `param' arguments as part of the
20498         signature, per the spec.
20499
20500 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
20501
20502         * decl.cs: Base class for classes, structs and interfaces.  This
20503         is the "Declaration Space" 
20504
20505         * cs-parser.jay: Use CheckDef for checking declaration errors
20506         instead of having one on each function.
20507
20508         * class.cs: Factor out some code for handling error handling in
20509         accordance to the "Declarations" section in the "Basic Concepts"
20510         chapter in the ECMA C# spec.
20511
20512         * interface.cs: Make all interface member classes derive from
20513         InterfaceMemberBase.
20514
20515 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
20516
20517         * Many things: all interfaces are parsed and generated in
20518         gen-treedump.  Support for member variables, constructors,
20519         destructors, properties, constants is there.
20520
20521         Beginning of the IL backend, but very little done, just there for
20522         testing purposes. 
20523
20524 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
20525
20526         * cs-parser.jay: Fix labeled statement.
20527
20528         * cs-tokenizer.cs (escape): Escape " and ' always.
20529         ref_line, ref_name: keep track of the line/filename as instructed
20530         by #line by the compiler.
20531         Parse #line.
20532
20533 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
20534
20535         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
20536         to match the values in System.CodeDOM.
20537
20538         Divid renamed to Divide.
20539
20540         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
20541         statements. 
20542         (Statements.set): remove.
20543
20544         * System.CodeDOM/CodeCatchClause.cs: always have a valid
20545         statements. 
20546
20547         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
20548         falseStatements always have valid values. 
20549
20550         * cs-parser.jay: Use System.CodeDOM now.
20551