2004-10-18 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / mcs / ChangeLog
1 2004-10-18  Martin Baulig  <martin@ximian.com>
2
3         Merged latest changes into gmcs.  Please keep this comment in
4         here, it makes it easier for me to see what changed in MCS since
5         the last time I merged.
6
7 2004-10-18  Martin Baulig  <martin@ximian.com>
8
9         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
10         `Type' directly, but call ResolveType() on it.
11         (Probe.DoResolve): Likewise.
12
13 2004-10-18  Martin Baulig  <martin@ximian.com>
14
15         * expression.cs (Invocation.BetterFunction): Put back
16         TypeManager.TypeToCoreType().
17
18 2004-10-18  Raja R Harinath  <rharinath@novell.com>
19
20         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
21         the ResolveType.
22
23 2004-10-18  Martin Baulig  <martin@ximian.com>
24
25         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
26         `Type' directly, but call ResolveType() on it.
27
28 2004-10-18  Martin Baulig  <martin@ximian.com>
29
30         * class.cs (FieldMember.Define): Don't access the TypeExpr's
31         `Type' directly, but call ResolveType() on it.
32         (MemberBase.DoDefine): Likewise.
33
34         * expression.cs (New.DoResolve): Don't access the TypeExpr's
35         `Type' directly, but call ResolveType() on it.
36         (ComposedCast.DoResolveAsTypeStep): Likewise.
37
38         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
39         `Type' directly, but call ResolveType() on it.
40
41 2004-10-11  Martin Baulig  <martin@ximian.com>
42
43         * report.cs: Don't make --fatal abort on warnings, we have
44         -warnaserror for that.
45
46 2004-10-07  Raja R Harinath  <rharinath@novell.com>
47
48         More DeclSpace.ResolveType avoidance.
49         * decl.cs (MemberCore.InUnsafe): New property.
50         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
51         with newly created EmitContext.
52         (FieldMember.Define): Likewise.
53         * delegate.cs (Delegate.Define): Likewise.
54         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
55         only if normal name-lookup fails.
56         (TypeExpr.DoResolve): Enable error-checking.
57         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
58         (SizeOf.DoResolve): Likewise.
59         (ComposedCast.DoResolveAsTypeStep): Likewise.
60         (StackAlloc.DoResolve): Likewise.
61         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
62         (Block.Unsafe): New property.
63         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
64         (Unsafe): Set 'unsafe' flag of contained block.
65         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
66         (Fixed.Resolve): Likewise.
67         (Catch.Resolve): Likewise.
68         (Using.ResolveLocalVariableDecls): Likewise.
69         (Foreach.Resolve): Likewise.
70
71 2004-10-05  John Luke <john.luke@gmail.com>
72
73         * cs-parser.jay: add location to error CS0175
74
75 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
76
77         * ecore.cs (Expression.Constantity): Add support for turning null
78         into a constant.
79
80         * const.cs (Const.Define): Allow constants to be reference types
81         as long as the value is Null.
82
83 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
84
85         * namespace.cs (NamespaceEntry.Using): No matter which warning
86         level is set, check if this namespace name has already been added.
87
88 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
89
90         * expression.cs: reftype [!=]= null should always use br[true,false].
91         # 67410
92
93 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
94
95         Fix #67108
96         * attribute.cs: Enum conversion moved to 
97         GetAttributeArgumentExpression to be applied to the all
98         expressions.
99
100 2004-10-01  Raja R Harinath  <rharinath@novell.com>
101
102         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
103         * class.c (TypeContainer.DefineType): Flag error if
104         base types aren't accessible due to access permissions.
105         * decl.cs (DeclSpace.ResolveType): Move logic to
106         Expression.ResolveAsTypeTerminal.
107         (DeclSpace.ResolveTypeExpr): Thin layer over
108         Expression.ResolveAsTypeTerminal.
109         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
110         Refactor code into NestedAccess.  Use it.
111         (DeclSpace.NestedAccess): New.
112         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
113         argument to silence errors.  Check access permissions.
114         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
115         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
116         (Cast.DoResolve): Likewise.
117         (New.DoResolve): Likewise.
118         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
119         (TypeOf.DoResolve): Likewise.
120
121         * expression.cs (Invocation.BetterConversion): Return the Type of
122         the better conversion.  Implement section 14.4.2.3 more faithfully.
123         (Invocation.BetterFunction): Make boolean.  Make correspondence to
124         section 14.4.2.2 explicit.
125         (Invocation.OverloadResolve): Update.
126         (Invocation): Remove is_base field.
127         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
128         (Invocation.Emit): Likewise.
129
130 2004-09-27  Raja R Harinath  <rharinath@novell.com>
131
132         * README: Update to changes.
133
134 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
135
136         * cs-parser.jay: Reverted 642 warning fix.
137
138 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
139
140         Fix bug #66615
141         * decl.cs (FindMemberWithSameName): Indexer can have more than
142         1 argument.
143
144 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
145
146         * expression.cs (LocalVariableReference.DoResolveLValue):
147         Do not report warning 219 for out values.
148         (EmptyExpression.Null): New member to avoid extra allocations.
149
150 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
151
152         * cs-parser.jay: Fix wrong warning 642 report.
153
154         * cs-tokenizer.cs (CheckNextToken): New helper;
155         Inspect next character if is same as expected.
156
157 2004-09-23  Martin Baulig  <martin@ximian.com>
158
159         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
160         (Convert.ImplicitReferenceConversionExists): Likewise.
161
162 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
163
164         * class.cs (Operator.Define): Add error 448 and 559 report.
165
166 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
167
168         * class.cs (MemberBase.IsTypePermitted): New protected
169         method for checking error CS0610.
170
171 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
172
173         * class.cs (TypeContainer.HasExplicitLayout): New property
174         Returns whether container has StructLayout attribute set Explicit.
175         (FieldMember): New abstract class for consts and fields.
176         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
177         (Field): Reuse FieldMember.
178
179         * const.cs (Const): Reuse FieldMember.
180
181         * rootcontext.cs: EmitConstants call moved to class.
182
183 2004-09-22  Martin Baulig  <martin@ximian.com>
184
185         Thanks to Peter Sestoft for this bug report.
186
187         * expression.cs (Conditional): If both the `trueExpr' and the
188         `falseExpr' is a NullLiteral, return a NullLiteral.
189
190 2004-09-22  Martin Baulig  <martin@ximian.com>
191
192         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
193         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
194         for the "get_Current" call.
195
196 2004-09-22  Martin Baulig  <martin@ximian.com>
197
198         Marek and me just fixed one of our oldest bugs: #28562 :-)
199
200         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
201
202         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
203         we're an EnumConstant, just return that.
204         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
205         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
206         to get the value which'll actually be written into the attribute.
207         However, we have to use GetValue() to access the attribute's value
208         in the compiler.        
209
210 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
211
212         * constant.cs (Constant.IsNegative): New abstract property
213         IsNegative.
214
215         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
216         (StackAlloc.DoResolve): Reused IsNegative.
217
218 2004-09-21  Martin Baulig  <martin@ximian.com>
219
220         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
221         if we're used in an iterator, we may be called from different
222         methods.
223
224         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
225         we actually have an exception block.
226
227 2004-09-20  John Luke <jluke@cfl.rr.com>
228
229         * class.cs, cs-parser.jay: Improve the error report for 1520:
230         report the actual line where the error happens, not where the
231         class was declared.
232
233         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
234         Pass location information that was available elsewhere.
235
236 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
237
238         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
239         runtime to delay sign assemblies.
240
241 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
242
243         * cs-parser.jay: Do not report the stack trace, this is barely
244         used nowadays.
245
246 2004-08-22  John Luke  <john.luke@gmail.com>
247  
248         * driver.cs : check that a resource id is not already used
249         before adding it, report CS1508 if it is, bug #63637
250
251 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
252
253         * ecore.cs: Removed dead code.
254
255 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
256
257         * class.cs: Do not report warning CS0067 on the interfaces.
258
259 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
260
261         * cs-parser.jay: Add error 504 report.
262
263 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
264
265         * rootcontext.cs: WarningLevel is 4 by default now.
266
267         * statement.cs (Fixed.Resolve): Do not null
268         VariableInfo.
269
270 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
271
272         Fixed bug #55780
273         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
274         deep search when property is not virtual.
275         (PropertyExpr.ResolveAccessors): Make one call for both
276         accessors.
277
278 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
279
280         Fixed bug #65766
281         * statement.cs: Error 152 report constains also location.
282
283 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
284
285         Fixed bug #65766
286         * const.cs: Explicitly set constant as static.
287
288 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
289
290         Fixed bug #64226
291         * cs-parser.jay: Add error 1017 report.
292
293 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
294
295         Fixed bug #59980, #64224
296         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
297
298         * typemanager.cs (IsSpecialMethod): Simplified
299
300 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
301
302         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
303         condition with better params.
304
305 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
306
307         Fixed bug #65238
308         * attribute.cs (Resolve): Property has to have both
309         accessors.
310
311 2004-09-14  Martin Baulig  <martin@ximian.com>
312
313         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
314
315 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
316
317         Fixed bug #61902
318         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
319         called and is obsolete then this member suppress message
320         when call is inside next [Obsolete] method or type.
321
322         * expression.cs: Use TestObsoleteMethodUsage member.
323
324 2004-09-14  Martin Baulig  <martin@ximian.com>
325
326         * cs-parser.jay: Sync a bit with the GMCS version.
327
328 2004-09-14  Martin Baulig  <martin@ximian.com>
329
330         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
331         (CSharpParser.yacc_verbose_flag): New public field.
332
333         * genericparser.cs: Removed.
334
335 2004-09-14  Raja R Harinath  <rharinath@novell.com>
336
337         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
338
339 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
340
341         * class.cs (MethodCore.CheckBase): Fix bug #65757.
342
343 2004-09-10  Martin Baulig  <martin@ximian.com>
344
345         Backported my MemberName changes from GMCS into MCS.
346
347         - we are now using a special `MemberName' class instead of using
348         strings; in GMCS, the `MemberName' also contains the type
349         arguments.
350
351         - changed the grammar rules a bit:
352           * the old `member_name' is now a `namespace_or_type_name':
353             The rule is that we use `namespace_or_type_name' everywhere
354             where we expect either a "member name" (GetEnumerator) or a
355             "member name" with an explicit interface name
356             (IEnumerable.GetEnumerator).
357             In GMCS, the explicit interface name may include type arguments
358             (IEnumerable<T>.GetEnumerator).
359           * we use `member_name' instead of just `IDENTIFIER' for
360             "member names":
361             The rule is that we use `member_name' wherever a member may
362             have type parameters in GMCS.       
363
364         * decl.cs (MemberName): New public class.
365         (MemberCore.MemberName): New public readonly field.
366         (MemberCore.ctor): Take a `MemberName' argument, not a string.
367         (DeclSpace): Likewise.
368
369         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
370         * enum.cs (Enum.ctor): Likewise.
371
372         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
373         MemberName.     
374         (AliasEntry.ctor): Take a MemberName, not an Expression.
375         (AliasEntry.UsingAlias): Likewise.
376
377         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
378         (IMethodData.MemberName): Changed type from string to MemberName.
379         (MemberBase.ExplicitInterfaceName): Likewise.
380         (AbstractPropertyEventMethod.SetupName): Make this private.
381         (AbstractPropertyEventMethod.ctor): Added `string prefix'
382         argument; compute the member name here.
383         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
384         on the `member.MemberName' and the `prefix'.
385
386         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
387         not `type_name'.
388         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
389         thus, we get a `MemberName' instead of a `string'.  These
390         declarations may have type parameters in GMCS.
391         (interface_method_declaration, delegate_declaration): Likewise.
392         (class_declaration, interface_declaration): Likewise.
393         (method_header): Use `namespace_or_type_name' instead of
394         `member_name'.  We may be an explicit interface implementation.
395         (property_declaration, event_declaration): Likewise.
396         (member_name): This is now just an `IDENTIFIER', not a
397         `namespace_or_type_name'.
398         (type_name, interface_type): Removed.
399         (namespace_or_type_name): Return a MemberName, not an Expression.
400         (primary_expression): Use `member_name' instead of `IDENTIFIER';
401         call GetTypeExpression() on the MemberName to get an expression.
402         (IndexerDeclaration.interface_type): Changed type from string to
403         MemberName.
404         (MakeName): Operate on MemberName's instead of string's.
405
406 2004-09-13  Raja R Harinath  <rharinath@novell.com>
407
408         Fix bug #55770.
409         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
410         (NamespaceEntry.Lookup): Add new argument to flag if we want the
411         lookup to avoid symbols introduced by 'using'.
412         * rootcontext.cs (NamespaceLookup): Update.
413
414 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
415
416         * class.cs (TypeContainer.DoDefineMembers): Do not call
417         DefineDefaultConstructor for static classes.
418
419 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
420
421         * attribute.cs (Attribute.Resolve): Add error 653 report.
422
423         * class.cs (Class.ApplyAttributeBuilder): Add error 641
424         report.
425         (Method.ApplyAttributeBuilder): Add error 685 report.
426         (Operator.Define): Add error 564 report.
427
428         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
429
430         * expression.cs (Invocation.DoResolve): Add error
431         245 and 250 report.
432
433         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
434         error 674 report.
435
436 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
437
438         * class.cs (ConstructorInitializer.Resolve):
439         Wrong error number (515->516).
440
441 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
442
443         * class.cs (Indexer.Define): Add error 631 report.
444
445 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
446
447         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
448
449 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
450
451         * expression.cs (Probe.DoResolve): Add error CS0241 report.
452
453 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
454
455         * cs-parser.jay: Added error CS0241 report.
456
457 2004-09-10  Raja R Harinath  <rharinath@novell.com>
458
459         * cs-parser.jay (fixed_statement): Introduce a scope for the
460         declaration in the 'fixed' statement.
461
462 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
463
464         * cs-parser.jay: Added CS0230 error report.
465
466 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
467
468         * cs-parser.jay: Added errors CS0231 and CS0257 report.
469
470 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
471
472         * expression.cs (Argument.Resolve): Added error CS0192 and
473         CS0199 report.
474
475 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
476
477         C# 2.0 #pragma warning feature
478
479         * cs-tokenizer.cs (PreProcessPragma): New method; 
480         Handles #pragma directive.
481
482         * report.cs (WarningRegions): New class; Support
483         class for #pragma warning directive. It tests whether
484         warning is enabled for a given line.
485
486 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
487
488         * const.cs: Add more descriptive error report, tahnks to
489         Sebastien. 
490
491 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
492
493         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
494
495 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
496
497         * expression.cs: Apply patch from Ben: Remove dead code from
498         ArrayCreation, and remove the TurnintoConstant call in const.cs,
499         as that code just threw an exception anwyays.
500
501         * const.cs: Remove the call to the turnintoconstant, for details
502         see bug: #63144
503         
504         * literal.cs: The type of the null-literal is the null type;  So
505         we use a placeholder type (literal.cs:System.Null, defined here)
506         for it.
507
508         * expression.cs (Conditional.DoResolve): Remove some old code that
509         is no longer needed, conversions have been fixed.
510
511         (ArrayCreationExpression.DoResolve): Return false if we fail to
512         resolve the inner expression.
513
514 2004-09-07  Raja R Harinath  <rharinath@novell.com>
515
516         Fix test-290.cs.
517         * cs-parser.jay (delegate_declaration): Record a delegate
518         declaration as a type declaration.
519         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
520
521 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
522
523         * parameter.cs: Do not crash if the type can not be resolved. 
524
525         * expression.cs: Report errors with unsafe pointers, fixes #64896
526
527 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
528
529         * expression.cs: Pointer arith always needs to do a conv.i
530         if the operand is a long. fix 65320
531
532 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
533
534         Fixed cs0619-37.cs, cs0619-38.cs
535
536         * enum.cs (GetObsoleteAttribute): Removed.
537
538         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
539         on Enum member is double staged. The first is tested member
540         and then enum.
541
542 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
543
544         Fixed #56986, #63631, #65231
545
546         * class.cs: (TypeContainer.AddToMemberContainer): New method,
547         adds member to name container.
548         (TypeContainer.AddToTypeContainer): New method, adds type to
549         name container.
550         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
551         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
552         AddOperator): Simplified by reusing AddToMemberContainer.
553         (TypeContainer.UserDefinedStaticConstructor): Changed to property
554         instead of field.
555         (Method.CheckForDuplications): Fixed implementation to test all
556         possibilities.
557         (MemberBase): Detection whether member is explicit interface
558         implementation is now in constructor.
559         (MemberBase.UpdateMemberName): Handles IndexerName.
560         (Accessor): Changed to keep also location information.
561         (AbstractPropertyEventMethod): Is derived from MemberCore.
562         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
563         will be emited or not.
564         (PropertyBase.AreAccessorsDuplicateImplementation):
565         Tests whether accessors are not in collision with some method.
566         (Operator): Is derived from MethodCore to simplify common
567         operations.
568
569         * decl.cs (Flags.TestMethodDuplication): Test for duplication
570         must be performed.
571         (DeclSpace.AddToContainer): Adds the member to defined_names
572         table. It tests for duplications and enclosing name conflicts.
573
574         * enum.cs (EnumMember): Clean up to reuse the base structures
575
576 2004-09-03  Martin Baulig  <martin@ximian.com>
577
578         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
579         into TypeContainer, to make partial classes work again.
580
581 2004-09-03  Martin Baulig  <martin@ximian.com>
582
583         * rootcontext.cs (RootContext.V2): Removed.
584
585 2004-03-23  Martin Baulig  <martin@ximian.com>
586
587         * expression.cs (Invocation.OverloadResolve): Added `bool
588         may_fail' argument and use it instead of the Location.IsNull() hack.
589
590 2004-09-03  Martin Baulig  <martin@ximian.com>
591
592         Merged latest changes into gmcs.  Please keep this comment in
593         here, it makes it easier for me to see what changed in MCS since
594         the last time I merged.
595
596 2004-09-03  Raja R Harinath  <rharinath@novell.com>
597
598         Fix #61128.
599         * expression.cs (BetterConversion): Don't allow either conversion 
600         to be null.  Remove redundant implicit conversion test when 'q ==
601         null' -- when this function is invoked, we already know that the
602         implicit conversion exists.
603         (BetterFunction): Assume that 'best' is non-null.  Remove
604         redundant reimplementation of IsApplicable when 'best' is null.
605         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
606         number of arguments.
607         (IsAncestralType): Extract from OverloadResolve.
608         (OverloadResolve): Make robust to the MethodGroupExpr being
609         unsorted.  Implement all the logic of Section 14.5.5.1, and
610         support overloading of methods from multiple applicable types.
611         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
612
613         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
614         (RealError, Warning): Append type of report to related symbol.
615
616 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
617
618         * enum.cs: Fixed CLS-Compliance checks for enum members.
619         Error tests cs3008-8.cs, cs3014-8.cs
620
621 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
622
623         Fixed bug #62342, #63102
624         * class.cs: ImplementIndexer uses member.IsExplicitImpl
625         like ImplementMethod.
626
627 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
628
629         * attribute.cs (Attribute.GetAttributeArgumentExpression):
630         Fixed bug #65170.
631
632 2004-09-02  Martin Baulig  <martin@ximian.com>
633
634         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
635         TypeManager.GetArgumentTypes() rather than calling GetParameters()
636         on the MethodBase.
637
638 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
639
640         C# 2.0 Static classes implemented
641
642         * class.cs (TypeContainer): instance_constructors,
643         initialized_fields, initialized_static_fields,
644         default_constructor, base_inteface_types are protected to be
645         accessible from StaticClass.
646         (TypeContainer.DefineDefaultConstructor): New virtual method
647         for custom default constructor generating
648         (StaticClass): New class to handle "Static classes" feature.
649
650         * cs-parser.jay: Handle static keyword on class like instance
651         of StaticClass.
652
653         * driver.cs: Added "/langversion" command line switch with two
654         options (iso-1, default).
655
656 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
657
658         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
659
660 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
661
662         * delegate.cs: Style.
663
664 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
665
666         * delegate.cs: Add seperate instance expr field for miguel.
667
668 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
669
670         * PointerArithmetic (Resolve): make sure we are not doing
671         pointer arith on void*. Also, make sure we are resolved
672         by not setting eclass until resolve.
673
674         All callers: Make sure that PointerArithmetic gets resolved.
675
676 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
677
678         * ArrayCreation (LookupType): If the type does not resolve 
679         to an array, give an error.
680
681 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
682
683         * statement.cs (Try.Resolve): Fixed bug #64222
684
685 2004-08-27  Martin Baulig  <martin@ximian.com>
686
687         * class.cs
688         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
689         crash here.     
690
691 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
692
693         * ecore.cs (Constantify): Get underlying type via
694         System.Enum.GetUnderlyingType to avoid StackOverflow on the
695         Windows in special cases.
696
697 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
698
699         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
700         for obtaining also private methods.
701         (GetRemoveMethod): Used GetRemoveMethod (true)
702         for obtaining also private methods.
703
704 2004-08-24  Martin Baulig  <martin@ximian.com>
705
706         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
707         MethodAttributes.HideBySig for operators.
708
709 2004-08-23  Martin Baulig  <martin@ximian.com>
710
711         Back to the old error reporting system :-)
712
713         * report.cs (Message): Removed.
714         (Report.MessageData, ErrorData, WarningData): Removed.
715         (Report.Error, Warning): Back to the old system.
716
717 2004-08-23  Martin Baulig  <martin@ximian.com>
718
719         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
720
721         * class.cs (TypeContainer.ParentContainer): New public virtual
722         method; replaces the explicit interface implementation.
723         (ClassPart.ParentContainer): Override.
724
725 2004-08-23  Martin Baulig  <martin@ximian.com>
726
727         * statement.cs (Switch): Added support for constant switches; see
728         #59428 or test-285.cs.
729
730 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
731
732         Fixed bug #62740.
733         * statement.cs (GetEnumeratorFilter): Removed useless
734         logic because C# specs is strict. GetEnumerator must be
735         public.
736
737 2004-08-22  Martin Baulig  <martin@ximian.com>
738
739         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
740         a switch and may break, reset the barrier.  Fixes #59867.
741
742 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
743
744         CLS-Compliance speed up (~5% for corlib)
745
746         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
747         New method. Tests container for CLS-Compliant names
748
749         * class.cs (TypeContainer.VerifyClsName): New method.
750         Checks whether container name is CLS Compliant.
751         (Constructor): Implements IMethodData.
752
753         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
754         low-case table for CLS Compliance test.
755         (MemberCache.VerifyClsParameterConflict): New method.
756         Checks method parameters for CS3006 error.
757
758         * enum.cs (EnumMember): Is derived from MemberCore.
759         (Enum.VerifyClsName): Optimized for better performance.
760
761 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
762
763         * report.cs: Renamed Error_T to Error and changed all
764         references.
765
766 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
767
768         * class.cs (TypeContainer.IndexerArrayList): New inner class
769         container for indexers.
770         (TypeContainer.DefaultIndexerName): New constant for default
771         indexer name. Replaced all "Item" with this constant.
772         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
773
774         * typemanager.cs (TypeManager.default_member_ctor): Cache here
775         DefaultMemberAttribute constructor.
776
777 2004-08-05  Martin Baulig  <martin@ximian.com>
778
779         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
780         Fix bug #59429.
781
782 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
783
784         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
785         multi platforms problem.
786
787         * compiler.csproj: Included shared files.
788
789 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
790
791         Fix bug 60333, 55971 in the more general way
792         * attribute.cs (Attribute.GetAttributeArgumentExpression):
793         Added arg_type argument for constant conversion.
794         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
795
796 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
797
798         Fix bug #59760
799         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
800         OperatorArrayList, MethodCoreArrayList for typecontainer
801         containers. Changed class member types to these new types.
802         (MethodArrayList.DefineMembers): Added test for CS0659.
803
804 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
805
806         * cfold.cs: Synchronize the folding with the code in expression.cs
807         Binary.DoNumericPromotions for uint operands.
808
809         * attribute.cs: Revert patch from Raja, it introduced a regression
810         while building Blam-1.2.1 (hard to isolate a test case).
811
812 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
813
814         Fix for #55382
815         * class.cs:
816         (TypeContainer.Define): Renamed to DefineContainerMembers because of
817         name collision.
818         (MethodCore.parent_method): New member. The method we're overriding
819         if this is an override method.
820         (MethodCore.CheckBase): Moved from Method class and made common.
821         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
822         private.
823         (MethodCore.CheckForDuplications): New abstract method. For custom
824         member duplication search in a container
825         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
826         method and its return type.
827         (Event.conflict_symbol): New member. Symbol with same name in the
828         parent class.
829
830         * decl.cs:
831         (MemberCache.FindMemberWithSameName): New method. The method
832         is looking for conflict with inherited symbols.
833
834 2004-08-04  Martin Baulig  <martin@ximian.com>
835
836         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
837
838         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
839
840 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
841
842         * report.cs (Message): New enum for better error, warning reference in
843         the code.
844         (MessageData): New inner abstract class. It generally handles printing of
845         error and warning messages.
846         Removed unused Error, Warning, Message methods.
847
848 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
849
850         Fix for cs0592-8.cs test
851         * attribute.cs
852         (Attributable.ValidAttributeTargets): Made public.
853         (Attribute.ExplicitTarget): New member for explicit target value.
854         (Attribute.CheckTargets): Now we translate explicit attribute
855         target to Target here.
856
857 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
858
859         * ecore.cs (MethodGroupExpr): new IsBase property.
860
861         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
862
863         * delegate.cs (DelegateCreation): store a MethodGroupExpr
864         rather than an instance expr.
865
866         (DelegateCreation.Emit): Use the method group rather than
867         the instance expression. Also, if you have base.Foo as the
868         method for a delegate, make sure to emit ldftn, not ldftnvirt.
869
870         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
871
872         (NewDelegate.DoResolve): Only check for the existance of Invoke
873         if the method is going to be needed. Use MethodGroupExpr.
874
875         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
876
877         * expression.cs: For pointer arith., make sure to use
878         the size of the type, not the size of the pointer to
879         the type.
880
881 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
882
883         Fix for #60722
884         * class.cs (Class): Added error CS0502 test.
885
886 2004-08-03  John Luke  <jluke@cfl.rr.com>
887             Raja R Harinath  <rharinath@novell.com>
888
889         Fix for #60997.
890         * attribute.cs (Attribute.complained_before): New flag.
891         (Attribute.ResolveType, Attribute.Resolve),
892         (Attribute.DefinePInvokeMethod): Set it.
893         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
894         
895 2004-08-03  Martin Baulig  <martin@ximian.com>
896
897         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
898         use a user-defined operator; we still need to do numeric
899         promotions in case one argument is a builtin type and the other
900         one has an implicit conversion to that type.  Fixes #62322.
901
902 2004-08-02  Martin Baulig  <martin@ximian.com>
903
904         * statement.cs (LocalInfo.Flags): Added `IsThis'.
905         (LocalInfo.IsThis): New public property.
906         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
907
908 2004-08-01  Martin Baulig  <martin@ximian.com>
909
910         * class.cs (TypeContainer.GetClassBases): Don't set the default
911         here since we may get called from GetPartialBases().
912         (TypeContainer.DefineType): If GetClassBases() didn't return a
913         parent, use the default one.
914
915 2004-07-30  Duncan Mak  <duncan@ximian.com>
916
917         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
918
919 2004-07-30  Martin Baulig  <martin@ximian.com>
920
921         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
922
923         * class.cs (SourceMethod): New public class, derive from the
924         symbol writer's ISourceMethod.
925         (Method): Use the new symbol writer API.
926
927         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
928         as argument and use the new symbol writer.
929
930         * location.cs
931         (SourceFile): Implement the symbol writer's ISourceFile.
932         (Location.SymbolDocument): Removed.
933         (Location.SourceFile): New public property.
934
935         * symbolwriter.cs: Use the new symbol writer API.
936
937 2004-07-30  Raja R Harinath  <rharinath@novell.com>
938
939         * Makefile (install-local): Remove.  Functionality moved to
940         executable.make.
941
942 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
943
944         * Makefile: Install mcs.exe.config file together with mcs.exe.
945         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
946         correct runtime version.
947         
948 2004-07-25  Martin Baulig  <martin@ximian.com>
949
950         * class.cs
951         (TypeContainer.RegisterOrder): Removed, this was unused.
952         (TypeContainer, interface_order): Removed.
953         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
954         TypeContainer as argument since we can also be called with a
955         `PartialContainer' for a partial class/struct/interface.
956         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
957         of checking whether we're an `Interface' - we could be a
958         `PartialContainer'.
959         (PartialContainer.Register): Override; call
960         AddClass()/AddStruct()/AddInterface() on our parent.
961
962         * cs-parser.jay (interface_member_declaration): Add things to the
963         `current_container', not the `current_class'.
964
965         * rootcontext.cs (RegisterOrder): The overloaded version which
966         takes an `Interface' was unused, removed.
967
968         * typemanager.cs (TypeManager.LookupInterface): Return a
969         `TypeContainer', not an `Interface'.
970         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
971         contain a `PartialContainer' for an interface, so check it's
972         `Kind' to figure out what it is.
973
974 2004-07-25  Martin Baulig  <martin@ximian.com>
975
976         * class.cs (Class.DefaultTypeAttributes): New public constant.
977         (Struct.DefaultTypeAttributes): Likewise.
978         (Interface.DefaultTypeAttributes): Likewise.
979         (PartialContainer.TypeAttr): Override this and add the
980         DefaultTypeAttributes.
981
982 2004-07-25  Martin Baulig  <martin@ximian.com>
983
984         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
985         we can just use the `Parent' field instead.
986
987 2004-07-25  Martin Baulig  <martin@ximian.com>
988
989         * class.cs (TypeContainer.Emit): Renamed to EmitType().
990
991 2004-07-25  Martin Baulig  <martin@ximian.com>
992
993         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
994         our parts before defining any methods.
995         (TypeContainer.VerifyImplements): Make this virtual.
996         (ClassPart.VerifyImplements): Override and call VerifyImplements()
997         on our PartialContainer.
998
999 2004-07-25  Martin Baulig  <martin@ximian.com>
1000
1001         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1002
1003         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1004         argument, we can just use the `Parent' field instead.
1005
1006         * class.cs
1007         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1008         (MemberBase.DoDefine): Likewise.
1009
1010 2004-07-24  Martin Baulig  <martin@ximian.com>
1011
1012         * decl.cs (MemberCore.Parent): New public field.
1013         (DeclSpace.Parent): Moved to MemberCore.
1014
1015         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1016         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1017         parent's .ctor.
1018         (FieldBase, Field, Operator): Likewise.
1019         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1020         (EventField, Event): Likewise.
1021
1022 2004-07-23  Martin Baulig  <martin@ximian.com>
1023
1024         * class.cs (PartialContainer): New public class.
1025         (ClassPart): New public class.
1026         (TypeContainer): Added support for partial classes.
1027         (TypeContainer.GetClassBases): Splitted some of the functionality
1028         out into GetNormalBases() and GetPartialBases().
1029
1030         * cs-tokenizer.cs (Token.PARTIAL): New token.
1031         (Tokenizer.consume_identifier): Added some hacks to recognize
1032         `partial', but only if it's immediately followed by `class',
1033         `struct' or `interface'.
1034
1035         * cs-parser.jay: Added support for partial clases.
1036
1037 2004-07-23  Martin Baulig  <martin@ximian.com>
1038
1039         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1040         a `DeclSpace' and also made it readonly.
1041         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1042         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1043         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1044
1045         * cs-parser.jay: Pass the `current_class', not the
1046         `current_container' (at the moment, this is still the same thing)
1047         to a new Method, Property, Event, Indexer or Constructor.
1048
1049 2004-07-23  Martin Baulig  <martin@ximian.com>
1050
1051         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1052         and removed the `current_interface' one.
1053         (struct_declaration, class_declaration, interface_declaration):
1054         Set `current_class' to the newly created class/struct/interface;
1055         set their `Bases' and call Register() before parsing their body.
1056
1057 2004-07-23  Martin Baulig  <martin@ximian.com>
1058
1059         * class.cs (Kind): New public enum.
1060         (TypeContainer): Made this class abstract.
1061         (TypeContainer.Kind): New public readonly field.
1062         (TypeContainer.CheckDef): New public method; moved here from
1063         cs-parser.jay.
1064         (TypeContainer.Register): New public abstract method.
1065         (TypeContainer.GetPendingImplementations): New public abstract
1066         method.
1067         (TypeContainer.GetClassBases): Removed the `is_class' and
1068         `is_iface' parameters.
1069         (TypeContainer.DefineNestedTypes): Formerly known as
1070         DoDefineType().
1071         (ClassOrStruct): Made this class abstract.
1072
1073         * tree.cs (RootTypes): New public type. 
1074
1075 2004-07-20  Martin Baulig  <martin@ximian.com>
1076
1077         * tree.cs (Tree.RecordNamespace): Removed.
1078         (Tree.Namespaces): Removed.
1079
1080         * rootcontext.cs (RootContext.IsNamespace): Removed.
1081
1082         * cs-parser.jay (namespace_declaration): Just create a new
1083         NamespaceEntry here.
1084
1085 2004-07-20  Martin Baulig  <martin@ximian.com>
1086
1087         * statement.cs (ExceptionStatement): New abstract class.  This is
1088         now used as a base class for everyone who's using `finally'.
1089         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
1090         our local variables before using them.
1091
1092         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
1093         virtual method.  This is used by Yield.Resolve() to "steal" an
1094         outer block's `finally' clauses.
1095         (FlowBranchingException): The .ctor now takes an ExceptionStatement
1096         argument.
1097
1098         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
1099         version which takes an ExceptionStatement.  This version must be
1100         used to create exception branchings.
1101
1102         * iterator.cs
1103         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
1104         (Iterator.EmitMoveNext): Added exception support; protect the
1105         block with a `fault' clause, properly handle 'finally' clauses.
1106         (Iterator.EmitDispose): Run all the `finally' clauses here.
1107
1108 2004-07-20  Martin Baulig  <martin@ximian.com>
1109
1110         * iterator.cs: This is the first of a set of changes in the
1111         iterator code.  Match the spec more closely: if we're an
1112         IEnumerable, then GetEnumerator() must be called.  The first time
1113         GetEnumerator() is called, it returns the current instance; all
1114         subsequent invocations (if any) must create a copy.
1115
1116 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
1117
1118         * expression.cs: Resolve the constant expression before returning
1119         it. 
1120
1121 2004-07-19  Martin Baulig  <martin@ximian.com>
1122
1123         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
1124         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
1125         the return type of the new EmitContext.
1126
1127 2004-07-18  Martin Baulig  <martin@ximian.com>
1128
1129         * class.cs (Property.Define): Fix iterators.
1130
1131         * iterators.cs (Iterator.Define): Moved the
1132         `container.AddInterator (this)' call here from the .ctor; only do
1133         it if we resolved successfully.
1134
1135 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
1136
1137         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
1138         `true' for preprocessing directives that we parse.  The return
1139         value indicates whether we should return to regular tokenizing or
1140         not, not whether it was parsed successfully.
1141
1142         In the past if we were in: #if false ... #line #endif, we would
1143         resume parsing after `#line'.  See bug 61604.
1144
1145         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
1146         building: IsEnumType should return true only for enums, not for
1147         enums or System.Enum itself.  This fixes #61593.
1148
1149         Likely what happened is that corlib was wrong: mcs depended on
1150         this bug in some places.  The bug got fixed, we had to add the
1151         hack, which caused bug 61593.
1152
1153         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
1154         that was a workaround for the older conditions.
1155
1156 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
1157
1158         * assign.cs: IAssignMethod has a new interface, as documented
1159         inline. All assignment code now uses this new api.
1160
1161         * ecore.cs, expression.cs: All classes which implement
1162         IAssignMethod now use the new interface.
1163
1164         * expression.cs (Invocation): add a hack to EmitCall so that
1165         IndexerAccess can be the target of a compound assignment without
1166         evaluating its arguments twice.
1167
1168         * statement.cs: Handle changes in Invocation api.
1169
1170 2004-07-16  Martin Baulig  <martin@ximian.com>
1171
1172         * iterators.cs: Rewrote this.  We're now using one single Proxy
1173         class for both the IEnumerable and the IEnumerator interface and
1174         `Iterator' derives from Class so we can use the high-level API.
1175
1176         * class.cs (TypeContainer.AddIterator): New method.
1177         (TypeContainer.DoDefineType): New protected virtual method, which
1178         is called from DefineType().
1179         (TypeContainer.DoDefineMembers): Call DefineType() and
1180         DefineMembers() on all our iterators.
1181         (TypeContainer.Emit): Call Emit() on all our iterators.
1182         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1183
1184         * codegen.cs (EmitContext.CurrentIterator): New public field.
1185
1186 2004-07-15  Martin Baulig  <martin@ximian.com>
1187
1188         * typemanager.cs
1189         (TypeManager.not_supported_exception_type): New type.   
1190
1191 2004-07-14  Martin Baulig  <martin@ximian.com>
1192
1193         * iterators.cs: Use real error numbers.
1194
1195 2004-07-14  Martin Baulig  <martin@ximian.com>
1196
1197         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1198         requires this to be a System.Collection.IEnumerable and not a
1199         class implementing that interface.
1200         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1201
1202 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1203
1204         * class.cs: Fixed previous fix, it broke some error tests.
1205
1206 2004-07-12  Martin Baulig  <martin@ximian.com>
1207
1208         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1209         Fixes #61293.
1210
1211 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1212
1213         * assign.cs (LocalTemporary): Add new argument: is_address,If
1214         `is_address' is true, then the value that we store is the address
1215         to the real value, and not the value itself.
1216         
1217         * ecore.cs (PropertyExpr): use the new local temporary
1218         stuff to allow us to handle X.Y += z (where X is a struct)
1219
1220 2004-07-08  Martin Baulig  <martin@ximian.com>
1221
1222         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1223         not always return, just like we're doing in Using.Resolve().
1224
1225 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1226
1227         * cs-parser.jay (fixed_statement): flag this as Pinned.
1228
1229 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1230
1231         * typemanager.cs (TypeManager): Removed MakePinned method, this
1232         mechanism is replaced with the .NET 2.x compatible mechanism of
1233         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1234
1235         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1236         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1237         `IsFixed' property which has a different meaning.
1238
1239 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1240
1241         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1242         visible from inside a nested class, not just the names of the
1243         immediately enclosing class.
1244         Fix for bug #60730.
1245
1246 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1247
1248         * expression.cs (BetterConversion): Remove buggy special-case
1249         handling of "implicit constant expression conversions".  At this
1250         point, we already know that the conversion is possible -- we're
1251         only checking to see which is better.
1252
1253 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1254
1255         * cs-parser.jay: Added error CS0210 test.
1256
1257 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1258
1259         * cs-parser.jay: Added error CS0134 test.
1260
1261 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1262
1263         Fix bug #52507
1264         * cs-parser.jay: Added error CS0145 test.
1265
1266 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1267
1268         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1269
1270 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1271         
1272         * expression.cs (StackAlloc.Resolve): The argument may not
1273         be a constant; deal with this case.
1274         
1275 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1276
1277         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1278         GetIndexerAttributeValue.
1279         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1280
1281         * class.cs (Indexer.Define): Added error tests for CS0415,
1282         CS0609.
1283
1284 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1285
1286         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1287         property code.
1288
1289 2004-06-23  Martin Baulig  <martin@ximian.com>
1290
1291         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1292         neither return nor throw, reset the barrier as well.  Fixes #60457.
1293
1294 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1295
1296         * class.cs : EventAttributes is now set to None by default.
1297           This fixes bug #60459.
1298
1299 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1300
1301         Fix bug #60219
1302         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1303         Don't throw exception but return null (it's sufficient now).
1304
1305 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1306
1307         * typemanager.cs (GetArgumentTypes): Faster implementation.
1308
1309 2004-06-18  Martin Baulig  <martin@ximian.com>
1310
1311         * attribute.cs (Attribute.Resolve): Check whether we're an
1312         EmptyCast which a Constant child.  Fixes #60333.
1313
1314 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1315
1316         * statement.cs (EmitCollectionForeach): Account for the fact that
1317         not all valuetypes are in areas which we can take the address of.
1318         For these variables, we store to a temporary variable. Also, make
1319         sure that we dont emit a `callvirt' on a valuetype method.
1320
1321 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1322
1323         * expression.cs (StackAlloc.DoReSolve): Added test for
1324         negative parameter (CS0247).
1325
1326 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1327
1328         Fix bug #59792
1329         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1330
1331 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1332
1333         Fix bug #59781
1334         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1335         ulong.
1336
1337 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1338
1339         Fix bug #58254 & cs1555.cs, cs1556.cs
1340         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1341
1342 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1343
1344         * cs-parser.jay: Added error CS1669 test for indexers.
1345
1346 2004-06-11  Martin Baulig  <martin@ximian.com>
1347
1348         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1349         call this twice: for params and varargs methods.
1350
1351 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1352
1353         * class.cs:
1354         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1355
1356 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1357
1358         * attribute.cs (Attribute.GetValidTargets): Made public.
1359
1360         * class.cs: 
1361         (AbstractPropertyEventMethod): New class for better code sharing.
1362         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1363         CS1667 report.
1364         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1365
1366 2004-06-11  Raja R Harinath  <rharinath@novell.com>
1367
1368         Fix bug #59477.
1369         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
1370         that the call to Resolve is part of a MemberAccess.
1371         (Expression.Resolve): Use it for SimpleName resolution.
1372         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
1373         Add 'intermediate' boolean argument.
1374         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
1375         error message when the SimpleName can be resolved ambiguously
1376         between an expression and a type.
1377         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
1378         public.
1379         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
1380         call on the left-side.
1381
1382 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1383
1384         * class.cs:
1385         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
1386
1387 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1388
1389         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
1390
1391 2004-06-11  Martin Baulig  <martin@ximian.com>
1392
1393         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
1394         varargs methods if applicable.
1395
1396 2004-06-11  Martin Baulig  <martin@ximian.com>
1397
1398         * expression.cs (Invocation.EmitCall): Don't use
1399         `method.CallingConvention == CallingConventions.VarArgs' since the
1400         method could also have `CallingConventions.HasThis'.
1401
1402 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1403
1404         * class.cs (Event.GetSignatureForError): Implemented.
1405         Fixed crash in error test cs3010.cs
1406
1407 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
1408
1409         * cs-tokenizer.cs: Change the way we track __arglist to be
1410         consistent with the other keywords.
1411
1412 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
1413
1414         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
1415         tomorrow.
1416
1417 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
1418
1419         * codegen.cs: Check that all referenced assemblies have a strongname
1420         before strongnaming the compiled assembly. If not report error CS1577.
1421         Fix bug #56563. Patch by Jackson Harper.
1422         * typemanager.cs: Added a method to return all referenced assemblies.
1423         Fix bug #56563. Patch by Jackson Harper.
1424
1425 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1426
1427         * class.cs:
1428         (Method.ApplyAttributeBuilder): Moved and added conditional
1429         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
1430
1431         * delegate.cs:
1432         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
1433
1434 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1435
1436         Fixed #59640
1437         * class.cs: (EventField.attribute_targets): Changed default target.
1438
1439 2004-06-08  Martin Baulig  <martin@ximian.com>
1440
1441         * expression.cs (Invocation.EmitCall): Enable varargs methods.
1442
1443 2004-06-08  Martin Baulig  <martin@ximian.com>
1444
1445         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
1446
1447 2004-06-07  Martin Baulig  <martin@ximian.com>
1448
1449         Added support for varargs methods.
1450
1451         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
1452         keyword.
1453
1454         * cs-parser.jay: Added support for `__arglist'.
1455
1456         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
1457
1458         * expression.cs (Argument.AType): Added `ArgList'.
1459         (Invocation): Added support for varargs methods.
1460         (ArglistAccess): New public class.
1461         (Arglist): New public class.
1462
1463         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
1464
1465         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
1466         a method's top-level block if the method has varargs.
1467
1468         * support.cs (ReflectionParameters, InternalParameters): Added
1469         support for varargs methods.    
1470
1471 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
1472
1473         * class.cs: Provide location in indexer error report.
1474
1475         * driver.cs: Use standard names.
1476
1477         * namespace.cs: Catch the use of using after a namespace has been
1478         declared also on using aliases.
1479
1480 2004-06-03  Raja R Harinath  <rharinath@novell.com>
1481
1482         Bug #50820.
1483         * typemanager.cs (closure_private_ok, closure_invocation_type)
1484         (closure_qualifier_type, closure_invocation_assembly)
1485         (FilterWithClosure): Move to ...
1486         (Closure): New internal nested class.
1487         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
1488         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
1489         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
1490         (MemberLookup, MemberLookupFailed): Use it.
1491         * expression.cs (New.DoResolve): Treat the lookup for the
1492         constructor as being qualified by the 'new'ed type.
1493         (Indexers.GetIndexersForTypeOrInterface): Update.
1494
1495 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
1496
1497         * attribute.cs
1498         (GetConditionalAttributeValue): New method. Returns
1499         condition of ConditionalAttribute.
1500         (SearchMulti): New method.  Returns all attributes of type 't'.
1501         Use it when attribute is AllowMultiple = true.
1502         (IsConditionalMethodExcluded): New method.
1503
1504         * class.cs
1505         (Method.IsExcluded): Implemented. Returns true if method has conditional
1506         attribute and the conditions is not defined (method is excluded).
1507         (IMethodData): Extended interface for ConditionalAttribute support.
1508         (PropertyMethod.IsExcluded): Implemented.
1509
1510         * decl.cs
1511         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
1512
1513         * expression.cs
1514         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
1515         on the method.
1516
1517 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
1518
1519         * expression.cs (ArrayCreationExpression): Make this just an
1520         `expression'. It can't be a statement, so the code here was
1521         dead.
1522
1523 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1524
1525         Fixed #59072
1526         * typemanager.cs (GetFullNameSignature): New method for
1527         MethodBase types.
1528
1529 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1530
1531         Fixed #56452
1532         * class.cs (MemberBase.GetSignatureForError): New virtual method.
1533         Use this method when MethodBuilder is null.
1534         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
1535         Added test for error CS0626 (MONO reports error for this situation).
1536         (IMethodData.GetSignatureForError): Extended interface.
1537
1538 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1539
1540         * attribute.cs
1541         (AttributeTester.GetObsoleteAttribute): Returns instance of
1542         ObsoleteAttribute when type is obsolete.
1543
1544         * class.cs
1545         (TypeContainer.VerifyObsoleteAttribute): Override.
1546         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1547         (MethodCode.VerifyObsoleteAttribute): Override.
1548         (MemberBase.VerifyObsoleteAttribute): Override.
1549
1550         * decl.cs
1551         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1552         and report proper error.
1553
1554         *delegate.cs
1555         Delegate.VerifyObsoleteAttribute): Override.
1556
1557         * ecore.cs
1558         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1559         and report proper error.
1560         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1561
1562         * enum.cs
1563         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1564         and enum member.
1565
1566         * expression.cs
1567         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1568         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1569         Added test for ObsoleteAttribute.
1570
1571         * statement.cs
1572         (Catch): Derived from Statement.
1573
1574 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1575  
1576         Fixed bug #59071 & cs0160.cs
1577  
1578         * statement.cs (Try.Resolve): Check here whether order of catch
1579         clauses matches their dependencies.
1580
1581 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
1582
1583         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
1584         caused a regression: #59343.  Referencing nested classes from an
1585         assembly stopped working.
1586
1587 2004-05-31  Martin Baulig  <martin@ximian.com>
1588
1589         MCS is now frozen for beta 2.
1590
1591 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1592
1593         * convert.cs: add a trivial cache for overload operator resolution.
1594
1595 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1596
1597         * decl.cs: If possible, use lookuptypedirect here. We can only do
1598         this if there is no `.' after the namespace. Avoids using
1599         LookupType, which does lots of slow processing.
1600         (FindNestedType) New method, does what it says :-).
1601         * namespace.cs: use LookupTypeDirect.
1602         * rootcontext.cs: use membercache, if possible.
1603         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1604
1605 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1606
1607         * expression.cs:
1608         According to the spec, 
1609
1610         In a member access of the form E.I, if E is a single identifier,
1611         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1612         field, property, localvariable, or parameter with the same type as
1613         the meaning of E as a type-name (§3.8), then both possible
1614         meanings of E are permitted.
1615
1616         We did not check that E as a simple-name had the same type as E as
1617         a type name.
1618
1619         This trivial check gives us 5-7% on bootstrap time.
1620
1621 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1622
1623         * expression.cs (Invocation.OverloadResolve): Avoid the
1624         use of hashtables and boxing here by allocating on demand.
1625
1626 2004-05-30  Martin Baulig  <martin@ximian.com>
1627
1628         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1629         we're doing a silent lookup.  Don't try to lookup nested types in
1630         TypeManager.object_type (thanks to Ben Maurer).
1631
1632 2004-05-30  Martin Baulig  <martin@ximian.com>
1633
1634         Committing a patch from Ben Maurer.
1635
1636         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1637
1638 2004-05-29  Martin Baulig  <martin@ximian.com>
1639
1640         * class.cs (IMethodData.ShouldIgnore): New method.
1641
1642         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1643         `Location' argument, we don't need it anywhere.  Use
1644         `IMethodData.ShouldIgnore ()' instead of
1645         `MethodData.GetMethodFlags ()'.
1646         (TypeManager.AddMethod): Removed.
1647         (TypeManager.AddMethod2): Renamed to AddMethod.
1648
1649 2004-05-29  Martin Baulig  <martin@ximian.com>
1650
1651         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1652
1653         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1654         converting from a class type S to an interface type and we already
1655         have an object on the stack, don't box it again.  Fixes #52578.
1656
1657 2004-05-29  Martin Baulig  <martin@ximian.com>
1658
1659         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1660         Added support for `params' parameters.  Fixes #59267.
1661
1662 2004-05-29  Martin Baulig  <martin@ximian.com>
1663
1664         * literal.cs (NullPointer): Provide a private .ctor which sets
1665         `type' to TypeManager.object_type.  Fixes #59048.
1666
1667 2004-05-29  Martin Baulig  <martin@ximian.com>
1668
1669         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1670         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1671
1672         * ecore.cs (EventExpr.instance_expr): Make the field private.
1673
1674 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1675
1676         Fixed bug #50080 & cs0214-2.cs
1677         * expression.cs (Cast.DoResolve): Check unsafe context here.
1678         
1679         * statement.cs (Resolve.DoResolve): Likewise.
1680
1681 2004-05-26  Martin Baulig  <martin@ximian.com>
1682
1683         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1684
1685         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1686         (RootContext.LookupType): Pass down the `silent' flag.
1687
1688 2004-05-25  Martin Baulig  <martin@ximian.com>
1689
1690         * expression.cs
1691         (MethodGroupExpr.IdenticalTypeName): New public property.
1692         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1693         expression actually refers to a type.
1694
1695 2004-05-25  Martin Baulig  <martin@ximian.com>
1696
1697         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1698         for #56176 and made it actually work.
1699
1700 2004-05-25  Martin Baulig  <martin@ximian.com>
1701
1702         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1703         (FieldExpr, PropertyExpr): Override and implement
1704         CacheTemporaries.  Fixes #52279.
1705
1706 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1707
1708         * location.cs: In the new compiler listing a file twice is a
1709         warning, not an error.
1710
1711 2004-05-24  Martin Baulig  <martin@ximian.com>
1712
1713         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1714         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1715
1716 2004-05-24  Martin Baulig  <martin@ximian.com>
1717
1718         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1719         walking the `using' list.  Fixes #53921.
1720
1721 2004-05-24  Martin Baulig  <martin@ximian.com>
1722
1723         * const.cs (Const.LookupConstantValue): Added support for
1724         EmptyCast's; fixes #55251.
1725
1726 2004-05-24  Martin Baulig  <martin@ximian.com>
1727
1728         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1729         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1730         which does the CS0135 check.  The reason is that we first need to
1731         check whether the variable actually exists.
1732
1733 2004-05-24  Martin Baulig  <martin@ximian.com>
1734
1735         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1736         than RootContext.LookupType() to find the explicit interface
1737         type.  Fixes #58584.
1738
1739 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1740
1741         * Makefile: Simplify.  Use executable.make.
1742         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1743
1744 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1745
1746         * decl.cs:
1747         * enum.cs:
1748         Use the invariant culture when doing String.Compare for CLS case
1749         sensitivity.
1750         
1751 2004-05-23  Martin Baulig  <martin@ximian.com>
1752
1753         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1754         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1755
1756         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1757         
1758 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1759
1760         * class.cs (MemberBase.Define): Reuse MemberType member for 
1761         resolved type. Other methods can use it too.
1762
1763 2004-05-23  Martin Baulig  <martin@ximian.com>
1764
1765         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1766         the variable also exists in the current block (otherwise, we need
1767         to report a CS0103).  Fixes #58670.
1768
1769 2004-05-23  Martin Baulig  <martin@ximian.com>
1770
1771         * flowanalysis.cs (Reachability.Reachable): Compute this
1772         on-the-fly rather than storing it as a field.
1773
1774 2004-05-23  Martin Baulig  <martin@ximian.com>
1775
1776         * flowanalysis.cs (Reachability.And): Manually compute the
1777         resulting `barrier' from the reachability.      
1778        
1779 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1780
1781         Fix bug #57835
1782         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1783         instance of ObsoleteAttribute when symbol is obsolete.
1784
1785         * class.cs
1786         (IMethodData): Extended interface for ObsoleteAttribute support.
1787
1788 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1789
1790         * attribute.cs: Fix bug #55970
1791
1792 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1793
1794         Fix bug #52705
1795         * attribute.cs
1796         (GetObsoleteAttribute): New method. Creates the instance of
1797         ObsoleteAttribute.
1798         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1799         ObsoleteAttribute when member is obsolete.
1800         (AttributeTester.Report_ObsoleteMessage): Common method for
1801         Obsolete error/warning reporting.
1802
1803         * class.cs
1804         (TypeContainer.base_classs_type): New member for storing parent type.
1805
1806         * decl.cs
1807         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1808         for this MemberCore.
1809
1810 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1811
1812         * attribute.cs, const.cs: Fix bug #58590
1813
1814 2004-05-21  Martin Baulig  <martin@ximian.com>
1815
1816         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1817         out parameters if the end of the method is unreachable.  Fixes
1818         #58098. 
1819
1820 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1821
1822         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1823         Hari was right, why extra method.
1824
1825 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1826
1827         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1828
1829 2004-05-20  Martin Baulig  <martin@ximian.com>
1830
1831         Merged this back from gmcs to keep the differences to a minumum.
1832
1833         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
1834         instead of a Declspace.
1835         (Attribute.ResolveType): Likewise.
1836         (Attributes.Search): Likewise.
1837         (Attributes.Contains): Likewise.
1838         (Attributes.GetClsCompliantAttribute): Likewise.
1839
1840         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
1841         argument.
1842         (MethodData.ApplyAttributes): Take an EmitContext instead of a
1843         DeclSpace.
1844
1845 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1846
1847         Fix bug #58688 (MCS does not report error when the same attribute
1848         is assigned twice)
1849
1850         * attribute.cs (Attribute.Emit): Distinction between null and default.
1851
1852 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1853
1854         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1855         of a top-level attribute without an attribute target.
1856         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1857         Make non-static.
1858         (Attribute.Conditional_GetConditionName), 
1859         (Attribute.Obsolete_GetObsoleteMessage): Update.
1860         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1861         part of ScanForIndexerName.
1862         (Attribute.CanIgnoreInvalidAttribute): New function.
1863         (Attribute.ScanForIndexerName): Move to ...
1864         (Attributes.ScanForIndexerName): ... here.
1865         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1866         (Attributes.Search): New internal variant that can choose not to
1867         complain if types aren't resolved.  The original signature now
1868         complains.
1869         (Attributes.GetClsCompliantAttribute): Use internal variant, with
1870         complaints suppressed.
1871         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1872         only if it not useful.
1873         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1874         top-level for attributes that are shared between the assembly
1875         and a top-level class.
1876         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1877         * class.cs: Update to reflect changes.
1878         (DefineIndexers): Fuse loops.
1879         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1880         a couple more variants of attribute names.
1881
1882 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1883
1884         Fix bug #52585 (Implemented explicit attribute declaration)
1885
1886         * attribute.cs:
1887         (Attributable.ValidAttributeTargets): New abstract method. It gets
1888         list of valid attribute targets for explicit target declaration.
1889         (Attribute.Target): It holds target itself.
1890         (AttributeSection): Removed.
1891         (Attribute.CheckTargets): New method. It checks whether attribute
1892         target is valid for the current element.
1893
1894         * class.cs:
1895         (EventProperty): New class. For events that are declared like
1896         property (with add and remove accessors).
1897         (EventField): New class. For events that are declared like field.
1898         class.cs
1899
1900         * cs-parser.jay: Implemented explicit attribute target declaration.
1901
1902         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1903         Override ValidAttributeTargets.
1904
1905         * parameter.cs:
1906         (ReturnParameter): Class for applying custom attributes on 
1907         the return type.
1908         (ParameterAtribute): New class. Class for applying custom
1909         attributes on the parameter type.
1910
1911 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1912
1913         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1914         definitions. 
1915
1916         (Method): Allow UNSAFE here.
1917
1918         * modifiers.cs: Support unsafe reporting.
1919
1920 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1921
1922         * decl.cs: Fix bug #58478.
1923
1924 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1925
1926         * statement.cs: When checking for unreachable code on an EmptyStatement,
1927         set the location. Fixes bug #58488.
1928
1929 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1930
1931         * driver.cs: Add -pkg handling.
1932
1933         From Gonzalo: UseShelLExecute=false
1934
1935 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1936
1937         * attribute.cs:
1938         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1939         for attribute.
1940         (Attribute.IsClsCompliaceRequired): Moved to base for better
1941         accesibility.
1942         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1943         when attribute is AttributeUsageAttribute.
1944         (Attribute.GetValidTargets): Simplified.
1945         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1946         attribute for this type.
1947         (Attribute.ApplyAttributes): Method renamed to Emit and make
1948         non-static.
1949         (GlobalAttributeSection): New class for special handling of global
1950         attributes (assembly, module).
1951         (AttributeSection.Emit): New method.
1952
1953         * class.cs: Implemented Attributable abstract methods.
1954         (MethodCore.LabelParameters): Moved to Parameter class.
1955         (Accessor): Is back simple class.
1956         (PropertyMethod): Implemented Attributable abstract class.
1957         (DelegateMethod): Implemented Attributable abstract class.
1958         (Event): New constructor for disctintion between normal Event
1959         and Event with accessors.
1960
1961         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1962
1963         * codegen.cs, const.cs, decl.cs, delegate.cs:
1964         (CommonAssemblyModulClass): Implemented Attributable abstract class
1965         and simplified.
1966
1967         * enum.cs: Implement IAttributeSupport interface.
1968         (EnumMember): New class for emum members. Implemented Attributable
1969         abstract class
1970
1971         * parameter.cs:
1972         (ParameterBase): Is abstract.
1973         (ReturnParameter): New class for easier [return:] attribute handling.
1974
1975         * typemanager.cs: Removed builder_to_attr.
1976
1977 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1978
1979         Fix bug #57151.
1980         * attribute.cs (Attribute.GetPositionalValue): New function.
1981         * class.cs (TypeContainer.VerifyMembers): New function.
1982         (TypeContainer.Emit): Use it.
1983         (ClassOrStruct): New base class for Class and Struct.
1984         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1985         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1986         class.
1987         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1988         then each non-static field should have a FieldOffset attribute.
1989         Otherwise, none of the fields should have a FieldOffset attribute.
1990         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1991         and FieldOffset attributes.
1992         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1993         (TypeManager.field_offset_attribute_type): New core types.
1994         (TypeManager.InitCoreTypes): Initialize them.
1995
1996 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1997
1998         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1999         Return correct type.
2000         From bug #58270.
2001
2002 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
2003
2004         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
2005         be implicitly converted to ulong.
2006         
2007         * expression.cs: The logic for allowing operator &, | and ^ worked
2008         was wrong, it worked before because we did not report an error in
2009         an else branch.  Fixes 57895.
2010
2011         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
2012         allow volatile fields to be reference types.
2013
2014 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
2015
2016         * driver.cs: Add support for /debug-
2017
2018 2004-05-07  Raja R Harinath  <rharinath@novell.com>
2019
2020         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
2021         Add a 'complain' parameter to silence errors.
2022         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
2023         silently overlooked type-resolutions.
2024         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
2025         to reflect changes.
2026         (Attributes.Search): New function.
2027         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
2028         (Attributes.GetAttributeFullName): Remove hack.
2029         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
2030         Update to reflect changes.
2031         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
2032         Use Attributes.Search instead of nested loops.
2033
2034 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
2035
2036         * decl.cs:
2037         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
2038         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
2039         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
2040
2041         * report.cs: (Report.Warning): Renamed to Warning_T because of
2042         parameter collision.
2043
2044 2004-05-05  Raja R Harinath  <rharinath@novell.com>
2045
2046         * expression.cs (MemberAccess.ResolveMemberAccess):
2047         Exit with non-zero status after Report.Error.
2048         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
2049         Likewise.
2050         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
2051
2052 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2053
2054         * support.cs: Don't hang when the file is empty.
2055
2056 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2057
2058         * support.cs: In SeekableStreamReader, compute the preamble size of the
2059           underlying stream. Position changes should take into account that initial
2060           count of bytes.
2061
2062 2004-05-03  Todd Berman  <tberman@sevenl.net>
2063
2064         * driver.cs: remove unused GetSysVersion function.
2065
2066 2004-05-03  Todd Berman  <tberman@sevenl.net>
2067
2068         * driver.cs: Remove the hack from saturday, as well as the hack
2069         from jackson (LoadAssemblyFromGac), also adds the CWD to the
2070         link_paths to get that bit proper.
2071
2072 2004-05-01  Todd Berman  <tberman@sevenl.net>
2073
2074         * driver.cs: Try a LoadFrom before a Load, this checks the current
2075         path. This is currently a bug in mono that is be fixed, however, this
2076         provides a workaround for now. This will be removed when the bug
2077         is fixed.
2078
2079 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
2080
2081         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2082         incomplete key pairs (#57941).
2083
2084 2004-05-01  Todd Berman  <tberman@sevenl.net>
2085
2086         * driver.cs: Remove '.' from path_chars, now System.* loads properly
2087         from the GAC
2088
2089 2004-04-30  Jackson Harper  <jackson@ximian.com>
2090
2091         * codegen.cs: Open keys readonly.
2092         
2093 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2094
2095         * typemanager.cs: don't report cyclic struct layout when a struct
2096         contains 2 or more fields of the same type. Failed for Pango.AttrShape
2097         which has 2 Pango.Rectangle fields.
2098
2099 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2100
2101         * expression.cs: Handle IntPtr comparisons with IL code
2102         rather than a method call.
2103
2104 2004-04-29  Martin Baulig  <martin@ximian.com>
2105
2106         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
2107         the list of PropertyInfo's in class hierarchy and find the
2108         accessor.  Fixes #56013.
2109
2110 2004-04-29  Martin Baulig  <martin@ximian.com>
2111
2112         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2113
2114 2004-04-29  Martin Baulig  <martin@ximian.com>
2115
2116         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2117
2118         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2119
2120 2004-04-29  Martin Baulig  <martin@ximian.com>
2121
2122         * class.cs (ConstructorInitializer.Resolve): Check whether the
2123         parent .ctor is accessible.  Fixes #52146.
2124
2125 2004-04-29  Martin Baulig  <martin@ximian.com>
2126
2127         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2128
2129         * statement.cs (Using.EmitLocalVariableDecls): Use
2130         TypeManager.idisposable_type, not typeof (IDisposable).
2131         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2132
2133 2004-04-29  Martin Baulig  <martin@ximian.com>
2134
2135         * class.cs (Event.Define): Don't emit the field and don't set
2136         RTSpecialName and SpecialName for events on interfaces.  Fixes
2137         #57703. 
2138
2139 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2140
2141         Refactor Attribute.ApplyAttributes.
2142         * attribute.cs (Attributable): New base class for objects that can
2143         have Attributes applied on them.
2144         (Attribute): Make AttributeUsage fields public.
2145         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2146         (Attribute.IsInternalCall): New property.
2147         (Attribute.UsageAttr): Convert to a public read-only property.
2148         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2149         (Attribute.ResolveType, Attribute.Resolve)
2150         (Attribute.ScanForIndexerName): Update to reflect changes.
2151         (Attribute.CheckAttributeTarget): Re-format.
2152         (Attribute.ApplyAttributes): Refactor, to various
2153         Attributable.ApplyAttributeBuilder methods.
2154         * decl.cs (MemberCore): Make Attributable.
2155         * class.cs (Accessor): Make Attributable.
2156         (MethodData.ApplyAttributes): Use proper attribute types, not
2157         attribute names.
2158         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2159         (TypeContainer.ApplyAttributeBuilder)
2160         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2161         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2162         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2163         (Operator.ApplyAttributeBuilder): New factored-out methods.
2164         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2165         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2166         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2167         * parameter.cs (ParameterBase): New Attributable base class
2168         that can also represent Return types.
2169         (Parameter): Update to the changes.
2170
2171 2004-04-29  Jackson Harper  <jackson@ximian.com>
2172
2173         * driver.cs: Prefer the corlib system version when looking for
2174         assemblies in the GAC. This is still a hack, but its a better hack
2175         now.
2176         
2177 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2178
2179         * decl.cs, enum.cs: Improved error 3005 reporting.
2180   
2181         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2182         (related_symbols): New private member for list of symbols
2183         related to reported error/warning.
2184         
2185         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2186
2187 2004-04-29  Martin Baulig  <martin@ximian.com>
2188
2189         * ecore.cs (Expression.Constantify): If we're an enum and
2190         TypeManager.TypeToCoreType() doesn't give us another type, use
2191         t.UnderlyingSystemType.  Fixes #56178.  
2192
2193 2004-04-29  Martin Baulig  <martin@ximian.com>
2194
2195         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2196         interfaces and for each interface, only add members directly
2197         declared in that interface.  Fixes #53255.
2198
2199 2004-04-28  Martin Baulig  <martin@ximian.com>
2200
2201         * expression.cs (ConditionalLogicalOperator): Use a temporary
2202         variable for `left' to avoid that we evaluate it more than once;
2203         bug #52588.
2204
2205 2004-04-28  Martin Baulig  <martin@ximian.com>
2206
2207         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2208         `void[]' (CS1547).
2209
2210 2004-04-28  Martin Baulig  <martin@ximian.com>
2211
2212         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2213         void (CS1547).
2214
2215         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2216         whether the type is not void (CS1547).
2217
2218 2004-04-28  Martin Baulig  <martin@ximian.com>
2219
2220         * expression.cs (Unary.DoResolveLValue): Override this and report
2221         CS0131 for anything but Operator.Indirection.
2222
2223 2004-04-28  Martin Baulig  <martin@ximian.com>
2224
2225         Committing a patch from Ben Maurer; see bug #50820.
2226
2227         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2228         check for classes.
2229
2230         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2231         classes.        
2232
2233 2004-04-28  Martin Baulig  <martin@ximian.com>
2234
2235         Committing a patch from Ben Maurer; see bug #50820.
2236
2237         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2238         check for classes.
2239
2240         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2241         classes.        
2242
2243 2004-04-28  Martin Baulig  <martin@ximian.com>
2244
2245         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2246         (Block.AddLabel): Call DoLookupLabel() to only search in the
2247         current block.
2248
2249 2004-04-28  Martin Baulig  <martin@ximian.com>
2250
2251         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2252         comparing StringConstants and NullLiterals in Equality and Inequality.
2253
2254 2004-04-28  Jackson Harper  <jackson@ximian.com>
2255
2256         * driver.cs: Attempt to load referenced assemblies from the
2257         GAC. This is the quick and dirty version of this method that
2258         doesnt take into account versions and just takes the first
2259         canidate found. Will be good enough for now as we will not have more
2260         then one version installed into the GAC until I update this method.
2261
2262 2004-04-28  Martin Baulig  <martin@ximian.com>
2263
2264         * typemanager.cs (TypeManager.CheckStructCycles): New public
2265         static method to check for cycles in the struct layout.
2266
2267         * rootcontext.cs (RootContext.PopulateTypes): Call
2268         TypeManager.CheckStructCycles() for each TypeContainer.
2269         [Note: We only need to visit each type once.]
2270
2271 2004-04-28  Martin Baulig  <martin@ximian.com>
2272
2273         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2274
2275         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2276         success and added `out object value'.  Use a `bool resolved' field
2277         to check whether we've already been called rather than
2278         `ConstantValue != null' since this breaks for NullLiterals.
2279
2280 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2281
2282         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2283         setting of this flag, since the 'set' method may be non-public.
2284
2285 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2286
2287         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2288         check on current_vector.Block.
2289
2290 2004-04-27  Martin Baulig  <martin@ximian.com>
2291
2292         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2293         a field initializer.  Fixes #56459.
2294
2295 2004-04-27  Martin Baulig  <martin@ximian.com>
2296
2297         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2298         we're not attempting to use an indexer.  Fixes #52154.
2299
2300 2004-04-27  Martin Baulig  <martin@ximian.com>
2301
2302         * statement.cs (Return): Don't create a return label if we don't
2303         need it; reverts my change from January 20th.  Thanks to Ben
2304         Maurer for this.
2305
2306 2004-04-27  Martin Baulig  <martin@ximian.com>
2307
2308         According to the spec, `goto' can only leave a nested scope, but
2309         never enter it.
2310
2311         * statement.cs (Block.LookupLabel): Only lookup in the current
2312         block, don't recurse into parent or child blocks.
2313         (Block.AddLabel): Check in parent and child blocks, report
2314         CS0140/CS0158 if we find a duplicate.
2315         (Block): Removed this indexer for label lookups.
2316         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2317         this already does the error reporting for us.
2318
2319         * flowanalysis.cs
2320         (FlowBranching.UsageVector.Block): New public variable; may be null.
2321         (FlowBranching.CreateSibling): Added `Block' argument.
2322         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2323         label for the target of a `goto' and check whether we're not
2324         leaving a `finally'.
2325
2326 2004-04-27  Martin Baulig  <martin@ximian.com>
2327
2328         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2329         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2330         just for returns).
2331
2332 2004-04-27  Martin Baulig  <martin@ximian.com>
2333
2334         * statement.cs (Block.AddLabel): Also check for implicit blocks
2335         and added a CS0158 check.
2336
2337 2004-04-27  Martin Baulig  <martin@ximian.com>
2338
2339         * flowanalysis.cs (FlowBranchingLoop): New class.
2340         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2341         UsageVector's instead of an ArrayList.
2342         (FlowBranching.Label): Likewise.
2343         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2344         (FlowBranching.AddBreakVector): New method.
2345
2346 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2347
2348         * attribute.cs: Small regression fix: only convert the type if we
2349         the type is different, fixes System.Drawing build.
2350
2351 2004-04-27  Martin Baulig  <martin@ximian.com>
2352
2353         * attribute.cs (Attribute.Resolve): If we have a constant value
2354         for a named field or property, implicity convert it to the correct
2355         type.
2356
2357 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2358
2359         * statement.cs (Block.Block): Implicit blocks share
2360         'child_variable_names' fields with parent blocks.
2361         (Block.AddChildVariableNames): Remove.
2362         (Block.AddVariable): Mark variable as "used by a child block" in
2363         every surrounding block.
2364         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2365         been used in a child block, complain about violation of "Invariant
2366         meaning in blocks" rule.
2367         * cs-parser.jay (declare_local_variables): Don't use
2368         AddChildVariableNames.
2369         (foreach_statement): Don't create an implicit block: 'foreach'
2370         introduces a scope.
2371
2372 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2373
2374         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2375         converting from 0L to ulong.  Fixes 57522.
2376
2377 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2378
2379         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2380         derived class hides via 'new' keyword field from base class (test-242.cs).
2381         TODO: Handle this in the more general way.
2382         
2383         * class.cs (CheckBase): Ditto.
2384
2385 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2386
2387         * decl.cs (caching_flags): New member for storing cached values
2388         as bit flags.
2389         (MemberCore.Flags): New enum where bit flags for caching_flags
2390         are defined.
2391         (MemberCore.cls_compliance): Moved to caching_flags.
2392         (DeclSpace.Created): Moved to caching_flags.
2393
2394         * class.cs: Use caching_flags instead of DeclSpace.Created
2395         
2396 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2397
2398         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2399         if we are only a derived class, not a nested class.
2400
2401         * typemanager.cs: Same as above, but do this at the MemberLookup
2402         level (used by field and methods, properties are handled in
2403         PropertyExpr).   Allow for the qualified access if we are a nested
2404         method. 
2405
2406 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2407
2408         * class.cs: Refactoring.
2409         (IMethodData): New inteface; Holds links to parent members
2410         to avoid member duplication (reduced memory allocation).
2411         (Method): Implemented IMethodData interface.
2412         (PropertyBase): New inner classes for get/set methods.
2413         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2414         (Event): New inner classes for add/remove methods.
2415         (Event.DelegateMethod): Implemented IMethodData interface.
2416
2417         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2418         EmitContext (related to class.cs refactoring).
2419
2420 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2421
2422         * delegate.cs (Delegate.VerifyApplicability): If the number of
2423         arguments are the same as the number of parameters, first try to
2424         verify applicability ignoring  any 'params' modifier on the last
2425         parameter.
2426         Fixes #56442.
2427
2428 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2429
2430         * class.cs (TypeContainer.AddIndexer): Use
2431         'ExplicitInterfaceName' to determine if interface name was
2432         explicitly specified.  'InterfaceType' is not initialized at this time.
2433         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2434         Indexers array is already in the required order.  Initialize
2435         'IndexerName' only if there are normal indexers.
2436         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2437         (TypeContainer.Emit): Emit DefaultMember attribute only if
2438         IndexerName is initialized.
2439         Fixes #56300.
2440
2441 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2442
2443         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2444         Fixes #57007
2445
2446 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2447
2448         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2449         attributes.
2450         Fix for #56456.
2451
2452         * attribute.cs (Attribute.Resolve): Check for duplicate named
2453         attributes.
2454         Fix for #56463.
2455
2456 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2457
2458         * iterators.cs (MarkYield): track whether we are in an exception,
2459         and generate code accordingly.  Use a temporary value to store the
2460         result for our state.
2461
2462         I had ignored a bit the interaction of try/catch with iterators
2463         since their behavior was not entirely obvious, but now it is
2464         possible to verify that our behavior is the same as MS .NET 2.0
2465
2466         Fixes 54814
2467
2468 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2469
2470         * iterators.cs: Avoid creating temporaries if there is no work to
2471         do. 
2472
2473         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2474         Enumerations, use TypeManager.EnumToUnderlying and call
2475         recursively. 
2476
2477         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2478         bug #57013
2479
2480         (This.Emit): Use EmitContext.EmitThis to emit our
2481         instance variable.
2482
2483         (This.EmitAssign): Ditto.
2484
2485         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2486         codepaths, we will move all the functionality into
2487         Mono.CSharp.This 
2488
2489         (FieldExpr.EmitAssign): Ditto.
2490
2491         This fixes several hidden bugs that I uncovered while doing a code
2492         review of this today.
2493
2494         * codegen.cs (EmitThis): reworked so the semantics are more clear
2495         and also support value types "this" instances.
2496
2497         * iterators.cs: Changed so that for iterators in value types, we
2498         do not pass the value type as a parameter.  
2499
2500         Initialization of the enumerator helpers is now done in the caller
2501         instead of passing the parameters to the constructors and having
2502         the constructor set the fields.
2503
2504         The fields have now `assembly' visibility instead of private.
2505
2506 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2507
2508         * expression.cs (Argument.Resolve): Check if fields passed as ref
2509         or out are contained in a MarshalByRefObject.
2510
2511         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2512         another compiler type.
2513
2514 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2515
2516         * class.cs (Indexer.Define): use the new name checking method.
2517         Also, return false on an error.
2518         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2519         (is_identifier_[start/part]_character): make static.
2520
2521 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2522
2523         * expression.cs (Binary.ResolveOperator): Do no append strings
2524         twice: since we can be invoked more than once (array evaluation)
2525         on the same concatenation, take care of this here.  Based on a fix
2526         from Ben (bug #56454)
2527
2528 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2529
2530         * codegen.cs: Fix another case where CS1548 must be reported (when 
2531         delay-sign isn't specified and no private is available #56564). Fix
2532         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2533         error when MCS is used on the MS runtime and we need to delay-sign 
2534         (which seems unsupported by AssemblyBuilder - see #56621).
2535
2536 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2537
2538         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2539         (TypeManager.ComputeNamespaces): Faster implementation for
2540         Microsoft runtime.
2541
2542         * compiler.csproj: Updated AssemblyName to mcs.
2543
2544 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2545
2546         * rootcontext.cs: Add new types to the boot resolution.
2547
2548         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2549         MulticastDelegate is not allowed.
2550
2551         * typemanager.cs: Add new types to lookup: System.TypedReference
2552         and ArgIterator.
2553
2554         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2555         check for TypedReference or ArgIterator, they are not allowed. 
2556
2557         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2558         makes us properly catch 1510 in some conditions (see bug 56016 for
2559         details). 
2560
2561 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2562
2563         * CryptoConvert.cs: update from corlib version
2564         with endian fixes.
2565
2566 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2567
2568         * class.cs (Indexer.Define): Check indexername declaration
2569
2570 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2571
2572         * attribute.cs (IsClsCompliant): Fixed problem with handling
2573         all three states (compliant, not-compliant, undetected).
2574
2575 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2576
2577         * attribute.cs (Attribute): Location is now public.
2578         (Resolve): Store resolved arguments (pos_values) in attribute class.
2579         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2580         (GetClsCompliantAttributeValue): New method that gets
2581         CLSCompliantAttribute value.
2582         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2583         if exists else null.
2584         (AttributeTester): New class for CLS-Compliant verification routines.
2585
2586         * class.cs (Emit): Add CLS-Compliant verification.
2587         (Method.GetSignatureForError): Implemented.
2588         (Constructor.GetSignatureForError): Implemented
2589         (Constructor.HasCompliantArgs): Returns if constructor has
2590         CLS-Compliant arguments.
2591         (Constructor.Emit): Override.
2592         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2593         is needed to test only parameters.
2594         (FieldBase.GetSignatureForError): Implemented.
2595         (TypeContainer): New member for storing base interfaces.
2596         (TypeContainer.FindMembers): Search in base interfaces too.
2597
2598         * codegen.cs (GetClsComplianceAttribute): New method that gets
2599         assembly or module CLSCompliantAttribute value.
2600         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2601         for assembly.
2602         (ModuleClass.Emit): Add error 3012 test.
2603
2604         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2605
2606         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2607         state for all decl types.
2608         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2609         if CLS-Compliant tests are required.
2610         (IsClsCompliaceRequired): New method. Analyze whether code
2611         must be CLS-Compliant.
2612         (IsExposedFromAssembly): New method. Returns true when MemberCore
2613         is exposed from assembly.
2614         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2615         value or gets cached value.
2616         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2617         is explicitly marked with CLSCompliantAttribute.
2618         (IsIdentifierClsCompliant): New abstract method. This method is
2619         used to testing error 3005.
2620         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2621         for identifier and parameters CLS-Compliant testing.
2622         (VerifyClsCompliance): New method. The main virtual method for
2623         CLS-Compliant verifications.
2624         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2625         null. I don't know why is null (too many public members !).
2626         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2627         and get value of first CLSCompliantAttribute that found.
2628
2629         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2630         (VerifyClsCompliance): Override and add extra tests.
2631
2632         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2633         clscheck- disable CLS-Compliant verification event if assembly is has
2634         CLSCompliantAttribute(true).
2635
2636         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2637         ApllyAttribute is now called in emit section as in the other cases.
2638         Possible future Emit integration.
2639         (IsIdentifierClsCompliant): New override.
2640         (VerifyClsCompliance): New override.
2641         (GetEnumeratorName): Returns full enum name.
2642
2643         * parameter.cs (GetSignatureForError): Implemented.
2644
2645         * report.cs (WarningData): New struct for Warning message information.
2646         (LocationOfPreviousError): New method.
2647         (Warning): New method. Reports warning based on the warning table.
2648         (Error_T): New method. Reports error based on the error table.
2649
2650         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2651         verifications are done here.
2652
2653         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2654
2655         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2656         CLSCompliantAttribute.
2657         (all_imported_types): New member holds all imported types from other
2658         assemblies.
2659         (LoadAllImportedTypes): New method fills static table with exported types
2660         from all referenced assemblies.
2661         (Modules): New property returns all assembly modules.
2662
2663 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2664
2665         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2666         throwing a parser error.
2667
2668         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2669         which removes the hardcoded get_/set_ prefixes for properties, as
2670         IL allows for the properties to be named something else.  
2671
2672         Bug #56013
2673
2674         * expression.cs: Do not override operand before we know if it is
2675         non-null.  Fix 56207
2676
2677 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2678
2679         * typemanager.cs: support for pinned variables.
2680
2681 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2682
2683         * decl.cs, typemanager.cs: Avoid using an arraylist
2684         as a buffer if there is only one result set.
2685
2686 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2687
2688         * expression.cs: Make sure you cant call a static method
2689         with an instance expression, bug #56174.
2690
2691 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
2692
2693         * class.cs (IsDuplicateImplementation): Improve error reporting to
2694         flag 663 (method only differs in parameter modifier).
2695
2696         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
2697         in preprocessor directives.
2698
2699         * location.cs (LookupFile): Allow for the empty path.
2700
2701         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
2702         better approach for some of that patch, but its failing with the
2703         CharSet enumeration.  For now try/catch will do.
2704
2705         * typemanager.cs: Do not crash if a struct does not have fields.
2706         Fixes 56150.
2707
2708 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2709
2710         * expression.cs: cs0213, cant fix a fixed expression.
2711         fixes 50231.
2712
2713 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2714
2715         * cs-parser.jay: detect invalid embeded statements gracefully.
2716         bug #51113.
2717
2718 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2719
2720         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
2721         As a regex:
2722         s/
2723         the invocation type may not be a subclass of the tye of the item/
2724         The type of the item must be a subclass of the invocation item.
2725         /g
2726
2727         Fixes bug #50820.
2728
2729 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
2730
2731         * attribute.cs: Added methods to get a string and a bool from an
2732         attribute. Required to information from AssemblyKeyFileAttribute,
2733         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
2734         * codegen.cs: Modified AssemblyName creation to include support for
2735         strongnames. Catch additional exceptions to report them as CS1548.
2736         * compiler.csproj: Updated include CryptoConvert.cs.
2737         * compiler.csproj.user: Removed file - user specific configuration.
2738         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
2739         Mono.Security assembly. The original class is maintained and tested in
2740         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
2741         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
2742         like CSC 8.0 (C# v2) supports.
2743         * Makefile: Added CryptoConvert.cs to mcs sources.
2744         * rootcontext.cs: Added new options for strongnames.
2745
2746 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
2747
2748         * driver.cs: For --expect-error, report error code `2'
2749         if the program compiled with no errors, error code `1' if
2750         it compiled with an error other than the one expected.
2751
2752 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
2753
2754         * compiler.csproj: Updated for Visual Studio .NET 2003.
2755         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
2756         * compiler.sln: Updated for Visual Studio .NET 2003.
2757
2758 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
2759
2760         * expression.cs: Fix bug #47234. We basically need to apply the
2761         rule that we prefer the conversion of null to a reference type
2762         when faced with a conversion to 'object' (csc behaviour).
2763
2764 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2765
2766         * statement.cs: Shorter form for foreach, eliminates
2767         a local variable. r=Martin.
2768
2769 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2770
2771         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
2772         checks if we can use brtrue/brfalse to test for 0.
2773         * expression.cs: use the above in the test for using brtrue/brfalse.
2774         cleanup code a bit.
2775
2776 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2777
2778         * expression.cs: Rewrite string concat stuff. Benefits:
2779
2780         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
2781         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
2782         rather than a concat chain.
2783
2784         * typemanager.cs: Add lookups for more concat overloads.
2785
2786 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2787
2788         * expression.cs: Emit shorter il code for array init.
2789
2790         newarr
2791         dup
2792         // set 1
2793
2794         // set 2
2795
2796         newarr
2797         stloc.x
2798
2799         ldloc.x
2800         // set 1
2801
2802         ldloc.x
2803         // set 2
2804
2805 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
2806
2807         * statement.cs: Before, two switch blocks would be merged if the
2808         total size of the blocks (end_item - begin_item + 1) was less than
2809         two times the combined sizes of the blocks.
2810
2811         Now, it will only merge if after the merge at least half of the
2812         slots are filled.
2813
2814         fixes 55885.
2815
2816 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
2817
2818         * class.cs : csc build fix for GetMethods(). See bug #52503.
2819
2820 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
2821
2822         * expression.cs: Make sure fp comparisons work with NaN.
2823         This fixes bug #54303. Mig approved this patch a long
2824         time ago, but we were not able to test b/c the runtime
2825         had a related bug.
2826
2827 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
2828
2829         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
2830
2831 2004-03-19  Martin Baulig  <martin@ximian.com>
2832
2833         * class.cs (MemberCore.IsDuplicateImplementation): Report the
2834         error here and not in our caller.
2835
2836 2004-03-19  Martin Baulig  <martin@ximian.com>
2837
2838         * interface.cs: Completely killed this file.
2839         (Interface): We're now a TypeContainer and live in class.cs.
2840
2841         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
2842         argument; we're now also called for interfaces.
2843         (TypeContainer.DefineMembers): Allow this method being called
2844         multiple times.
2845         (TypeContainer.GetMethods): New public method; formerly known as
2846         Interface.GetMethod().  This is used by PendingImplementation.
2847         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
2848         it's now private and non-static.
2849         (Interface): Moved this here; it's now implemented similar to
2850         Class and Struct.
2851         (Method, Property, Event, Indexer): Added `bool is_interface'
2852         argument to their .ctor's.
2853         (MemberBase.IsInterface): New public field.
2854
2855         * cs-parser.jay: Create normal Method, Property, Event, Indexer
2856         instances instead of InterfaceMethod, InterfaceProperty, etc.
2857         (opt_interface_base): Removed; we now use `opt_class_base' instead.
2858         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
2859
2860 2004-03-19  Martin Baulig  <martin@ximian.com>
2861
2862         * class.cs (MethodCore.IsDuplicateImplementation): New private
2863         method which does the CS0111 checking.
2864         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
2865         Use IsDuplicateImplementation().
2866
2867 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
2868
2869         * decl.cs (FindMemberToOverride): New method to find the correct
2870         method or property to override in the base class.
2871         * class.cs
2872             - Make Method/Property use the above method to find the
2873               version in the base class.
2874             - Remove the InheritableMemberSignatureCompare as it is now
2875               dead code.
2876
2877         This patch makes large code bases much faster to compile, as it is
2878         O(n) rather than O(n^2) to do this validation.
2879
2880         Also, it fixes bug 52458 which is that nested classes are not
2881         taken into account when finding the base class member.
2882
2883         Reviewed/Approved by Martin.
2884
2885 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
2886
2887         * interface.cs: In all interface classes removed redundant
2888         member initialization.
2889
2890 2004-03-16  Martin Baulig  <martin@ximian.com>
2891
2892         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
2893
2894 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
2895
2896         * decl.cs (DefineTypeAndParents): New helper method to define a
2897         type's containers before the type itself is defined;  This is a
2898         bug exposed by the recent changes to Windows.Forms when an
2899         implemented interface was defined inside a class that had not been
2900         built yet.   
2901
2902         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
2903
2904         (Check): Loop correctly to report errors modifiers
2905         (UNSAFE was not in the loop, since it was the same as TOP).
2906
2907         * interface.cs: Every interface member now takes a ModFlags,
2908         instead of a "is_new" bool, which we set on the base MemberCore. 
2909
2910         Every place where we called "UnsafeOk" in the interface, now we
2911         call the proper member (InterfaceMethod.UnsafeOK) instead to get
2912         the unsafe settings from the member declaration instead of the
2913         container interface. 
2914
2915         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
2916
2917         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
2918         `set_indexer_name' to the pending bits (one per type).
2919
2920         We fixed a bug today that was picking the wrong method to
2921         override, since for properties the existing InterfaceMethod code
2922         basically ignored the method name.  Now we make sure that the
2923         method name is one of the valid indexer names.
2924
2925 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
2926  
2927         * support.cs (SeekableStreamReader): Keep track of stream byte
2928         positions and don't mix them with character offsets to the buffer.
2929
2930         Patch from Gustavo Giráldez
2931
2932 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
2933
2934         * interface.cs (InterfaceSetGetBase): Removed double member
2935         initialization, base class does it as well.
2936
2937 2004-03-13  Martin Baulig  <martin@ximian.com>
2938
2939         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
2940         when compiling corlib.
2941
2942 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
2943
2944         * convert.cs (ExplicitConversion): We were reporting an error on
2945         certain conversions (object_type source to a value type, when the
2946         expression was `null') before we had a chance to pass it through
2947         the user defined conversions.
2948
2949         * driver.cs: Replace / and \ in resource specifications to dots.
2950         Fixes 50752
2951
2952         * class.cs: Add check for duplicate operators.  Fixes 52477
2953
2954 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
2955
2956         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
2957         that are in the middle of the statements, not only at the end.
2958         Fixes #54987
2959
2960         * class.cs (TypeContainer.AddField): No longer set the
2961         `HaveStaticConstructor' flag, now we call it
2962         `UserDefineStaticConstructor' to diferentiate the slightly
2963         semantic difference.
2964
2965         The situation is that we were not adding BeforeFieldInit (from
2966         Modifiers.TypeAttr) to classes that could have it.
2967         BeforeFieldInit should be set to classes that have no static
2968         constructor. 
2969
2970         See:
2971
2972         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
2973
2974         And most importantly Zoltan's comment:
2975
2976         http://bugzilla.ximian.com/show_bug.cgi?id=44229
2977
2978         "I think beforefieldinit means 'it's ok to initialize the type sometime 
2979          before its static fields are used', i.e. initialization does not need
2980          to be triggered by the first access to the type. Setting this flag
2981          helps the JIT to compile better code, since it can run the static
2982          constructor at JIT time, and does not need to generate code to call it
2983          (possibly lots of times) at runtime. Unfortunately, mcs does not set
2984          this flag for lots of classes like String. 
2985          
2986          csc sets this flag if the type does not have an explicit static 
2987          constructor. The reasoning seems to be that if there are only static
2988          initalizers for a type, and no static constructor, then the programmer
2989          does not care when this initialization happens, so beforefieldinit
2990          can be used.
2991          
2992          This bug prevents the AOT compiler from being usable, since it 
2993          generates so many calls to mono_runtime_class_init that the AOT code
2994          is much slower than the JITted code. The JITted code is faster, 
2995          because it does not generate these calls if the vtable is type is
2996          already initialized, which is true in the majority of cases. But the
2997          AOT compiler can't do this."
2998
2999 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3000
3001         * class.cs (MethodData.Emit): Refactor the code so symbolic
3002         information is generated for destructors;  For some reasons we
3003         were taking a code path that did not generate symbolic information
3004         before. 
3005
3006 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3007
3008         * class.cs: Create a Constructor.CheckBase method that
3009         takes care of all validation type code. The method
3010         contains some code that was moved from Define.
3011
3012         It also includes new code that checks for duplicate ctors.
3013         This fixes bug #55148.
3014
3015 2004-03-09  Joshua Tauberer <tauberer@for.net>
3016
3017         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3018         a { ... }-style array creation invokes EmitStaticInitializers
3019         which is not good for reference-type arrays.  String, decimal
3020         and now null constants (NullCast) are not counted toward
3021         static initializers.
3022
3023 2004-03-05  Martin Baulig  <martin@ximian.com>
3024
3025         * location.cs (SourceFile.HasLineDirective): New public field;
3026         specifies whether the file contains or is referenced by a "#line"
3027         directive.
3028         (Location.DefineSymbolDocuments): Ignore source files which
3029         either contain or are referenced by a "#line" directive.        
3030
3031 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3032
3033         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3034         direct access to our parent, so check the method inline there.
3035
3036 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3037
3038         * expression.cs (Invocation.EmitCall): Miguel's last commit
3039         caused a regression. If you had:
3040
3041             T t = null;
3042             t.Foo ();
3043
3044         In Foo the implict this would be null.
3045
3046 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3047
3048         * expression.cs (Invocation.EmitCall): If the method is not
3049         virtual, do not emit a CallVirt to it, use Call.
3050
3051         * typemanager.cs (GetFullNameSignature): Improve the method to
3052         cope with ".ctor" and replace it with the type name.
3053
3054         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3055         as an argument the ConstructorBuilder where it is being defined,
3056         to catch the recursive constructor invocations.
3057
3058 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3059
3060         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3061         routines to check if a type is an enumerable/enumerator allow
3062         classes that implement the IEnumerable or IEnumerator interfaces.
3063
3064         * class.cs (Property, Operator): Implement IIteratorContainer, and
3065         implement SetYields.
3066
3067         (Property.Define): Do the block swapping for get_methods in the
3068         context of iterators.   We need to check if Properties also
3069         include indexers or not.
3070
3071         (Operator): Assign the Block before invoking the
3072         OperatorMethod.Define, so we can trigger the Iterator code
3073         replacement. 
3074
3075         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3076         Property and Operator classes are not created when we parse the
3077         declarator but until we have the block completed, so we use a
3078         singleton SimpleIteratorContainer.Simple to flag whether the
3079         SetYields has been invoked.
3080
3081         We propagate this setting then to the Property or the Operator to
3082         allow the `yield' to function.
3083
3084 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3085
3086         * codegen.cs: Implemented attribute support for modules.
3087         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3088         Assembly/Module functionality.
3089
3090         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3091         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3092         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3093
3094 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3095
3096         * interface.cs (FindMembers): The operation is performed on all base
3097         interfaces and not only on the first. It is required for future CLS Compliance patch.
3098
3099 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3100
3101         * statement.cs, codegen.cs:
3102         This patch deals with patterns such as:
3103
3104         public class List : IEnumerable {
3105
3106                 public MyEnumerator GetEnumerator () {
3107                         return new MyEnumerator(this);
3108                 }
3109
3110                 IEnumerator IEnumerable.GetEnumerator () {
3111                         ...
3112                 }
3113                 
3114                 public struct MyEnumerator : IEnumerator {
3115                         ...
3116                 }
3117         }
3118
3119         Before, there were a few things we did wrong:
3120         1) we would emit callvirt on a struct, which is illegal
3121         2) we emited ldarg when we needed to emit ldarga
3122         3) we would mistakenly call the interface methods on an enumerator
3123         type that derived from IEnumerator and was in another assembly. For example:
3124
3125         public class MyEnumerator : IEnumerator
3126
3127         Would have the interface methods called, even if there were public impls of the
3128         method. In a struct, this lead to invalid IL code.
3129
3130 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3131
3132         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3133           renamed to Emit.
3134
3135         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3136
3137 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3138
3139         * cs-parser.jay: Fix small regression: we were not testing V2
3140         compiler features correctly.
3141
3142         * interface.cs: If the emit context is null, then create one
3143
3144 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3145
3146         * decl.cs (GetSignatureForError): New virtual method to get full name
3147           for error messages.
3148
3149         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3150           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3151
3152         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3153           Duplicated members and code in these classes has been removed.
3154           Better encapsulation in these classes.
3155
3156 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3157
3158         * assign.cs (Assign.DoResolve): When dealing with compound
3159         assignments, there is a new rule in ECMA C# 2.4 (might have been
3160         there before, but it is documented here) that states that in:
3161
3162         a op= b;
3163
3164         If b is of type int, and the `op' is a shift-operator, then the
3165         above is evaluated as:
3166
3167         a = (int) a op b 
3168
3169         * expression.cs (Binary.ResolveOperator): Instead of testing for
3170         int/uint/long/ulong, try to implicitly convert to any of those
3171         types and use that in pointer arithmetic.
3172
3173         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3174         method to print information for from the type, not from the
3175         null-method we were given.
3176
3177 2004-02-01  Duncan Mak  <duncan@ximian.com>
3178
3179         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3180         parsing for cmd, fixes bug #53694.
3181
3182 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3183
3184         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3185         in the member name duplication tests. Property and operator name duplication
3186         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3187
3188 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3189
3190         * interface.cs (PopulateMethod): Fixed crash when interface method
3191         returns not existing type (error test cs0246-3.cs).
3192
3193 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3194
3195         * cs-parser.jay (interface_accessors): Re-write actions to also
3196         store attributes attached to get and set methods. Fix spelling
3197         while at it.
3198
3199         (inteface_property_declaration): Modify accordingly.
3200
3201         (InterfaceAccessorInfo): New helper class to store information to pass
3202         around between rules that use interface_accessors.
3203
3204         * interface.cs (Emit): Apply attributes on the get and set
3205         accessors of properties and indexers too.
3206
3207         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3208         right MethodBuilder when applying attributes to the get and set accessors.
3209
3210 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3211
3212         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3213
3214 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3215
3216         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3217
3218 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3219
3220         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3221         changes that treat `yield' specially when present before `break'
3222         or `return' tokens.
3223
3224         * cs-tokenizer.cs: yield is no longer a keyword.
3225
3226 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3227
3228         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3229         setting for default constructors.
3230         For default constructors are almost every time set wrong Modifier. The
3231         generated IL code has been alright. But inside mcs this values was
3232         wrong and this was reason why several of my CLS Compliance tests
3233         failed.
3234
3235 2004-01-22  Martin Baulig  <martin@ximian.com>
3236
3237         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3238         not a QualifiedIdentifier.  This is what `type_name_expression'
3239         was previously doing.
3240         (type_name_expression): Removed; the code is now in
3241         `namespace_or_type_name'.
3242         (qualified_identifier): Removed, use `namespace_or_type_name'
3243         instead.
3244         (QualifiedIdentifier): Removed this class.      
3245
3246 2004-01-22  Martin Baulig  <martin@ximian.com>
3247
3248         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3249         not a string as alias name.
3250
3251 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3252
3253         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3254         #52730 bug, and instead compute correctly the need to use a
3255         temporary variable when requesting an address based on the
3256         static/instace modified of the field and the constructor.
3257  
3258 2004-01-21  Martin Baulig  <martin@ximian.com>
3259
3260         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3261         class and namespace before looking up aliases.  Fixes #52517.
3262
3263 2004-01-21  Martin Baulig  <martin@ximian.com>
3264
3265         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3266         assinged in a 'try'; fixes exception4.cs.
3267
3268 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3269         * class.cs : Implemented parameter-less constructor for TypeContainer
3270
3271         * decl.cs: Attributes are now stored here. New property OptAttributes
3272
3273         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3274
3275         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3276
3277 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3278
3279         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3280           (CSharpSignature): New method for indexer and property signature.
3281
3282 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3283
3284         * pending.cs (IsVirtualFilter): Faster implementation.
3285
3286 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3287
3288         * typemanager.cs: Avoid inclusion of same assembly more than once.
3289
3290 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3291
3292         * cs-parser.jay: Fixed problem where the last assembly attribute
3293           has been applied also to following declaration (class, struct, etc.)
3294           
3295 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3296
3297         * class.cs: Added error CS0538, CS0539 reporting.
3298         Fixed crash on Microsoft runtime when field type is void.
3299
3300         * cs-parser.jay: Added error CS0537 reporting.
3301
3302         * pending.cs: Added error CS0535 reporting.
3303         Improved error report for errors CS0536, CS0534.
3304
3305 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3306
3307         Merge a few bits from the Anonymous Method MCS tree.
3308
3309         * statement.cs (ToplevelBlock): New class for toplevel methods,
3310         will hold anonymous methods, lifted variables.
3311
3312         * cs-parser.jay: Create toplevel blocks for delegates and for
3313         regular blocks of code. 
3314
3315 2004-01-20  Martin Baulig  <martin@ximian.com>
3316
3317         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3318         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3319         and `NeedExplicitReturn'; added `IsLastStatement'.
3320         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3321         have a `ReturnLabel' or we're not unreachable.
3322
3323         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3324         child's reachability; don't just override ours with it.  Fixes
3325         #58058 (lluis's example).
3326         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3327         InFinally(), InLoop(), InSwitch() and
3328         BreakCrossesTryCatchBoundary() methods.
3329
3330         * statement.cs (Return): Do all error checking in Resolve().
3331         Unless we are the last statement in a top-level block, always
3332         create a return label and jump to it.
3333         (Break, Continue): Do all error checking in Resolve(); also make
3334         sure we aren't leaving a `finally'.
3335         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3336         statement in a top-level block.
3337         (Block.Flags): Added `IsDestructor'.
3338         (Block.IsDestructor): New public property.
3339
3340 2004-01-20  Martin Baulig  <martin@ximian.com>
3341
3342         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3343
3344 2004-01-20  Martin Baulig  <martin@ximian.com>
3345
3346         * statement.cs (Statement.ResolveUnreachable): New public method.
3347         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3348         (Block.Resolve): Resolve unreachable statements.
3349
3350 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3351
3352         * expression.cs: We need to fix the case where we do
3353         not have a temp variable here.
3354
3355         * assign.cs: Only expression compound assignments need
3356         temporary variables.
3357
3358 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3359
3360         * flowanalysis.cs: Reduce memory allocation in a few ways:
3361           - A block with no variables should not allocate a bit
3362             vector for itself.
3363           - A method with no out parameters does not need any tracking
3364             for assignment of the parameters, so we need not allocate
3365             any data for it.
3366           - The arrays:
3367                 public readonly Type[] VariableTypes;
3368                 public readonly string[] VariableNames;
3369             Are redundant. The data is already stored in the variable
3370             map, so we need not allocate another array for it.
3371           - We need to add alot of checks for if (params | locals) == null
3372             due to the first two changes.
3373
3374 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3375
3376         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3377         implement IMemoryLocation, we store a copy on a local variable and
3378         take the address of it.  Patch from Benjamin Jemlich
3379
3380         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3381         to use a special "type_name_expression" rule which reduces the
3382         number of "QualifiedIdentifier" classes created, and instead
3383         directly creates MemberAccess expressions.
3384
3385 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3386
3387         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3388         that fixes #52853.  Null literal assignment to ValueType
3389
3390         * class.cs (MethodData.Emit): Instead of checking the name of the
3391         method to determine if its a destructor, create a new derived
3392         class from Method called Destructor, and test for that.  
3393
3394         * cs-parser.jay: Create a Destructor object instead of a Method.  
3395
3396         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3397
3398         Fixes: 52933
3399
3400 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3401
3402         * expression.cs (Binary.ResolveOperator): Perform an implicit
3403         conversion from MethodGroups to their delegate types on the
3404         Addition operation.
3405
3406         * delegate.cs: Introduce a new class DelegateCreation that is the
3407         base class for `NewDelegate' and `ImplicitDelegateCreation',
3408         factor some code in here.
3409
3410         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3411         conversion from MethodGroups to compatible delegate types. 
3412
3413         * ecore.cs (Expression.Resolve): Do not flag error 654
3414         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3415         we allow conversions from MethodGroups to delegate types now.
3416
3417         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3418         assignments in v2 either.
3419
3420 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3421
3422         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3423         static read-only fields in ctors.
3424
3425         Applied patch from Benjamin Jemlich 
3426
3427         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3428
3429 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3430
3431         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3432         here to return true, as they can be used like this:
3433
3434                 (XXX) int.MEMBER ()
3435
3436         Fixed 49836 and all the other dups
3437
3438 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3439
3440         * driver.cs: Implement /win32res and /win32icon.
3441
3442 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
3443
3444         * cs-parser.jay: Add a rule to improve error handling for the
3445         common mistake of placing modifiers after the type.
3446
3447 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
3448
3449         * cs-parser.jay (interface_event_declaration): Catch
3450         initialization of events on interfaces, and report cs0068
3451
3452         * cs-parser.jay (interface_event_declaration): Catch
3453         initialization of events. 
3454
3455         * ecore.cs: Better report missing constructors.
3456
3457         * expression.cs (Binary.ResolveOperator): My previous bug fix had
3458         the error reporting done in the wrong place.  Fix.
3459
3460         * expression.cs (Binary.ResolveOperator): Catch the 
3461         operator + (E x, E y) error earlier, and later allow for implicit
3462         conversions in operator +/- (E e, U x) from U to the underlying
3463         type of E.
3464
3465         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
3466         52596, if the container class is abstract, the default constructor
3467         is protected otherwise its public (before, we were always public).
3468
3469         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
3470         fixed statement.
3471
3472         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
3473         Jemlich that fixes bug #52597, MCS was generating invalid code for
3474         idisposable structs.   Thanks to Ben for following up with this
3475         bug as well.
3476
3477 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
3478
3479         * driver.cs: Allow assemblies without code to be generated, fixes
3480         52230.
3481
3482 2004-01-07  Nick Drochak <ndrochak@gol.com>
3483
3484         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
3485
3486 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
3487
3488         * cs-parser.jay: Add rules to improve error reporting if fields or
3489         methods are declared at the namespace level (error 116)
3490
3491         * Add rules to catch event add/remove
3492
3493 2004-01-04  David Sheldon <dave-mono@earth.li>
3494
3495   * expression.cs: Added matching ")" to error message for 
3496   CS0077
3497
3498 2004-01-03 Todd Berman <tberman@gentoo.org>
3499
3500         * ecore.cs, attribute.cs:
3501         Applying fix from #52429.
3502
3503 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3504
3505         * ecore.cs, expression.cs, statement.cs:
3506         Total rewrite of how we handle branching. We
3507         now handle complex boolean expressions with fewer
3508         jumps. As well if (x == 0) no longer emits a ceq.
3509
3510         if (x is Foo) is much faster now, because we generate
3511         better code.
3512
3513         Overall, we get a pretty big improvement on our benchmark
3514         tests. The code we generate is smaller and more readable.
3515
3516         I did a full two-stage bootstrap. The patch was reviewed
3517         by Martin and Miguel.
3518
3519 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3520
3521         * cs-parser.jay: Make primary_expression not take a QI.
3522         we dont need this because the member_access rule covers
3523         us here. So we replace the rule with just IDENTIFIER.
3524
3525         This has two good effects. First, we remove a s/r conflict.
3526         Second, we allocate many fewer QualifiedIdentifier objects.
3527
3528 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3529
3530         * attribute.cs: Handle MarshalAs attributes as pseudo, and
3531         set the correct information via SRE. This prevents
3532         hanging on the MS runtime. Fixes #29374.
3533
3534 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3535
3536         * convert.cs: correctly handle conversions to value types
3537         from Enum and ValueType as unboxing conversions.
3538
3539         Fixes bug #52569. Patch by Benjamin Jemlich.
3540
3541 2004-01-02  Ravi Pratap  <ravi@ximian.com>
3542
3543         * expression.cs (BetterConversion): Prefer int -> uint
3544         over int -> ulong (csc's behaviour). This fixed bug #52046.
3545
3546 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3547
3548         * decl.cs (MemberCache.FindMembers): now returns a
3549         MemberInfo [].
3550
3551         * typemanager.cs: In general, go with with ^^.
3552         (CopyNewMethods): take an IList.
3553         (RealMemberLookup): Only allocate an arraylist
3554         if we copy from two sets of methods.
3555
3556         This change basically does two things:
3557         1) Fewer array lists allocated due to CopyNewMethods.
3558         2) the explicit cast in MemberList costed ALOT.
3559
3560 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
3561
3562         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
3563         a hashtable to avoid needless string allocations when an identifier is
3564         used more than once (the common case).
3565
3566 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3567
3568         * pending.cs: MS's TypeBuilder.GetInterfaces ()
3569         is broken, it will not return anything. So, we
3570         have to use the information we have in mcs to
3571         do the task.
3572
3573         * typemanager.cs: Add a cache for GetInterfaces,
3574         since this will now be used more often (due to ^^)
3575
3576         (GetExplicitInterfaces) New method that gets the
3577         declared, not effective, interfaces on a type
3578         builder (eg, if you have interface IFoo, interface
3579         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
3580         { IBar }.
3581
3582         This patch makes MCS able to bootstrap itself on
3583         Windows again.
3584
3585 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3586
3587         * expression.cs: Remove the Nop's that Miguel put
3588         in by mistake.
3589
3590 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3591
3592         * report.cs, codegen.cs: Give the real stack trace to
3593         the error when an exception is thrown.
3594
3595 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3596
3597         * decl.cs: only allocate hashtables for ifaces if 
3598         it is an iface!
3599
3600 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3601
3602         * expression.cs: fix the error from cs0121-2.cs
3603         (a parent interface has two child interfaces that
3604         have a function with the same name and 0 params
3605         and the function is called through the parent).
3606
3607 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3608
3609         * class.cs, rootcontext.cs, typmanager.cs: do not
3610         leak pointers.
3611
3612 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3613
3614         * codegen.cs: remove stack for the ec flow branching.
3615         It is already a linked list, so no need.
3616
3617 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3618
3619         * Makefile: Allow custom profiler here.
3620
3621 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3622
3623         * typemanager.cs (LookupType):
3624           - Use a static char [], because split takes
3625             a param array for args, so it was allocating
3626             every time.
3627           - Do not store true in a hashtable, it boxes.
3628
3629 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3630
3631         * flowanalysis.cs: bytify common enums.
3632
3633 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3634
3635         * modifiers.cs: Add a new set of flags for the
3636         flags allowed on explicit interface impls.
3637         * cs-parser.jay: catch the use of modifiers in
3638         interfaces correctly.
3639         * class.cs: catch private void IFoo.Blah ().
3640
3641         All related to bug #50572.
3642
3643 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3644
3645         * decl.cs: Rewrite the consistant accessability checking.
3646         Accessability is not linear, it must be implemented in
3647         a tableish way. Fixes #49704.
3648
3649 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3650
3651         * expression.cs: Handle negation in a checked context.
3652         We must use subtraction from zero. Fixes #38674.
3653
3654 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3655
3656         * class.cs: Ignore static void main in DLLs.
3657         * rootcontext.cs: Handle the target type here,
3658         since we are have to access it from class.cs
3659         * driver.cs: account for the above.
3660
3661 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3662
3663         * report.cs: Give line numbers and files if available.
3664
3665 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
3666
3667         * driver.cs: Implement /addmodule.
3668
3669         * typemanager.cs:  Change 'modules' field so it now contains Modules not
3670         ModuleBuilders.
3671
3672 2003-12-20  Martin Baulig  <martin@ximian.com>
3673
3674         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
3675         (FieldBase.IsAssigned): Removed this field.
3676         (FieldBase.SetAssigned): New public method.
3677         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
3678
3679 2003-12-20  Martin Baulig  <martin@ximian.com>
3680
3681         * expression.cs (LocalVariableReference.DoResolve): Don't set
3682         `vi.Used' if we're called from DoResolveLValue().
3683
3684         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
3685         returns the usage vector it just merged into the current one -
3686         pass this one to UsageWarning().
3687         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
3688         of the `EmitContext', don't call this recursively on our children.
3689
3690 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
3691
3692         * driver.cs: Implement /target:module.
3693
3694 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
3695
3696         * support.cs (CharArrayHashtable): New helper class.
3697
3698         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
3699         char arrays, not strings, so we can avoid creating a string in
3700         consume_identifier if the identifier is a keyword.
3701
3702 2003-12-16  Martin Baulig  <martin@ximian.com>
3703
3704         * statement.cs (LocalInfo.Assigned): Removed this property.
3705         (LocalInfo.Flags): Removed `Assigned'.
3706         (LocalInfo.IsAssigned): New public method; takes the EmitContext
3707         and uses flow analysis.
3708         (Block.UsageWarning): Made this method private.
3709         (Block.Resolve): Call UsageWarning() if appropriate.
3710
3711         * expression.cs (LocalVariableReference.DoResolve): Always set
3712         LocalInfo.Used here.
3713
3714 2003-12-13  Martin Baulig  <martin@ximian.com>
3715
3716         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
3717         any value here; we're now using flow analysis to figure out
3718         whether a statement/block returns a value.
3719
3720 2003-12-13  Martin Baulig  <martin@ximian.com>
3721
3722         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
3723         working again.
3724         (FlowBranching.MergeFinally): Don't call
3725         `branching.CheckOutParameters()' here, this is called in
3726         MergeTopBlock().
3727         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
3728         when adding the `finally' vector.       
3729
3730 2003-12-13  Martin Baulig  <martin@ximian.com>
3731
3732         * flowanalysis.cs
3733         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
3734         actually work and also fix #48962.
3735
3736 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3737
3738         * decl.cs: Do not check System.Object for nested types,
3739         since we know it does not have any. Big bang for buck:
3740
3741         BEFORE:
3742            Run 1:   8.35 seconds
3743            Run 2:   8.32 seconds
3744            corlib:  17.99 seconds
3745         AFTER:
3746            Run 1:   8.17 seconds
3747            Run 2:   8.17 seconds
3748            corlib:  17.39 seconds
3749
3750 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3751
3752         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
3753         time we are returning 0 members, so we save alot here.
3754
3755 2003-12-11  Martin Baulig  <martin@ximian.com>
3756
3757         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
3758         `MergeChild()', also just take the `FlowBranching' as argument;
3759         call Merge() on it and return the result.
3760         (FlowBranching.Merge): We don't need to do anything if we just
3761         have one sibling.
3762
3763 2003-12-11  Martin Baulig  <martin@ximian.com>
3764
3765         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
3766         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
3767         Maurer for this idea.
3768
3769 2003-12-11  Martin Baulig  <martin@ximian.com>
3770
3771         * flowanalysis.cs (MergeResult): This class is now gone; we now
3772         use the `UsageVector' for this.  The reason for this is that if a
3773         branching just has one sibling, we don't need to "merge" them at
3774         all - that's the next step to do.
3775         (FlowBranching.Merge): We now return a `UsageVector' instead of a
3776         `MergeResult'.
3777
3778 2003-12-11  Martin Baulig  <martin@ximian.com>
3779
3780         Reworked flow analyis and made it more precise and bug-free.  The
3781         most important change is that we're now using a special `Reachability'
3782         class instead of having "magic" meanings of `FlowReturns'.  I'll
3783         do some more cleanups and optimizations and also add some more
3784         documentation this week.
3785
3786         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
3787         largely reworked this class.
3788         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
3789         the new `Reachability' class instead of having "magic" values here.
3790         (FlowBranching): We're now using an instance of `Reachability'
3791         instead of having separate `Returns', `Breaks' etc. fields.
3792
3793         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
3794         based on flow analysis; ignore the return value of block.Emit ().
3795
3796 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
3797
3798         * driver.cs typemanager.cs: Find the mono extensions to corlib even
3799         if they are private.
3800
3801 2003-12-09  Martin Baulig  <martin@ximian.com>
3802
3803         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
3804         call them directly on the UsageVector.
3805
3806 2003-12-09  Martin Baulig  <martin@ximian.com>
3807
3808         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
3809         Changed return type from `FlowReturns' to `Reachability'.
3810
3811 2003-12-09  Martin Baulig  <martin@ximian.com>
3812
3813         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
3814         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
3815         `Reachable' fields with a single `Reachability' one.
3816
3817 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3818
3819         * class.cs (FindMembers): Remove foreach's.
3820
3821         Bootstrap times:
3822
3823         BEFORE
3824                 Run 1:   8.74 seconds
3825                 Run 2:   8.71 seconds
3826
3827         AFTER
3828                 Run 1:   8.64 seconds
3829                 Run 2:   8.58 seconds
3830
3831
3832 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3833
3834         * cs-parser.jay:
3835         * gen-treedump.cs:
3836         * statement.cs:
3837         This patch does a few things:
3838                 1. EmptyStatement is now a singleton, so it is never reallocated.
3839                 2. All blah is EmptyStatement constructs have been changed to
3840                    blah == EmptyStatement.Value, which is much faster and valid
3841                    now that EmptyStatement is a singleton.
3842                 3. When resolving a block, rather than allocating a new array for
3843                    the non-empty statements, empty statements are replaced with
3844                    EmptyStatement.Value
3845                 4. Some recursive functions have been made non-recursive.
3846         Mainly the performance impact is from (3), however (1) and (2) are needed for
3847         this to work. (4) does not make a big difference in normal situations, however
3848         it makes the profile look saner.
3849
3850         Bootstrap times:
3851
3852         BEFORE
3853         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3854         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3855         Total memory allocated: 56397 KB
3856
3857         AFTER
3858         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
3859         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
3860         Total memory allocated: 55666 KB
3861
3862 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3863
3864         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
3865         than the hashtable in a hashtable version
3866
3867         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
3868         we always end up concating a string. This results in a huge perf
3869         loss, because many strings have to be tracked by the GC. In this
3870         patch, we first use a hashtable that works with two keys, so that
3871         the strings do not need to be concat'ed.
3872
3873         Bootstrap times:
3874         BEFORE
3875                 Run 1:   8.74 seconds
3876                 Run 2:   8.71 seconds
3877
3878         AFTER
3879                 Run 1:   8.65 seconds
3880                 Run 2:   8.56 seconds
3881
3882 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3883
3884         * Makefile: Add a new target `do-time' that does a quick and simple
3885         profile, leaving easy to parse output.
3886
3887 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
3888
3889         * codegen.cs (Init): Create the dynamic assembly with 
3890         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
3891
3892 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3893
3894         * support.cs: Make the PtrHashtable use only one
3895         instance of its comparer.
3896
3897 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
3898
3899         * typemanager.cs: Fix lookup of GetNamespaces.
3900
3901 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
3902
3903         * expression.cs: Removed redundant line.
3904
3905         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
3906         ArrayLists, use for loops with bounds.  
3907
3908         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
3909         arraylist.
3910
3911         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
3912         arraylists, use for loop with bounds.
3913
3914         The above three changes give us a 0.071 second performance
3915         improvement out of 3.294 seconds down to 3.223.  On my machine
3916         the above changes reduced the memory usage by 1,387 KB during
3917         compiler bootstrap.
3918
3919         * cs-parser.jay (QualifiedIdentifier): New class used to represent
3920         QualifiedIdentifiers.  Before we created a new string through
3921         concatenation, and mostly later on, the result would be
3922         manipulated by DecomposeQI through string manipulation.
3923
3924         This reduced the compiler memory usage for bootstrapping from
3925         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
3926         compile times in 0.05 seconds.
3927
3928 2003-11-28  Dick Porter  <dick@ximian.com>
3929
3930         * support.cs: Do string compares with the Invariant culture.
3931
3932         * rootcontext.cs: 
3933         * gen-treedump.cs: 
3934         * expression.cs: 
3935         * driver.cs: 
3936         * decl.cs: 
3937         * codegen.cs: 
3938         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
3939         the comparison is done with the Invariant culture.
3940
3941 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
3942
3943         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
3944         GetEnumerator method.
3945
3946         (ProbeCollectionType): Iterate starting at the most specific type
3947         upwards looking for a GetEnumerator
3948
3949         * expression.cs: Shift count can be up to 31 for int/uint and 63
3950         for long/ulong.
3951
3952 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
3953
3954         * statement.cs (Block.LookupLabel): Also look for the label on the
3955         children blocks.  Use a hash table to keep track of visited
3956         nodes. 
3957
3958         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
3959         we actually did transform the other operand, otherwise fall back
3960         to the common codepath that casts to long.
3961
3962         * cs-tokenizer.cs: Use the same code pattern as the int case.
3963         Maybe I should do the parsing myself, and avoid depending on the
3964         Parse routines to get this done.
3965
3966 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
3967
3968         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3969         which fixes bug 51347.  This time test it.
3970
3971         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
3972         attributes for example can not tell the difference between these.
3973         The difference was only a syntax feature of the language. 
3974
3975         * attribute.cs: Apply attributes to delegates.
3976
3977         * delegate.cs: Call the apply attributes method.
3978
3979 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
3980
3981         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
3982         comparing 0 vs Byte.MinValue, not the value
3983
3984         (ImplicitConversionRequired): When reporting a conversion error,
3985         use error 31 to print out the constant error instead of the
3986         simpler 29.
3987
3988         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3989         which fixes bug 51347.
3990
3991 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
3992
3993         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
3994         which fixes the -warnaserror command line option.
3995
3996 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
3997
3998         * cfold.cs (DoNumericPromotions): During constant folding of
3999         additions on UIntConstant, special case intconstants with
4000         IntConstants like we do on the expression binary operator. 
4001
4002 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4003
4004         * convert.cs (ImplicitReferenceConversion): We were missing a case
4005         (System.Enum are not value types or class types, so we need to
4006         classify them separatedly).
4007
4008         * driver.cs: We do not support error 2007.
4009
4010 2003-11-12 Jackson Harper <jackson@ximian.com>
4011
4012         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4013         system directory. Also use the full file name so users can
4014         libraries names mscorlib-o-tron.dll in a non system dir.
4015
4016 2003-11-10  Martin Baulig  <martin@ximian.com>
4017
4018         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4019         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4020         calling `ResolveType()' on them, directly assign their `Type'.
4021
4022 2003-11-08  Martin Baulig  <martin@ximian.com>
4023
4024         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4025         return value and the `out parent' parameter.
4026         (TypeContainer.DefineType): Moved the CS0644 check into
4027         GetClassBases().  Don't pass the interface types to the
4028         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4029         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4030
4031         * ecore.cs (TypeExpr.IsAttribute): New property.
4032         (TypeExpr.GetInterfaces): New method.
4033
4034         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4035         TypeExpr instead of a Type.
4036         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4037         (Interface.DefineType): Don't pass the interface types to the
4038         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4039         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4040
4041         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4042         instead of a `Type[]'.
4043         (TypeManager.RegisterBuilder): Likewise.
4044         (TypeManager.AddUserInterface): Likewise.
4045         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4046         `Type[]' and also return a `TypeExpr[]'.
4047         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4048
4049 2003-11-08  Martin Baulig  <martin@ximian.com>
4050
4051         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4052         Expression.     
4053
4054 2003-11-08  Martin Baulig  <martin@ximian.com>
4055
4056         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4057         TypeManager.ResolveExpressionTypes().
4058
4059         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4060         instead of an Expression.
4061         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4062         (TypeExpression): New public class; formerly known as `TypeExpr'.
4063
4064         * expression.cs (ComposedCast): Derive from TypeExpr.
4065
4066         * typemanager.cs (TypeManager.system_*_expr): These are now
4067         TypExpr's instead of Expression's.
4068         (TypeManager.ResolveExpressionTypes): New public static function;
4069         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4070         of them.        
4071
4072 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4073
4074         * expression.cs (New.DoResolve): Do not dereference value that
4075         might be a null return.
4076
4077         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4078         sure that the constant value has the right type.  Fixes an
4079         unreported bug, similar to 50425.
4080
4081         * const.cs (Const.LookupConstantValue): Call
4082         ImplicitStandardConversionExists before doing a conversion to
4083         avoid havng the TypeManager.ChangeType do conversions.
4084
4085         Reduced the number of casts used
4086
4087         (Const.ChangeType): New routine to enable reuse of the constant
4088         type changing code from statement.
4089
4090         * typemanager.cs (ChangeType): Move common initialization to
4091         static global variables.
4092
4093         Fixes #50425.
4094
4095         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4096         every value type to go through, even if it was void.  Fix that. 
4097
4098         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4099         character of the define, and the is_identifier_part_character for
4100         the rest of the string.
4101
4102 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4103
4104         * expression.cs (UnaryMutator.EmitCode): When I updated
4105         LocalVariableReference.DoResolve, I overdid it, and dropped an
4106         optimization done on local variable references.
4107
4108 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4109
4110         * ecore.cs: Convert the return from Ldlen into an int.
4111
4112 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4113
4114         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4115         the accessibility, this is a special case for toplevel non-public
4116         classes (internal for instance).
4117
4118 2003-10-20  Nick Drochak <ndrochak@gol.com>
4119
4120         * ecore.cs: Fix typo and build.  Needed another right paren.
4121
4122 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4123
4124         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4125         `internal' case regular and protected, but not allowing protected
4126         to be evaluated later.  Bug 49840
4127
4128 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4129
4130         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4131         to kb.Nlast, and not the kb.nFirst to isolate the switch
4132         statement.
4133
4134         Extract the underlying type, so enumerations of long/ulong are
4135         treated like long/ulong.
4136
4137 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4138
4139         * expression.cs (New): Overload the meaning of RequestedType to
4140         track the possible creation of the NewDelegate type, since
4141         DoResolve is invoked more than once for new constructors on field
4142         initialization.
4143
4144         See bugs: #48800 and #37014
4145
4146         * cs-parser.jay (declare_local_constants): Take an arraylist
4147         instead of a single constant.
4148
4149         (local_constant_declaration): It should take a
4150         constant_declarators, not a constant_declarator.  Fixes 49487
4151
4152         * convert.cs: Fix error report.
4153
4154 2003-10-13 Jackson Harper <jackson@ximian.com>
4155
4156         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4157         bug #49611
4158
4159 2003-10-09  Martin Baulig  <martin@ximian.com>
4160
4161         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4162         to the .ctor.
4163         (MethodCore.DoDefineParameters): Removed the TypeContainer
4164         argument; use the DeclSpace which was passed to the .ctor instead.
4165         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4166         TypeContainer; we only need a DeclSpace here.
4167
4168 2003-10-09  Martin Baulig  <martin@ximian.com>
4169
4170         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4171         to the .ctor.
4172         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4173         EmitContext's .ctor.    
4174
4175 2003-10-09  Martin Baulig  <martin@ximian.com>
4176
4177         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4178         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4179         AsAccessible(), moved them as well.
4180
4181         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4182
4183 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
4184
4185         * cs-parser.jay : Renamed yyName to yyNames related to jay.
4186
4187 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4188
4189         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4190         generation for >=, as spotted by Paolo, bug 48679.  
4191         Patch from David Waite.
4192
4193         * cs-tokenizer.cs: Add handling for #pragma.
4194
4195         * cs-parser.jay: Allow for both yield and yield return in the
4196         syntax.  The anti-cobolization of C# fight will go on!
4197
4198         * class.cs (TypeBuilder.DefineType): Catch error condition here
4199         (Parent.DefineType erroring out and returning null).
4200
4201         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4202         coping with enumerations variables, we were mistakenly processing
4203         them as a regular value type instead of built-in types.  Fixes the
4204         bug #48063
4205
4206         * typemanager.cs (IsBuiltinOrEnum): New method.
4207
4208 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
4209
4210         * cs-parser.jay: Upgrade: yield now needs the return clause.
4211
4212 2003-09-19  Martin Baulig  <martin@ximian.com>
4213
4214         * decl.cs (MemberCache.SetupCacheForInterface): Take a
4215         `MemberCache parent' argument.  Normally, an interface doesn't
4216         have a parent type except System.Object, but we use this in gmcs
4217         for generic type parameters.
4218
4219 2003-09-18  Martin Baulig  <martin@ximian.com>
4220
4221         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
4222         on `type.IsInterface'; don't check whether the type has a parent
4223         to determine whether it's an interface.
4224
4225 2003-09-15  Martin Baulig  <martin@ximian.com>
4226
4227         * class.cs (TypeContainer.DefineType): Added an error flag to
4228         avoid reporting duplicate CS0146's ("class definition is
4229         circular.").
4230
4231         * driver.cs (Driver.MainDriver): Abort if
4232         RootContext.ResolveTree() reported any errors.
4233
4234 2003-09-07  Martin Baulig  <martin@ximian.com>
4235
4236         * report.cs (Error, Warning): Added overloaded versions which take
4237         a `params object[] args' and call String.Format().
4238
4239 2003-09-07  Martin Baulig  <martin@ximian.com>
4240
4241         * decl.cs (DeclSpace..ctor): Don't call
4242         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
4243         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
4244         (DeclSpace.RecordDecl): New method.
4245
4246         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
4247
4248 2003-09-02  Ravi Pratap  <ravi@ximian.com>
4249
4250         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
4251         value attributes to be applied to ParameterBuilders.
4252
4253         * class.cs (MethodCore.LabelParameters): Make static and more
4254         generic so that it can be used from other places - like interface
4255         methods, for instance.
4256
4257         * interface.cs (Interface.Emit): Call LabelParameters before
4258         emitting attributes on the InterfaceMethod.
4259
4260 2003-08-26  Martin Baulig  <martin@ximian.com>
4261
4262         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
4263         resolving aliases; fixes #47927.
4264
4265 2003-08-26  Martin Baulig  <martin@ximian.com>
4266
4267         * statement.cs (Using.DoResolve): This is internally emitting a
4268         try/finally clause, so we need to set ec.NeedExplicitReturn if we
4269         do not always return.  Fixes #47681.
4270
4271 2003-08-26  Martin Baulig  <martin@ximian.com>
4272
4273         * decl.cs (MemberCore): Moved WarningNotHiding(),
4274         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
4275         into MemberBase.
4276         (AdditionResult): Make this nested in DeclSpace.
4277         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
4278         argument; call NamespaceEntry.Define() unless we're nested in a
4279         class or struct.
4280
4281         * namespace.cs (Namespace.DefineName): New public function.  This
4282         is called from DeclSpace's .ctor to add 
4283         (Namespace.Lookup): Include DeclSpaces in the lookup.
4284
4285         * class.cs (Operator): Derive from MemberBase, not MemberCore.
4286
4287         * const.cs (Const): Derive from MemberBase, not MemberCore.     
4288
4289 2003-08-25  Martin Baulig  <martin@ximian.com>
4290
4291         * convert.cs (Convert.ExplicitReferenceConversion): When
4292         converting from an interface type to a class, unbox if the target
4293         type is a struct type.  Fixes #47822.
4294
4295 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4296
4297         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
4298         #47854.
4299
4300 2003-08-22  Martin Baulig  <martin@ximian.com>
4301
4302         * class.cs (TypeManager.DefineType): When defining a nested type,
4303         call DefineType() on our parent; fixes #47801.
4304
4305 2003-08-22  Martin Baulig  <martin@ximian.com>
4306
4307         * class.cs (MethodData.Define): While checking if a method is an
4308         interface implementation, improve the test a bit more to fix #47654.
4309
4310 2003-08-22  Martin Baulig  <martin@ximian.com>
4311
4312         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
4313         correctly; fixes #47722.
4314
4315 2003-08-22  Martin Baulig  <martin@ximian.com>
4316
4317         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
4318         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
4319
4320         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
4321
4322 2003-08-22  Martin Baulig  <martin@ximian.com>
4323
4324         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
4325         can only be assigned in static constructors.  Fixes #47161.
4326
4327 2003-08-22  Martin Baulig  <martin@ximian.com>
4328
4329         Rewrote and improved the flow analysis code.
4330
4331         * flowbranching.cs (FlowBranching): Make this class abstract.
4332         (FlowBranching.CreateBranching): New static function to create a
4333         new flow branching.
4334         (FlowBranchingBlock, FlowBranchingException): New classes.
4335         (FlowBranching.UsageVector.Type): New public readonly field.
4336         (FlowBranching.UsageVector.Breaks): Removed the setter.
4337         (FlowBranching.UsageVector.Returns): Removed the setter.
4338         (FlowBranching.UsageVector): Added Break(), Return(),
4339         NeverReachable() and Throw() methods to modify the reachability.
4340         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
4341         done by FlowBranching.Merge().
4342         (FlowBranching.UsageVector.MergeChild): New method; merges the
4343         merge result into the current vector.
4344         (FlowBranching.Merge): New abstract method to merge a branching.
4345
4346 2003-08-12  Martin Baulig  <martin@ximian.com>
4347
4348         * expression.cs (Indirection.CacheTemporaries): Create the
4349         LocalTemporary with the pointer type, not its element type.
4350
4351 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
4352
4353         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
4354         token was a keyword or not.
4355
4356         Add `error' options where an IDENTIFIER was expected;  Provide
4357         CheckToken and CheckIdentifierToken convenience error reporting
4358         functions. 
4359
4360         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
4361
4362         * decl.cs: Rename `NamespaceEntry Namespace' public field into
4363         NameSpaceEntry NameSpaceEntry.
4364
4365         (LookupInterfaceOrClass): Avoid creating a full qualified name
4366         from namespace and name: avoid doing lookups when we know the
4367         namespace is non-existant.   Use new Tree.LookupByNamespace which
4368         looks up DeclSpaces based on their namespace, name pair.
4369
4370         * driver.cs: Provide a new `parser verbose' to display the
4371         exception thrown during parsing.  This is turned off by default
4372         now, so the output of a failure from mcs is more graceful.
4373
4374         * namespace.cs: Track all the namespaces defined in a hashtable
4375         for quick lookup.
4376
4377         (IsNamespace): New method
4378
4379 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
4380
4381         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
4382         we know that we need to concatenate (full typename can never be
4383         null). 
4384
4385         * class.cs: ditto.
4386
4387         * statement.cs: Use a bitfield;  Do not initialize to null things
4388         which are done by the constructor by default.
4389
4390         * cs-parser.jay: bug fix, parameter was 4, not 3.
4391
4392         * expression.cs: Just use the property;
4393
4394         * statement.cs: No need for GetVariableInfo method.
4395
4396 2003-08-08  Martin Baulig  <martin@ximian.com>
4397
4398         * flowanalysis.cs (FlowReturns): This is now nested in the
4399         `FlowBranching' class.
4400         (MyBitVector): Moved this here from statement.cs.
4401         (FlowBranching.SiblingType): New enum type.
4402         (FlowBranching.CreateSibling): Added `SiblingType' argument.
4403
4404 2003-08-07  Martin Baulig  <martin@ximian.com>
4405
4406         * flowanalysis.cs (FlowBranchingType): This is now nested in the
4407         `FlowBranching' class and called `BranchingType'.
4408
4409 2003-08-07  Martin Baulig  <martin@ximian.com>
4410
4411         * flowanalysis.cs: Moved all the control flow analysis code into
4412         its own file.
4413
4414 2003-08-07  Martin Baulig  <martin@ximian.com>
4415
4416         * assign.cs (Assign.DoResolve): `target' must either be an
4417         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
4418         #37319.
4419
4420 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
4421
4422         * expression.cs (BinaryMethod): This kind of expression is created by the
4423         Binary class if it determines that the operator has to be handled
4424         by a method.
4425
4426         (BinaryDelegate): This kind of expression is created if we are
4427         dealing with a + or - operator on delegates.
4428
4429         (Binary): remove method, argumetns, and DelegateOperator: when
4430         dealing with methods, 
4431
4432         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
4433
4434         * statement.cs (Block): use bitfields for the three extra booleans
4435         we had in use.   Remove unused topblock parameter.
4436
4437         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
4438
4439         * assign.cs: Drop extra unneeded tests.
4440
4441 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
4442
4443         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
4444
4445         * statement.cs (Foreach): Use VariableStorage instead of
4446         LocalBuilders.   
4447
4448         * codegen.cs (VariableStorage): New class used by clients that
4449         require a variable stored: locals or fields for variables that
4450         need to live across yield.
4451
4452         Maybe provide a convenience api for EmitThis+EmitLoad?
4453
4454         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
4455         these bad boys.
4456
4457 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
4458
4459         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
4460         RemapParameterLValue): New methods that are used to turn a
4461         precomputed FieldInfo into an expression like this:
4462
4463                 instance.FieldInfo
4464
4465         The idea is to use this instead of making LocalVariableReference
4466         have more than one meaning.
4467
4468         * cs-parser.jay: Add error production to BASE.
4469
4470         * ecore.cs: Deal with TypeManager.GetField returning null, which
4471         is now a valid return value.
4472
4473         (FieldExprNoAddress): New expression for Fields whose address can
4474         not be taken.
4475
4476         * expression.cs (LocalVariableReference): During the resolve
4477         phases, create new expressions if we are in a remapping context.
4478         Remove code that dealt with remapping here.
4479
4480         (ParameterReference): same.
4481
4482         (ProxyInstance): New expression, like the `This' expression, but
4483         it is born fully resolved.  We know what we are doing, so remove
4484         the errors that are targeted to user-provided uses of `this'.
4485
4486         * statement.cs (Foreach): our variable is now stored as an
4487         Expression;  During resolution, follow the protocol, dont just
4488         assume it will return this.
4489
4490 2003-08-06  Martin Baulig  <martin@ximian.com>
4491
4492         * support.cs (SeekableStreamReader.cs): New public class.
4493
4494         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
4495         SeekableStreamReader instead of the normal StreamReader.
4496
4497 2003-08-04  Martin Baulig  <martin@ximian.com>
4498
4499         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
4500         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
4501         deambiguate casts and delegate invocations.
4502         (parenthesized_expression): Use the new tokens to ensure this is
4503         not a cast of method invocation.
4504
4505         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
4506         when reading a `)' and Deambiguate_CloseParens () was previously
4507         called.
4508
4509         * expression.cs (ParenthesizedExpression): New class.  This is
4510         just used for the CS0075 test.
4511         (Binary.DoResolve): Check for CS0075.   
4512
4513 2003-07-29  Ravi Pratap  <ravi@ximian.com>
4514
4515         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
4516         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
4517         reference comparison.
4518
4519         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
4520         examine the ReturnType for equality - this is necessary in the
4521         cases of implicit and explicit operators whose signature also
4522         includes the return type.
4523
4524 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
4525
4526         * namespace.cs: Cache the result of the namespace computation,
4527         instead of computing it every time.
4528
4529 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
4530
4531         * decl.cs: Use a global arraylist that we reuse over invocations
4532         to avoid excesive memory consumption.  Reduces memory usage on an
4533         mcs compile by one meg (45 average).
4534
4535         * typemanager.cs (LookupTypeReflection): In .NET pointers are
4536         private, work around that.
4537
4538 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
4539
4540         * literal.cs (IntLiteral): Define Zero and One static literals. 
4541
4542         * cs-parser.jay (integer_literal): use static literals to reduce
4543         memory usage for the most used literals (0, 1 and -1).  211kb
4544         reduced in memory usage.
4545
4546         Replace all calls to `new ArrayList' with `new
4547         ArrayList(4)' which is a good average number for most allocations,
4548         and also requires only 16 bytes of memory for its buffer by
4549         default. 
4550
4551         This reduced MCS memory usage in seven megabytes for the RSS after
4552         bootstrapping.
4553
4554 2003-07-28  Ravi Pratap  <ravi@ximian.com>
4555
4556         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
4557         handle params methods the correct way by forming only one
4558         applicable set with params and normal methods in them. Earlier we
4559         were looking at params methods only if we found no normal methods
4560         which was not the correct thing to do.
4561
4562         (Invocation.BetterFunction): Take separate arguments indicating
4563         when candidate and the best method are params methods in their
4564         expanded form.
4565
4566         This fixes bugs #43367 and #46199.
4567
4568         * attribute.cs: Documentation updates.
4569
4570         (CheckAttribute): Rename to CheckAttributeTarget.
4571         (GetValidPlaces): Rename to GetValidTargets.
4572
4573         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
4574         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
4575
4576         Fixes bug #44468.
4577
4578 2003-07-28  Martin Baulig  <martin@ximian.com>
4579
4580         * class.cs (TypeContainer.DefineMembers): Use the base type's full
4581         name when looking up the base class of a nested class.  Fixes #46977.
4582
4583 2003-07-26  Martin Baulig  <martin@ximian.com>
4584
4585         * expression.cs (Indexers.Indexer): New nested struct; contains
4586         getter, setter and the indexer's type.
4587         (Indexers.Properties): This is now an ArrayList of
4588         Indexers.Indexer's.
4589         (IndexerAccess.DoResolveLValue): Correctly set the type if the
4590         indexer doesn't have any getters.
4591
4592         * assign.cs (Assign.DoResolve): Also do the implicit conversions
4593         for embedded property and indexer assignments.
4594
4595 2003-07-26  Martin Baulig  <martin@ximian.com>
4596
4597         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
4598         preprocessor directive is not the first non-whitespace character
4599         on a line.
4600
4601 2003-07-26  Martin Baulig  <martin@ximian.com>
4602
4603         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
4604         namespace parsing, follow the spec more closely.
4605
4606         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
4607         NamespaceEntry.Lookup().
4608
4609 2003-07-25  Martin Baulig  <martin@ximian.com>
4610
4611         * MethodCore.cs (OverridesSomething): New public field; it's set
4612         from TypeContainer.DefineMembers if this method overrides
4613         something (which doesn't need to be a method).  Fix #39462.
4614
4615 2003-07-25  Ravi Pratap  <ravi@ximian.com>
4616
4617         * typemanager.cs (GetMembers): Ensure that the list of members is
4618         reversed. This keeps things in sync.
4619
4620         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
4621         find an AttributeUsage attribute.
4622
4623         * expression.cs (Invocation.OverloadResolve): Perform the check
4624         which disallows Invoke to be directly called on a Delegate.
4625
4626         (Error_InvokeOnDelegate): Report error cs1533.
4627
4628 2003-07-25  Martin Baulig  <martin@ximian.com>
4629
4630         * expression.cs (Indexers.GetIndexersForType): Only look in the
4631         interface hierarchy if the requested type is already an
4632         interface.  Fixes #46788 while keeping #46502 fixed.
4633
4634 2003-07-25  Martin Baulig  <martin@ximian.com>
4635
4636         * class.cs (TypeContainer.DefineMembers): Check whether all
4637         readonly fields have been assigned and report warning CS0649 if
4638         not.
4639
4640         * statement.cs (LocalInfo.IsFixed): Always return true if this is
4641         a valuetype.
4642
4643 2003-07-24  Ravi Pratap  <ravi@ximian.com>
4644
4645         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
4646         returned from GetMethods to make things consistent with the
4647         assumptions MCS makes about ordering of methods.
4648
4649         This should comprehensively fix bug #45127 and it does :-)
4650
4651         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
4652         ordering is actually reverse.
4653
4654         * Clean up some debug messages I left lying around.
4655
4656         * interface.cs (Populate*): Get rid of code which emits attributes
4657         since the stage in which we emit attributes is the 'Emit' stage,
4658         not the define stage.
4659
4660         (Emit): Move attribute emission for interface members here.
4661
4662 2003-07-22  Ravi Pratap  <ravi@ximian.com>
4663
4664         * expression.cs (Invocation.OverloadResolve): Follow the spec more
4665         closely: we eliminate methods in base types when we have an
4666         applicable method in a top-level type.
4667
4668         Please see section 14.5.5.1 for an exact description of what goes
4669         on. 
4670
4671         This fixes bug #45127 and a host of other related to corlib compilation.
4672
4673         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
4674         array is the method corresponding to the top-level type (this is
4675         because of the changes made to icall.c) so we change this
4676         accordingly.
4677
4678         (MethodGroupExpr.Name): This too.
4679
4680         * typemanager.cs (GetElementType): New method which does the right
4681         thing when compiling corlib. 
4682
4683         * everywhere: Make use of the above in the relevant places.
4684
4685 2003-07-22  Martin Baulig  <martin@ximian.com>
4686
4687         * cs-parser.jay (invocation_expression): Moved
4688         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
4689         `cast_expression', but create a InvocationOrCast which later
4690         resolves to either an Invocation or a Cast.
4691
4692         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
4693         method; call this before EmitStatement() to make sure that this
4694         expression can be used as a statement.
4695
4696         * expression.cs (InvocationOrCast): New class; resolves to either
4697         an Invocation or a Cast.
4698
4699         * statement.cs (StatementExpression): Call ResolveStatement() on
4700         the ExpressionStatement before emitting it.
4701
4702 2003-07-21  Martin Baulig  <martin@ximian.com>
4703
4704         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
4705         `ref' and `out' attributes match; fixes #46220.
4706         (MemberAccess.ResolveMemberAccess): You can't reference a type
4707         through an expression; fixes #33180.
4708         (Indexers.GetIndexersForType): Don't return the indexers from
4709         interfaces the class implements; fixes #46502.
4710
4711 2003-07-21  Martin Baulig  <martin@ximian.com>
4712
4713         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
4714         CS0661 checks; fixes bug #30442.
4715
4716 2003-07-21  Martin Baulig  <martin@ximian.com>
4717
4718         * decl.cs (AdditionResult): Added `Error'.
4719
4720         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
4721
4722         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
4723         makes cs0031.cs actually work.
4724
4725 2003-07-20  Martin Baulig  <martin@ximian.com>
4726
4727         * namespace.cs: Fixed that bug which caused a crash when compiling
4728         the debugger's GUI.
4729
4730 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
4731
4732         * typemanager.cs (LookupTypeReflection): Never expose types which
4733         are NotPublic, NestedPrivate, NestedAssembly, or
4734         NestedFamANDAssem.  We used to return these, and later do a check
4735         that would report a meaningful error, but the problem is that we
4736         would not get the real match, if there was a name override.
4737
4738 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
4739
4740         * namespace.cs (Namespace, Name): Do not compute the namespace
4741         name dynamically, compute it in the constructor.  This reduced
4742         memory usage by 1697 KB.
4743
4744         * driver.cs: Use --pause to pause at the end.
4745
4746 2003-07-17  Peter Williams  <peter@newton.cx>
4747
4748         * Makefile: Change the name of the test target so that it doesn't
4749         conflict with the recursive test target.
4750
4751 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
4752
4753         * expression.cs (LocalVariableReference.Emit, EmitAssign,
4754         AddressOf): Do not use EmitThis, that was wrong, use the actual
4755         this pointer.
4756
4757 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
4758
4759         * class.cs (MethodData.Define): While checking if a method is an
4760         interface implementation, improve the test: If we are not public
4761         (use new test here: use the computed MethodAttributes directly,
4762         instead of the parsed modifier flags) check if the `implementing'
4763         method comes from an interface or not.
4764
4765         * pending.cs (VerifyPendingMethods): Slightly better error
4766         message.
4767
4768         * makefile: add test target that does the mcs bootstrap.
4769
4770 2003-07-16  Ravi Pratap  <ravi@ximian.com>
4771
4772         * interface.cs (Define): Do nothing here since there are no
4773         members to populate etc. Move the attribute emission out of here
4774         since this was just totally the wrong place to put it. Attribute
4775         application happens during the 'Emit' phase, not in the 'Define'
4776         phase.
4777
4778         (Emit): Add this method and move the attribute emission here
4779
4780         * rootcontext.cs (EmitCode): Call the Emit method on interface
4781         types too.
4782
4783 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4784
4785         * expression.cs (OverloadResolve): Report error only if Location
4786         is not 'Null' which means that there was a probe going on.
4787
4788 2003-07-14  Martin Baulig  <martin@ximian.com>
4789
4790         * expression.cs (ConditionalLogicalOperator): New public class to
4791         implement user defined conditional logical operators.
4792         This is section 14.11.2 in the spec and bug #40505.
4793
4794 2003-07-14  Martin Baulig  <martin@ximian.com>
4795
4796         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
4797
4798 2003-07-14  Martin Baulig  <martin@ximian.com>
4799
4800         * codegen.cs (EmitContext.InFixedInitializer): New public field.
4801
4802         * ecore.cs (IVariable.VerifyFixed): New interface method.
4803
4804         * expression.cs (Unary.ResolveOperator): When resolving the `&'
4805         operator, check whether the variable is actually fixed.  Fixes bug
4806         #36055.  Set a variable definitely assigned when taking its
4807         address as required by the spec.
4808
4809         * statement.cs (LocalInfo.IsFixed): New field.
4810         (LocalInfo.MakePinned): Set `IsFixed' to true.
4811
4812 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4813
4814         * attribute.cs (Attribute.Resolve): While doing a Member lookup
4815         for .ctors, ensure that we only ask for members declared in the
4816         attribute type (BindingFlags.DeclaredOnly).
4817
4818         Fixes bug #43632.
4819
4820         * expression.cs (Error_WrongNumArguments): Report error 1501
4821         correctly the way CSC does.
4822
4823 2003-07-13  Martin Baulig  <martin@ximian.com>
4824
4825         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
4826         lookup on the fully qualified name, to make things like "X.X" work
4827         where "X.X" is a fully qualified type name, but we also have a
4828         namespace "X" in the using list.  Fixes #41975.
4829
4830 2003-07-13  Martin Baulig  <martin@ximian.com>
4831
4832         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
4833         function. If we're a CompoundAssign, we need to create an embedded
4834         CompoundAssign, not an embedded Assign.
4835         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
4836         Fixes #45854.
4837
4838 2003-07-13  Martin Baulig  <martin@ximian.com>
4839
4840         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
4841         work to fix bug #46088.
4842
4843 2003-07-13  Ravi Pratap <ravi@ximian.com>
4844
4845         * class.cs (Operator.Emit): Do not emit attributes here - it is
4846         taken care of by the Method class that we delegate too. This takes
4847         care of bug #45876.
4848
4849 2003-07-10  Martin Baulig  <martin@ximian.com>
4850
4851         * expression.cs (TypeOfVoid): New class.
4852         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
4853
4854 2003-07-10  Martin Baulig  <martin@ximian.com>
4855
4856         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
4857         bug #35957.
4858
4859 2003-07-10  Martin Baulig  <martin@ximian.com>
4860
4861         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
4862         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
4863
4864         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
4865
4866         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
4867
4868 2003-07-10  Martin Baulig  <martin@ximian.com>
4869
4870         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
4871         of decimal.  Fixes #42850.
4872
4873         NOTE: I also fixed the created byte blob, but this doesn't work on
4874         the MS runtime and csc never produces any byte blobs for decimal
4875         arrays.
4876
4877 2003-07-10  Martin Baulig  <martin@ximian.com>
4878
4879         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
4880         structs; fixes #32068.
4881         (Block.AddChildVariableNames): Fixed #44302.
4882
4883 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4884
4885         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
4886
4887 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4888
4889         * attribute.cs: And this test is onger needed.
4890
4891 2003-07-08  Martin Baulig  <martin@ximian.com>
4892
4893         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
4894         inaccessible types.  Fixes #36313.
4895
4896         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
4897
4898         * namespace.cs (NamespaceEntry): Create implicit entries for all
4899         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
4900         implicit entries for N1.N2 and N1.
4901
4902 2003-07-08  Martin Baulig  <martin@ximian.com>
4903
4904         Rewrote the handling of namespaces to fix a lot of the issues
4905         wrt. `using' aliases etc.
4906
4907         * namespace.cs (Namespace): Splitted this class into a
4908         per-assembly `Namespace' and a per-file `NamespaceEntry'.
4909
4910         * typemanager.cs (TypeManager.IsNamespace): Removed.
4911         (TypeManager.ComputeNamespaces): Only compute namespaces from
4912         loaded assemblies here, not the namespaces from the assembly we're
4913         currently compiling.
4914
4915 2003-07-08  Martin Baulig  <martin@ximian.com>
4916
4917         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
4918
4919 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4920
4921         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
4922         already fixed it.  
4923
4924         I thought about the memory savings here, but LookupTypeReflection
4925         is used under already very constrained scenarios.  Compiling
4926         corlib or mcs only exposes one hit, so it would not really reduce
4927         any memory consumption.
4928
4929 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4930
4931         * typemanager.cs: fixes bug #45889 by only adding public types from
4932         other assemblies to the list of known types.
4933
4934 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4935
4936         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
4937         on the type we resolved.
4938
4939 2003-07-05  Martin Baulig  <martin@ximian.com>
4940
4941         * pending.cs (PendingImplementation.ParentImplements): Don't
4942         create the proxy if the parent is abstract.
4943
4944         * class.cs (TypeContainer.DefineIndexers): Process explicit
4945         interface implementations first.  Fixes #37714.
4946
4947 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
4948
4949         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
4950         defined recursively;  but since we modify the input parameters
4951         (left is set to `this' temporarily), we reset this value if the
4952         left_is_explicit is false, which gives the original semantics to
4953         the code.  
4954
4955         * literal.cs (NullPointer): new class used to represent a null
4956         literal in a pointer context.
4957
4958         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
4959         type is a pointer, use a NullPointer object instead of a
4960         NullLiteral.   Closes 43687
4961
4962         (ExplicitConversion): Convert pointer values using
4963         the conv opcode to the proper type.
4964
4965         * ecore.cs (New): change ValueTypeVariable property into a method,
4966         that returns whether the valuetype is suitable for being used.
4967
4968         * expression.cs (Binary.DoNumericPromotions): Only return if we
4969         the int constant was a valid uint, and we can return both left and
4970         right as uints.  If not, we continue processing, to trigger the
4971         type conversion.  This fixes 39018.
4972
4973         * statement.cs (Block.EmitMeta): During constant resolution, set
4974         the CurrentBlock property on the emitcontext, so that we resolve
4975         constants propertly.
4976
4977 2003-07-02  Martin Baulig  <martin@ximian.com>
4978
4979         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
4980         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
4981
4982         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
4983         than emitting it here.
4984
4985         * statement.cs: Fixed some more flow analysis bugs.
4986
4987 2003-07-02  Martin Baulig  <martin@ximian.com>
4988
4989         * class.cs (MethodData.Define): When implementing interface
4990         methods, set Final unless we're Virtual.
4991
4992         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
4993         check work for interface methods.
4994
4995 2003-07-01  Martin Baulig  <martin@ximian.com>
4996
4997         * ecore.cs (EmitContext.This): Replaced this property with a
4998         GetThis() method which takes a Location argument.  This ensures
4999         that we get the correct error location for a CS0188.
5000
5001 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5002
5003         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5004         ImplicitStandardConversion.
5005
5006         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5007
5008 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5009
5010         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5011         optimization.
5012
5013 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5014
5015         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5016         constructors.
5017
5018         (MethodData.Define): Turn off initlocals for unsafe methods.
5019
5020 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5021
5022         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5023         complete;  Fixes #37521.
5024
5025         * delegate.cs: Use Modifiers.TypeAttr to compute the
5026         TypeAttributes, instead of rolling our own.  This makes the flags
5027         correct for the delegates.
5028
5029 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5030
5031         * class.cs (Constructor.Define): Set the private flag for static
5032         constructors as well.
5033
5034         * cs-parser.jay (statement_expression): Set the return value to
5035         null, to avoid a crash when we catch an error.
5036
5037 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5038
5039         * cs-parser.jay: Applied patch from Jackson that adds support for
5040         extern and unsafe modifiers to destructor declarations.
5041
5042         * expression.cs: Report error 21 if the user is trying to index a
5043         System.Array.
5044
5045         * driver.cs: Add an error message, suggested by the bug report.
5046
5047         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5048         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5049
5050 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5051
5052         * namespace.cs: Add some information to reduce FAQs.
5053
5054 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5055
5056         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5057         underlying enumeration types.  Fixes #43915.
5058
5059         * expression.cs: Treat ushort/short as legal values to be used in
5060         bitwise operations.
5061
5062 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5063
5064         * delegate.cs: transfer custom attributes for paramenters from
5065         the delegate declaration to Invoke and BeginInvoke.
5066
5067 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5068
5069         * attribute.cs: handle custom marshalers and emit marshal info
5070         for fields, too.
5071
5072 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5073
5074         * makefile.gnu: Added anonymous.cs to the compiler sources.
5075
5076 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
5077
5078         * iterators.cs: Change the name of the proxy class to include two
5079         underscores.
5080
5081         * cs-parser.jay: Update grammar to include anonymous methods.
5082
5083         * anonymous.cs: new file.
5084
5085 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
5086
5087         * class.cs (Field.Define): Add missing test for pointers and
5088         safety. 
5089
5090 2003-05-27  Ravi Pratap  <ravi@ximian.com>
5091
5092         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
5093         we use the stobj opcode.
5094
5095         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
5096         since it wasn't the correct fix. 
5097
5098         It still is puzzling that we are required to use stobj for IntPtr
5099         which seems to be a ValueType.
5100
5101 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
5102
5103         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
5104         during regular simple name resolution.   Now, the trick is that
5105         instead of returning for processing the simplename, we do a
5106         TypeManager.LookupType (ie, a rooted lookup as opposed to a
5107         contextual lookup type).   If a match is found, return that, if
5108         not, return for further composition.
5109
5110         This fixes long-standing 30485.
5111
5112         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5113         using the address to initialize an object, do an Stobj instead of
5114         using the regular Stelem.
5115
5116         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
5117         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
5118         Because if we are a BaseIndexerAccess that value will be true.
5119         Fixes 43643.
5120
5121         * statement.cs (GotoCase.Resolve): Return after reporting an
5122         error, do not attempt to continue. 
5123
5124         * expression.cs (PointerArithmetic.Emit): If our operand is a
5125         long, convert our constants to match the operand before
5126         multiplying.  Convert to I type before adding.   Fixes 43670.
5127
5128 2003-05-14  Ravi Pratap  <ravi@ximian.com>
5129
5130         * enum.cs (ImplicitConversionExists) : Rename to
5131         ImplicitEnumConversionExists to remove ambiguity. 
5132
5133         * ecore.cs (NullCast): New type of cast expression class which
5134         basically is very similar to EmptyCast with the difference being
5135         it still is a constant since it is used only to cast a null to
5136         something else
5137         (eg. (string) null)
5138
5139         * convert.cs (ImplicitReferenceConversion): When casting a null
5140         literal, we return a NullCast.
5141
5142         * literal.cs (NullLiteralTyped): Remove - I don't see why this
5143         should be around anymore.
5144
5145         The renaming (reported was slightly wrong). Corrections:
5146
5147         ConvertImplicitStandard -> ImplicitConversionStandard
5148         ConvertExplicitStandard -> ExplicitConversionStandard
5149
5150         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
5151         before passing them in !
5152
5153         * convert.cs (ImplicitConversionStandard): When comparing for
5154         equal expr and target types, ensure that expr is not a
5155         NullLiteral.
5156
5157         In general, we must not be checking (expr_type ==
5158         target_type) in the top level conversion methods
5159         (ImplicitConversion, ExplicitConversion etc). This checking is
5160         done in the methods that they delegate to.
5161
5162 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
5163
5164         * convert.cs: Move Error_CannotConvertType,
5165         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
5166         ImplicitNumericConversion, ImplicitConversionExists,
5167         ImplicitUserConversionExists, StandardConversionExists,
5168         FindMostEncompassedType, FindMostSpecificSource,
5169         FindMostSpecificTarget, ImplicitUserConversion,
5170         ExplicitUserConversion, GetConversionOperators,
5171         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
5172         TryImplicitIntConversion, Error_CannotConvertImplicit,
5173         ConvertImplicitRequired, ConvertNumericExplicit,
5174         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
5175         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
5176         its own file.
5177
5178         Perform the following renames:
5179
5180         StandardConversionExists -> ImplicitStandardConversionExists
5181         ConvertImplicit -> ImplicitConversion
5182         ConvertImplicitStandard -> ImplicitStandardConversion
5183         TryImplicitIntConversion -> ImplicitIntConversion
5184         ConvertImplicitRequired -> ImplicitConversionRequired
5185         ConvertNumericExplicit -> ExplicitNumericConversion
5186         ConvertReferenceExplicit -> ExplicitReferenceConversion
5187         ConvertExplicit -> ExplicitConversion
5188         ConvertExplicitStandard -> ExplicitStandardConversion
5189
5190 2003-05-19  Martin Baulig  <martin@ximian.com>
5191
5192         * statement.cs (TypeInfo.StructInfo): Made this type protected.
5193         (TypeInfo): Added support for structs having structs as fields.
5194
5195         * ecore.cs (FieldExpr): Implement IVariable.
5196         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
5197         VariableInfo for the field.
5198
5199 2003-05-18  Martin Baulig  <martin@ximian.com>
5200
5201         * expression.cs (This.DoResolve): Report a CS0027 if we're
5202         emitting a field initializer.
5203
5204 2003-05-18  Martin Baulig  <martin@ximian.com>
5205
5206         * expression.cs (This.ResolveBase): New public function.
5207         (This.DoResolve): Check for CS0188.
5208
5209         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
5210         This.Resolve().
5211
5212         * ecore.cs (MethodGroupExpr.DoResolve): Set the
5213         `instance_expression' to null if we don't have any non-static
5214         methods.
5215
5216 2003-05-18  Martin Baulig  <martin@ximian.com>
5217
5218         Reworked the way how local variables and parameters are handled by
5219         the flow analysis code.
5220
5221         * statement.cs (TypeInfo, VariableMap): New public classes.
5222         (VariableInfo): New public class.  This is now responsible for
5223         checking whether a variable has been assigned.  It is used for
5224         parameters and local variables.
5225         (Block.EmitMeta): Take the InternalParameters as argument; compute
5226         the layout of the flow vectors here.
5227         (Block.LocalMap, Block.ParameterMap): New public properties.
5228         (FlowBranching): The .ctor doesn't get the InternalParameters
5229         anymore since Block.EmitMeta() now computes the layout of the flow
5230         vector.
5231         (MyStructInfo): This class is now known as `StructInfo' and nested
5232         in `TypeInfo'; we don't access this directly anymore.
5233
5234         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
5235         property and removed IsAssigned(), IsFieldAssigned(),
5236         SetAssigned() and SetFieldAssigned(); we now call them on the
5237         VariableInfo so we don't need to duplicate this code everywhere.
5238
5239         * expression.cs (ParameterReference): Added `Block block' argument
5240         to the .ctor.
5241         (LocalVariableReference, ParameterReference, This): The new
5242         VariableInfo class is now responsible for all the definite
5243         assignment stuff.
5244
5245         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
5246         IsParameterAssigned, SetParameterAssigned): Removed.
5247
5248 2003-05-18  Martin Baulig  <martin@ximian.com>
5249
5250         * typemanager.cs (InitCoreTypes): Try calling
5251         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
5252         the 3-args-version.  Corlib now also needs our `void_type'.
5253         (GetMethod): Added overloaded version which takes an optional
5254         `bool report_errors' to allow lookups of optional methods.
5255
5256 2003-05-12  Martin Baulig  <martin@ximian.com>
5257
5258         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
5259         only used for locals and not for parameters.
5260
5261 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
5262
5263         * support.cs (InternalParameters.ParameterType): Return the
5264         ExternalType of the parameter.
5265
5266         * parameter.cs (Parameter.ExternalType): drop the two arguments,
5267         they were unused.
5268
5269 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
5270
5271         * class.cs (MethodData.Define): Do not set the `newslot' on
5272         interface members, if they are also flagged as "override".
5273
5274         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
5275         better code for ++i and i++.  This only works for static fields
5276         and local variables.
5277
5278         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
5279         want to pull the DeclSpace out of the builder_to_declspace instead
5280         of the TypeBuilder (like in TypeContainer.FindMembers).
5281
5282         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
5283         instead of LookupTypeContainer.  Fixes the crash on .NET for
5284         looking up interface members.
5285
5286         * const.cs: Create our own emit context during the Definition
5287         stage, so that constants are evaluated in the proper context, when
5288         a recursive definition happens.
5289
5290 2003-05-11  Martin Baulig  <martin@ximian.com>
5291
5292         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
5293         new block for a switch section.
5294         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
5295         the adding/lookup in the switch block.  Fixes #39828.
5296
5297 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
5298
5299         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
5300         functionality: I needed to convert the data after I had performed
5301         the add/sub operation into the operands type size.
5302
5303         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
5304         pass the type for the box operation, otherwise the resulting
5305         object would have been of type object.
5306
5307         (BoxedCast): Add constructor to specify the type to box as.
5308
5309 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
5310
5311         * iterators.cs: I was reusing the `count' variable inadvertently,
5312         take steps to not allow this to happen.
5313
5314 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
5315
5316         * attribute.cs (Attribute.Resolve): Params attributes are encoded
5317         by creating an array at the point where the params starts and
5318         putting all those arguments there, then adjusting the size of the
5319         array.
5320
5321 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
5322
5323         * expression.cs (New.AddressOf): Implement interface
5324         IMemoryLocation.  This is used when the `new' operator is used in
5325         the context of an invocation to a method on a value type.
5326
5327         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
5328         example. 
5329
5330         * namespace.cs: Also check the using aliases here.
5331
5332         * driver.cs: Move the test for using validity after the types have
5333         been entered, so we do a single pass that also includes the using
5334         aliases. 
5335
5336         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
5337         in the regular case.   CreateSiblingForFinally is doing extra
5338         error checking.
5339
5340         * attribute.cs (GetAttributeArgumentExpression): Store the result
5341         on an out value, and use the return value to indicate failure
5342         instead of using null (which is a valid return for Constant.GetValue).
5343
5344         * statement.cs: Perform the analysis flow for the increment
5345         portion after the statement, because this will be the real flow of
5346         execution.  Fixes #42385
5347
5348         * codegen.cs (EmitContext.EmitArgument,
5349         EmitContext.EmitStoreArgument): New helper functions when the
5350         RemapToProxy flag is set.
5351
5352         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
5353         function.
5354
5355         Add support for remapping parameters. 
5356
5357         * iterators.cs: Propagate parameter values;  Store parameter
5358         values in the proxy classes.
5359
5360 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
5361
5362         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
5363         need a proxy reference;  I do not know what I was thinking
5364
5365         * cs-parser.jay (constructor_initializer): catch another error,
5366         and display nice message.
5367
5368         (field_declaration): catch void field declaration
5369         to flag a better error. 
5370
5371         * class.cs (MemberBase.CheckBase): Report an error instead of a
5372         warning if a new protected member is declared in a struct. 
5373         (Field.Define): catch the error of readonly/volatile.
5374
5375         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
5376
5377         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
5378         volatile variable is taken
5379
5380 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
5381
5382         * statement.cs (Fixed.Resolve): Report an error if we are not in
5383         an unsafe context.
5384
5385 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
5386
5387         * typemanager.cs: reuse the code that handles type clashes for
5388         delegates and enumerations.
5389
5390         * class.cs (Report28): Always report.
5391
5392         * expression.cs (EncodeAsAttribute): Allow nulls here.
5393
5394 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
5395
5396         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
5397         the functionality for testing whether an expression is valid for
5398         an attribute here.  Also handle the case of arrays of elements
5399         being stored. 
5400
5401         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
5402         encoding a linear array into an array of objects that are suitable
5403         to be passed to an CustomAttributeBuilder.
5404
5405         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
5406
5407         * ecore.cs: (FieldExpr): Handle field remapping here.
5408
5409         * iteratators.cs: Pass the instance variable (if the method is an
5410         instance method) to the constructors, so we can access the field
5411         variables on the class.
5412
5413         TODO: Test this with structs.  I think the THIS variable on
5414         structs might have to be a pointer, and not a refenrece
5415
5416 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
5417
5418         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
5419         local variables to fields in a proxy class.
5420
5421         * iterators.cs (PopulateProxy): Rename our internal fields to
5422         <XXX>.  
5423         Create a <THIS> field if we are an instance method, so we can
5424         reference our parent container variables.
5425         (MapVariable): Called back from the EmitContext code to enter a
5426         new variable to field mapping into the proxy class (we just create
5427         a FieldBuilder).
5428
5429         * expression.cs
5430         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
5431         for using the remapped locals to fields.
5432
5433         I placed the code here, because that gives the same semantics to
5434         local variables, and only changes the Emit code.
5435
5436         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
5437         statements inside iterators.
5438         (VariableInfo): Add a FieldBuilder for the cases when we are
5439         remapping local variables to fields in a proxy class
5440
5441         * ecore.cs (SimpleNameResolve): Avoid testing two times for
5442         current_block != null.
5443
5444         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
5445         not cope with strings, as it has been moved to the
5446         TableSwitchEmit.  Fixed bug in switch generation.
5447
5448         * expression.cs (New.DoResolve): Provide more context for the user
5449         when reporting an error.
5450
5451         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
5452         pointers. 
5453
5454         * expression.cs (MemberAccess.DoResolve): When we get a type back,
5455         check the permissions for it.  Note than in a type-resolution
5456         context the check was already present in DeclSpace.ResolveType,
5457         but was missing from the MemberAccess.
5458
5459         (ArrayCreation.CheckIndices): warn if the user has
5460         more nested levels of expressions, but there are no more
5461         dimensions specified.  Avoids crash on bug 41906.
5462
5463 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
5464
5465         * statement.cs (Block): replace Implicit bool, for a generic
5466         flags.   
5467         New flag: `Unchecked'.  This is used during the EmitMeta phase
5468         (which is out-of-line with the regular Resolve/Emit process for a
5469         statement, as this is done ahead of time, but still gets a chance
5470         to call constant resolve).
5471
5472         (Block.Flags): new enum for adding a new flag.
5473
5474         (Block.EmitMeta): track the state of unchecked.
5475
5476         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
5477         to enable constant resolution to work there as well.
5478
5479 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
5480
5481         * typemanager.cs (ienumerable_type): Also look up
5482         System.Collections.IEnumerable. 
5483
5484 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
5485
5486         TODO: Test more than one conditional per method.
5487
5488         * class.cs (Indexer.Define): Report the location where the user is
5489         referencing the unsupported feature.
5490
5491         (MethodData): Overload the use of `conditionals' to
5492         minimize the creation of needless ArrayLists.   This saves roughly
5493         212kb on my machine.
5494
5495         (Method): Implement the new IIteratorContainer interface.
5496         (Method.SetYields): Implement the method by setting the ModFlags
5497         to contain METHOD_YIELDS.
5498
5499         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
5500         which just got set to null.
5501
5502         * iterators.cs: New file.
5503
5504         (Yield, YieldBreak): New statements.
5505
5506         * statement.cs (Return.Resolve): Flag an error if we are used in
5507         an iterator method.
5508
5509         * codegen.cs (InIterator): New flag set if the code is being
5510         compiled in an iterator method.
5511
5512         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
5513         internal modifier, and we just use it to avoid adding extra
5514         fields, as this is seldom used.  
5515
5516         * cs-parser.jay: Add yield_statement (yield and yield break).
5517
5518         * driver.cs: New flag -v2 to turn on version 2 features. 
5519
5520         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
5521         hashtable when v2 is enabled.
5522
5523 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
5524
5525         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
5526         there is already a namespace defined with this name.
5527
5528         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
5529         people upgraded their corlibs.
5530
5531         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
5532         always use fully qualified types, no need to use the compiler
5533         front end.
5534
5535         (TypeManager.IsNamespace): Use binarysearch.
5536
5537         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
5538         AddDelegate): I did not quite use the new IsValid API properly: I
5539         have to pass the short-name and the fullname.  I was passing only
5540         the basename instead of the fullname sometimes. 
5541
5542         (TypeContainer.DefineType): call NamespaceClash.
5543
5544         * interface.cs (Interface.DefineType): use NamespaceClash before
5545         defining the type.
5546
5547         * delegate.cs (Delegate.DefineType): use NamespaceClash before
5548         defining the type.
5549
5550         * enum.cs: (Enum.DefineType): use NamespaceClash before
5551         defining the type.
5552
5553         * typemanager.cs (: 3-line patch that gives us some tasty 11%
5554         speed increase.  First, use the negative_hits cache when we get a
5555         negative.  Second, add the type with its full original name
5556         instead of the new . and + encoded name (reflection uses + to
5557         separate type from a nested type).  Use LookupTypeReflection
5558         directly which bypasses the type->name hashtable (that we already
5559         know does not contain the type.
5560
5561         * decl.cs (DeclSpace.ResolveTypeExpr): track the
5562         location/container type. 
5563
5564         * driver.cs: When passing utf8, use directly the UTF8Encoding.
5565
5566 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
5567
5568         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
5569
5570         * delegate.cs (NewDelegate.Resolve): Test whether an instance
5571         method is being referenced in the method group from a static
5572         context, and report error 120 if so.
5573
5574         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
5575         Error118. 
5576
5577         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
5578         is created, we create the A namespace).
5579
5580         * cs-parser.jay: A namespace also introduces a DeclarationFound.
5581         Fixes #41591
5582
5583 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
5584
5585         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
5586         invocation to ModuleBuilder.GetType with the same values will
5587         return a new type instance, so we need to cache its return
5588         values. 
5589
5590         * expression.cs (Binary.ResolveOperator): Only allow the compare
5591         operators on enums if they are of the same type.
5592
5593         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
5594         types of ValueType on their own case.  Before we were giving them
5595         the same treatment as objects.
5596
5597         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
5598         fullname.  Short name is used to compare against container name.
5599         Fullname is used to check against defined namespace names.
5600
5601         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
5602         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
5603
5604         (Method.CheckBase): Call parent.
5605         (MemberBase.CheckBase): Check for protected members on sealed
5606         classes.
5607         (PropertyBase.CheckBase): Call parent.
5608         (Field.Define): Call parent.
5609
5610         * report.cs: Negative error codes are now mapped to 8000 - code,
5611         so that the display is render more nicely.
5612
5613         * typemanager.cs: Do not use try/catch, instead report a regular
5614         error. 
5615
5616         (GetPointerType, GetReferenceType): These methods provide
5617         mechanisms to obtain the T* and T& from a T.  We had the code
5618         previously scattered around the code base, and it also used
5619         TypeManager.LookupType that would go through plenty of caches.
5620         This one goes directly to the type source.
5621
5622         In some places we did the Type.GetType followed by
5623         ModuleBuilder.GetType, but not in others, so this unifies the
5624         processing as well.
5625
5626         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
5627         statements now that we have namespace information.
5628
5629         * typemanager.cs (IsNamespace): New method, returns whether the
5630         string presented is a namespace or not.
5631
5632         (ComputeNamespaces): New public entry point, computes the list of
5633         available namespaces, using the GetNamespaces API call in Mono, or
5634         the slower version in MS.NET.   
5635
5636         Now before we start the semantic analysis phase, we have a
5637         complete list of namespaces including everything that the user has
5638         provided.
5639
5640         Deleted old code to cache namespaces in .nsc files.
5641
5642 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
5643
5644         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
5645         class/struct location definition Location for the implicit
5646         constructor location.
5647
5648         (Operator.Define): Use the location of the operator for the
5649         implicit Method definition.
5650
5651         (Constructor.Emit): use the constructor location for the implicit
5652         base initializer constructor.
5653
5654         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
5655         and the Expression class now contains two new methods:
5656
5657         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
5658         isolate type lookup from the rest of the resolution process.
5659
5660         Since we use Expressions to hold type definitions due to the way
5661         we parse the input we have historically overloaded Resolve to
5662         perform the Type lookups if a special flag is passed.  Now this is
5663         eliminated and two methods take their place. 
5664
5665         The differences in the two methods between xStep and xTerminal is
5666         that xStep is involved in our current lookup system that uses
5667         SimpleNames to compose a name, while xTerminal is used just to
5668         catch the case where the simplename lookup failed.
5669
5670 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
5671
5672         * expression.cs (ResolveMemberAccess): Remove redundant code.
5673         TypeExpr expressions are always born fully resolved.
5674
5675         * interface.cs (PopulateMethod): Do not lookup the types twice.
5676         We were doing it once during SemanticAnalysis and once during
5677         PopulateMethod.
5678
5679         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
5680         in local variable type definitions, were being returned as a
5681         SimpleName (we decomposed everything into a string), that is
5682         because primary_expression was being used instead of a type in the
5683         grammar (reduce/reduce conflicts).
5684
5685         The part that was wrong is that we converted the expression into a
5686         string (an oversimplification in one hand, compounded with primary
5687         expressions doing string concatenation).
5688
5689         So things like:
5690
5691         A.B.C [] x;
5692
5693         Would return "A.B.C[]" as a SimpleName.  This stopped things like
5694         using clauses from working on this particular context.  And a type
5695         was being matched directly against "A.B.C[]".
5696
5697         We now use the correct approach, and allow for ComposedCast to be
5698         part of the unary expression.  So the "A.B.C []" become a composed
5699         cast of "A.B.C" (as a nested group of MemberAccess with a
5700         SimpleName at the end) plus the rank composition "[]". 
5701
5702         Also fixes 35567
5703
5704 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
5705
5706         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
5707         for the access level checking.
5708
5709         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
5710         `TypeContainer container', because I kept getting confused when I
5711         was debugging this code.
5712
5713         * expression.cs (Indexers): Instead of tracking getters/setters,
5714         we now track them in parallel.  We create one arraylist less, but
5715         most importantly it is possible now for the LValue code to find a
5716         matching get for a set.
5717
5718         (IndexerAccess.DoResolveLValue): Update the code.
5719         GetIndexersForType has been modified already to extract all the
5720         indexers from a type.  The code assumed it did not.
5721
5722         Also make the code set the correct return type for the indexer.
5723         This was fixed a long time ago for properties, but was missing for
5724         indexers.  It used to be void_type.
5725
5726         (Binary.Emit): Test first for doubles instead of
5727         floats, as they are more common.
5728
5729         (Binary.EmitBranchable): Use the .un version of the branch opcodes
5730         when dealing with floats and the <=, >= operators.  This fixes bug
5731         #39314 
5732
5733         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
5734         to load the array value by emitting a load on the foreach variable
5735         type.  This was incorrect.  
5736
5737         We now emit the code to load an element using the the array
5738         variable type, and then we emit the conversion operator.
5739
5740         Fixed #40176
5741
5742 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
5743
5744         * attribute.cs: Avoid allocation of ArrayLists in the common case.
5745
5746 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
5747
5748         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
5749         test for protection before we test for signatures. 
5750
5751         (MethodSignature.ToString): implement.
5752
5753         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
5754         to the case where we reduced into a LongConstant.
5755
5756         * decl.cs (CheckAccessLevel): If the type is an array, we can not
5757         depend on whether the information is acurrate, because the
5758         Microsoft runtime will always claim that the array type is public,
5759         regardless of the real state.
5760
5761         If the type is a pointer, another problem happens: the type is
5762         reported as non-public in Microsoft.  
5763
5764         In both cases we have to call CheckAccessLevel recursively with
5765         the underlying type as the argument to be tested.
5766
5767 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
5768
5769         * assign.cs (Assign.Emit): If we are dealing with a compound
5770         assignment expression, we should use the code path that stores the
5771         intermediate result in a temporary value.  This fixes #40903.
5772
5773         *expression.cs (Indirection.ToString): Provide ToString method for
5774         debugging. 
5775
5776 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
5777
5778         * class.cs: Null out fields holding references to Block objects so
5779         they can be garbage collected.
5780
5781         * expression.cs (OverloadResolve): Remove unused local.
5782
5783 2003-04-07  Martin Baulig  <martin@ximian.com>
5784
5785         * codegen.cs (EmitContext.CurrentFile): New public field.
5786         (EmitContext.Mark): Use the CurrentFile to check whether the
5787         location is in the correct file.
5788         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
5789
5790 2003-04-07  Martin Baulig  <martin@ximian.com>
5791
5792         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
5793
5794         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
5795         location.  [FIXME: The location argument which gets passed to this
5796         method is sometimes wrong!]
5797
5798 2003-04-07  Nick Drochak <ndrochak@gol.com>
5799
5800         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
5801
5802 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
5803
5804         * expression.cs (Indirection.EmitAssign): We were using the
5805         temporary, but returning immediately instead of continuing the
5806         EmitAssing flow.
5807
5808 2003-04-06  Martin Baulig  <martin@ximian.com>
5809
5810         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
5811         if it's a nested child, but also deriving from the outer class.
5812         See test 190.cs.
5813
5814         * typemanager.cs (IsNestedChildOf): Make this work if it's a
5815         nested child, but also deriving from the outer class.  See
5816         test-190.cs.
5817         (FilterWithClosure): We may access private members of the outer
5818         class if we're a nested child and deriving from the outer class.
5819         (RealMemberLookup): Only set `closure_private_ok' if the
5820         `original_bf' contained BindingFlags.NonPublic.
5821
5822 2003-04-05  Martin Baulig  <martin@ximian.com>
5823
5824         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
5825
5826 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
5827
5828         * class.cs (Event.Define): Do not allow abstract events to have
5829         initializers. 
5830
5831 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
5832
5833         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
5834         block in event declarations.
5835
5836         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
5837         value type, get its address.
5838
5839         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
5840         leaving a class on the stack instead of a boolean value (int
5841         0/1).  Change the code so we compare against null, and then the
5842         result against zero.
5843
5844         * class.cs (TypeContainer.GetClassBases): We were checking for the
5845         parent class being sealed too late.
5846
5847         * expression.cs (Binary.Emit): For <= and >= when dealing with
5848         floating point values, use cgt.un and clt.un instead of cgt and
5849         clt alone.
5850
5851 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
5852
5853         * statement.cs: Apply the same optimization as MS: skip the 
5854         GetEnumerator returning an IEnumerator, and use the one returning a 
5855         CharEnumerator instead. This allows us to avoid the try-finally block 
5856         and the boxing.
5857
5858 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
5859
5860         * cs-parser.jay: Attributes cannot be applied to
5861                          namespaces. Fixes #40473
5862
5863 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5864
5865         * class.cs:
5866         (Add*): check if the name is valid using the full name for constants,
5867         fields, properties and events.
5868
5869 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
5870
5871         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
5872         char constants to be part of the enumeration.
5873
5874         * expression.cs (Conditional.DoResolve): Add support for operator
5875         true. Implements the missing functionality from 14.12
5876
5877         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
5878         operator true/false as required by the spec.
5879
5880         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
5881         implicit conversion to boolean.
5882
5883         * statement.cs (Statement.ResolveBoolean): A boolean expression is
5884         also one where the type implements `operator true'. 
5885
5886         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
5887         get an expression that will invoke operator true based on an
5888         expression.  
5889
5890         (GetConversionOperators): Removed the hack that called op_True
5891         here.  
5892
5893         (Expression.ResolveBoolean): Move this from Statement.
5894
5895 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
5896
5897         * ecore.cs (FieldExpr): do not allow initialization of initonly
5898         fields on derived classes
5899
5900 2003-03-13  Martin Baulig  <martin@ximian.com>
5901
5902         * statement.cs (Block.Emit): Call ig.BeginScope() and
5903         ig.EndScope() when compiling with debugging info; call
5904         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
5905
5906 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
5907
5908         * expression.cs (Indexers): Do not construct immediately, allow
5909         for new members to be appended as we go.  Fixes 38143
5910
5911 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5912
5913         * expression.cs: save/restore context when resolving an unchecked
5914         expression.
5915
5916 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
5917
5918         * cfold.cs: Catch division by zero in modulus operator during
5919         constant folding.
5920
5921 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
5922
5923         * interface.cs (Interface.DefineMembers): Avoid defining members
5924         twice. 
5925
5926 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
5927
5928         * driver.cs: handle the +/- options for -noconfig
5929
5930         * statement.cs (Unckeched.Resolve): Also track the state of
5931         unchecked in the Resolve phase.
5932
5933 2003-02-27  Martin Baulig  <martin@ximian.com>
5934
5935         * ecore.cs (Expression.MemberLookup): Don't create a
5936         MethodGroupExpr for something which is not a method.  Fixes #38291.
5937
5938 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
5939
5940         * class.cs (MemberBase.CheckParameters): Also check that the type
5941         is unmanaged if it is a pointer.
5942
5943         * expression.cs (SizeOf.Resolve): Add location information.
5944
5945         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
5946         a managed type is declared.
5947
5948         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
5949         parameter modifiers as well.  Fixes bug 38606
5950
5951         * class.cs: Very sad.  Am backing out the speed up changes
5952         introduced by the ArrayList -> Array in the TypeContainer, as they
5953         were not actually that much faster, and introduced a bug (no error
5954         reports on duplicated methods).
5955
5956         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
5957         source first, this will guarantee that we have a valid expression
5958         before calling in lower levels functions that will require a
5959         resolved object.  Then use this original_source in the
5960         target.ResolveLValue instead of the original source that was
5961         passed to us.
5962
5963         Another change.  Use target.Resolve instead of LValueResolve.
5964         Although we are resolving for LValues, we will let the Assign code
5965         take care of that (it will be called again from Resolve).  This
5966         basically allows code like this:
5967
5968         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
5969         class Y { void A (X x) { x [0] += o; }
5970
5971         The problem was that the indexer was trying to resolve for
5972         set_Item (idx, object o) and never finding one.  The real set_Item
5973         was set_Item (idx, X).  By delaying the process we get the right
5974         semantics. 
5975
5976         Fixes bug 36505
5977
5978 2003-02-23  Martin Baulig  <martin@ximian.com>
5979
5980         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
5981         while calling DoEmit ().
5982
5983         * codegen.cs (EmitContext.Mark): Don't mark locations in other
5984         source files; if you use the #line directive inside a method, the
5985         compiler stops emitting line numbers for the debugger until it
5986         reaches the end of the method or another #line directive which
5987         restores the original file.
5988
5989 2003-02-23  Martin Baulig  <martin@ximian.com>
5990
5991         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
5992
5993 2003-02-23  Martin Baulig  <martin@ximian.com>
5994
5995         * statement.cs (Block.AddChildVariableNames): We need to call this
5996         recursively, not just for our immediate children.
5997
5998 2003-02-23  Martin Baulig  <martin@ximian.com>
5999
6000         * class.cs (Event.Define): Always make the field private, like csc does.
6001
6002         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6003         actually work, fixes bug #37521.
6004
6005 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6006
6007         * delegate.cs: When creating the various temporary "Parameters"
6008         classes, make sure that we call the ComputeAndDefineParameterTypes
6009         on those new parameters (just like we do with the formal ones), to
6010         allow them to be resolved in the context of the DeclSpace.
6011
6012         This fixes the bug that Dick observed in Bugzilla #38530.
6013
6014 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6015
6016         * expression.cs (ResolveMemberAccess): When resolving a constant,
6017         do not attempt to pull a constant if the value was not able to
6018         generate a valid constant.
6019
6020         * const.cs (LookupConstantValue): Do not report more errors than required.
6021
6022 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6023
6024         * expression.cs: fixes bug #38328.
6025
6026 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6027
6028         * class.cs: Changed all the various members that can be part of a
6029         class from being an ArrayList to be an Array of the right type.
6030         During the DefineType type_list, interface_list, delegate_list and
6031         enum_list are turned into types, interfaces, delegates and enums
6032         arrays.  
6033
6034         And during the member population, indexer_list, event_list,
6035         constant_list, field_list, instance_constructor_list, method_list,
6036         operator_list and property_list are turned into their real arrays.
6037
6038         Although we could probably perform this operation earlier, for
6039         good error reporting we need to keep the lists and remove the
6040         lists for longer than required.
6041
6042         This optimization was triggered by Paolo profiling the compiler
6043         speed on the output of `gen-sample-program.pl' perl script. 
6044
6045         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6046         not crash in methods like MemberLookupFailed that use this field.  
6047
6048         This problem arises when the compiler fails to resolve a type
6049         during interface type definition for example.
6050
6051 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6052
6053         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
6054         inherit from System.Object, so we have to stop at null, not only
6055         when reaching System.Object.
6056
6057 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
6058
6059         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
6060         DeclaredOnly because the parent indexer might have had a different
6061         name, but did not loop until the top of the hierarchy was reached.
6062
6063         The problem this one fixes is 35492: when a class implemented an
6064         indexer from an interface, we were getting the interface method
6065         (which was abstract) and we were flagging an error (can not invoke
6066         abstract method).
6067
6068         This also keeps bug 33089 functioning, and test-148 functioning.
6069
6070         * typemanager.cs (IsSpecialMethod): The correct way of figuring
6071         out if a method is special is to see if it is declared in a
6072         property or event, or whether it is one of the predefined operator
6073         names.   This should fix correctly #36804.
6074
6075 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
6076
6077         The goal here is to remove the dependency on EmptyCast.Peel ().
6078         Killing it completely.
6079
6080         The problem is that currently in a number of places where
6081         constants are expected, we have to "probe" for an EmptyCast, and
6082         Peel, which is not the correct thing to do, as this will be
6083         repetitive and will likely lead to errors. 
6084
6085         The idea is to remove any EmptyCasts that are used in casts that
6086         can be reduced to constants, so we only have to cope with
6087         constants. 
6088
6089         This bug hunt was triggered by Bug 37363 and the desire to remove
6090         the duplicate pattern where we were "peeling" emptycasts to check
6091         whether they were constants.  Now constants will always be
6092         constants.
6093
6094         * ecore.cs: Use an enumconstant here instead of wrapping with
6095         EmptyCast.  
6096
6097         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
6098         throwing me off.  By handling this we can get rid of a few hacks.
6099
6100         * statement.cs (Switch): Removed Peel() code.
6101
6102 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
6103
6104         * class.cs: Location information for error 508
6105
6106         * expression.cs (New.DoResolve): Add a guard against double
6107         resolution of an expression.  
6108
6109         The New DoResolve might be called twice when initializing field
6110         expressions (see EmitFieldInitializers, the call to
6111         GetInitializerExpression will perform a resolve on the expression,
6112         and later the assign will trigger another resolution
6113
6114         This leads to bugs (#37014)
6115
6116         * delegate.cs: The signature for EndInvoke should contain any ref
6117         or out parameters as well.  We were not doing this in the past. 
6118
6119         * class.cs (Field.Define): Do not overwrite the type definition
6120         inside the `volatile' group.  Turns out that volatile enumerations
6121         were changing the type here to perform a validity test, which
6122         broke conversions. 
6123
6124 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
6125
6126         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
6127         and structs, we do not want to load the instance variable
6128
6129         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
6130         enum_type has to be handled like an object reference (implicit
6131         conversions exists from this to object), but the regular IsClass
6132         and IsValueType tests will never return true for this one.
6133
6134         Also we use TypeManager.IsValueType instead of type.IsValueType,
6135         just for consistency with the rest of the code (this is only
6136         needed if we ever use the construct exposed by test-180.cs inside
6137         corlib, which we dont today).
6138
6139 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
6140
6141         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
6142         just InternalCall.
6143
6144 2003-02-09  Martin Baulig  <martin@ximian.com>
6145
6146         * namespace.cs (Namespace..ctor): Added SourceFile argument.
6147         (Namespace.DefineNamespaces): New static public method; this is
6148         called when we're compiling with debugging to add all namespaces
6149         to the symbol file.
6150
6151         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
6152         pass it to the Namespace's .ctor.
6153
6154         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
6155         and MethodBase arguments; pass the namespace ID to the symwriter;
6156         pass the MethodBase instead of the token to the symwriter.
6157         (SymbolWriter.DefineNamespace): New method to add a namespace to
6158         the symbol file.
6159
6160 2003-02-09  Martin Baulig  <martin@ximian.com>
6161
6162         * symbolwriter.cs: New file.  This is a wrapper around
6163         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
6164         methods here in near future.
6165
6166 2003-02-09  Martin Baulig  <martin@ximian.com>
6167
6168         * codegen.cs (EmitContext.Mark): Just pass the arguments to
6169         ILGenerator.MarkSequencePoint() which are actually used by the
6170         symbol writer.
6171
6172 2003-02-09  Martin Baulig  <martin@ximian.com>
6173
6174         * location.cs (SourceFile): New public sealed class.  This
6175         contains the name and an index which is used in the location's token.
6176         (Location): Reserve an appropriate number of bits in the token for
6177         the source file instead of walking over that list, this gives us a
6178         really huge performance improvement when compiling with debugging.
6179
6180         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
6181         `SourceFile' argument instead of a string.
6182         (Driver.ProcessFile): Add all the files via Location.AddFile(),
6183         but don't parse/tokenize here, we need to generate the list of all
6184         source files before we do that.
6185         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
6186         the files.
6187
6188         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
6189         instead of a string.
6190
6191         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
6192         of a string.
6193
6194 2003-02-09  Martin Baulig  <martin@ximian.com>
6195
6196         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
6197         filename on `#line default'.
6198
6199 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
6200
6201         * statement.cs: don't clear the pinned var when the fixed statement
6202         returns from the method (fixes bug#37752).
6203
6204 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
6205
6206         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
6207         to IsValueType.
6208
6209 2003-02-07  Martin Baulig  <martin@ximian.com>
6210
6211         * driver.cs: Removed the `--debug-args' command line argument.
6212
6213         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
6214         automatically by the AsssemblyBuilder.
6215         (CodeGen.InitializeSymbolWriter): We don't need to call any
6216         initialization function on the symbol writer anymore.  This method
6217         doesn't take any arguments.
6218
6219 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
6220
6221         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
6222         from referenced assemblies as well.
6223
6224 2003-02-02  Martin Baulig  <martin@ximian.com>
6225
6226         * class.cs (MethodData.Emit): Generate debugging info for external methods.
6227
6228 2003-02-02  Martin Baulig  <martin@ximian.com>
6229
6230         * class.cs (Constructor.Emit): Open the symbol writer before
6231         emitting the constructor initializer.
6232         (ConstructorInitializer.Emit): Call ec.Mark() to allow
6233         single-stepping through constructor initializers.
6234
6235 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
6236
6237         * class.cs: Handle error 549: do not allow virtual methods in
6238         sealed classes. 
6239
6240 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
6241
6242         * decl.cs: Check access levels when resolving types
6243
6244 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
6245
6246         * statement.cs: Add parameters and locals set in catch blocks that might 
6247         return to set vector
6248
6249 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
6250
6251         * class.cs (Operator): Set the SpecialName flags for operators.
6252
6253         * expression.cs (Invocation.DoResolve): Only block calls to
6254         accessors and operators on SpecialName methods.
6255
6256         (Cast.TryReduce): Handle conversions from char constants.
6257
6258
6259 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
6260
6261         * statement.cs: small memory and time optimization in FlowBranching.
6262
6263 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
6264
6265         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
6266         problem that the last fix but in the other sid (Set).
6267
6268         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
6269         access when there is no indexer in the hierarchy.
6270
6271 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
6272
6273         * class.cs: Combine some if statements.
6274
6275 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6276
6277         * driver.cs: fixed bug #37187.
6278
6279 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
6280
6281         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
6282         any indexer, it's needed to build a list with all the indexers in the
6283         hierarchy (AllGetters), else we have problems. Fixes #35653.
6284
6285 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
6286
6287         * class.cs (MethodData.Define): It is wrong for an interface
6288         implementation to be static in both cases: explicit and implicit.
6289         We were only handling this in one case.
6290
6291         Improve the if situation there to not have negations.
6292
6293         * class.cs (Field.Define): Turns out that we do not need to check
6294         the unsafe bit on field definition, only on usage.  Remove the test.
6295
6296 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6297
6298         * driver.cs: use assembly.Location instead of Codebase (the latest
6299         patch made mcs fail when using MS assemblies).
6300
6301 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
6302
6303         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
6304         get the path to *corlib.dll.
6305
6306 2003-01-21  Nick Drochak <ndrochak@gol.com>
6307
6308         * cs-tokenizer.cs:
6309         * pending.cs:
6310         * typemanager.cs: Remove compiler warnings
6311
6312 2003-01-20  Duncan Mak  <duncan@ximian.com>
6313
6314         * AssemblyInfo.cs: Bump the version number to 0.19.
6315
6316 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6317
6318         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
6319
6320 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
6321
6322         * class.cs (Constructor::Emit): Emit debugging info for constructors.
6323
6324 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
6325
6326         * cs-parser.jay: Small fix: we were not comparing the constructor
6327         name correctly.   Thanks to Zoltan for the initial pointer.
6328
6329 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
6330
6331         * cs-tokenizer.cs: Set file name when specified with #line
6332
6333 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
6334
6335         * cs-parser.jay: Only perform the constructor checks here if we
6336         are named like the class;  This will help provider a better
6337         error.  The constructor path is taken when a type definition is
6338         not found, but most likely the user forgot to add the type, so
6339         report that rather than the constructor error.
6340
6341 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
6342
6343         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
6344         allocations.
6345
6346 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6347
6348         * cs-parser.jay: Add cleanup call.
6349
6350 2003-01-13  Duncan Mak  <duncan@ximian.com>
6351
6352         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
6353         consistent with other methods.
6354
6355 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6356
6357         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
6358
6359 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
6360
6361         * attribute.cs: only set GuidAttr to true when we have a
6362         GuidAttribute.
6363
6364 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6365
6366         * ecore.cs:
6367         * expression.cs:
6368         * typemanager.cs: fixes to allow mcs compile corlib with the new
6369         Type.IsSubclassOf fix.
6370
6371 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
6372
6373         * expression.cs (LocalVariableReference.DoResolve): Classify a
6374         constant as a value, not as a variable.   Also, set the type for
6375         the variable.
6376
6377         * cs-parser.jay (fixed_statement): take a type instead of a
6378         pointer_type, so we can produce a better error message later.
6379
6380         * statement.cs (Fixed.Resolve): Flag types that are not pointers
6381         as an error.  
6382
6383         (For.DoEmit): Make inifinite loops have a
6384         non-conditional branch back.
6385
6386         (Fixed.DoEmit): First populate the pinned variables, then emit the
6387         statement, then clear the variables.  Before I was emitting the
6388         code once for each fixed piece.
6389
6390
6391 2003-01-08  Martin Baulig  <martin@ximian.com>
6392
6393         * statement.cs (FlowBranching.MergeChild): A break in a
6394         SWITCH_SECTION does not leave a loop.  Fixes #36155.
6395
6396 2003-01-08  Martin Baulig  <martin@ximian.com>
6397
6398         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
6399         lives in the same number space than `param_map'.  Fixes #36154.
6400
6401 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
6402
6403         * cs-parser.jay (constructor_declaration): Set the
6404         Constructor.ModFlags before probing for it.  This makes the
6405         compiler report 514, 515 and 132 (the code was there, but got
6406         broken). 
6407
6408         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
6409         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
6410         (GotoCase.Resolve): Set `Returns' to ALWAYS.
6411
6412 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
6413
6414         * enum.cs: create the enum static fields using the enum type.
6415
6416 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
6417
6418         * class.cs: don't try to create the ParamBuilder for the return
6419         type if it's not needed (and handle it breaking for the ms runtime
6420         anyway).
6421
6422 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
6423
6424         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
6425
6426 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
6427
6428         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
6429         the command.   This showed up while compiling the JANET source
6430         code, which used \r as its only newline separator.
6431
6432 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
6433
6434         * class.cs (Method.Define): If we are an operator (because it
6435         reuses our code), then set the SpecialName and HideBySig.  #36128
6436
6437 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
6438
6439         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
6440         exception, report error 120 `object reference required'.
6441
6442         * driver.cs: Add --pause option, used during to measure the size
6443         of the process as it goes with --timestamp.
6444
6445         * expression.cs (Invocation.DoResolve): Do not allow methods with
6446         SpecialName to be invoked.
6447
6448 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
6449
6450         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
6451         number before adding it.
6452
6453 2002-12-21  Ravi Pratap  <ravi@ximian.com>
6454
6455         * ecore.cs (StandardImplicitConversion): When in an unsafe
6456         context, we allow conversion between void * to any other pointer
6457         type. This fixes bug #35973.
6458
6459 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
6460
6461         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
6462         is not thrown when extensionless outputs are used 
6463
6464 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6465
6466         * rootcontext.cs: fixed compilation of corlib.
6467
6468 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
6469
6470         * attribute.cs (Attributes.Contains): Add new method.
6471
6472         * class.cs (MethodCore.LabelParameters): if the parameter is an
6473         `out' parameter, check that no attribute `[In]' has been passed.
6474
6475         * enum.cs: Handle the `value__' name in an enumeration.
6476
6477 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
6478
6479         * decl.cs: Added special case to allow overrides on "protected
6480         internal" methods
6481
6482 2002-12-18  Ravi Pratap  <ravi@ximian.com>
6483
6484         * attribute.cs (Attributes.AddAttributeSection): Rename to this
6485         since it makes much more sense.
6486
6487         (Attributes.ctor): Don't require a Location parameter.
6488
6489         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
6490
6491         * attribute.cs (ApplyAttributes): Remove extra Location parameters
6492         since we already have that information per attribute.
6493
6494         * everywhere : make appropriate changes.
6495
6496         * class.cs (LabelParameters): Write the code which actually
6497         applies attributes to the return type. We can't do this on the MS
6498         .NET runtime so we flag a warning in the case an exception is
6499         thrown.
6500
6501 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
6502
6503         * const.cs: Handle implicit null conversions here too.
6504
6505 2002-12-17  Ravi Pratap  <ravi@ximian.com>
6506
6507         * class.cs (MethodCore.LabelParameters): Remove the extra
6508         Type [] parameter since it is completely unnecessary. Instead
6509         pass in the method's attributes so that we can extract
6510         the "return" attribute.
6511
6512 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
6513
6514         * cs-parser.jay (parse): Use Report.Error to flag errors instead
6515         of ignoring it and letting the compile continue.
6516
6517         * typemanager.cs (ChangeType): use an extra argument to return an
6518         error condition instead of throwing an exception.
6519
6520 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
6521
6522         * expression.cs (Unary.TryReduce): mimic the code for the regular
6523         code path.  Perform an implicit cast in the cases where we can
6524         implicitly convert to one of the integral types, and then reduce
6525         based on that constant.   This fixes bug #35483.
6526
6527 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6528
6529         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
6530
6531 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6532
6533         * namespace.cs: fixed bug #35489.
6534
6535 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
6536
6537         * class.cs: Remove some dead code.
6538
6539         * cs-parser.jay: Estimate the number of methods needed
6540         (RootContext.MethodCount);
6541
6542         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
6543         numbers instead of StringBuilders.
6544
6545         * support.cs (PtrHashtable): Add constructor with initial size;
6546         We can now reduce reallocations of the method table.
6547
6548 2002-12-10  Ravi Pratap  <ravi@ximian.com>
6549
6550         * attribute.cs (ApplyAttributes): Keep track of the emitted
6551         attributes on a per-target basis. This fixes bug #35413.
6552
6553 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
6554
6555         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
6556         default to the Windows 1252 encoding.
6557
6558         (UnixParseOption): Support version, thanks to Alp for the missing
6559         pointer. 
6560
6561         * AssemblyInfo.cs: Add nice assembly information.
6562
6563         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
6564         (bug 35169).
6565
6566         * cs-parser.jay: Allow a trailing comma before the close bracked
6567         in the attribute_section production.
6568
6569         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
6570         address of the instance was being taken, I will take this out,
6571         because we take the address of the object immediately here.
6572
6573 2002-12-09  Ravi Pratap  <ravi@ximian.com>
6574
6575         * typemanager.cs (AreMultipleAllowed): Take care of the most
6576         obvious case where attribute type is not in the current assembly -
6577         stupid me ;-)
6578
6579 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
6580
6581         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
6582         definitions, instead of doing that afterwards.  
6583
6584         Also we use a nice little hack, depending on the constructor, we
6585         know if we are a "composed" name or a simple name.  Hence, we
6586         avoid the IndexOf test, and we avoid 
6587
6588         * codegen.cs: Add code to assist in a bug reporter to track down
6589         the source of a compiler crash. 
6590
6591 2002-12-07  Ravi Pratap  <ravi@ximian.com>
6592
6593         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
6594         types have been emitted for a given element and flag an error
6595         if something which does not have AllowMultiple set is used more
6596         than once.
6597
6598         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
6599         attribute types and their corresponding AllowMultiple properties
6600
6601         (AreMultipleAllowed): Check the property for a given type.
6602
6603         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
6604         property in the case we have a TypeContainer.
6605
6606         (Attributes.AddAttribute): Detect duplicates and just skip on
6607         adding them. This trivial fix catches a pretty gross error in our
6608         attribute emission - global attributes were being emitted twice!
6609
6610         Bugzilla bug #33187 is now fixed.
6611
6612 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
6613
6614         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
6615         instead of pp_and).
6616
6617         * expression.cs (Binary.ResolveOperator): I can only use the
6618         Concat (string, string, string) and Concat (string, string,
6619         string, string) if the child is actually a concatenation of
6620         strings. 
6621
6622 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
6623
6624         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
6625         context where we need a 2-character lookahead.
6626
6627         * pending.cs (PendingImplementation): Rework so we can keep track
6628         of interface types all the time, and flag those which were
6629         implemented by parents as optional.
6630
6631 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
6632
6633         * expression.cs (Binary.ResolveOperator): Use
6634         String.Concat(string,string,string) or
6635         String.Concat(string,string,string,string) when possible. 
6636
6637         * typemanager: More helper methods.
6638
6639
6640 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
6641
6642         * pending.cs: remove the bogus return from GetMissingInterfaces()
6643         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
6644
6645 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6646
6647         * namespace.cs: avoid duplicated 'using xxx' being added to
6648         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
6649         when we get more than one 'using' statement for the same namespace.
6650         Report a CS0105 warning for it.
6651
6652 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
6653
6654         * cs-tokenizer.cs (consume_identifier): use read directly, instead
6655         of calling getChar/putback, uses internal knowledge of it.    
6656
6657         (xtoken): Reorder tokenizer so most common patterns are checked
6658         first.  This reduces the compilation time in another 5% (from 8.11s
6659         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
6660
6661         The parsing time is 22% of the compilation in mcs, and from that
6662         64% is spent on the tokenization process.  
6663
6664         I tried using a binary search for keywords, but this is slower
6665         than the hashtable.  Another option would be to do a couple of
6666         things:
6667
6668                 * Not use a StringBuilder, instead use an array of chars,
6669                   with a set value.  Notice that this way we could catch
6670                   the 645 error without having to do it *afterwards*.
6671
6672                 * We could write a hand-parser to avoid the hashtable
6673                   compares altogether.
6674
6675         The identifier consumption process takes 37% of the tokenization
6676         time.  Another 15% is spent on is_number.  56% of the time spent
6677         on is_number is spent on Int64.Parse:
6678
6679                 * We could probably choose based on the string length to
6680                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
6681                   computations. 
6682
6683         Another 3% is spend on wrapping `xtoken' in the `token' function.
6684
6685         Handle 0xa0 as whitespace (#34752)
6686
6687 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
6688
6689         * typemanager.cs (IsCLRType): New routine to tell whether a type
6690         is one of the builtin types.  
6691
6692         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
6693         typecode in more places instead of doing pointer comparissions.
6694         We could leverage some knowledge about the way the typecodes are
6695         laid out.
6696
6697         New code to cache namespaces in assemblies, it is currently not
6698         invoked, to be used soon.
6699
6700         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
6701
6702         * expression.cs (Binary.ResolveOperator): specially handle
6703         strings, and do not perform user-defined operator overloading for
6704         built-in types.
6705
6706 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
6707
6708         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
6709         internalcall as it is a pretty simple operation;  Avoid whenever
6710         possible to call Char.IsLetter.
6711
6712         (consume_identifier): Cut by half the number of
6713         hashtable calls by merging the is_keyword and GetKeyword behavior.
6714
6715         Do not short-circuit, because if we do, we
6716         report errors (ie, #if false && true would produce an invalid
6717         directive error);
6718
6719
6720 2002-11-24  Martin Baulig  <martin@ximian.com>
6721
6722         * expression.cs (Cast.TryReduce): If we're in checked syntax,
6723         check constant ranges and report a CS0221.  Fixes #33186.
6724
6725 2002-11-24  Martin Baulig  <martin@ximian.com>
6726
6727         * cs-parser.jay: Make this work for uninitialized variable
6728         declarations in the `for' initializer.  Fixes #32416.
6729
6730 2002-11-24  Martin Baulig  <martin@ximian.com>
6731
6732         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
6733         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
6734
6735 2002-11-24  Martin Baulig  <martin@ximian.com>
6736
6737         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
6738         argument; if true, we also check for user-defined conversions.
6739         This is only needed if both arguments are of a user-defined type.
6740         Fixes #30443, added test-175.cs.
6741         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
6742
6743         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
6744
6745 2002-11-24  Martin Baulig  <martin@ximian.com>
6746
6747         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
6748         function to get the store opcode.
6749         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
6750         only emit the Ldelema if the store opcode is Stobj.  You must run
6751         both test-34 and test-167 to test this.  Fixes #34529.
6752
6753 2002-11-23  Martin Baulig  <martin@ximian.com>
6754
6755         * ecore.cs (Expression.MemberLookup): Added additional
6756         `qualifier_type' argument which is used when we're being called
6757         from MemberAccess.DoResolve() and null if we're called from a
6758         SimpleName lookup.
6759         (Expression.MemberLookupFailed): New method to report errors; this
6760         does the CS1540 check and reports the correct error message.
6761
6762         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
6763         argument for the CS1540 check and redone the way how we're dealing
6764         with private members.  See the comment in the source code for details.
6765         (FilterWithClosure): Reverted this back to revision 1.197; renamed
6766         `closure_start_type' to `closure_qualifier_type' and check whether
6767         it's not null.  It was not this filter being broken, it was just
6768         being called with the wrong arguments.
6769
6770         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
6771         and pass it the correct `qualifier_type'; this also does the error
6772         handling for us.
6773
6774 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
6775
6776         * expression.cs (Invocation.EmitParams): If the we are dealing
6777         with a non-built-in value type, load its address as well.
6778
6779         (ArrayCreation): Use a a pretty constant instead
6780         of the hardcoded value 2.   Use 6 instead of 2 for the number of
6781         static initializers.  
6782
6783         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
6784         because they are not really value types, just glorified integers. 
6785
6786         * driver.cs: Do not append .exe, the CSC compiler does not do it.
6787
6788         * ecore.cs: Remove redundant code for enumerations, make them use
6789         the same code path as everything else, fixes the casting issue
6790         with enumerations in Windows.Forms.
6791
6792         * attribute.cs: Do only cast to string if it is a string, the
6793         validation happens later.
6794
6795         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
6796         people upgrade their corlibs.
6797
6798         * ecore.cs: Oops, enumerations were not following the entire code path
6799
6800 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
6801
6802         * typemanager.cs (FilterWithClosure): Commented out the test for
6803         1540 in typemanager.cs, as it has problems when accessing
6804         protected methods from a parent class (see test-174.cs). 
6805
6806         * attribute.cs (Attribute.ValidateGuid): new method.
6807         (Attribute.Resolve): Use above.
6808
6809 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
6810
6811         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
6812
6813         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
6814         handling for enumerations, as we only needed the TypeContainer
6815         functionality to begin with (this is required for the fix below to
6816         work for enums that reference constants in a container class for
6817         example). 
6818
6819         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
6820
6821         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
6822         a valid TypeBuilder to perform lookups on.o
6823
6824         * class.cs (InheritableMemberSignatureCompare): Use true in the
6825         call to GetGetMethod and GetSetMethod, because we are comparing
6826         the signature, and we need to get the methods *even* if they are
6827         private. 
6828
6829         (PropertyBase.CheckBase): ditto.
6830
6831         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
6832         GotoCase.Resolve): Use Peel on EmpytCasts.
6833
6834         * ecore.cs (EmptyCast): drop child, add Peel method.
6835
6836 2002-11-17  Martin Baulig  <martin@ximian.com>
6837
6838         * ecore.cs (EmptyCast.Child): New public property.
6839
6840         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
6841         label resolved to an EmptyCast.  Fixes #34162.
6842         (GotoCase.Resolve): Likewise.
6843         (Block.EmitMeta): Likewise.
6844
6845 2002-11-17  Martin Baulig  <martin@ximian.com>
6846
6847         * expression.cs (Invocation.BetterConversion): Prefer int over
6848         uint; short over ushort; long over ulong for integer literals.
6849         Use ImplicitConversionExists instead of StandardConversionExists
6850         since we also need to check for user-defined implicit conversions.
6851         Fixes #34165.  Added test-173.cs.
6852
6853 2002-11-16  Martin Baulig  <martin@ximian.com>
6854
6855         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
6856         with the `true' and `false' literals.  Fixes #33151.
6857
6858 2002-11-16  Martin Baulig  <martin@ximian.com>
6859
6860         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
6861         October 22nd; don't do the cs1540 check for static members.
6862
6863         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
6864         now using our own filter here and doing the cs1540 check again.
6865
6866 2002-11-16  Martin Baulig  <martin@ximian.com>
6867
6868         * support.cs (InternalParameters): Don't crash if we don't have
6869         any fixed parameters.  Fixes #33532.
6870
6871 2002-11-16  Martin Baulig  <martin@ximian.com>
6872
6873         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
6874         when looking up static methods to make this work on Windows.
6875         Fixes #33773.
6876
6877 2002-11-16  Martin Baulig  <martin@ximian.com>
6878
6879         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
6880         a setter rather than using PropertyInfo.CanWrite.
6881
6882 2002-11-15  Nick Drochak  <ndrochak@gol.com>
6883
6884         * class.cs: Allow acces to block member by subclasses. Fixes build
6885         breaker.
6886
6887 2002-11-14  Martin Baulig  <martin@ximian.com>
6888
6889         * class.cs (Constructor.Emit): Added the extern/block check.
6890         Fixes bug #33678.
6891
6892 2002-11-14  Martin Baulig  <martin@ximian.com>
6893
6894         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
6895         iteration while looking for indexers, this is needed because the
6896         indexer may have a different name in our base classes.  Fixed the
6897         error reporting (no indexers at all, not get accessor, no
6898         overloaded match).  Fixes bug #33089.
6899         (IndexerAccess.DoResolveLValue): Likewise.
6900
6901 2002-11-14  Martin Baulig  <martin@ximian.com>
6902
6903         * class.cs (PropertyBase.CheckBase): Make this work for multiple
6904         indexers.  Fixes the first part of bug #33089.
6905         (MethodSignature.InheritableMemberSignatureCompare): Added support
6906         for properties.
6907
6908 2002-11-13  Ravi Pratap  <ravi@ximian.com>
6909
6910         * attribute.cs (Attribute.Resolve): Catch the
6911         NullReferenceException and report it since it isn't supposed to
6912         happen. 
6913
6914 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
6915
6916         * expression.cs (Binary.EmitBranchable): Also handle the cases for
6917         LogicalOr and LogicalAnd that can benefit from recursively
6918         handling EmitBranchable.  The code now should be nice for Paolo.
6919
6920 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
6921
6922         * typemanager.cs (LookupType): Added a negative-hit hashtable for
6923         the Type lookups, as we perform quite a number of lookups on
6924         non-Types.  This can be removed once we can deterministically tell
6925         whether we have a type or a namespace in advance.
6926
6927         But this might require special hacks from our corlib.
6928
6929         * TODO: updated.
6930
6931         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
6932         and double which avoids a conversion from an integer to a double.
6933
6934         * expression.cs: tiny optimization, avoid calling IsConstant,
6935         because it effectively performs the lookup twice.
6936
6937 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
6938
6939         But a bogus return here to keep the semantics of the old code
6940         until the Mono runtime is fixed.
6941
6942         * pending.cs (GetMissingInterfaces): New method used to remove all
6943         the interfaces that are already implemented by our parent
6944         classes from the list of pending methods. 
6945
6946         * interface.cs: Add checks for calls after ResolveTypeExpr.
6947
6948 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
6949
6950         * class.cs (Class.Emit): Report warning 67: event not used if the
6951         warning level is beyond 3.
6952
6953         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
6954         being a NullLiteral.
6955
6956         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
6957         specifiers. 
6958
6959         * class.cs (TypeContainer.GetClassBases): Cover a missing code
6960         path that might fail if a type can not be resolved.
6961
6962         * expression.cs (Binary.Emit): Emit unsigned versions of the
6963         operators. 
6964
6965         * driver.cs: use error 5.
6966
6967 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
6968
6969         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
6970
6971 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
6972
6973         * cs-parser.jay (switch_section): A beautiful patch from Martin
6974         Baulig that fixed 33094.
6975
6976 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
6977
6978         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
6979         Check whether the base is abstract and report an error if so.
6980
6981         * expression.cs (IndexerAccess.DoResolveLValue,
6982         IndexerAccess.DoResolve): ditto. 
6983
6984         (Invocation.DoResolve): ditto.
6985
6986         (Invocation.FullMethodDesc): Improve the report string.
6987
6988         * statement.cs (Block): Eliminate IsVariableDefined as it is
6989         basically just a wrapper for GetVariableInfo.
6990
6991         * ecore.cs (SimpleName): Use new 
6992
6993         * support.cs (ReflectionParamter.ParameterType): We unwrap the
6994         type, as we return the actual parameter ref/unref state on a
6995         different call.
6996
6997 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
6998
6999         * support.cs: Return proper flags REF/OUT fixing the previous
7000         commit.  
7001
7002         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7003         not used to mean `ref' but `ref or out' in ParameterReference
7004
7005         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7006         full type signature instead of calling TypeManger.CSharpName
7007         ourselves. 
7008
7009         * support.cs (InternalParameters.ParameterDesc): Do not compare
7010         directly to the modflags, because REF/OUT will actually be bitsets
7011         if set. 
7012
7013         * delegate.cs (VerifyMethod): Check also the modifiers.
7014
7015         * cs-tokenizer.cs: Fix bug where floating point values with an
7016         exponent where a sign was missing was ignored.
7017
7018         * driver.cs: Allow multiple assemblies to be specified in a single
7019         /r: argument
7020
7021 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7022
7023         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7024         because identifiers after a parenthesis would end up in this kind
7025         of production, and we needed to desamiguate it for having casts
7026         like:
7027
7028                 (UserDefinedType *) xxx
7029
7030 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7031
7032         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7033         we should set on the Bindingflags.NonPublic, but not turn on
7034         private_ok.  private_ok controls whether a Private member is
7035         returned (this is chekced on the filter routine), while the
7036         BindingFlags.NonPublic just controls whether private/protected
7037         will be allowed.   This fixes the problem part of the problem of
7038         private properties being allowed to be used in derived classes.
7039
7040         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7041         so we can call the children DoResolveLValue method (this will
7042         properly signal errors on lvalue assignments to base properties)
7043
7044         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7045         getter are null, and we have a property info, we know that this
7046         happened because the lookup failed, so we report an error 122 for
7047         protection level violation.
7048
7049         We also silently return if setter and getter are null in the
7050         resolve functions, this condition only happens if we have flagged
7051         the error before.  This is the other half of the problem. 
7052
7053         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
7054         not have accessibility information, that is why we were returning
7055         true in the filter function in typemanager.cs.
7056
7057         To properly report 122 (property is inaccessible because of its
7058         protection level) correctly, we report this error in ResolveAccess
7059         by failing if both the setter and the getter are lacking (ie, the
7060         lookup failed). 
7061
7062         DoResolve and DoLResolve have been modified to check for both
7063         setter/getter being null and returning silently, the reason being
7064         that I did not want to put the knowledge about this error in upper
7065         layers, like:
7066
7067         int old = Report.Errors;
7068         x = new PropertyExpr (...);
7069         if (old != Report.Errors)
7070                 return null;
7071         else
7072                 return x;
7073
7074         So the property expr is returned, but it is invalid, so the error
7075         will be flagged during the resolve process. 
7076
7077         * class.cs: Remove InheritablePropertySignatureCompare from the
7078         class, as we no longer depend on the property signature to compute
7079         whether it is possible to implement a method or not.
7080
7081         The reason is that calling PropertyInfo.GetGetMethod will return
7082         null (in .NET, in Mono it works, and we should change this), in
7083         cases where the Get Method does not exist in that particular
7084         class.
7085
7086         So this code:
7087
7088         class X { public virtual int A { get { return 1; } } }
7089         class Y : X { }
7090         class Z : Y { public override int A { get { return 2; } } }
7091
7092         Would fail in Z because the parent (Y) would not have the property
7093         defined.  So we avoid this completely now (because the alternative
7094         fix was ugly and slow), and we now depend exclusively on the
7095         method names.
7096
7097         (PropertyBase.CheckBase): Use a method-base mechanism to find our
7098         reference method, instead of using the property.
7099
7100         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
7101         routines are gone now.
7102
7103         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
7104         names, they were incorrectly named.
7105
7106         * cs-tokenizer.cs: Return are more gentle token on failure. 
7107
7108         * pending.cs (PendingImplementation.InterfaceMethod): This routine
7109         had an out-of-sync index variable, which caused it to remove from
7110         the list of pending methods the wrong method sometimes.
7111
7112 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
7113
7114         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
7115         CanWrite, because those refer to this particular instance of the
7116         property, and do not take into account the fact that we can
7117         override single members of a property.
7118
7119         Constructor requires an EmitContext.  The resolution process does
7120         not happen here, but we need to compute the accessors before,
7121         because the resolution does not always happen for properties.
7122
7123         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
7124         subclass, before we did not update this flag, but we did update
7125         bindingflags. 
7126
7127         (GetAccessors): Drop this routine, as it did not work in the
7128         presence of partially overwritten set/get methods. 
7129
7130         Notice that this broke the cs1540 detection, but that will require
7131         more thinking. 
7132
7133 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7134
7135         * class.cs:
7136         * codegen.cs:
7137         * driver.cs: issue a warning instead of an error if we don't support
7138         debugging for the platform. Also ignore a couple of errors that may
7139         arise when trying to write the symbols. Undo my previous patch.
7140
7141 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7142
7143         * driver.cs: ignore /debug switch except for Unix platforms.
7144
7145 2002-10-23  Nick Drochak  <ndrochak@gol.com>
7146
7147         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
7148
7149 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
7150
7151         * driver.cs: Do not make mcs-debug conditional, so we do not break
7152         builds that use it.
7153
7154         * statement.cs (UsageVector.MergeChildren): I would like Martin to
7155         review this patch.  But basically after all the children variables
7156         have been merged, the value of "Breaks" was not being set to
7157         new_breaks for Switch blocks.  I think that it should be set after
7158         it has executed.  Currently I set this to the value of new_breaks,
7159         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
7160         conservative, but I do not understand this code very well.
7161
7162         I did not break anything in the build, so that is good ;-)
7163
7164         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
7165
7166 2002-10-20  Mark Crichton  <crichton@gimp.org>
7167
7168         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
7169
7170 2002-10-20  Nick Drochak  <ndrochak@gol.com>
7171
7172         * cfold.cs: Fixed compile blocker.
7173
7174 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
7175
7176         * driver.cs: I was chekcing the key, not the file.
7177
7178 2002-10-19  Ravi Pratap  <ravi@ximian.com>
7179
7180         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
7181         message that we were generating - we just need to silently return
7182         a null.
7183
7184 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
7185
7186         * class.cs (Event.Define): Change my previous commit, as this
7187         breaks the debugger.  This is a temporary hack, as it seems like
7188         the compiler is generating events incorrectly to begin with.
7189
7190         * expression.cs (Binary.ResolveOperator): Added support for 
7191         "U operator - (E x, E y)"
7192
7193         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
7194         y)".
7195
7196         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
7197         init-only variables, but this path did not take into account that
7198         there might be also instance readonly variables.  Correct this
7199         problem. 
7200
7201         This fixes bug 32253
7202
7203         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
7204         delegates as well.
7205
7206         * driver.cs: Change the extension for modules to `netmodule'
7207
7208         * cs-parser.jay: Improved slightly the location tracking for
7209         the debugger symbols.
7210
7211         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
7212         modifiers that were specified instead of the hardcoded value
7213         (FamAndAssem).  This was basically ignoring the static modifier,
7214         and others.  Fixes 32429.
7215
7216         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
7217         fixed a bug in the process (32476)
7218
7219         * expression.cs (ArrayAccess.EmitAssign): Patch from
7220         hwang_rob@yahoo.ca that fixes bug 31834.3
7221
7222 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
7223
7224         * driver.cs: Make the module extension .netmodule.
7225
7226 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
7227
7228         * driver.cs: Report an error if the resource file is not found
7229         instead of crashing.
7230
7231         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
7232         false, like Emit does.
7233
7234 2002-10-16  Nick Drochak  <ndrochak@gol.com>
7235
7236         * typemanager.cs: Remove unused private member.  Also reported mcs
7237         bug to report this as a warning like csc.
7238
7239 2002-10-15  Martin Baulig  <martin@gnome.org>
7240
7241         * statement.cs (Statement.Emit): Made this a virtual method; emits
7242         the line number info and calls DoEmit().
7243         (Statement.DoEmit): New protected abstract method, formerly knows
7244         as Statement.Emit().
7245
7246         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
7247
7248 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
7249
7250         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
7251         have fixed a remaining problem: not every AddXXXX was adding a
7252         fully qualified name.  
7253
7254         Now everyone registers a fully qualified name in the DeclSpace as
7255         being defined instead of the partial name.  
7256
7257         Downsides: we are slower than we need to be due to the excess
7258         copies and the names being registered this way.  
7259
7260         The reason for this is that we currently depend (on the corlib
7261         bootstrap for instance) that types are fully qualified, because
7262         we dump all the types in the namespace, and we should really have
7263         types inserted into the proper namespace, so we can only store the
7264         basenames in the defined_names array.
7265
7266 2002-10-10  Martin Baulig  <martin@gnome.org>
7267
7268         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
7269         from bug #31834, see the bug report for a testcase which is
7270         miscompiled.
7271
7272 2002-10-10  Martin Baulig  <martin@gnome.org>
7273
7274         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
7275         flow analysis code for this.
7276
7277         * statement.cs (Do, While, For): Tell the flow analysis code about
7278         infinite loops.
7279         (FlowBranching.UsageVector): Added support for infinite loops.
7280         (Block.Resolve): Moved the dead code elimination here and use flow
7281         analysis to do it.
7282
7283 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
7284
7285         * class.cs (Field.Define): Catch cycles on struct type
7286         definitions. 
7287
7288         * typemanager.cs (IsUnmanagedtype): Do not recursively check
7289         fields if the fields are static.  We only need to check instance
7290         fields. 
7291
7292         * expression.cs (As.DoResolve): Test for reference type.
7293
7294         * statement.cs (Using.ResolveExpression): Use
7295         ConvertImplicitRequired, not ConvertImplicit which reports an
7296         error on failture
7297         (Using.ResolveLocalVariableDecls): ditto.
7298
7299         * expression.cs (Binary.ResolveOperator): Report errors in a few
7300         places where we had to.
7301
7302         * typemanager.cs (IsUnmanagedtype): Finish implementation.
7303
7304 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
7305
7306         * expression.cs: Use StoreFromPtr instead of extracting the type
7307         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
7308
7309         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
7310         an enumeration value to a System.Enum, but System.Enum is not a
7311         value type, but an class type, so we need to box.
7312
7313         (Expression.ConvertExplicit): One codepath could return
7314         errors but not flag them.  Fix this.  Fixes #31853
7315
7316         * parameter.cs (Resolve): Do not allow void as a parameter type.
7317
7318 2002-10-06  Martin Baulig  <martin@gnome.org>
7319
7320         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
7321         if it's a class type and not a struct.  Fixes #31815.
7322
7323 2002-10-06  Martin Baulig  <martin@gnome.org>
7324
7325         * statement.cs: Reworked the flow analysis code a bit to make it
7326         usable for dead code elimination.
7327
7328 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7329
7330         * cs-parser.jay: allow empty source files. Fixes bug #31781.
7331
7332 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7333
7334         * expression.cs (ComposedCast.DoResolveType): A quick workaround
7335         to fix the test 165, will investigate deeper.
7336
7337 2002-10-04  Martin Baulig  <martin@gnome.org>
7338
7339         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
7340         finally blocks actually work.
7341         (Try.Resolve): We don't need to create a sibling for `finally' if
7342         there is no finally block.
7343
7344 2002-10-04  Martin Baulig  <martin@gnome.org>
7345
7346         * class.cs (Constructor.Define): The default accessibility for a
7347         non-default constructor is private, not public.
7348
7349 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7350
7351         * class.cs (Constructor): Make AllowedModifiers public, add
7352         EXTERN.
7353
7354         * cs-parser.jay: Perform the modifiers test here, as the
7355         constructor for the Constructor class usually receives a zero
7356         because of the way we create it (first we create, later we
7357         customize, and we were never checking the modifiers).
7358
7359         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
7360         is a version of LookupTypeReflection that includes the type-name
7361         cache.  This can be used as a fast path for functions that know
7362         the fully qualified name and are only calling into *.GetType() to
7363         obtain a composed type.
7364
7365         This is also used by TypeManager.LookupType during its type
7366         composition.
7367
7368         (LookupType): We now also track the real type name, as sometimes
7369         we can get a quey for the real type name from things like
7370         ComposedCast.  This fixes bug 31422.
7371
7372         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
7373         complete type fullname, it does not have to go through the type
7374         resolution system to obtain the composed version of the type (for
7375         obtaining arrays or pointers).
7376
7377         (Conditional.Emit): Use the EmitBoolExpression to
7378         generate nicer code, as requested by Paolo.
7379
7380         (ArrayCreation.CheckIndices): Use the patch from
7381         hwang_rob@yahoo.ca to validate the array initializers. 
7382
7383 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
7384
7385         * class.cs (ConstructorInitializer.Emit): simplify code by using
7386         Invocation.EmitCall, and at the same time, fix the bugs in calling
7387         parent constructors that took variable arguments. 
7388
7389         * ecore.cs (Expression.ConvertNumericExplicit,
7390         Expression.ImplicitNumericConversion): Remove the code that
7391         manually wrapped decimal (InternalTypeConstructor call is now gone
7392         as well).
7393
7394         * expression.cs (Cast.TryReduce): Also handle decimal types when
7395         trying to perform a constant fold on the type.
7396
7397         * typemanager.cs (IsUnmanagedtype): Partially implemented.
7398
7399         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
7400         that only turned off an error report, and did nothing else. 
7401
7402 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
7403
7404         * driver.cs: Handle and ignore /fullpaths
7405
7406 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
7407
7408         * expression.cs (Binary.ResolveOperator): Catch the case where
7409         DoNumericPromotions returns true, 
7410
7411         (Binary.DoNumericPromotions): Simplify the code, and the tests.
7412
7413 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
7414
7415         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
7416         report error 70.
7417
7418 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
7419
7420         * ecore.cs (ConvertNumericExplicit): It is not enough that the
7421         conversion exists, but it is also required that the conversion be
7422         performed.  This manifested in "(Type64Enum) 2".  
7423
7424         * class.cs (TypeManager.AddMethod): The fix is not to change
7425         AddEnum, because that one was using a fully qualified name (every
7426         DeclSpace derivative does), but to change the AddMethod routine
7427         that was using an un-namespaced name.  This now correctly reports
7428         the duplicated name.
7429
7430         Revert patch until I can properly fix it.  The issue
7431         is that we have a shared Type space across all namespaces
7432         currently, which is wrong.
7433
7434         Options include making the Namespace a DeclSpace, and merge
7435         current_namespace/current_container in the parser.
7436
7437 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
7438
7439         * cs-parser.jay: Improve error reporting when we get a different
7440         kind of expression in local_variable_type and
7441         local_variable_pointer_type. 
7442
7443         Propagate this to avoid missleading errors being reported.
7444
7445         * ecore.cs (ImplicitReferenceConversion): treat
7446         TypeManager.value_type as a target just like object_type.   As
7447         code like this:
7448
7449         ValueType v = 1;
7450
7451         Is valid, and needs to result in the int 1 being boxed before it
7452         is assigned to the value type v.
7453
7454         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
7455         to validate the enumeration name.
7456
7457         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
7458         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
7459         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
7460
7461         * ecore.cs (TryImplicitIntConversion): When doing an
7462         implicit-enumeration-conversion, check if the type is 64-bits and
7463         perform a conversion before passing to EnumConstant.
7464
7465 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
7466
7467         * decl.cs (Error_AmbiguousTypeReference); New routine used to
7468         report ambiguous type references.  Unlike the MS version, we
7469         report what the ambiguity is.   Innovation at work ;-)
7470
7471         (DeclSpace.FindType): Require a location argument to
7472         display when we display an ambiguous error.
7473
7474         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
7475
7476         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
7477
7478         * expression.cs (EmitDynamicInitializers): Apply patch from
7479         hwang_rob@yahoo.ca that fixes the order in which we emit our
7480         initializers. 
7481
7482 2002-09-21  Martin Baulig  <martin@gnome.org>
7483
7484         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
7485         delegate takes no arguments.
7486
7487 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
7488
7489         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
7490         from integers.
7491
7492         * expression.cs: Extract the underlying type.
7493
7494         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
7495
7496         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
7497
7498 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
7499
7500         * class.cs (TypeContainer.DefineType): We can not use the nice
7501         PackingSize with the size set to 1 DefineType method, because it
7502         will not allow us to define the interfaces that the struct
7503         implements.
7504
7505         This completes the fixing of bug 27287
7506
7507         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
7508         means also structs.  This fixes part of the problem. 
7509         (Expresion.ImplicitReferenceConversionExists): ditto.
7510
7511         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
7512         error if there were no errors reported during the type lookup
7513         process, to avoid duplicates or redundant errors.  Without this
7514         you would get an ambiguous errors plus a type not found.  We have
7515         beaten the user enough with the first error.  
7516
7517         (DeclSparce.FindType): Emit a warning if we have an ambiguous
7518         reference. 
7519
7520         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
7521         during the resolution process, stop the lookup, this avoids
7522         repeated error reports (same error twice).
7523
7524         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
7525
7526         * typemanager.cs (LookupType): Redo the type lookup code to match
7527         the needs of System.Reflection.  
7528
7529         The issue is that System.Reflection requires references to nested
7530         types to begin with a "+" sign instead of a dot.  So toplevel
7531         types look like: "NameSpace.TopLevelClass", and nested ones look
7532         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
7533         levels. 
7534
7535 2002-09-19  Martin Baulig  <martin@gnome.org>
7536
7537         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
7538         says that a method always returns or always throws an exception,
7539         don't report the CS0161.
7540
7541         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
7542         set `Returns = new_returns'.
7543
7544 2002-09-19  Martin Baulig  <martin@gnome.org>
7545
7546         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
7547         to an enum constant, check for a CS0176.
7548
7549 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
7550
7551         * class.cs (TypeContainer.CheckPairedOperators): Now we check
7552         for operators that must be in pairs and report errors.
7553
7554         * ecore.cs (SimpleName.DoResolveType): During the initial type
7555         resolution process, when we define types recursively, we must
7556         check first for types in our current scope before we perform
7557         lookups in the enclosing scopes.
7558
7559         * expression.cs (MakeByteBlob): Handle Decimal blobs.
7560
7561         (Invocation.VerifyArgumentsCompat): Call
7562         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
7563         I thought we were supposed to always call this, but there are a
7564         few places in the code where we dont do it.
7565
7566 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
7567
7568         * driver.cs: Add support in -linkres and -resource to specify the
7569         name of the identifier.
7570
7571 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7572
7573         * ecore.cs (StandardConversionExists): Sync with the conversion
7574         code: allow anything-* to void* conversions.
7575
7576         (FindMostSpecificSource): Use an Expression argument
7577         instead of a Type, because we might be handed over a Literal which
7578         gets a few more implicit conversions that plain types do not.  So
7579         this information was being lost.
7580
7581         Also, we drop the temporary type-holder expression when not
7582         required.
7583
7584 2002-09-17  Martin Baulig  <martin@gnome.org>
7585
7586         * class.cs (PropertyBase.CheckBase): Don't check the base class if
7587         this is an explicit interface implementation.
7588
7589 2002-09-17  Martin Baulig  <martin@gnome.org>
7590
7591         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
7592         different `IndexerName' attributes.
7593
7594         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
7595         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
7596         virtual CommonResolve().
7597
7598 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7599
7600         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
7601         and convert that to the UnderlyingType.
7602
7603         * statement.cs (Foreach.Resolve): Indexers are just like variables
7604         or PropertyAccesses.
7605
7606         * cs-tokenizer.cs (consume_string): Track line numbers and columns
7607         inside quoted strings, we were not doing this before.
7608
7609 2002-09-16  Martin Baulig  <martin@gnome.org>
7610
7611         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
7612         resolve it.  This is needed for the definite assignment check of the
7613         instance expression, fixes bug #29846.
7614         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
7615
7616 2002-09-16  Nick Drochak  <ndrochak@gol.com>
7617
7618         * parameter.cs: Fix compile error.  Cannot reference static member
7619         from an instance object.  Is this an mcs bug?
7620
7621 2002-09-14  Martin Baulig  <martin@gnome.org>
7622
7623         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
7624         multiple times.  Fixes bug #30295, added test-166.cs.
7625
7626 2002-09-14  Martin Baulig  <martin@gnome.org>
7627
7628         * statement.cs (Block.Emit): Don't emit unreachable code.
7629         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
7630         `break' statements.
7631         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
7632
7633 2002-09-14  Martin Baulig  <martin@gnome.org>
7634
7635         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
7636         is set.
7637
7638 2002-09-14  Martin Baulig  <martin@gnome.org>
7639
7640         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
7641         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
7642         be false on the ms runtime.
7643
7644 2002-09-13  Martin Baulig  <martin@gnome.org>
7645
7646         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
7647         the CS0038 error message.
7648
7649 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
7650
7651         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
7652         constant inside, return it.
7653
7654 2002-09-12  Martin Baulig  <martin@gnome.org>
7655
7656         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
7657         implicit conversion can be done between enum types.
7658
7659         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
7660         check whether an implicit conversion to the current enum's UnderlyingType
7661         exists and report an error if not.
7662
7663         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
7664         without debugging support.
7665
7666         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
7667         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
7668
7669 2002-09-12  Martin Baulig  <martin@gnome.org>
7670
7671         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
7672
7673         * ecore.cs (IMemberExpr.DeclaringType): New property.
7674         (SimpleName.SimpleNameResolve): Check whether we're accessing a
7675         nonstatic member of an outer type (CS0038).
7676
7677 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
7678
7679         * driver.cs: Activate the using-error detector at warning level
7680         4 (at least for MS-compatible APIs).
7681
7682         * namespace.cs (VerifyUsing): Small buglett fix.
7683
7684         * pending.cs (PendingImplementation): pass the container pointer. 
7685
7686         * interface.cs (GetMethods): Allow for recursive definition.  Long
7687         term, I would like to move every type to support recursive
7688         definitions, not the current ordering mechanism that we have right
7689         now.
7690
7691         The situation is this: Attributes are handled before interfaces,
7692         so we can apply attributes to interfaces.  But some attributes
7693         implement interfaces, we will now handle the simple cases
7694         (recursive definitions will just get an error).  
7695
7696         * parameter.cs: Only invalidate types at the end if we fail to
7697         lookup all types.  
7698
7699 2002-09-09  Martin Baulig  <martin@gnome.org>
7700
7701         * ecore.cs (PropertyExpr.Emit): Also check for
7702         TypeManager.system_int_array_get_length so this'll also work when
7703         compiling corlib.  Fixes #30003.
7704
7705 2002-09-09  Martin Baulig  <martin@gnome.org>
7706
7707         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
7708         and throw an exception if we can't get the type's size.  Fixed #30040,
7709         added test-165.cs.
7710
7711 2002-09-09  Martin Baulig  <martin@gnome.org>
7712
7713         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
7714
7715         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
7716         context.  Fixes bug #30027.
7717
7718         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
7719         virtual functions.  Fixes bug #30043, added test-164.cs.
7720
7721 2002-09-08  Ravi Pratap  <ravi@ximian.com>
7722
7723         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
7724
7725 2002-09-08  Nick Drochak  <ndrochak@gol.com>
7726
7727         * driver.cs: Use an object to get the windows codepage since it's not a
7728         static property.
7729
7730 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
7731
7732         * statement.cs (For.Emit): for infinite loops (test == null)
7733         return whether there is a break inside, not always "true".
7734
7735         * namespace.cs (UsingEntry): New struct to hold the name of the
7736         using definition, the location where it is defined, and whether it
7737         has been used in a successful type lookup.
7738
7739         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
7740         strings.
7741
7742         * decl.cs: ditto.
7743
7744 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7745
7746         * attribute.cs : Fix incorrect code which relied on catching
7747         a NullReferenceException to detect a null being passed in
7748         where an object was expected.
7749
7750 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
7751
7752         * statement.cs (Try): flag the catch variable as assigned
7753
7754         * expression.cs (Cast): Simplified by using ResolveType instead of
7755         manually resolving.
7756
7757         * statement.cs (Catch): Fix bug by using ResolveType.
7758
7759 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7760
7761         * expression.cs (BetterConversion): Special case for when we have
7762         a NullLiteral as the argument and we have to choose between string
7763         and object types - we choose string the way csc does.
7764
7765         * attribute.cs (Attribute.Resolve): Catch the
7766         NullReferenceException and report error #182 since the Mono
7767         runtime no more has the bug and having this exception raised means
7768         we tried to select a constructor which takes an object and is
7769         passed a null.
7770
7771 2002-09-05  Ravi Pratap  <ravi@ximian.com>
7772
7773         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
7774         message (1502, 1503) when we can't locate a method after overload
7775         resolution. This is much more informative and closes the bug
7776         Miguel reported.
7777
7778         * interface.cs (PopulateMethod): Return if there are no argument
7779         types. Fixes a NullReferenceException bug.
7780
7781         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
7782         expressions too. Previously we were checking only in one place for
7783         positional arguments leaving out named arguments.
7784
7785         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
7786         type to the enum type is not allowed. Remove code corresponding to
7787         that.
7788
7789         (ConvertNumericExplicit): Allow explicit conversions from
7790         the underlying type to enum type. This precisely follows the spec
7791         and closes a bug filed by Gonzalo.
7792
7793 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7794
7795         * compiler.csproj:
7796         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
7797
7798 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
7799
7800         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
7801         it was important that we stored the right value after the
7802         reduction in `converted'.
7803
7804 2002-09-04  Martin Baulig  <martin@gnome.org>
7805
7806         * location.cs (Location.SymbolDocument): Use full pathnames for the
7807         source files.
7808
7809 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
7810
7811         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
7812         of the expression resolve mechanism, because that will catch the
7813         SimpleName error failures.
7814
7815         (Conditional): If we can not resolve the
7816         expression, return, do not crash.
7817
7818 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7819
7820         * cs-tokenizer.cs:
7821         (location): display token name instead of its number.
7822
7823 2002-08-28  Martin Baulig  <martin@gnome.org>
7824
7825         * expression.cs (Binary.ResolveOperator): Don't silently return
7826         but return an error if an operator cannot be applied between two
7827         enum types.
7828
7829 2002-08-28  Martin Baulig  <martin@gnome.org>
7830
7831         * class.cs (Constructor.Define): Set the permission attributes
7832         correctly instead of making all constructors public.
7833
7834 2002-08-28  Martin Baulig  <martin@gnome.org>
7835
7836         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
7837         for private members before reporting a CS0103; if we find anything,
7838         it's a CS0122.
7839
7840 2002-08-28  Martin Baulig  <martin@gnome.org>
7841
7842         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
7843         to check whether `closure_start_type == closure_invocation_type',
7844         we also need to check whether `m.DeclaringType == closure_invocation_type'
7845         before bypassing the permission checks.  We might be accessing
7846         protected/private members from the base class.
7847         (TypeManager.RealMemberLookup): Only set private_ok if private
7848         members were requested via BindingFlags.NonPublic.
7849
7850         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
7851
7852         * expression.cs (MemberAccess.ResolveMemberAccess): Set
7853         MethodGroupExpr.IsExplicitImpl if appropriate.
7854         (Invocation.DoResolve): Don't report the CS0120 for explicit
7855         interface implementations.
7856
7857 2002-08-27  Martin Baulig  <martin@gnome.org>
7858
7859         * expression.cs (Invocation.DoResolve): If this is a static
7860         method and we don't have an InstanceExpression, we must report
7861         a CS0120.
7862
7863 2002-08-25  Martin Baulig  <martin@gnome.org>
7864
7865         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
7866         `==' between a valuetype and an object.
7867
7868 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
7869
7870         * ecore.cs (TypeExpr): Provide a ToString method.
7871
7872 2002-08-24  Martin Baulig  <martin@gnome.org>
7873
7874         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
7875         now called proggie.dbg and it's a binary file.
7876
7877 2002-08-23  Martin Baulig  <martin@gnome.org>
7878
7879         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
7880
7881 2002-08-23  Martin Baulig  <martin@gnome.org>
7882
7883         * struct.cs (MyStructInfo.ctor): Make this work with empty
7884         structs; it's not allowed to use foreach() on null.
7885
7886 2002-08-23  Martin Baulig  <martin@gnome.org>
7887
7888         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
7889         writer the full pathname of the generated assembly.
7890
7891 2002-08-23  Martin Baulig  <martin@gnome.org>
7892
7893         * statements.cs (FlowBranching.UsageVector.MergeChildren):
7894         A `finally' block never returns or breaks; improved handling of
7895         unreachable code.
7896
7897 2002-08-23  Martin Baulig  <martin@gnome.org>
7898
7899         * statement.cs (Throw.Resolve): Allow `throw null'.
7900
7901 2002-08-23  Martin Baulig  <martin@gnome.org>
7902
7903         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
7904         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
7905         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
7906         MemberLookup would return a wrong event if this is an explicit
7907         interface implementation and the class has an event with the same
7908         name.
7909
7910 2002-08-23  Martin Baulig  <martin@gnome.org>
7911
7912         * statement.cs (Block.AddChildVariableNames): New public method.
7913         (Block.AddChildVariableName): Likewise.
7914         (Block.IsVariableNameUsedInChildBlock): Likewise.
7915         (Block.AddVariable): Check whether a variable name has already
7916         been used in a child block.
7917
7918         * cs-parser.jay (declare_local_variables): Mark all variable names
7919         from the current block as being used in a child block in the
7920         implicit block.
7921
7922 2002-08-23  Martin Baulig  <martin@gnome.org>
7923
7924         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
7925         find the symbol writer.
7926
7927         * driver.cs: csc also allows the arguments to /define being
7928         separated by commas, not only by semicolons.
7929
7930 2002-08-23  Martin Baulig  <martin@gnome.org>
7931
7932         * interface.cs (Interface.GetMembers): Added static check for events.
7933
7934 2002-08-15  Martin Baulig  <martin@gnome.org>
7935
7936         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
7937         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
7938
7939         * ecore.cs (Expression.MemberLookup): Added documentation and explained
7940         why the MethodData.EmitDestructor() change was necessary.
7941
7942 2002-08-20  Martin Baulig  <martin@gnome.org>
7943
7944         * class.cs (TypeContainer.FindMembers): Added static check for events.
7945
7946         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
7947
7948         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
7949         use Type.GetEvents(), not Type.FindMembers().
7950
7951 2002-08-20  Martin Baulig  <martin@gnome.org>
7952
7953         * decl.cs (MemberCache): Added a special method cache which will
7954         be used for method-only searched.  This ensures that a method
7955         search will return a MethodInfo with the correct ReflectedType for
7956         inherited methods.      
7957
7958 2002-08-20  Martin Baulig  <martin@gnome.org>
7959
7960         * decl.cs (DeclSpace.FindMembers): Made this public.
7961
7962 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7963
7964         * delegate.cs: fixed build on windows.
7965         [FIXME:  Filed as bug #29150: MCS must report these errors.]
7966
7967 2002-08-19  Ravi Pratap  <ravi@ximian.com>
7968
7969         * ecore.cs (StandardConversionExists): Return a false
7970         if we are trying to convert the void type to anything else
7971         since that is not allowed.
7972
7973         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
7974         we flag error 70 in the event an event is trying to be accessed
7975         directly from outside the declaring type.
7976
7977 2002-08-20  Martin Baulig  <martin@gnome.org>
7978
7979         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
7980         MemberCache from typemanager.cs to decl.cs.
7981
7982 2002-08-19  Martin Baulig  <martin@gnome.org>
7983
7984         * class.cs (TypeContainer): Implement IMemberContainer.
7985         (TypeContainer.DefineMembers): Create the MemberCache.
7986         (TypeContainer.FindMembers): Do better BindingFlags checking; only
7987         return public members if BindingFlags.Public was given, check
7988         whether members are static.
7989
7990 2002-08-16  Martin Baulig  <martin@gnome.org>
7991
7992         * decl.cs (DeclSpace.Define): Splitted this in Define and
7993         DefineMembers.  DefineMembers is called first and initializes the
7994         MemberCache.
7995
7996         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
7997         DefineMembers() on all our DeclSpaces.
7998
7999         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8000         but call DefineMembers() on all nested interfaces.  We call their
8001         Define() in our new Define() function.
8002
8003         * interface.cs (Interface): Implement IMemberContainer.
8004         (Interface.Define): Moved all code except the attribute stuf to
8005         DefineMembers().
8006         (Interface.DefineMembers): Initialize the member cache.
8007
8008         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8009         need this anymore since we can use MemberCache.FindMembers directly.
8010
8011 2002-08-19  Martin Baulig  <martin@gnome.org>
8012
8013         * typemanager.cs (MemberCache): When creating the cache for an
8014         interface type, add all inherited members.
8015         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8016         to `out bool used_cache' and documented it.
8017         (TypeManager.MemberLookup): If we already used the cache in the first
8018         iteration, we don't need to do the interfaces check.
8019
8020 2002-08-19  Martin Baulig  <martin@gnome.org>
8021
8022         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8023         here from IMemberFinder and don't implement this interface anymore.
8024         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8025
8026         * typemanager.cs (IMemberFinder): This interface is now only used by
8027         classes which actually support the member cache.
8028         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8029         since we only put DeclSpaces into this Hashtable.
8030         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8031         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8032
8033 2002-08-16  Martin Baulig  <martin@gnome.org>
8034
8035         * typemanager.cs (ICachingMemberFinder): Removed.
8036         (IMemberFinder.MemberCache): New property.
8037         (TypeManager.FindMembers): Merged this with RealFindMembers().
8038         This function will never be called from TypeManager.MemberLookup()
8039         so we can't use the cache here, just the IMemberFinder.
8040         (TypeManager.MemberLookup_FindMembers): Check whether the
8041         IMemberFinder has a MemberCache and call the cache's FindMembers
8042         function.
8043         (MemberCache): Rewrote larger parts of this yet another time and
8044         cleaned it up a bit.
8045
8046 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8047
8048         * driver.cs (LoadArgs): Support quoting.
8049
8050         (Usage): Show the CSC-like command line arguments.
8051
8052         Improved a few error messages.
8053
8054 2002-08-15  Martin Baulig  <martin@gnome.org>
8055
8056         * typemanager.cs (IMemberContainer.Type): New property.
8057         (IMemberContainer.IsInterface): New property.
8058
8059         The following changes are conditional to BROKEN_RUNTIME, which is
8060         defined at the top of the file.
8061
8062         * typemanager.cs (MemberCache.MemberCache): Don't add the base
8063         class'es members, but add all members from TypeHandle.ObjectType
8064         if we're an interface.
8065         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
8066         is the current type.
8067         (MemberCache.CacheEntry.Container): Removed this field.
8068         (TypeHandle.GetMembers): Include inherited members.
8069
8070 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8071
8072         * typemanager.cs: fixed compilation and added a comment on a field that
8073         is never used.
8074
8075 2002-08-15  Martin Baulig  <martin@gnome.org>
8076
8077         * class.cs (ConstructorInitializer.Resolve): In the
8078         Expression.MemberLookup call, use the queried_type as
8079         invocation_type.
8080
8081         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
8082         declared' attribute, it's always true.
8083         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
8084         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
8085         temporary wrapper for FindMembers which tells MemberLookup whether
8086         members from the base classes are included in the return value.
8087         This will go away soon.
8088         (TypeManager.MemberLookup): Use this temporary hack here; once the
8089         new MemberCache is completed, we don't need to do the DeclaredOnly
8090         looping here anymore since the MemberCache will take care of this.
8091         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
8092         (MemberCache): When creating the MemberCache for a class, get
8093         members from the current class and all its base classes.
8094         (MemberCache.CacheEntry.Container): New field.  This is a
8095         temporary hack until the Mono runtime is fixed to distinguish
8096         between ReflectedType and DeclaringType.  It allows us to use MCS
8097         with both the MS runtime and the unfixed Mono runtime without
8098         problems and without accecting performance.
8099         (MemberCache.SearchMembers): The DeclaredOnly looping from
8100         TypeManager.MemberLookup is now done here.      
8101
8102 2002-08-14  Martin Baulig  <martin@gnome.org>
8103
8104         * statement.cs (MyStructInfo.MyStructInfo): Don't call
8105         Type.GetFields on dynamic types but get the fields from the
8106         corresponding TypeContainer.
8107         (MyStructInfo.GetStructInfo): Added check for enum types.
8108
8109         * typemanager.cs (MemberList.IsSynchronized): Implemented.
8110         (MemberList.SyncRoot): Implemented.
8111         (TypeManager.FilterWithClosure): No need to check permissions if
8112         closure_start_type == closure_invocation_type, don't crash if
8113         closure_invocation_type is null.
8114
8115 2002-08-13  Martin Baulig  <martin@gnome.org>
8116
8117         Rewrote TypeContainer.FindMembers to use a member cache.  This
8118         gives us a speed increase of about 35% for the self-hosting MCS
8119         build and of about 15-20% for the class libs (both on GNU/Linux).
8120
8121         * report.cs (Timer): New class to get enhanced profiling.  This
8122         whole class is "TIMER" conditional since it remarkably slows down
8123         compilation speed.
8124
8125         * class.cs (MemberList): New class.  This is an IList wrapper
8126         which we're now using instead of passing MemberInfo[]'s around to
8127         avoid copying this array unnecessarily.
8128         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
8129         (ICachingMemberFinder, IMemberContainer): New interface.
8130         (TypeManager.FilterWithClosure): If `criteria' is null, the name
8131         has already been checked, otherwise use it for the name comparision.
8132         (TypeManager.FindMembers): Renamed to RealMemberFinder and
8133         provided wrapper which tries to use ICachingMemberFinder.FindMembers
8134         if possible.  Returns a MemberList, not a MemberInfo [].
8135         (TypeHandle): New class, implements IMemberContainer.  We create
8136         one instance of this class per type, it contains a MemberCache
8137         which is used to do the member lookups.
8138         (MemberCache): New class.  Each instance of this class contains
8139         all members of a type and a name-based hash table.
8140         (MemberCache.FindMembers): This is our new member lookup
8141         function.  First, it looks up all members of the requested name in
8142         the hash table.  Then, it walks this list and sorts out all
8143         applicable members and returns them.
8144
8145 2002-08-13  Martin Baulig  <martin@gnome.org>
8146
8147         In addition to a nice code cleanup, this gives us a performance
8148         increase of about 1.4% on GNU/Linux - not much, but it's already
8149         half a second for the self-hosting MCS compilation.
8150
8151         * typemanager.cs (IMemberFinder): New interface.  It is used by
8152         TypeManager.FindMembers to call FindMembers on a TypeContainer,
8153         Enum, Delegate or Interface.
8154         (TypeManager.finder_to_member_finder): New PtrHashtable.
8155         (TypeManager.finder_to_container): Removed.
8156         (TypeManager.finder_to_delegate): Removed.
8157         (TypeManager.finder_to_interface): Removed.
8158         (TypeManager.finder_to_enum): Removed.
8159
8160         * interface.cs (Interface): Implement IMemberFinder.
8161
8162         * delegate.cs (Delegate): Implement IMemberFinder.
8163
8164         * enum.cs (Enum): Implement IMemberFinder.
8165
8166         * class.cs (TypeContainer): Implement IMemberFinder.
8167
8168 2002-08-12  Martin Baulig  <martin@gnome.org>
8169
8170         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
8171
8172 2002-08-12  Martin Baulig  <martin@gnome.org>
8173
8174         * ecore.cs (ITypeExpression): New interface for expressions which
8175         resolve to a type.
8176         (TypeExpression): Renamed to TypeLookupExpression.
8177         (Expression.DoResolve): If we're doing a types-only lookup, the
8178         expression must implement the ITypeExpression interface and we
8179         call DoResolveType() on it.
8180         (SimpleName): Implement the new ITypeExpression interface.
8181         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
8182         hack, the situation that we're only looking up types can't happen
8183         anymore when this method is called.  Moved the type lookup code to
8184         DoResolveType() and call it.
8185         (SimpleName.DoResolveType): This ITypeExpression interface method
8186         is now doing the types-only lookup.
8187         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
8188         (ResolveFlags): Added MaskExprClass.
8189
8190         * expression.cs (MemberAccess): Implement the ITypeExpression
8191         interface.
8192         (MemberAccess.DoResolve): Added support for a types-only lookup
8193         when we're called via ITypeExpression.DoResolveType().
8194         (ComposedCast): Implement the ITypeExpression interface.
8195
8196         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
8197         Expression.Resolve() with ResolveFlags.Type instead.
8198
8199 2002-08-12  Martin Baulig  <martin@gnome.org>
8200
8201         * interface.cs (Interface.Define): Apply attributes.
8202
8203         * attribute.cs (Attribute.ApplyAttributes): Added support for
8204         interface attributes.
8205
8206 2002-08-11  Martin Baulig  <martin@gnome.org>
8207
8208         * statement.cs (Block.Emit): Only check the "this" variable if we
8209         do not always throw an exception.
8210
8211         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
8212         whether the property has a set accessor.
8213
8214 2002-08-11  Martin Baulig  <martin@gnome.org>
8215
8216         Added control flow analysis support for structs.
8217
8218         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
8219         with control flow analysis turned off.
8220         (IVariable): New interface.
8221         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
8222         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
8223         (FieldExpr.DoResolve): Resolve the instance expression with flow
8224         analysis turned off and do the definite assignment check after the
8225         resolving when we know what the expression will resolve to.
8226
8227         * expression.cs (LocalVariableReference, ParameterReference):
8228         Implement the new IVariable interface, only call the flow analysis
8229         code if ec.DoFlowAnalysis is true.
8230         (This): Added constructor which takes a Block argument.  Implement
8231         the new IVariable interface.
8232         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
8233         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
8234         This does the definite assignment checks for struct members.
8235
8236         * class.cs (Constructor.Emit): If this is a non-static `struct'
8237         constructor which doesn't have any initializer, call
8238         Block.AddThisVariable() to tell the flow analysis code that all
8239         struct elements must be initialized before control returns from
8240         the constructor.
8241
8242         * statement.cs (MyStructInfo): New public class.
8243         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
8244         argument to this indexer.  If non-zero, check an individual struct
8245         member, not the whole struct.
8246         (FlowBranching.CheckOutParameters): Check struct members.
8247         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
8248         overloaded versions of these methods which take an additional
8249         `int field_idx' argument to check struct members.
8250         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
8251         overloaded versions of these methods which take an additional
8252         `string field_name' argument to check struct member.s
8253         (VariableInfo): Implement the IVariable interface.
8254         (VariableInfo.StructInfo): New public property.  Returns the
8255         MyStructInfo instance of the variable if it's a struct or null.
8256         (Block.AddThisVariable): New public method.  This is called from
8257         Constructor.Emit() for non-static `struct' constructor which do
8258         not have any initializer.  It creates a special variable for the
8259         "this" instance variable which will be checked by the flow
8260         analysis code to ensure that all of the struct's fields are
8261         initialized before control returns from the constructor.
8262         (UsageVector): Added support for struct members.  If a
8263         variable/parameter is a struct with N members, we reserve a slot
8264         in the usage vector for each member.  A struct is considered fully
8265         initialized if either the struct itself (slot 0) or all its
8266         members are initialized.
8267
8268 2002-08-08  Martin Baulig  <martin@gnome.org>
8269
8270         * driver.cs (Driver.MainDriver): Only report an error CS5001
8271         if there were no compilation errors.
8272
8273         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
8274         `UnsafeContext' property to determine whether the parent is in
8275         unsafe context rather than checking the parent's ModFlags:
8276         classes nested in an unsafe class are unsafe as well.
8277
8278 2002-08-08  Martin Baulig  <martin@gnome.org>
8279
8280         * statement.cs (UsageVector.MergeChildren): Distinguish between
8281         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
8282         we return.  Added test17() and test18() to test-154.cs.
8283
8284 2002-08-08  Martin Baulig  <martin@gnome.org>
8285
8286         * typemanager.cs (TypeManager.FilterWithClosure): If we have
8287         Family access, make sure the invoking type isn't a subclass of the
8288         queried type (that'd be a CS1540).
8289
8290         * ecore.cs (Expression.MemberLookup): Added overloaded version of
8291         this method which takes an additional `Type invocation_type'.
8292
8293         * expression.cs (BaseAccess.DoResolve): Use the base type as
8294         invocation and query type.
8295         (MemberAccess.DoResolve): If the lookup failed and we're about to
8296         report a CS0122, try a lookup with the ec.ContainerType - if this
8297         succeeds, we must report a CS1540.
8298
8299 2002-08-08  Martin Baulig  <martin@gnome.org>
8300
8301         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
8302         (MethodGroupExpr): Implement the IMemberExpr interface.
8303
8304         * expression (MemberAccess.ResolveMemberAccess): No need to have
8305         any special code for MethodGroupExprs anymore, they're now
8306         IMemberExprs.   
8307
8308 2002-08-08  Martin Baulig  <martin@gnome.org>
8309
8310         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
8311         Family, FamANDAssem and FamORAssem permissions.
8312         (TypeManager.IsSubclassOrNestedChildOf): New public method.
8313
8314 2002-08-08  Martin Baulig  <martin@gnome.org>
8315
8316         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
8317         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
8318         or loop block.
8319
8320 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
8321
8322         * driver.cs: implemented /resource option to embed managed resources.
8323
8324 2002-08-07  Martin Baulig  <martin@gnome.org>
8325
8326         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
8327         (FieldBase.HasFieldInitializer): New public property.
8328         (FieldBase.GetInitializerExpression): New public method.  Resolves and
8329         returns the field initializer and makes sure it is only resolved once.
8330         (TypeContainer.EmitFieldInitializers): Call
8331         FieldBase.GetInitializerExpression to get the initializer, this ensures
8332         that it isn't resolved multiple times.
8333
8334         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
8335         the resolving process (SimpleName/MemberLookup) that we're currently
8336         emitting a field initializer (which must not access any instance members,
8337         this is an error CS0236).
8338
8339         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
8340         argument, if the `IsFieldInitializer' flag is set, we must report and
8341         error CS0236 and not an error CS0120.   
8342
8343 2002-08-07  Martin Baulig  <martin@gnome.org>
8344
8345         * ecore.cs (IMemberExpr): New public interface.
8346         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
8347         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
8348         if the expression is an IMemberExpr.
8349
8350         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
8351         to be null, implicitly default to `this' if we're non-static in
8352         this case.  Simplified the code a lot by using the new IMemberExpr
8353         interface.  Also fixed bug #28176 here.
8354
8355 2002-08-06  Martin Baulig  <martin@gnome.org>
8356
8357         * cs-parser.jay (SimpleLookup): Removed.  We need to create
8358         ParameterReferences during semantic analysis so that we can do a
8359         type-only search when resolving Cast, TypeOf and SizeOf.
8360         (block): Pass the `current_local_parameters' to the Block's
8361         constructor.
8362
8363         * class.cs (ConstructorInitializer): Added `Parameters parameters'
8364         argument to the constructor.
8365         (ConstructorInitializer.Resolve): Create a temporary implicit
8366         block with the parameters.
8367
8368         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
8369         references here if we aren't doing a type-only search.
8370
8371         * statement.cs (Block): Added constructor which takes a
8372         `Parameters parameters' argument.
8373         (Block.Parameters): New public property.
8374
8375         * support.cs (InternalParameters.Parameters): Renamed `parameters'
8376         to `Parameters' and made it public readonly.
8377
8378 2002-08-06  Martin Baulig  <martin@gnome.org>
8379
8380         * ecore.cs (Expression.Warning): Made this public as well.
8381
8382         * report.cs (Report.Debug): Print the contents of collections.
8383
8384 2002-08-06  Martin Baulig  <martin@gnome.org>
8385
8386         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
8387         used to tell Resolve() which kinds of expressions it may return.
8388         (Expression.Resolve): Added overloaded version of this method which
8389         takes a `ResolveFlags flags' argument.  This can be used to tell
8390         Resolve() which kinds of expressions it may return.  Reports a
8391         CS0118 on error.
8392         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
8393         ResolveFlags.SimpleName.
8394         (Expression.Error118): Added overloaded version of this method which
8395         takes a `ResolveFlags flags' argument.  It uses the flags to determine
8396         which kinds of expressions are allowed.
8397
8398         * expression.cs (Argument.ResolveMethodGroup): New public method.
8399         Resolves an argument, but allows a MethodGroup to be returned.
8400         This is used when invoking a delegate.
8401
8402         * TODO: Updated a bit.
8403
8404 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8405
8406         Fixed compilation with csc.
8407
8408         * ecore.cs: Expression.Error made public. Is this correct? Should
8409         Warning be made public too?
8410
8411         * expression.cs: use ea.Location instead of ea.loc.
8412         [FIXME:  Filed as bug #28607: MCS must report these errors.]
8413
8414 2002-08-06  Martin Baulig  <martin@gnome.org>
8415
8416         * ecore.cs (Expression.loc): Moved the location here instead of
8417         duplicating it in all derived classes.
8418         (Expression.Location): New public property.
8419         (Expression.Error, Expression.Warning): Made them non-static and
8420         removed the location argument.
8421         (Expression.Warning): Added overloaded version which takes an
8422         `int level' argument.
8423         (Expression.Error118): Make this non-static and removed the
8424         expression and location arguments.
8425         (TypeExpr): Added location argument to the constructor.
8426
8427         * expression.cs (StaticCallExpr): Added location argument to
8428         the constructor.
8429         (Indirection, PointerArithmetic): Likewise.
8430         (CheckedExpr, UnCheckedExpr): Likewise.
8431         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
8432         (StringPtr): Likewise.
8433
8434
8435 2002-08-05  Martin Baulig  <martin@gnome.org>
8436
8437         * expression.cs (BaseAccess.DoResolve): Actually report errors.
8438
8439         * assign.cs (Assign.DoResolve): Check whether the source
8440         expression is a value or variable.
8441
8442         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
8443         while resolving the corresponding blocks.
8444
8445         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
8446         an error, don't silently return null.
8447
8448         * statement.cs (Block.AddVariable): Do the error reporting here
8449         and distinguish between CS0128 and CS0136.
8450         (Block.DoResolve): Report all unused labels (warning CS0164).
8451         (LabeledStatement): Pass the location to the constructor.
8452         (LabeledStatement.HasBeenReferenced): New property.
8453         (LabeledStatement.Resolve): Set it to true here.
8454
8455         * statement.cs (Return.Emit): Return success even after reporting
8456         a type mismatch error (CS0126 or CS0127), this is what csc does and
8457         it avoids confusing the users with any consecutive errors.
8458
8459 2002-08-05  Martin Baulig  <martin@gnome.org>
8460
8461         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
8462
8463         * const.cs (Const.LookupConstantValue): Catch circular definitions.
8464
8465         * expression.cs (MemberAccess.DoResolve): Silently return if an
8466         error has already been reported.
8467
8468         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
8469         error has already been reported.
8470
8471 2002-08-05  Martin Baulig  <martin@gnome.org>
8472
8473         * statement.cs (UsageVector): Only initialize the `parameters'
8474         vector if we actually have any "out" parameters.
8475
8476 2002-08-05  Martin Baulig  <martin@gnome.org>
8477
8478         * expression.cs (Binary.ResolveOperator): When combining delegates,
8479         they must have the same type.
8480
8481 2002-08-05  Martin Baulig  <martin@gnome.org>
8482
8483         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
8484         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
8485         work with the ms runtime and we also don't need it: if we're a
8486         PropertyBuilder and not in the `indexer_arguments' hash, then we
8487         are a property and not an indexer.
8488
8489         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
8490         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
8491         since the latter one doesn't work with the ms runtime.
8492
8493 2002-08-03  Martin Baulig  <martin@gnome.org>
8494
8495         Fixed bugs #27998 and #22735.
8496
8497         * class.cs (Method.IsOperator): New public field.
8498         (Method.CheckBase): Report CS0111 if there's already a method
8499         with the same parameters in the current class.  Report CS0508 when
8500         attempting to change the return type of an inherited method.
8501         (MethodData.Emit): Report CS0179 if a method doesn't have a body
8502         and it's not marked abstract or extern.
8503         (PropertyBase): New abstract base class for Property and Indexer.
8504         (PropertyBase.CheckBase): Moved here from Property and made it work
8505         for indexers.
8506         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
8507         the same so we can reuse it there.
8508         (Property, Indexer): Derive from PropertyBase.
8509         (MethodSignature.inheritable_property_signature_filter): New delegate
8510         to find properties and indexers.
8511
8512         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
8513         argument and improved error reporting.
8514
8515         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
8516         EmptyReadOnlyParameters and made it a property.
8517
8518         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
8519         version of this method which takes a `PropertyInfo indexer'.
8520         (TypeManager.RegisterIndexer): New method.
8521
8522         * class.cs: Added myself as author of this file :-)
8523
8524 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8525
8526         * class.cs: fixed compilation on windoze.
8527
8528 2002-08-03  Martin Baulig  <martin@gnome.org>
8529
8530         * interface.cs (Interface.GetInterfaceBases): Check whether all
8531         base interfaces are at least as accessible than the current one.
8532
8533         * class.cs (TypeContainer.GetClassBases): Check whether base types
8534         are at least as accessible than the current type.
8535         (TypeContainer.AsAccessible): Implemented and made non-static.
8536         (MemberBase.CheckParameters): Report errors if the accessibility
8537         checks fail.
8538
8539         * delegate.cs (Delegate.Delegate): The default visibility is
8540         internal for top-level types and private for nested types.
8541         (Delegate.Define): Report errors if the accessibility checks fail.
8542
8543         * enum.cs (Enum.Enum): The default visibility is internal for
8544         top-level types and private for nested types.
8545         (Enum.DefineType): Compute the correct visibility.
8546
8547         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
8548         function which takes a `bool is_toplevel' instead of a TypeContainer.
8549
8550         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
8551         builtin type.
8552
8553 2002-08-02  Martin Baulig  <martin@gnome.org>
8554
8555         * expression.cs (LocalVariableReferenc): Added constructor which
8556         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
8557         (LocalVariableReference.IsReadOnly): New property.
8558         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
8559         variable is readonly, use our own readonly flag to do this; you can
8560         use the new constructor to get a writable reference to a read-only
8561         variable.
8562
8563         * cs-parser.jay (foreach_statement, using_statement): Get a writable
8564         reference to the local variable.
8565
8566 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
8567
8568         * rootcontext.cs (ResolveCore): Also include System.Exception
8569
8570         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
8571         we reach an EmptyStatement.
8572
8573         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
8574         is also fine.
8575
8576         * expression.cs (Binary.ResolveOperator): Check error result in
8577         two places.
8578
8579         use brtrue/brfalse directly and avoid compares to null.
8580
8581 2002-08-02  Martin Baulig  <martin@gnome.org>
8582
8583         * class.cs (TypeContainer.Define): Define all nested interfaces here.
8584         Fixes bug #28407, added test-155.cs.
8585
8586 2002-08-01  Martin Baulig  <martin@gnome.org>
8587
8588         * class.cs (Event.EmitDefaultMethod): Make this work with static
8589         events.  Fixes #28311, added verify-3.cs.
8590
8591 2002-08-01  Martin Baulig  <martin@gnome.org>
8592
8593         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
8594         `is_disposable' fields.
8595         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
8596         `hm.is_disposable' if we're using the collection pattern.
8597         (Foreach.EmitCollectionForeach): Use the correct type for the
8598         enumerator's local variable, only emit the try/finally block if
8599         necessary (fixes #27713).
8600
8601 2002-08-01  Martin Baulig  <martin@gnome.org>
8602
8603         * ecore.cs (Expression.report118): Renamed to Error118 and made
8604         it public static.
8605
8606         * statement.cs (Throw.Resolve): Check whether the expression is of
8607         the correct type (CS0118) and whether the type derives from
8608         System.Exception (CS0155).
8609         (Catch.Resolve): New method.  Do the type lookup here and check
8610         whether it derives from System.Exception (CS0155).
8611         (Catch.CatchType, Catch.IsGeneral): New public properties.
8612
8613         * typemanager.cs (TypeManager.exception_type): Added.
8614
8615 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
8616
8617         * driver.cs: Updated About function.
8618
8619 2002-07-31  Martin Baulig  <martin@gnome.org>
8620
8621         Implemented Control Flow Analysis.
8622
8623         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
8624         (EmitContext.CurrentBranching): Added.
8625         (EmitContext.StartFlowBranching): Added.
8626         (EmitContext.EndFlowBranching): Added.
8627         (EmitContext.KillFlowBranching): Added.
8628         (EmitContext.IsVariableAssigned): Added.
8629         (EmitContext.SetVariableAssigned): Added.
8630         (EmitContext.IsParameterAssigned): Added.
8631         (EmitContext.SetParameterAssigned): Added.
8632         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
8633         Added control flow analysis stuff here.
8634
8635         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
8636         resolve the expression as lvalue.
8637         (LocalVariableReference.DoResolve): Check whether the variable has
8638         already been assigned.
8639         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
8640         the parameter as assigned here.
8641         (ParameterReference.DoResolve): Check whether the parameter has already
8642         been assigned.
8643         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
8644         expression as lvalue.
8645
8646         * statement.cs (FlowBranching): New class for the flow analysis code.
8647         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
8648         (LabeledStatement.IsDefined): New public property.
8649         (LabeledStatement.AddUsageVector): New public method to tell flow
8650         analyis that the label may be reached via a forward jump.
8651         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
8652         flow analysis.
8653         (VariableInfo.Number): New public field.  This is used by flow analysis
8654         to number all locals of a block.
8655         (Block.CountVariables): New public property.  This is the number of
8656         local variables in this block (including the locals from all parent
8657         blocks).
8658         (Block.EmitMeta): Number all the variables.
8659
8660         * statement.cs: Added flow analysis support to all classes.
8661
8662 2002-07-31  Martin Baulig  <martin@gnome.org>
8663
8664         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
8665         To get debugging messages, compile mcs with /define:MCS_DEBUG and
8666         then use this argument.
8667
8668         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
8669
8670         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
8671         use this to specify /define options.
8672
8673 2002-07-29  Martin Baulig  <martin@gnome.org>
8674
8675         * statement.cs (Fixed): Moved all code that does variable lookups
8676         and resolvings from Emit to Resolve.
8677
8678         * statement.cs (For): Moved all code that does variable lookups
8679         and resolvings from Emit to Resolve.
8680
8681         * statement.cs (Using): Moved all code that does variable lookups
8682         and resolvings from Emit to Resolve.
8683
8684 2002-07-29  Martin Baulig  <martin@gnome.org>
8685
8686         * attribute.cs (Attribute.Resolve): Explicitly catch a
8687         System.NullReferenceException when creating the
8688         CustromAttributeBuilder and report a different warning message.
8689
8690 2002-07-29  Martin Baulig  <martin@gnome.org>
8691
8692         * support.cs (ParameterData.ParameterName): Added method to
8693         get the name of a parameter.
8694
8695         * typemanager.cs (TypeManager.IsValueType): New public method.
8696
8697 2002-07-29  Martin Baulig  <martin@gnome.org>
8698
8699         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
8700         is a flag which specifies that it's either ref or out.
8701         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
8702         the out parameter to `out Parameter.Modifier mod', also set the
8703         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
8704
8705         * support.cs (InternalParameters.ParameterModifier): Distinguish
8706         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8707         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8708
8709         * expression.cs (Argument.GetParameterModifier): Distinguish
8710         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8711         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8712
8713 2002-07-29  Martin Baulig  <martin@gnome.org>
8714
8715         * expression.cs (ParameterReference.ParameterReference): Added
8716         `Location loc' argument to the constructor.
8717
8718         * cs-parser.jay: Pass location to ParameterReference.
8719
8720 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
8721
8722         * statement.cs (Try): Initialize the location.
8723
8724         * cs-parser.jay: pass location to Try.
8725
8726         * expression.cs (Unary.Reduce): Change the prototype to return
8727         whether a constant fold could be performed or not.  The result is
8728         returned in an out parameters.  In the case of Indirection and
8729         AddressOf, we want to perform the full tests.
8730
8731 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
8732
8733         * statement.cs (Statement.Emit): Flag dead code.
8734
8735 2002-07-27  Andrew Birkett  <andy@nobugs.org>
8736
8737         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
8738
8739 2002-07-27  Martin Baulig  <martin@gnome.org>
8740
8741         * class.cs (MethodData.Define): Put back call to
8742         TypeManager.AddMethod(), accidentally commented this out.
8743
8744         * report.cs (Debug): New public method to print debugging information,
8745         this is `[Conditional ("DEBUG")]'.
8746
8747 2002-07-26  Martin Baulig  <martin@gnome.org>
8748
8749         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
8750         (switch_statement): Push the current_block to the switch_stack and
8751         pop it again when we're done with the switch.
8752         (switch_section): The new block is a child of the current_block.
8753         Fixes bug #24007, added test-152.cs.
8754
8755 2002-07-27  Martin Baulig  <martin@gnome.org>
8756
8757         * expression.cs (Invocation.EmitArguments): When calling a varargs
8758         function with only its fixed arguments, we need to pass an empty
8759         array.
8760
8761 2002-07-27  Martin Baulig  <martin@gnome.org>
8762
8763         Mono 0.13 has been released.
8764
8765 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
8766
8767         * driver.cs: Rename --resource to --linkres, because that is what
8768         we do currently, we dont support --resource yet.
8769
8770         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
8771
8772 2002-07-25  Martin Baulig  <martin@gnome.org>
8773
8774         * class.cs (MethodData): New public class.  This is a `method builder'
8775         class for a method or one accessor of a Property/Indexer/Event.
8776         (MethodData.GetMethodFlags): Moved here from MemberBase.
8777         (MethodData.ApplyAttributes): Likewise.
8778         (MethodData.ApplyObsoleteAttribute): Likewise.
8779         (MethodData.ApplyConditionalAttribute): Likewise.
8780         (MethodData.ApplyDllImportAttribute): Likewise.
8781         (MethodData.CheckAbstractAndExternal): Likewise.
8782         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
8783         (MethodData.Emit): Formerly known as Method.Emit().
8784         (MemberBase): Moved everything which was specific to a single
8785         accessor/method to MethodData.
8786         (Method): Create a new MethodData and call Define() and Emit() on it.
8787         (Property, Indexer, Event): Create a new MethodData objects for each
8788         accessor and call Define() and Emit() on them.
8789
8790 2002-07-25  Martin Baulig  <martin@gnome.org>
8791
8792         Made MethodCore derive from MemberBase to reuse the code from there.
8793         MemberBase now also checks for attributes.
8794
8795         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
8796         (MemberBase.GetMethodFlags): Moved here from class Method and marked
8797         as virtual.
8798         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
8799         `CallingConventions cc' and `Attributes opt_attrs' arguments.
8800         (MemberBase.ApplyAttributes): New virtual method; applies the
8801         attributes to a method or accessor.
8802         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
8803         (MemberBase.ApplyConditionalAttribute): Likewise.
8804         (MemberBase.ApplyDllImportAttribute): Likewise.
8805         (MemberBase.CheckAbstractAndExternal): Likewise.
8806         (MethodCore.ParameterTypes): This is now a property instead of a
8807         method, it's initialized from DoDefineParameters().
8808         (MethodCore.ParameterInfo): Removed the set accessor.
8809         (MethodCore.DoDefineParameters): New protected virtual method to
8810         initialize ParameterTypes and ParameterInfo.
8811         (Method.GetReturnType): We can now simply return the MemberType.
8812         (Method.GetMethodFlags): Override the MemberBase version and add
8813         the conditional flags.
8814         (Method.CheckBase): Moved some code from Define() here, call
8815         DoDefineParameters() here.
8816         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
8817         here to avoid some larger code duplication.
8818         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
8819         ensure that abstract and external accessors don't declare a body.
8820
8821         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
8822         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
8823         lookup in the attribute's parent classes, so we need to abort as soon
8824         as we found the first match.
8825         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
8826         the attribute has no arguments.
8827
8828         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
8829         of a Method.
8830
8831 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8832
8833         * cs-parser.jay: reverted previous patch.
8834
8835 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8836
8837         * cs-parser.jay: fixed bug #22119.
8838
8839 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8840
8841         * attribute.cs: fixed compilation. The error was:
8842         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
8843         be assigned to before control leaves the current method."
8844         [FIXME:  Filed as bug #28186: MCS must report this error.]
8845
8846 2002-07-25  Martin Baulig  <martin@gnome.org>
8847
8848         * attribute.cs (Attribute.Conditional_GetConditionName): New static
8849         method to pull the condition name ouf of a Conditional attribute.
8850         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
8851         the obsolete message and error flag out of an Obsolete attribute.
8852
8853         * class.cs (Method.GetMethodFlags): New public method to get the
8854         TypeManager.MethodFlags for this method.
8855         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
8856         private methods.
8857         (Method.Define): Get and apply the Obsolete and Conditional attributes;
8858         if we're overriding a virtual function, set the new private variable
8859         `parent_method'; call the new TypeManager.AddMethod().
8860
8861         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
8862         the MethodBuilder and the Method in a PtrHashtable.
8863         (TypeManager.builder_to_method): Added for this purpose.
8864         (TypeManager.MethodFlags): Added IsObsoleteError.
8865         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
8866         Obsolete and Conditional arguments in MethodBuilders.  If we discover
8867         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
8868         the message from the attribute.
8869
8870 2002-07-24  Martin Baulig  <martin@gnome.org>
8871
8872         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
8873         preprocessor directives, ensure that the argument to #define/#undef is
8874         exactly one identifier and that it's actually an identifier.
8875
8876         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
8877         did not work ....
8878
8879 2002-07-24  Martin Baulig  <martin@gnome.org>
8880
8881         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
8882         initialize it to TypeManager.object_type in the constructor.
8883         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
8884         of the `hm.get_current' method if we're using the collection pattern.
8885         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
8886         for the explicit conversion to make it work when we're using the collection
8887         pattern and the `Current' property has a different return type than `object'.
8888         Fixes #27713.
8889
8890 2002-07-24  Martin Baulig  <martin@gnome.org>
8891
8892         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
8893         does not match, but don't report any errors.  This method is called in
8894         order for all methods in a MethodGroupExpr until a matching method is
8895         found, so we don't want to bail out if the first method doesn't match.
8896         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
8897         matches, report the 123.  Fixes #28070.
8898
8899 2002-07-24  Martin Baulig  <martin@gnome.org>
8900
8901         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
8902         TypeManager.TypeToCoreType() to the top of the method so the
8903         following equality checks will work.  Fixes #28107.
8904
8905 2002-07-24  Martin Baulig  <martin@gnome.org>
8906
8907         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
8908         operand is of type uint, and the other operand is of type sbyte,
8909         short or int, the operands are converted to type long." -
8910         Actually do what this comment already told us.  Fixes bug #28106,
8911         added test-150.cs.
8912
8913 2002-07-24  Martin Baulig  <martin@gnome.org>
8914
8915         * class.cs (MethodBase): New abstract class.  This is now a base
8916         class for Property, Indexer and Event to avoid some code duplication
8917         in their Define() and DefineMethods() methods.
8918         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
8919         generic methods for Define() and DefineMethods().
8920         (FieldBase): Derive from MemberBase, not MemberCore.
8921         (Property): Derive from MemberBase, not MemberCore.
8922         (Property.DefineMethod): Moved all the code from this method to the
8923         new MethodBase.DefineAccessor(), just call it with appropriate
8924         argumetnts.
8925         (Property.Define): Call the new Property.DoDefine(), this does some
8926         sanity checks and we don't need to duplicate the code everywhere.
8927         (Event): Derive from MemberBase, not MemberCore.
8928         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
8929         accessors, this will also make them work with interface events.
8930         (Indexer): Derive from MemberBase, not MemberCore.
8931         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
8932         (Indexer.Define): Use the new MethodBase functions.
8933
8934         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
8935         argument to the constructor.
8936         (Interface.FindMembers): Added support for interface events.
8937         (Interface.PopluateEvent): Implemented.
8938
8939         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
8940
8941 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
8942
8943         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
8944         but this is required to check for a method name being the same as
8945         the containing class.  
8946
8947         Handle this now.
8948
8949 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8950
8951         * interface.cs: initialize variable.
8952
8953 2002-07-23  Martin Baulig  <martin@gnome.org>
8954
8955         Implemented the IndexerName attribute in interfaces.
8956
8957         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
8958         name if this is an explicit interface implementation.
8959         (Indexer.InterfaceIndexerName): New public variable.  If we're
8960         implementing an interface indexer, this is the IndexerName in that
8961         interface.  Otherwise, it's the IndexerName.
8962         (Indexer.DefineMethod): If we're implementing interface indexer,
8963         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
8964         and Pending.ImplementIndexer methods.
8965         (Indexer.Define): Also define the PropertyBuilder if we're
8966         implementing an interface indexer and this is neither an explicit
8967         interface implementation nor do the IndexerName match the one in
8968         the interface.
8969
8970         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
8971         If a method is defined here, then we always need to create a proxy
8972         for it.  This is used when implementing interface indexers.
8973         (Pending.IsInterfaceIndexer): New public method.
8974         (Pending.ImplementIndexer): New public method.
8975         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
8976         This is used when implementing interface indexers to define a proxy
8977         if necessary.
8978         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
8979         define a proxy if necessary.
8980
8981         * interface.cs (Interface.IndexerName): New public variable.
8982         (Interface.PopulateIndexer): Set the IndexerName.
8983         (Interface.DefineIndexers): New private method.  Populate all the
8984         indexers and make sure their IndexerNames match.
8985
8986         * typemanager.cs (IndexerPropertyName): Added support for interface
8987         indexers.
8988
8989 2002-07-22  Martin Baulig  <martin@gnome.org>
8990
8991         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
8992         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
8993         ret if HasReturnLabel.
8994         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
8995         variables.
8996
8997         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
8998         and set the ec.LoopBeginTryCatchLevel.
8999         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9000         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9001         the current ec.TryCatchLevel, the branch goes out of an exception
9002         block.  In this case, we need to use Leave and not Br.
9003
9004 2002-07-22  Martin Baulig  <martin@gnome.org>
9005
9006         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9007         block unless the block does not always return or it is contained in
9008         another try { ... } catch { ... } block.  Fixes bug #26506.
9009         Added verify-1.cs to the test suite.
9010
9011 2002-07-22  Martin Baulig  <martin@gnome.org>
9012
9013         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9014         then we do not always return.  Fixes bug #24985.
9015
9016 2002-07-22  Martin Baulig  <martin@gnome.org>
9017
9018         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9019         lookup on a per-class level; ie. walk up the class hierarchy until we
9020         found at least one applicable method, then choose the best among them.
9021         Fixes bug #24463 and test-29.cs.
9022
9023 2002-07-22  Martin Baulig  <martin@gnome.org>
9024
9025         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9026         return types of the methods.  The return type is not part of the
9027         signature and we must not check it to make the `new' modifier work.
9028         Fixes bug #27999, also added test-147.cs.
9029         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9030
9031         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9032         on the method's return type.
9033
9034 2002-07-21  Martin Baulig  <martin@gnome.org>
9035
9036         * assign.cs: Make this work if the rightmost source is a constant and
9037         we need to do an implicit type conversion.  Also adding a few more tests
9038         to test-38.cs which should have caught this.
9039
9040         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9041         target in the makefile for this.  The makefile.gnu is primarily intended
9042         for end-users who don't want to debug the compiler.
9043
9044 2002-07-21  Martin Baulig  <martin@gnome.org>
9045
9046         * assign.cs: Improved the Assign class so it can now handle embedded
9047         assignments (X = Y = Z = something).  As a side-effect this'll now also
9048         consume less local variables.  test-38.cs now passes with MCS, added
9049         a few new test cases to that test.
9050
9051 2002-07-20  Martin Baulig  <martin@gnome.org>
9052
9053         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
9054         instructions.  Fixes bug #27977, also added test-146.cs.
9055
9056 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9057
9058         * cs-tokenizer.cs: fixed getHex ().
9059
9060 2002-07-19  Martin Baulig  <martin@gnome.org>
9061
9062         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
9063         not Type.GetType() to lookup the array type.  This is needed when
9064         we're constructing an array of a user-defined type.
9065         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
9066         single-dimensional arrays, but also for single-dimensial arrays of
9067         type decimal.
9068
9069 2002-07-19  Martin Baulig  <martin@gnome.org>
9070
9071         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
9072         this function is called, it's not allowed to share LocalBuilders
9073         among ILGenerators.
9074
9075 2002-07-19  Martin Baulig  <martin@gnome.org>
9076
9077         * expression.cs (Argument.Resolve): Report an error 118 when trying
9078         to pass a type as argument.
9079
9080 2002-07-18  Martin Baulig  <martin@gnome.org>
9081
9082         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
9083         Conv_R_Un for the signed `long' type.
9084
9085 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
9086
9087         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
9088         `expr' for the temporary result, as that will fail if we do
9089         multiple resolves on the same expression.
9090
9091 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
9092
9093         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
9094         ec.TypeContainer for looking up aliases. 
9095
9096         * class.cs (TypeContainer): Remove LookupAlias from here.
9097
9098         * decl.cs (DeclSpace); Move here.
9099
9100 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
9101
9102         * class.cs (FindMembers): Only call filter if the constructor
9103         bulider is not null.
9104
9105         Also handle delegates in `NestedTypes' now.  Now we will perform
9106         type lookups using the standard resolution process.  This also
9107         fixes a bug.
9108
9109         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
9110         This uses Expressions (the limited kind that can be parsed by the
9111         tree) instead of strings.
9112
9113         * expression.cs (ComposedCast.ToString): Implement, used to flag
9114         errors since now we have to render expressions.
9115
9116         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
9117         FormArrayType. 
9118
9119         * ecore.cs (SimpleName.ToString): ditto.
9120
9121         * cs-parser.jay: Instead of using strings to assemble types, use
9122         Expressions to assemble the type (using SimpleName, ComposedCast,
9123         MemberAccess).  This should fix the type lookups in declarations,
9124         because we were using a different code path for this.
9125
9126         * statement.cs (Block.Resolve): Continue processing statements
9127         even when there is an error.
9128
9129 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
9130
9131         * class.cs (Event.Define): Also remove the `remove' method from
9132         the list of pending items.
9133
9134         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
9135         generate more compact code. 
9136
9137 2002-07-17  Martin Baulig  <martin@gnome.org>
9138
9139         * const.cs (Const.LookupConstantValue): Add support for constant
9140         `unchecked' and `checked' expressions.
9141         Also adding test case test-140.cs for this.
9142
9143 2002-07-17  Martin Baulig  <martin@gnome.org>
9144
9145         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
9146         check whether mi.ReturnType implements the IEnumerator interface; the
9147         `==' and the IsAssignableFrom() will fail in this situation.
9148
9149 2002-07-16  Ravi Pratap  <ravi@ximian.com>
9150
9151         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
9152         here too.
9153
9154 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9155
9156         * expression.cs: fixed bug #27811.
9157
9158 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
9159
9160         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
9161         Molaro: when we are a ref, the value already contains a pointer
9162         value, do not take the address of it.
9163
9164 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
9165         * removed mb-parser.jay and mb-tokenizer.cs
9166
9167 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9168
9169         * expression.cs: check against the building corlib void type.
9170
9171 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
9172
9173         * ecore.cs: fix for valuetype static readonly fields: when 
9174         initializing them, we need their address, not the address of a copy.
9175
9176 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
9177
9178         * typemanager.cs: register also enum_type in corlib.
9179
9180 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9181
9182         * class.cs: allow calling this (but not base) initializers in structs.
9183
9184 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
9185
9186         * ecore.cs: make sure we compare against the building base types
9187         in GetTypeSize ().
9188
9189 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
9190
9191         * typemanager.cs: fix TypeToCoreType() to handle void and object
9192         (corlib gets no more typerefs after this change).
9193
9194 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
9195
9196         * expression.cs (ArrayCreation.EmitArrayArguments): use
9197         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
9198
9199         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
9200         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
9201         array indexes, the runtime actually forbids them.
9202
9203         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
9204         for array arguments here.
9205
9206         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
9207         instead of the default for ValueTypes.
9208
9209         (New.DoEmit): Use IsValueType instead of
9210         IsSubclassOf (value_type)
9211         (New.DoResolve): ditto.
9212         (Invocation.EmitCall): ditto.
9213
9214         * assign.cs (Assign): ditto.
9215
9216         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
9217         Statements *are* currently doing part of their resolution during
9218         Emit.  
9219
9220         Expressions do always resolve during resolve, but statements are
9221         only required to propagate resolution to their children.
9222
9223 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
9224
9225         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
9226
9227         (LoadAssembly): Do not add the dll if it is already specified
9228
9229         (MainDriver): Add the System directory to the link path at the end,
9230         after all the other -L arguments. 
9231
9232         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
9233         wrong opcode for loading bytes and bools (ldelem.i1 instead of
9234         ldelem.u1) and using the opposite for sbytes.
9235
9236         This fixes Digger, and we can finally run it.
9237
9238         * driver.cs (UnixParseOption): Move the option parsing here.  
9239         (CSCParseOption): Implement CSC-like parsing of options.
9240
9241         We now support both modes of operation, the old Unix way, and the
9242         new CSC-like way.  This should help those who wanted to make cross
9243         platform makefiles.
9244
9245         The only thing broken is that /r:, /reference: and /lib: are not
9246         implemented, because I want to make those have the same semantics
9247         as the CSC compiler has, and kill once and for all the confussion
9248         around this.   Will be doing this tomorrow.
9249
9250         * statement.cs (Unsafe.Resolve): The state is checked during
9251         resolve, not emit, so we have to set the flags for IsUnsfe here.
9252
9253 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9254
9255         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
9256         not catch the Error_ObjectRefRequired in SimpleName (as it is
9257         possible to have a class/instance variable name that later gets
9258         deambiguated), we have to check this here.      
9259
9260 2002-07-10  Ravi Pratap  <ravi@ximian.com>
9261
9262         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
9263         make static and put into Expression.
9264
9265         (Event.Define): Register the private field of the event with the 
9266         TypeManager so that GetFieldFromEvent can get at it.
9267
9268         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
9269         keep track of the private field associated with an event which
9270         has no accessors.
9271
9272         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
9273         private field.
9274
9275         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
9276
9277 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9278
9279         * expression.cs (Binary.EmitBranchable): this routine emits the
9280         Binary expression in a branchable context.  This basically means:
9281         we need to branch somewhere, not just get the value on the stack.
9282
9283         This works together with Statement.EmitBoolExpression.
9284
9285         * statement.cs (Statement.EmitBoolExpression): Use
9286         EmitBranchable. 
9287
9288 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
9289
9290         * statement.cs (For): Reduce the number of jumps in loops.
9291
9292         (For): Implement loop inversion for the For statement.
9293
9294         (Break): We can be breaking out of a Try/Catch controlled section
9295         (foreach might have an implicit try/catch clause), so we need to
9296         use Leave instead of Br.
9297
9298         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
9299         now).  If the instace expression supports IMemoryLocation, we use
9300         the AddressOf method from the IMemoryLocation to extract the
9301         address instead of emitting the instance.
9302
9303         This showed up with `This', as we were emitting the instance
9304         always (Emit) instead of the Address of This.  Particularly
9305         interesting when This is a value type, as we dont want the Emit
9306         effect (which was to load the object).
9307
9308 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
9309
9310         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
9311
9312         * statement.cs (Checked): Set the CheckedState during the resolve
9313         process too, as the ConvCast operations track the checked state on
9314         the resolve process, and not emit.
9315
9316         * cs-parser.jay (namespace_member_declaration): Flag that we have
9317         found a declaration when we do.  This is used to flag error 1529
9318
9319         * driver.cs: Report ok when we display the help only.
9320
9321 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
9322
9323         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
9324
9325 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
9326
9327         * cs-tokenizer.cs (define): We also have to track locally the
9328         defines.  AllDefines is just used for the Conditional Attribute,
9329         but we also need the local defines for the current source code. 
9330
9331 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
9332
9333         * statement.cs (While, For, Do): These loops can exit through a
9334         Break statement, use this information to tell whether the
9335         statement is the last piece of code.
9336
9337         (Break): Flag that we break.
9338
9339         * codegen.cs (EmitContexts): New `Breaks' state variable.
9340
9341 2002-07-03  Martin Baulig  <martin@gnome.org>
9342
9343         * class.cs (TypeContainer.MethodModifiersValid): Allow override
9344         modifiers in method declarations in structs.  Otherwise, you won't
9345         be able to override things like Object.Equals().
9346
9347 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9348
9349         * class.cs (Method, Property, Indexer): Do not allow the public
9350         modifier to be used in explicit interface implementations.
9351
9352         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
9353         override modifiers in method declarations in structs
9354
9355 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
9356
9357         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
9358         integer or real overflow, report an error
9359
9360 2002-07-02  Martin Baulig  <martin@gnome.org>
9361
9362         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
9363         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
9364         to tell the runtime about our newly created System.Object and
9365         System.ValueType types.
9366
9367 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9368
9369         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
9370         struct instead of Ldarg/Starg.
9371
9372 2002-07-02  Martin Baulig  <martin@gnome.org>
9373
9374         * expression.cs (Indirection.Indirection): Call
9375         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
9376
9377 2002-07-02  Martin Baulig  <martin@gnome.org>
9378
9379         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
9380         ValueType, call TypeManager.TypeToCoreType() on it.
9381         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
9382         the OpCodes.Newarr argument.
9383
9384 2002-07-02  Martin Baulig  <martin@gnome.org>
9385
9386         * expression.cs (Invocation.EmitCall): When compiling corlib,
9387         replace all calls to the system's System.Array type to calls to
9388         the newly created one.
9389
9390         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
9391         System.Array methods.
9392         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
9393         from the system's System.Array type which must be replaced.
9394
9395 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
9396
9397         * typemanager.cs: load unverifiable_code_ctor so we can build
9398         corlib using the correct type. Avoid using GetTypeCode() with
9399         TypeBuilders.
9400         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
9401         TypeManager.object_type to allow building corlib.
9402
9403 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
9404
9405         * ecore.cs: handle System.Enum separately in LoadFromPtr().
9406
9407 2002-07-01  Martin Baulig  <martin@gnome.org>
9408
9409         * class.cs: Make the last change actually work, we need to check
9410         whether `ifaces != null' to avoid a crash.
9411
9412 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9413
9414         * class.cs: when we build structs without fields that implement
9415         interfaces, we need to add the interfaces separately, since there is
9416         no API to both set the size and add the interfaces at type creation
9417         time.
9418
9419 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9420
9421         * expression.cs: the dimension arguments to the array constructors
9422         need to be converted if they are a long.
9423
9424 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
9425
9426         * class.cs: don't emit ldarg.0 if there is no parent constructor
9427         (fixes showstopper for corlib).
9428
9429 2002-06-29  Martin Baulig  <martin@gnome.org>
9430
9431         MCS now compiles corlib on GNU/Linux :-)
9432
9433         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
9434         ie. check for MethodImplOptions.InternalCall.
9435
9436         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
9437         and TypeManager.attribute_type are null, so we must explicitly check
9438         whether parent is not null to find out whether it's an attribute type.
9439         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
9440         and SetBuilder, not only if the property is neither abstract nor external.
9441         This is necessary to set the MethodImplOptions on the accessor methods.
9442         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
9443         SetBuilder, see Property.Emit().
9444
9445         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
9446         populate "System.Object", "System.ValueType" and "System.Attribute" since
9447         they've already been populated from BootCorlib_PopulateCoreTypes().
9448
9449 2002-06-29  Martin Baulig  <martin@gnome.org>
9450
9451         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
9452         is the NullLiteral, we also need to make sure that target_type is not
9453         an enum type.   
9454
9455 2002-06-29  Martin Baulig  <martin@gnome.org>
9456
9457         * rootcontext.cs (RootContext.ResolveCore): We must initialize
9458         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
9459         before calling BootstrapCorlib_ResolveDelegate ().
9460
9461 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9462
9463         * statement.cs: fixed build-breaker. All tests passed ok.
9464
9465 2002-06-27  Martin Baulig  <martin@gnome.org>
9466
9467         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
9468         for System.Decimal when compiling corlib.
9469
9470 2002-06-27  Martin Baulig  <martin@gnome.org>
9471
9472         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
9473         switch blocks which contain nothing but a default clause.
9474
9475 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
9476
9477        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
9478
9479 2002-06-27  Martin Baulig  <martin@gnome.org>
9480
9481         * ecore.cs (PropertyExpr.PropertyExpr): Call
9482         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
9483
9484         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
9485         is already a TypeBuilder.
9486
9487 2002-06-27  Martin Baulig  <martin@gnome.org>
9488
9489         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
9490         `target_type == TypeManager.array_type', not IsAssignableFrom() in
9491         the "from an array-type to System.Array" case.  This makes it work
9492         when compiling corlib.
9493
9494 2002-06-27  Martin Baulig  <martin@gnome.org>
9495
9496         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
9497         non-static PropertyExpr, set its InstanceExpression.  This makes
9498         the `ICollection.Count' property work in System/Array.cs.
9499
9500 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
9501
9502         * driver.cs: Made error handling more consistent.  Errors now
9503         tracked by Report class, so many methods which used to return int
9504         now return void.  Main() now prints success/failure and 
9505         errors/warnings message.
9506
9507         Renamed '--probe' compiler argument to '--expect-error'.  Removed
9508         the magic number return values (123 and 124).  Now, if the
9509         expected error occurs, the compiler exits with success (exit value
9510         0).  If the compilation completes without seeing that particular
9511         error, the compiler exits with failure (exit value 1).  The
9512         makefile in mcs/errors has been changed to handle the new behaviour.
9513
9514         * report.cs: Made 'expected error' number a property and renamed
9515         it from 'Probe' to 'ExpectedError'.
9516
9517         * genericparser.cs: Removed error handling support, since it is
9518         now all done by Report class.
9519
9520         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
9521         class, so parse() no longer returns an int.
9522
9523         * namespace.cs: Use Report.Error instead of GenericParser.error
9524
9525 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
9526
9527         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
9528         TypeContainer.AddOperator): At the front of the list put the
9529         explicit implementations, so they get resolved/defined first. 
9530
9531 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
9532
9533         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
9534         interface type is implemented by this TypeContainer.  Used during
9535         explicit interface implementation.
9536
9537         (Property.Define, Indexer.Define, Method.Define): Validate that
9538         the given interface in the explicit implementation is one of the
9539         base classes for the containing type.
9540
9541         Also if we are explicitly implementing an interface, but there is
9542         no match in the pending implementation table, report an error.
9543
9544         (Property.Define): Only define the property if we are
9545         not explicitly implementing a property from an interface.  Use the
9546         correct name also for those properties (the same CSC uses,
9547         although that is really not needed).
9548
9549         (Property.Emit): Do not emit attributes for explicitly implemented
9550         properties, as there is no TypeBuilder.
9551
9552         (Indexer.Emit): ditto.
9553
9554         Hiding then means that we do not really *implement* a pending
9555         implementation, which makes code fail.
9556
9557 2002-06-22  Martin Baulig  <martin@gnome.org>
9558
9559         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
9560         the return value of Object.GetType().  [FIXME: we need to do this whenever
9561         we get a type back from the reflection library].
9562
9563 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
9564
9565         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
9566
9567 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
9568
9569         * attribute.cs: Return null if we can not look up the type.
9570
9571         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
9572         the interface types found.
9573
9574         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
9575         interface types found.
9576
9577         * typemanager.cs (GetInterfaces): Make this routine returns alll
9578         the interfaces and work around the lame differences between
9579         System.Type and System.Reflection.Emit.TypeBuilder in the results
9580         result for GetInterfaces.
9581
9582         (ExpandInterfaces): Given an array of interface types, expand and
9583         eliminate repeated ocurrences of an interface.  This expands in
9584         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
9585         be IA, IB, IC.
9586
9587 2002-06-21  Martin Baulig  <martin@gnome.org>
9588
9589         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
9590         on System.Enum.
9591
9592 2002-06-21  Martin Baulig  <martin@gnome.org>
9593
9594         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
9595         and called with one of the core types, return the corresponding typebuilder for
9596         that type.
9597
9598         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
9599         element type.
9600
9601 2002-06-21  Martin Baulig  <martin@gnome.org>
9602
9603         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
9604         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
9605         (Expression.ConvertReferenceExplicit): Likewise.
9606
9607         * expression.cs (ElementAccess.DoResolve): Likewise.
9608         (ElementAccess.DoResolveLValue): Likewise.
9609
9610 2002-06-10  Martin Baulig  <martin@gnome.org>
9611
9612         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
9613         add the "value" parameter to the parameter list.
9614
9615         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
9616         to our caller.
9617
9618 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
9619
9620         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
9621         the argument to an int, uint, long or ulong, per the spec.  Also
9622         catch negative constants in array creation.
9623
9624 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
9625
9626         * class.cs: do not allow the same interface to appear twice in
9627         the definition list.
9628
9629 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
9630
9631         * ecore.cs: don't use ldlen with System.Array.
9632
9633 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
9634
9635         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
9636
9637 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
9638
9639         * modifiers.cs: produce correct field attributes for protected
9640         internal. Easy fix so miguel can work on ther harder stuff:-)
9641
9642 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
9643
9644         * pending.cs: New file.  Move the code from class.cs here.
9645         Support clearning the pending flag for all methods (when not doing
9646         explicit interface implementation).
9647
9648 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
9649
9650         * rootcontext.cs: added a couple more types needed to bootstrap.
9651
9652 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
9653
9654         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
9655         constructor in the type, instead of any constructor in the type
9656         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
9657         a bug in the Mono runtime when applying the params attribute). 
9658
9659 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
9660         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
9661
9662 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
9663
9664         * expression.cs (Unary.ResolveOperator): Use TypeManager
9665         to resolve the type.
9666
9667 2002-06-13  Ravi Pratap  <ravi@ximian.com>
9668
9669         * cs-parser.jay (enum_member_declaration): Pass in the attributes
9670         attached.
9671
9672         * enum.cs (AddEnumMember): Add support to store the attributes associated 
9673         with each member too.
9674
9675         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
9676         field builders too - this takes care of the enum member case.
9677
9678 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
9679
9680         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
9681         address-of operator on both value types and pointers.
9682
9683 2002-06-10  Martin Baulig  <martin@gnome.org>
9684
9685         * interface.cs (Interface.PopulateIndexer): Add the indexer's
9686         PropertyBuilder to the `property_builders' list.
9687
9688         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
9689         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
9690         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
9691         find any indexers which are inherited from an interface.
9692
9693 2002-06-09  Martin Baulig  <martin@gnome.org>
9694
9695         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
9696         the same type as the constant if necessary.  There's also a test-130.cs
9697         for this.
9698
9699         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
9700
9701         * typemanager.cs (TypeManager.ChangeType): Previously known as
9702         Enum.ChangeEnumType().
9703
9704 2002-06-09  Martin Baulig  <martin@gnome.org>
9705
9706         * expression.cs (Cast.TryReduce): Added support for consts.
9707
9708 2002-06-08  Ravi Pratap  <ravi@ximian.com>
9709
9710         * class.cs (Accessor): Hold attributes information so we can pass
9711         it along.
9712
9713         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
9714         Modify to pass in attributes attached to the methods.
9715
9716         (add_accessor_declaration, remove_accessor_declaration): Ditto.
9717
9718         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
9719         to handle the Accessor kind :-)
9720
9721         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
9722
9723 2002-06-08  Martin Baulig  <martin@gnome.org>
9724
9725         * expression.cs (Unary.TryReduceNegative): Added support for
9726         ULongConstants.
9727
9728 2002-06-08  Martin Baulig  <martin@gnome.org>
9729
9730         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
9731         name can't be found in the `defined_names' - the caller will do a
9732         MemberLookup in this case and thus find methods in System.Enum
9733         such as Enum.IsDefined().
9734
9735 2002-06-08  Martin Baulig  <martin@gnome.org>
9736
9737         * enum.cs (Enum.ChangeEnumType): This is a custom version of
9738         Convert.ChangeType() which works with TypeBuilder created types.
9739         (Enum.LookupEnumValue, Enum.Define): Use it here.
9740
9741         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
9742         `TypeBuilder.BaseType != null' check.
9743         (TypeContainer.FindMembers): Only lookup parent members if we
9744         actually have a parent.
9745         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
9746         (ConstructorInitializer.Resolve): Likewise.
9747
9748         * interface.cs (Interface.FindMembers): Added
9749         `TypeBuilder.BaseType != null' check.
9750
9751         * rootcontext.cs (RootContext.ResolveCore): Added
9752         "System.Runtime.CompilerServices.IndexerNameAttribute" to
9753         classes_second_stage.
9754
9755         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
9756         debug_type and trace_type when compiling with --nostdlib.       
9757
9758 2002-06-07  Martin Baulig  <martin@gnome.org>
9759
9760         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
9761         (AddField): Set it to true when adding a non-static field.
9762         (DefineType): Use `have_nonstatic_fields' to find out whether we
9763         have non-static fields, not `Fields != null'.
9764
9765 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
9766
9767         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
9768         dereferencing a null on the static-field code path)
9769
9770 2002-05-30  Martin Baulig  <martin@gnome.org>
9771
9772         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
9773         to take command line arguments.  Use reflection to call the new
9774         custom `Initialize' function on the symbol writer and pass it the
9775         command line arguments.
9776
9777         * driver.cs (--debug-args): New command line argument to pass command
9778         line arguments to the symbol writer.
9779
9780 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
9781
9782         * assign.cs (DoResolve): Forgot to do the implicit conversion to
9783         the target type for indexers and properties.  Thanks to Joe for
9784         catching this.
9785
9786 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
9787
9788         * typemanager.cs (MethodFlags): returns the method flags
9789         (Obsolete/ShouldIgnore) that control warning emission and whether
9790         the invocation should be made, or ignored. 
9791
9792         * expression.cs (Invocation.Emit): Remove previous hack, we should
9793         not do this on matching a base type, we should do this based on an attribute
9794
9795         Only emit calls to System.Diagnostics.Debug and
9796         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
9797         on the command line.
9798
9799         * rootcontext.cs: Global settings for tracing and debugging.
9800
9801         * cs-tokenizer.cs (define): New utility function to track
9802         defines.   Set the global settings for TRACE and DEBUG if found.
9803
9804 2002-05-25  Ravi Pratap  <ravi@ximian.com>
9805
9806         * interface.cs (Populate*): Pass in the TypeContainer as well as
9807         the DeclSpace as parameters so that we can create EmitContexts and
9808         then use that to apply attributes etc.
9809
9810         (PopulateMethod, PopulateEvent, PopulateProperty)
9811         (PopulateIndexer): Apply attributes everywhere.
9812
9813         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
9814         etc.
9815
9816         (ApplyAttributes): Update accordingly.
9817
9818         We now apply interface attributes for all members too.
9819
9820 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
9821
9822         * class.cs (Indexer.Define); Correctly check if we are explicit
9823         implementation (instead of checking the Name for a ".", we
9824         directly look up if the InterfaceType was specified).
9825
9826         Delay the creation of the PropertyBuilder.
9827
9828         Only create the PropertyBuilder if we are not an explicit
9829         interface implementation.   This means that explicit interface
9830         implementation members do not participate in regular function
9831         lookups, and hence fixes another major ambiguity problem in
9832         overload resolution (that was the visible effect).
9833
9834         (DefineMethod): Return whether we are doing an interface
9835         implementation. 
9836
9837         * typemanager.cs: Temporary hack until we get attributes in
9838         interfaces (Ravi is working on that) and we get IndexerName
9839         support in interfaces.
9840
9841         * interface.cs: Register the indexers as properties.
9842
9843         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
9844         warning, I have verified that this is a bug in the .NET runtime
9845         (JavaScript suffers of the same problem).
9846
9847         * typemanager.cs (MemberLookup): When looking up members for
9848         interfaces, the parent of an interface is the implicit
9849         System.Object (so we succeed in searches of Object methods in an
9850         interface method invocation.  Example:  IEnumerable x;  x.ToString
9851         ()) 
9852
9853 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
9854
9855         * class.cs (Event): Events should also register if they do
9856         implement the methods that an interface requires.
9857
9858         * typemanager.cs (MemberLookup); use the new GetInterfaces
9859         method. 
9860
9861         (GetInterfaces): The code used to lookup interfaces for a type is
9862         used in more than one place, factor it here. 
9863
9864         * driver.cs: Track the errors at the bottom of the file, we kept
9865         on going.
9866
9867         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
9868         instance if the method we are calling is static!
9869
9870 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
9871
9872         * attribute.cs (ApplyAttributes): Make this function filter out
9873         the IndexerName attribute (as that attribute in reality is never
9874         applied) and return the string constant for the IndexerName
9875         attribute. 
9876
9877         * class.cs (TypeContainer.Emit): Validate that all the indexers
9878         have the same IndexerName attribute, and if so, set the
9879         DefaultName attribute on the class. 
9880
9881         * typemanager.cs: The return value might contain other stuff (not
9882         only methods).  For instance, consider a method with an "Item"
9883         property and an Item method.
9884
9885         * class.cs: If there is a problem with the parameter types,
9886         return. 
9887
9888 2002-05-24  Ravi Pratap  <ravi@ximian.com>
9889
9890         * ecore.cs (ImplicitConversionExists): Wrapper function which also
9891         looks at user defined conversion after making a call to 
9892         StandardConversionExists - we need this for overload resolution.
9893
9894         * expression.cs : Update accordingly the various method calls.
9895
9896         This fixes 2 bugs filed against implicit user defined conversions 
9897
9898 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
9899
9900         * statement.cs: Track the result of the assignment.
9901
9902 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
9903
9904         * expression.cs (MemberAccess): Improved error reporting for
9905         inaccessible members.
9906
9907 2002-05-22  Martin Baulig  <martin@gnome.org>
9908
9909         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
9910         itself with debugging support.
9911
9912 2002-05-22  Martin Baulig  <martin@gnome.org>
9913
9914         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
9915         Removed, this isn't needed anymore.
9916
9917 2002-05-20  Martin Baulig  <martin@gnome.org>
9918
9919         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
9920         be underlying type for an enum.
9921
9922 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
9923
9924         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
9925         that splits out the loading of just the core types.
9926
9927         * rootcontext.cs (ResolveCore): Split the struct resolution in
9928         two, so we can load the enumeration underlying types before any
9929         enums are used.
9930
9931         * expression.cs (Is): Bandaid until we fix properly Switch (see
9932         bug #24985 for details).
9933
9934         * typemanager.cs (ImplementsInterface): The hashtable will contain
9935         a null if there are no interfaces implemented.
9936
9937 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
9938
9939         * cs-parser.jay (indexer_declarator): It is fine to have array
9940         parameters
9941
9942 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9943
9944         * typemanager.cs: (RegisterBuilder): New function used to register
9945         TypeBuilders that implement interfaces.  Since
9946         TypeBuilder.GetInterfaces (as usual) does not work with lame
9947         Reflection.Emit. 
9948         (AddUserType): register interfaces.
9949
9950         (ImplementsInterface): Use the builder_to_ifaces hash if we are
9951         dealing with TypeBuilder.  Also, arrays are showing up as
9952         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
9953         methods can not be invoked on them!
9954
9955         * ecore.cs (ExplicitReferenceConversionExists): Made public.
9956         (ImplicitReferenceConversionExists): Split out from
9957         StandardConversionExists. 
9958
9959         * expression.cs (As): We were only implementing one of the three
9960         cases for the as operator.  We now implement them all.
9961         (Is): Implement the various other cases for Is as well.
9962
9963         * typemanager.cs (CACHE): New define used to control if we want or
9964         not the FindMembers cache.  Seems to have a negative impact on
9965         performance currently
9966
9967         (MemberLookup): Nested types have full acess to
9968         enclosing type members
9969
9970         Remove code that coped with instance/static returns for events, we
9971         now catch this in RealFindMembers.
9972
9973         (RealFindMembers): only perform static lookup if the instance
9974         lookup did not return a type or an event.  
9975
9976 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9977
9978         * assign.cs (CompoundAssign): We pass more semantic information
9979         now to Compound Assignments than we did before: now we have all
9980         the information at hand, and now we resolve the target *before* we
9981         do the expression expansion, which allows the "CacheValue" method
9982         to have the effect we intended (before, a [x] += 1 would generate
9983         two differen ArrayAccess expressions from the ElementAccess,
9984         during the resolution process).
9985
9986         (CompoundAssign.DoResolve): Resolve target and original_source here.
9987
9988 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
9989
9990         * expression.cs (ArrayAccess): dropped debugging information. 
9991
9992         * typemanager.cs: Small bug fix: I was always returning i_members,
9993         instead of one of i_members or s_members (depending on which had
9994         the content).
9995
9996         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
9997         method is invoked before any code generation takes place, and it
9998         is a mechanism to inform that the expression will be invoked more
9999         than once, and that the method should use temporary values to
10000         avoid having side effects
10001
10002         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10003
10004         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10005         implementation.
10006
10007         * expression.cs (Indirection, ArrayAccess): Add support for
10008         CacheTemporaries in these two bad boys. 
10009
10010         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10011         ldobj or ldind_ref.  
10012         (StoreFromPtr): Handle stobj as well.
10013
10014         * expression.cs (UnaryMutator): Share more code.
10015
10016         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10017         down: I was not tracking the Filter function as well, which
10018         was affecting the results of the cache.
10019
10020 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10021
10022         * attribute.cs: Remove the hack to handle the CharSet property on
10023         StructLayouts. 
10024
10025 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10026
10027         * attribute.cs (DoResolve): More uglyness, we now only try to
10028         resolve the attribute partially, to extract the CharSet
10029         information (only if we are a StructLayout attribute).  Otherwise 
10030
10031         (GetExtraTypeInfo): Add some code to conditionally kill in the
10032         future this.   I am more and more convinced that the .NET
10033         framework has special code to handle the attribute setting on
10034         certain elements.
10035
10036         * expression.cs (IsParamsMethodApplicable): Revert my previous
10037         foreach change here, it was wrong.
10038
10039 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10040
10041         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10042         (pp_expr): do not abort on unknown input, just return.
10043         (eval): abort if there are pending chars.
10044
10045         * attribute.cs (Attribute.Resolve): Positional parameters are
10046         optional.  Deal with that case.
10047
10048         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10049         the Ansi/Unicode/Auto information for the type.
10050
10051         (TypeContainer.DefineType): instantiate the EmitContext here, as
10052         we will be using it during the type definition (to resolve
10053         attributes) and during the emit phase.
10054
10055         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
10056         to pull type information out of the attributes
10057
10058         (Attribute.Resolve): track the constructor builder, and allow for
10059         multiple invocations (structs and classes will use this).
10060
10061         * ecore.cs (MemberLookupFinal): new version with all the
10062         parameters customizable.
10063
10064         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
10065         constructors.  Return if the result value is null (as the error
10066         would have been flagged already by MemberLookupFinal)
10067
10068         Do not allow instances of abstract classes or interfaces to be
10069         created.
10070
10071         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
10072         We have to compare the assembly property here when dealing with
10073         FamANDAssem and Assembly access modifiers, because we might be
10074         creating an assembly from *modules* (that means that we are not
10075         getting TypeBuilders for types defined in other modules that are
10076         part of this assembly).
10077
10078         (Method.Emit): If the method is marked abstract and has a body,
10079         emit an error. 
10080
10081         (TypeContainer.DefineMembers): If both the defined member and the
10082         parent name match are methods, then do not emit any warnings: let
10083         the Method.Define routine take care of flagging warnings.  But if
10084         there is a mismatch (method overrides something else, or method is
10085         overriwritten by something, then emit warning).
10086
10087         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
10088         set to null, this means `do not check for the return type on the
10089         signature'. 
10090
10091         (Method.Define): set the return type for the method signature to
10092         null, so that we get methods with the same name and parameters and
10093         different return types.  This is used to flag warning 114 (you are
10094         hiding a method, and you probably want to use the new/override
10095         keywords instead).
10096
10097         * typemanager.cs (MemberLookup): Implemented proper access
10098         control, closing a long standing set of bug reports.  The problem
10099         was that the Framework only has two bits: Public and NonPublic,
10100         and NonPublic includes private and protected methods, but we need
10101         to enforce the FamANDAssem, FamOrAssem and Family. 
10102
10103 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
10104
10105         * statement.cs (GotoCase): Return true: Ammounts to giving up
10106         knowledge on whether we return or not, and letting the other case
10107         be responsible for it.
10108
10109 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
10110
10111         * driver.cs: Do not load directories for each file processed, only
10112         do it if there is a pattern.
10113
10114         * ecore.cs: Report readonly assigns here as well, as we might have
10115         been resolved only by MemberAccess.
10116
10117         (SimpleName.SimpleNameResolve): Also be useful for LValue
10118         resolution.   We need this to propagate assign to local readonly variables
10119
10120         * typemanager.cs: Use a ptrhashtable for the criteria, because we
10121         do not want to reuse potential criteria memory.
10122
10123         * class.cs (MyEventBuilder): Set reflected_type;
10124
10125         * ecore.cs (Constantify): Added support for constifying bools.
10126
10127         (RootContext.LookupType): Added a cache for values looked up in
10128         the declaration space.
10129
10130         * typemanager.cs (FindMembers): Now is a front-end to
10131         RealFindMembers, and provides a two-level hashtable-based cache to
10132         the request.  
10133
10134         15% performance improvement: from 22.5 to 19.2 seconds.
10135
10136         * expression.cs (IsParamsMethodApplicable): use foreach.
10137         (Invocation.DoResolve): ditto.
10138         (New.DoResolve): ditto.
10139         (ArrayCreation.DoResolve): ditto.
10140
10141         * ecore.cs (FindMostEncompassingType): use foreach.
10142
10143         * delegate.cs (NewDelegate.DoResolve): Use foreach
10144
10145         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
10146         (RemoveMethods): use foreach.
10147
10148         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
10149         nested foreach statements instead of for, and also break out of
10150         the inner loop once a match is found.
10151
10152         (Invocation.OverloadResolve): Use foreach, simplify the code. 
10153
10154 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
10155
10156         * cfold.cs (BinaryFold): During an enumeration evaluation context,
10157         we actually unwrap the expression to allow for extra information
10158         to be extracted. 
10159
10160         * expression.cs: Use Shr_Un on unsigned operations. 
10161
10162 2002-05-08  Ravi Pratap  <ravi@ximian.com>
10163
10164         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
10165         applicable operators was not being considered correctly. This closes
10166         the bug Miguel reported.
10167
10168 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
10169
10170         * attribute.cs: check that the type derives from System.Attribute
10171         and report the correct error in that case (moved the duplicate code to
10172         its own method, too).
10173
10174 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
10175
10176         * attribute.cs: lookup attribute type name as the spec says: first the
10177         bare attribute name and then name + "Attribute" (nant compiles with
10178         mcs after this fix).
10179
10180 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
10181
10182         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
10183         Because of the way we parse things, we should try to see if a
10184         UIntConstant can fit in an integer.
10185
10186 2002-05-07  Ravi Pratap  <ravi@ximian.com>
10187
10188         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
10189         when we are in an explicit context.
10190
10191         (ConvertReferenceExplicit): When converting from Iface type S to Class
10192         T make sure the rules are implemented as an OR.
10193
10194         * parameter.cs (ParameterType): Make it a property for now although the
10195         purpose really isn't anything immediate.
10196
10197         * expression.cs (Is*Applicable): Do better checking on the parameter type
10198         of a ref/out parameter. The ones from the system assemblies are already 
10199         marked with the correct type so we don't need to do any correction.
10200
10201         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
10202         the object type is standard too so include that.
10203
10204 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10205
10206         * ecore.cs (StandardConversionExists): Augment with missing code:
10207         deal with IntConstant, LongConstants and Enumerations.
10208
10209         * assign.cs: Report the error, instead of failing silently
10210
10211         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
10212         typecontainer that they are declared, because the
10213         typecontainer/namespace will have the list of using clauses that
10214         need to be applied.
10215
10216         Assembly Attributes were escaping the normal registration
10217         mechanism. 
10218
10219         (EmitCode): Apply attributes within an EmitContext that represents
10220         the container they were declared on.
10221
10222         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
10223
10224 2002-05-06  Ravi Pratap  <ravi@ximian.com>
10225
10226         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
10227         Revamp completely - make much cleaner as we now operate only
10228         on a set of Types.
10229
10230         (FindMostSpecificSource, FindMostSpecificTarget): New methods
10231         to implement the logic detailed in the spec more correctly.
10232
10233         (UserDefinedConversion): Update accordingly.
10234
10235 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10236
10237         * statement.cs: Return flow analysis information up.
10238
10239         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
10240         and the default.
10241
10242         (token): Do not consume an extra character before calling
10243         decimal_digits.
10244
10245 2002-05-06  Piers Haken <piersh@friskit.com>
10246
10247         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
10248
10249 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10250
10251         * class.cs (Constructor.Emit): Set the IsStatic flag in the
10252         EmitContext during the instance constructor initializer
10253         resolution, to stop access to instance variables.
10254
10255         This is mandated by the spec, last paragraph of the `constructor
10256         initializers' section. 
10257
10258 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
10259
10260         * cs-parser.jay, class.cs (Accessor): new class used to represent
10261         an accessor (get or set).  In the past we used `null' to represent
10262         a missing accessor.  But this is ambiguous because there was no
10263         way to tell in abstract indexers/properties if one of them was
10264         specified.
10265
10266         Now there is a way of addressing that.
10267
10268         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
10269         instead of FindMembers.
10270
10271         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
10272         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
10273
10274         * attribute.cs: Treat indexers and properties as the same in terms
10275         of applying attributes
10276
10277         * ecore.cs (FindMostEncompassedType): Use statically initialized
10278         EmptyExpressions()s like we do elsewhere to avoid creating useless
10279         objects (and we take this out of the tight loop).
10280
10281         (GetConversionOperators): Move the code to extract the actual
10282         operators to a separate routine to clean things up.
10283
10284 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
10285
10286         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
10287         events are always registered FieldBuilders.
10288
10289         * class.cs (FieldBase): New class shared by Fields 
10290
10291         * delegate.cs: If we are a toplevel delegate, use our full name.
10292         If we are a nested delegate, then only use our tail name.
10293
10294 2002-05-02  Ravi Pratap  <ravi@ximian.com>
10295
10296         * expression.cs (IsApplicable): Ensure that we add the "&" to
10297         ref/out types before comparing it with the type of the argument.
10298
10299         (IsParamsMethodApplicable): Ditto.
10300
10301         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
10302         silly me ;-)
10303
10304         * delegate.cs : Handle the case when we have more than one applicable
10305         method. Flag an error only when we finish checking all.
10306
10307 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
10308
10309         * expression.cs: Add support for boolean static initializers.
10310
10311 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
10312
10313         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
10314
10315         * parameter.cs (ComputeParameterTypes,
10316         ComputeAndDefineParameterTypes): Better error handling: now we
10317         clear the `types' cache if we fail during any of the type lookups.
10318         We also return the status code correctly to our caller
10319
10320         * delegate.cs: If we fail to define a delegate, abort the extra
10321         steps. 
10322
10323         * expression.cs (Binary.ResolveOperator): for
10324         operator==(object,object) and operator !=(object, object) we also
10325         have to verify that there is an implicit conversion from one to
10326         the other.
10327
10328         (ArrayAccess.DoResolve): Array Access can operate on
10329         non-variables. 
10330
10331 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
10332
10333         * assign.cs (CompoundAssign): A new class used as a "flag" that
10334         the assignment actually is happening as part of a compound
10335         assignment operator.
10336
10337         During compound assignment, a few new rules exist to enable things
10338         like:
10339
10340         byte b |= 1 + 2
10341
10342         From the spec:
10343
10344         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
10345         to the type of x) if y is implicitly convertible to the type of x,
10346         and the operator is a builtin operator and the return type of the
10347         operator is explicitly convertible to the type of x. 
10348
10349         * rootcontext.cs: Reset warning level to 2.  4 catches various
10350         "interesting" features in mcs, we must clean this up at some
10351         point, but currently am trying to kill other bugs ;-)
10352
10353         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
10354         in container classes as well.  
10355
10356         * expression.cs (Binary.ResolveOperator): Handle string case
10357         before anything else (as operator overloading does emit an error
10358         before doing anything else).
10359
10360         This code could go away when we move to a table driven model, but
10361         i could not come up with a good plan last night.
10362
10363 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
10364
10365         * typemanager.cs (CSharpName): reimplementation using regex.
10366         * class.cs: added null check for fields in Emit
10367         * rootcontext.cs: set warninglevel to 4
10368
10369 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
10370
10371         * typemanager.cs (CSharpName): reimplemented with Lupus
10372         suggestion.
10373
10374 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
10375
10376         * statement.cs (If): correclty implement Resolve, because we were
10377         not catching sem errors in there.  The same process is needed
10378         everywhere else. 
10379         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
10380
10381
10382         (Statement.Warning_DeadCodeFound): Factorize code.
10383         (While): Report dead code here too.
10384
10385         (Statement): Added Resolve virtual method to allow
10386         for resolution split from the emit code.
10387
10388 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10389
10390         * statement.cs (EmitBoolExpression): No longer try to resolve the
10391         expression here.    
10392         (MakeBoolean): New utility function that resolve, implicitly
10393         converts to boolean and tags the expression. 
10394
10395
10396         (If, Do): Implement dead code elimination.
10397         (While): Implement loop inversion
10398
10399         (Do, While, For, If): Resolve the expression prior to calling our
10400         code generation.
10401
10402 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
10403
10404         * class.cs:
10405           - added method Report28 (warning: program has more than one entry point)
10406           - added method IsEntryPoint, implements paragraph 10.1 of the spec
10407           - modified method Method.Define, the part at the end of the method
10408
10409         * rootcontext.cs: added static public Location EntryPointLocation;
10410           
10411         * ../errors/cs0028.cs : Add test case for the above warning.              
10412
10413         * typemanager.cs:
10414           - modified method CSharpName to allow arrays of primitive type to
10415             be printed nicely (e.g. instead of System.Int32[][] it now prints
10416             int[][])
10417           - added method CSharpSignature: returns the signature of a method
10418             in string format to be used in reporting errors, warnings, etc.
10419
10420         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
10421         with String.Empty.
10422
10423 2002-04-26  Ravi Pratap  <ravi@ximian.com>
10424
10425         * delegate.cs (Define): Fix extremely silly bug where I was
10426         setting the type of the 'object' parameter of the BeginInvoke
10427         method to System.IAsyncResult instead of System.Object ;-)
10428
10429 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10430
10431         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
10432         here. 
10433
10434         (Constructor.Emit): return if we fail to initialize the
10435         constructor.  Another door closed!  
10436
10437         * expression.cs (New.DoResolve): Improve error message (from -6 to
10438         1501).  Use DeclaredOnly lookup to find the exact constructor.
10439
10440         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
10441         loop.  This is useful.
10442
10443         * cs-parser.jay: Adjust the default parameters so that destructors
10444         have the proper signature.
10445
10446 2002-04-26  Martin Baulig  <martin@gnome.org>
10447
10448         * driver.cs (LoadAssembly): If `assembly' contains any characters
10449         which are only valid in path names and not in assembly names
10450         (currently slash, backslash and point), use Assembly.LoadFrom ()
10451         instead of Assembly.Load () on the `assembly' (before iteration
10452         over the link_paths).
10453
10454 2002-04-26  Martin Baulig  <martin@gnome.org>
10455
10456         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
10457
10458 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
10459
10460         * class.cs (Property): use the new typemanager.MemberLookup
10461
10462         (TypeContainer.MemberLookup): Implement using the
10463         TypeManager.MemberLookup now. 
10464
10465         * typemanager.cs: Make MemberLookup a function of the TypeManager,
10466         and return MemberInfos, so that these can be used without an
10467         EmitContext (what we had before).
10468
10469 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
10470
10471         * expression.cs: Fix the case where the argument to params if the
10472         type of the params.  I omitted handling this before.   Fixed
10473
10474 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10475
10476         * driver.cs: Call BootCorlib_PopulateCoreType
10477
10478         * class.cs (Property.CheckBase): Check for properties only, not
10479         for all members. 
10480
10481         * interface.cs: Temporary hack: try/catch around the
10482         CustomAttributeBuilder, because I am getting an exception that I
10483         do not understand.
10484
10485         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
10486         types whose definitions are required to be there (attributes are
10487         defined before standard types).
10488
10489         Compute definitions as we boot the various types, as they are used
10490         immediately (value_type class will need object_type, but if we do
10491         not initialize object_type, we will pass a null, which will let
10492         the runtime pick the System.Object from the existing corlib, which
10493         is not what we want).
10494
10495 2002-04-22  Patrik Torstensson <totte@labs2.com>
10496
10497         * cs-tokenizer.cs: fixed a number of trim() issues.
10498
10499 2002-04-22  Ravi Pratap  <ravi@ximian.com>
10500
10501         * expression.cs (Argument.Type): Ensure that we return the correct
10502         type when we have out or ref parameters [in which case we 
10503         append a "&"].
10504
10505 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10506
10507         * class.cs (Property, Indexer): Allow extern modifier in there. 
10508
10509         * typemanager.cs (InitBaseTypes): Initializes object_type and
10510         value_type, since those will be used early on during the bootstrap
10511         process to compile corlib.
10512
10513         (InitCoreTypes): Move code from here to InitBaseTypes.
10514
10515 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
10516
10517         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
10518         single-dimension arrays as using the ldlen opcode.  
10519
10520         Daniel Lewis discovered this optimization.  
10521
10522         * typemanager.cs: Add signature for System.Array::get_Length
10523
10524 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10525
10526         * statement.cs: report the error when the foreach does not apply to an
10527         array nor a collection.
10528
10529 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
10530
10531         * expression.cs: Add implicit conversions to the operator ~.
10532
10533         * constant.cs (DecimalConstant.Emit): Emit decimal value.
10534
10535         * typemanager.cs: Locate the decimal constructor.
10536
10537 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10538
10539         * attribute.cs: use the new property of TypeOf.
10540         * expression.cs: added 'get' property around typearg.
10541
10542         These changes fix a build breaker reported by NickD. Is this the
10543         correct way to fix?  If not, please, revert my changes and make it
10544         work :-).
10545
10546 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
10547
10548         * attribute.cs: Add support for typeof in attribute invocations.
10549         I am not sure that this is right though.
10550
10551 2002-04-14  Duncan Mak  <duncan@ximian.com>
10552
10553         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
10554         Binary.Operator.Division case.
10555
10556 2002-04-13  Ravi Pratap  <ravi@ximian.com>
10557
10558         * class.cs (DefineType): Ensure that we do a proper check on
10559         attribute types and also register it with the TypeManager.
10560
10561         (TypeContainer.Targets): The default for attribute types is
10562         AttributeTargets.All.
10563
10564         * attribute.cs (ApplyAttributes): Registering the attribute type
10565         is done elsewhere, not when we discover we have a Usage attribute.
10566
10567 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10568
10569         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
10570         and get rid of is_delegate parameter.
10571
10572         * everywhere : update.
10573
10574 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10575
10576         * cs-parser.jay (compilation_unit): Revamp completely to use
10577         some new ideas that I got from Rhys' grammar to solve the problems
10578         with assembly level attributes.
10579
10580         (outer_declaration): New grammar production.
10581
10582         (attribute_sections): Add.
10583
10584         (opt_attributes): Base on attribute_sections
10585
10586         (namespace_declaration): Allow opt_attributes to tackle the case
10587         when we have assembly level attributes - we are clever in this
10588         regard now ;-)
10589
10590         * attribute.cs (ApplyAttributes): Do not worry about assembly 
10591         attributes in the non-global context.
10592
10593         * rootcontext.cs (AddGlobalAttributes): Go back to using this
10594         instead of SetGlobalAttributes.
10595
10596         * class.cs, rootcontext.cs : Ensure we define and generate 
10597         attribute types before anything else.
10598
10599         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
10600         and flag the new error -20 for the case when the attribute type
10601         does not have valid targets specified. csc does not catch this.
10602
10603         * ../errors/errors.txt : update for error # -20
10604
10605 2002-04-11  Ravi Pratap  <ravi@ximian.com>
10606
10607         * support.cs (InternalParameters.ParameterModifier): Do some null
10608         checking and return sane values.
10609
10610         * class.cs (Method.Define): If we are a PInvoke method, ensure
10611         that we are static and extern. Report error # 601
10612
10613         * ../errors/cs0601.cs : Add test case for the above error.
10614
10615 2002-04-07  Ravi Pratap  <ravi@ximian.com>
10616
10617         * rootcontext.cs (attribute_types): We need to keep type of
10618         all attribute types separately and emit code for them first.
10619
10620         (RegisterAttribute) : Implement.
10621
10622         * class.cs (DefineType): Check if the current Type is a custom
10623         attribute type and register it accordingly.
10624
10625         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
10626         adding the first attribute twice and rename to
10627
10628         (SetGlobalAttributes): this.
10629
10630         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
10631         lookups.
10632
10633         * attribute.cs (ApplyAttributes): Take an additional argument telling us
10634         if we are processing global arguments. Hmm, I am unsure of this.
10635
10636 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10637
10638         * expression.cs: added static array of strings to avoid calling
10639         Enum.ToString () for Operator in Binary. Significant recover of
10640         performance.
10641
10642 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
10643
10644         * class.cs (FindMembers): Allow the Builders of the various
10645         members to be null.  If they are skip them.  This only happens
10646         during the PInvoke declaration.
10647
10648 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
10649
10650         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
10651         failure, so we do not keep going afterwards.
10652
10653         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
10654         wanted to pass `false' as the `is_delegate' argument.  If this is
10655         the case, why not use delegate_type == null to mean `is_delegate =
10656         false' and anything else as is_delegate = true.
10657
10658 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
10659
10660         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
10661         code for the section, not the beginning of the tests.
10662
10663 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
10664
10665         * cfold.cs: Handle operator + (Enum x, Underlying x) 
10666
10667         * expression.cs (Binary): same.  Warn about errors where we have
10668         Enum/Enum in operator + as well.
10669
10670 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
10671
10672         * statement.cs:
10673                 - added support for switch(bool)
10674                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
10675                 - add TableSwitchEmit() to handle table-based switch statements
10676
10677 2002-04-05  Ravi Pratap  <ravi@ximian.com>
10678
10679         * expression.cs (Invocation.OverloadResolve): Factor out code which
10680         does parameter compatibility checking with arguments so that we can 
10681         re-use the code even from Delegate.VerifyApplicability
10682
10683         (VerifyArgumentsCompat): Move above code here.
10684
10685         * delegate.cs (VerifyApplicability): Get rid of duplicate code
10686         and instead make a call to the above method.
10687
10688 2002-03-31  Ravi Pratap  <ravi@ximian.com>
10689
10690         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
10691         We use it to keep track of classes which are attribute types.
10692
10693 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
10694
10695         * delegate.cs (Delegate.Define): Correctly define the types in the
10696         presence of fixed and array parameters.
10697
10698         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
10699         doing FindMembers.
10700
10701         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
10702         include NonPublic after the first iteration.
10703
10704         * class.cs (Indexer.CheckBase): Only check if both parents are
10705         non-null. 
10706
10707         * cs-parser.jay (accessor_body): If empty, set to null.
10708
10709         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
10710         same code path here to resolve constants names that we did have in
10711         MemberAccess.DoResolve.  There is too much code duplicated here.
10712
10713 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
10714
10715         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
10716
10717         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
10718         to MakeUnionSet.
10719
10720         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
10721         tokens, numbers and strings.
10722
10723         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
10724         parenthesis.
10725
10726         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
10727         asyncronous parameters and the regular parameters.  
10728
10729         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
10730         specify the target directory.
10731
10732         * expression.cs: (This.DoResolve): Simplify
10733         (As.Emit): Optimize, do not generate IsInst if the expression is
10734         always of the given type.
10735
10736         (Is.DoResolve): Bug fix, we were reporting both always/never for
10737         the is expression.
10738
10739         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
10740         creating too many unnecessary arrays.
10741
10742 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
10743
10744         * class.cs (EmitFieldInitializer): Use Assign expression to assign
10745         fields instead of rolling our own initializer.   Takes care of all
10746         implicit conversions, and drops unnecessary static checks/argument.
10747
10748 2002-03-31  Dick Porter  <dick@ximian.com>
10749
10750         * driver.cs: use the GetDirectories() return values properly, and
10751         use "/" as path separator.
10752
10753 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
10754
10755         * expression.cs (Unary): Optimize - - expr into expr.
10756         (Binary): Optimize a + (-b) into a -b.
10757
10758         * codegen.cs (CodeGen): Made all methods static.
10759
10760 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
10761
10762         * rootcontext.cs: 
10763
10764         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
10765         TypeBuilder property.
10766
10767         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
10768         instead. 
10769
10770         * tree.cs: Removed the various RecordXXXX, and replaced with a
10771         single RecordDecl.  Removed all the accessor methods, and just
10772         left a single access point Type 
10773
10774         * enum.cs: Rename DefineEnum to DefineType.
10775
10776         * decl.cs: New abstract method `DefineType' used to unify the
10777         Defines for Enumerations, Interfaces, TypeContainers and
10778         Delegates.
10779
10780         (FindType): Moved LookupInterfaceOrClass here.  Moved the
10781         LookupBaseClasses method that used to live in class.cs and
10782         interface.cs here, and renamed to FindType.
10783
10784         * delegate.cs: Implement DefineType.  Take advantage of the
10785         refactored pattern for locating the parent builder without taking
10786         the parent_builder argument (which we know does not work if we are
10787         nested, and triggering a toplevel definition).
10788
10789 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10790
10791         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
10792         accessibility of a member has changed during override and report
10793         an error if so.
10794
10795         * class.cs (Method.Define, Property.Define): Only complain on
10796         overrides if the method is private, any other accessibility is
10797         fine (and since we just checked the permission is the same, we are
10798         good to go).
10799
10800         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
10801         and elif are processed always.  The other pre-processing
10802         directives are only processed if we are "taking" the path
10803
10804 2002-03-29  Martin Baulig  <martin@gnome.org>
10805
10806         * class.cs (Method.Emit): Only emit symbolic debugging info if the
10807         current location is not Null.
10808
10809         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
10810         a separate method so we can profile it.
10811
10812         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
10813         `span.Seconds' are just seconds, but no minutes or hours.
10814         (MainDriver): Profile the CodeGen.SaveSymbols calls.
10815
10816 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10817
10818         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
10819         Remove the gratuitous set of Final:
10820
10821                                 // If an interface implementation, then we can set Final.
10822                                 if (((flags & MethodAttributes.Abstract) == 0) &&
10823                                     implementing.DeclaringType.IsInterface)
10824                                         flags |= MethodAttributes.Final;
10825
10826         I do not know what I was smoking when I used that.
10827
10828
10829         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
10830         step into fixing the name resolution issues for delegates and
10831         unifying the toplevel name resolution.
10832
10833 2002-03-28  Martin Baulig  <martin@gnome.org>
10834
10835         * class.cs (Method.Emit): If we have a symbol writer, call its
10836         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
10837         tell it about the current method.
10838
10839         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
10840         writer that we're going to emit the first byte of IL code for a new
10841         statement (a new source line).
10842         (EmitContext.EmitTopBlock): If we have a symbol writer, call
10843         EmitContext.Mark() before emitting any code.
10844
10845         * location.cs (SymbolDocument): Return null when we're Null.
10846
10847         * statement.cs (Statement): Moved the `Location loc' variable here.
10848         (Statement.EmitBoolExpression): If we have a symbol writer, call
10849         ec.Mark() before emitting any code to tell it that we're at the
10850         beginning of a new statement.
10851         (StatementExpression): Added `Location' argument to the constructor.
10852         (Block): Added public readonly variable `StartLocation' and public
10853         variable `EndLocation'.  The latter is to be set using SetEndLocation().
10854         (Block): Added constructor which takes a start and end location.
10855         (Block.SetEndLocation): New method. This sets the end location.
10856         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
10857         local variables we create.
10858         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
10859         each statement and do also mark the begin and end of the block.
10860
10861         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
10862         tell it the current lexer.Location, use Location.Null for the end of the
10863         block.
10864         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
10865         current block, set its end location using SetEndLocation().
10866         (statement_expression): StatementExpression constructor now takes the
10867         lexer.Location as additional argument.
10868         (for_statement, declare_local_variables): Likewise.
10869         (declare_local_variables): When creating a new implicit block, use the
10870         new Block constructor and pass it the lexer.Location.
10871
10872 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10873
10874         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
10875         members also on the parent interfaces recursively.
10876
10877 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
10878
10879         * report.cs: Use new formats, since Gonzalo finished the missing
10880         bits. 
10881
10882         * expression.cs (Binary.ResolveOperator): added missing operator|
10883         operator& and operator^ for bool/bool.
10884
10885         * cs-parser.jay: CheckDef now takes a Location argument that is
10886         used to report errors more precisly (instead of reporting the end
10887         of a definition, we try to track something which is a lot closer
10888         to the source of the problem).
10889
10890         * cs-tokenizer.cs: Track global token use, so we can properly flag
10891         the use of #define/#undef after the first token has been seen.
10892
10893         Also, rename the reportXXXX to Error_DescriptiveName
10894
10895         * decl.cs (DeclSpace.IsTopLevel): Move property here from
10896         TypeContainer, so that Enum and Interface can use this too.
10897
10898         * class.cs (TypeContainer.LookupInterfaceOrClass,
10899         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
10900         `builder' argument.  Typically this was used to pass the parent
10901         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
10902         the definition).  
10903
10904         The problem is that a nested class could trigger the definition of
10905         a toplevel class, and the builder would be obviously wrong in that
10906         case. 
10907
10908         So we drop this argument, and we compute dynamically the
10909         TypeBuilder/ModuleBuilder (the correct information was available
10910         to us anyways from DeclSpace.Parent)
10911
10912         * interface.cs (Interface.DefineInterface): Drop builder
10913         parameter cleanup like class.cs
10914
10915         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
10916         like class.cs
10917
10918         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
10919         values. 
10920
10921         (Try.Emit): Propagate the returns value from the statement.
10922
10923         (Return.Emit): Even if we are leavning 
10924
10925         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
10926
10927         * modifiers.cs: Fix the computation of MethodAttributes flags.
10928
10929 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
10930
10931         * driver.cs: allow compilation of files that start with '/'.
10932         Add a default case when checking the argument of --target.
10933
10934 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
10935
10936         * interface.cs: Implement the same search algorithm for types in
10937         the interface code.
10938
10939         * delegate.cs: Do not allow multiple definition.
10940
10941         * Recovered ChangeLog that got accidentally amputated
10942
10943         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
10944
10945         * rootcontext.cs: Load manually enum to allow core classes to
10946         contain enumerations.
10947
10948         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
10949         Update to new static methods in TypeManager.
10950
10951         * typemanager.cs (GetMethod, GetConstructor): Use our
10952         implementation of FindMembers to find the members, since during
10953         corlib compilation, the types are TypeBuilders and GetMethod and
10954         GetConstructor do not work.
10955
10956         Make all methods in TypeManager static.
10957
10958         (InitCodeHelpers): Split the functionality from
10959         the InitCodeTypes function.
10960
10961         * driver.cs: Call InitCodeHelpers after we have populated the
10962         types. 
10963
10964         * cs-parser.jay (delegate_declaration): we did not used to compute
10965         the delegate name correctly for void delegates.
10966
10967 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
10968
10969         * rootcontext.cs (RootContext): Init the interface_resolve_order
10970         and type_container_resolve_order always.
10971
10972         (ResolveCore, BootstrapCorlib_ResolveClass,
10973         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
10974         compiler when compiling with --nostdlib
10975
10976         * class.cs (TypeContainer.DefineType): Check that our parent is
10977         not null.  This test is most important when we are bootstraping
10978         the core types.
10979
10980         * codegen.cs: Split out the symbol writing code.
10981
10982 2002-03-25  Martin Baulig  <martin@gnome.org>
10983
10984         * driver.cs (-g): Made -g an alias for --debug.
10985
10986 2002-03-24  Martin Baulig  <martin@gnome.org>
10987
10988         * codegen.cs (SymbolWriter): New public variable. Returns the
10989         current symbol writer.
10990         (CodeGen): Added `bool want_debugging_support' argument to the
10991          constructor. If true, tell the ModuleBuild that we want debugging
10992         support and ask it for the ISymbolWriter.
10993         (Save): If we have a symbol writer, call it's Close() method after
10994         saving the assembly.
10995
10996         * driver.c (--debug): New command line argument to create a
10997         debugger information file.
10998
10999         * location.cs (SymbolDocument): New public property. Returns an
11000         ISymbolDocumentWriter object for the current source file or null
11001         if we don't have a symbol writer.
11002
11003 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11004
11005         * driver.cs (LoadAssembly): Correctly return when all the paths
11006         have been tried and not before.
11007
11008         * statement.cs (Switch.Emit): return the actual coverage for this
11009         statement (returns/not-returns)
11010
11011         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11012         switch of the statement if we are the last switch section.  That
11013         kills two problems: try/catch problems (we used to emit an empty
11014         nop at the end) and switch statements where all branches would
11015         return. 
11016
11017 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11018
11019         * driver.cs: Add default assemblies (the equivalent to the
11020         Microsoft CSC.RSP file)
11021
11022         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11023         also update tokens_seen and set it to false.
11024
11025         * driver.cs: Implement --recurse for Mike.
11026
11027         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11028         correctly splitting out the paths.
11029
11030 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11031
11032         * interface.cs (Interface.PopulateProperty): Instead of using
11033         `parent' as the declaration space for the set parameters, use
11034         `this' 
11035
11036         * support.cs (InternalParameters): InternalParameters constructor
11037         takes a DeclSpace instead of a TypeContainer.
11038
11039         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11040         types are being initialized, load the address of it before calling
11041         the function.  
11042
11043         (New): Provide a mechanism to disable the generation of local
11044         value type temporaries when the caller will be providing us with
11045         an address to store it.
11046
11047         (ArrayCreation.EmitDynamicInitializers): Use it.
11048
11049 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11050
11051         * expression.cs (Invocation.EmitArguments): Only probe for array
11052         property if there is more than one argument.  Sorry about that.
11053
11054         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
11055         empty param arrays.
11056
11057         * class.cs (Method.LabelParameters): Fix incorrect code path that
11058         prevented the `ParamArrayAttribute' from being applied to the
11059         params attribute.
11060
11061 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
11062
11063         * support.cs (ReflectionParameters): Correctly compute whether the
11064         last argument is a params array.  Fixes the problem with
11065         string.Split ('a')
11066
11067         * typemanager.cs: Make the assemblies array always be non-null
11068         (empty, but non-null)
11069
11070         * tree.cs (RecordDecl): New function that abstracts the recording
11071         of names.  This reports error 101, and provides a pointer to the
11072         previous declaration.  Fixes a crash in the compiler.
11073
11074         * cs-parser.jay (constructor_declaration): Update to new grammar,
11075         and provide a constructor_body that can be empty.
11076
11077 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
11078
11079         * driver.cs: Add support for --resources.
11080
11081         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
11082         Make all types for the various array helper methods be integer.
11083
11084         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
11085         CheckState to ConvCast.
11086
11087         (ConvCast): Now it takes a `checked' state argument, to avoid
11088         depending on the emit context for the conversion, and just using
11089         the resolve time setting.
11090
11091         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
11092         instead of Invocation.EmitArguments.  We do not emit the original
11093         arguments, instead we emit those which have been converted to
11094         unsigned int expressions.
11095
11096         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
11097
11098         * codegen.cs: ditto.
11099
11100         * expression.cs (LocalVariableReference): Drop the use of the
11101         Store function that depended on the variable index.
11102
11103         * statement.cs (VariableInfo): Drop the `Idx' property from this
11104         class, as this is not taking into account the indexes for
11105         temporaries tat we generate during the execution, getting the
11106         indexes wrong.
11107
11108         * class.cs: First emit class initializers, then call the parent
11109         constructor. 
11110
11111         * expression.cs (Binary): Fix opcode emision.
11112         (UnaryMutator.EmitCode): Support checked code generation
11113
11114         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
11115         matches for events for both the Static and Instance scans,
11116         pointing to the same element.   Fix that.
11117
11118 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
11119
11120         * rootcontext.cs (ResolveTree): Always set the
11121         interface_resolve_order, because nested interfaces will be calling
11122         into us.
11123
11124         * class.cs (GetInterfaceOrClass): Track the same resolution
11125         process used by TypeManager.LookupType.  This fixes the nested
11126         type lookups in class declarations (separate path from
11127         LookupType). 
11128
11129         (TypeContainer.DefineType): Also define nested interfaces.
11130         (TypeContainer.RegisterOrder): New public function used to
11131         register the order in which child interfaces need to be closed.
11132
11133         Nested interfaces need to be closed after their parents have been
11134         created. 
11135
11136         * interface.cs (InterfaceAttr): Put all the logic for computing
11137         the interface attribute here. 
11138
11139         (DefineInterface): Register our interface order with the
11140         RootContext or with the TypeContainer depending on the case.
11141
11142 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11143
11144         * cs-parser.jay: rework foreach statement to work with the new
11145         changes to the policy on SimpleNames.
11146
11147         * report.cs: support Stacktrace on warnings as well.
11148
11149         * makefile: drop --unsafe and /unsafe from the compile.
11150
11151 2002-03-13  Ravi Pratap  <ravi@ximian.com>
11152
11153         * ecore.cs (StandardConversionExists): Modify to take an Expression
11154         as the first parameter. Ensure we do null -> reference type conversion
11155         checking.
11156
11157         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
11158         temporary Expression objects.
11159
11160 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
11161
11162         * interface.cs: workaround bug in method overloading resolution
11163         (there is already a bugzilla bug for it).
11164
11165 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11166
11167         We could also solve this problem by having a separate path for
11168         performing type lookups, instead of DoResolve, we could have a
11169         ResolveType entry point, and only participating pieces of the
11170         production (simplename, deref, array) would implement this. 
11171
11172         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
11173         signal SimpleName to only resolve type names and not attempt to
11174         resolve anything else.
11175
11176         * expression.cs (Cast): Set the flag.
11177
11178         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
11179
11180         * class.cs: Only report 108 if there is no `new' modifier.
11181
11182         * cs-parser.jay: rework foreach statement to work with the new
11183         changes to the policy on SimpleNames.
11184
11185         * report.cs: support Stacktrace on warnings as well.
11186
11187         * makefile: drop --unsafe and /unsafe from the compile.
11188
11189 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
11190
11191         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11192         lookups here, instead of doing that at parse time.  This means
11193         that our grammar will not introduce `LocalVariableReferences' as
11194         expressions at this point.  That solves the problem of code like
11195         this:
11196
11197         class X {
11198            static void Main ()
11199            { int X = 1;
11200             { X x = null }}}
11201
11202         This is only half the fix.  The full fix requires parameters to
11203         also be handled in this way.
11204
11205         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
11206         makes the use more obvious of the DeclSpace.  The
11207         ec.TypeContainer.TypeBuilder is now only used to pull the
11208         TypeBuilder for it.
11209
11210         My theory is that I can get rid of the TypeBuilder completely from
11211         the EmitContext, and have typecasts where it is used (from
11212         DeclSpace to where it matters).  
11213
11214         The only pending problem is that the code that implements Aliases
11215         is on TypeContainer, and probably should go in DeclSpace.
11216
11217         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11218         lookups here, instead of doing that at parse time.  This means
11219         that our grammar will not introduce `LocalVariableReferences' as
11220         expressions at this point.  That solves the problem of code like
11221         this:
11222
11223         class X {
11224            static void Main ()
11225            { int X = 1;
11226             { X x = null }}}
11227
11228         This is only half the fix.  The full fix requires parameters to
11229         also be handled in this way.
11230
11231         * class.cs (Property.DefineMethod): When implementing an interface
11232         method, set newslot, when implementing an abstract method, do not
11233         set the flag (before we tried never setting it, or always setting
11234         it, which is the difference).
11235         (Indexer.DefineMethod): same.
11236         (Method.DefineMethod): same.
11237
11238         * ecore.cs: Only set the status used flag if we get back a Field.
11239
11240         * attribute.cs: Temporary hack, so Paolo can keep working.
11241
11242 2002-03-08  Ravi Pratap  <ravi@ximian.com>
11243
11244         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
11245         the unmanaged type in the case we have a MarshalAs attribute.
11246
11247         (Resolve): Handle the case when we are parsing the special MarshalAs
11248         attribute [we need to store the unmanaged type to use later]
11249
11250         * typemanager.cs (marshal_as_attr_type): Built in type for the 
11251         MarshalAs Attribute.
11252
11253         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
11254         on parameters and accordingly set the marshalling info.
11255
11256 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
11257
11258         * class.cs: Optimizing slightly by removing redundant code after
11259         we switched to the `NoTypes' return value.
11260         (Property.DefineMethod): use NoTypes here too.
11261
11262         This fixes the bug I introduced in my last batch of changes.
11263
11264 2002-03-05  Ravi Pratap  <ravi@ximian.com>
11265
11266         * tree.cs (RecordEnum): Add. We now keep track of enums too.
11267
11268         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
11269         Enums since those are types too. 
11270
11271         * cs-parser.jay (enum_declaration): Record enums as we parse them.
11272
11273         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
11274         thanks to a call during the lookup process.
11275
11276 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
11277
11278         * statement.cs (Foreach): Lots of work to accomodate a particular
11279         kind of foreach statement that I had not kept in mind.  It is
11280         possible to have foreachs on classes that provide a GetEnumerator
11281         method that return objects that implement the "pattern" for using
11282         a foreach, there is no need to support GetEnumerator
11283         specifically. 
11284
11285         This is needed to compile nant.
11286
11287         * decl.cs: Only report 114 if the member is not `Finalize' and if
11288         the warning level is at least 2.
11289
11290         * class.cs: Moved the compare function from Method to
11291         MethodSignature. 
11292
11293         (MethodSignature.InheritableMemberSignatureCompare): Add new
11294         filter function that is used to extract inheritable methods from a
11295         class. 
11296
11297         (Method.Define): Use the new `inheritable_method_signature_filter'
11298         delegate
11299
11300         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
11301         command. 
11302
11303 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
11304
11305         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
11306
11307         * cs-parser.jay: Add opt_semicolon to the interface declaration.
11308
11309         * expression.cs: Pass location information to
11310         ConvertImplicitStandard. 
11311
11312         * class.cs: Added debugging code to track return values from
11313         interfaces. 
11314
11315 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
11316
11317         * expression.cs (Is.DoResolve): If either side of the `is' is an
11318         interface, do not flag the warning.
11319
11320         * ecore.cs (ImplicitReferenceConversion): We need a separate test
11321         for interfaces
11322
11323         * report.cs: Allow for --fatal to be used with --probe.
11324
11325         * typemanager.cs (NoTypes): Move the definition for the empty Type
11326         array here. 
11327
11328         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
11329         properties. 
11330         (TypeContainer.DefineProxy): New function used to proxy to parent
11331         implementations when implementing interfaces.
11332         (TypeContainer.ParentImplements): used to lookup if our parent
11333         implements a public function that is required by an interface.
11334         (TypeContainer.VerifyPendingMethods): Hook this up.
11335
11336         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
11337         `modules' and `assemblies' arraylists into arrays.  We only grow
11338         these are the very early start up of the program, so this improves
11339         the speedof LookupType (nicely measured).
11340
11341         * expression.cs (MakeByteBlob): Replaced unsafe code with
11342         BitConverter, as suggested by Paolo.
11343
11344         * cfold.cs (ConstantFold.Binary): Special case: perform constant
11345         folding of string concatenation, but if either side is a string,
11346         and the other is not, then return null, and let the runtime use
11347         the concatenation on the string plus the object (using
11348         `Object.ToString'). 
11349
11350 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
11351
11352         Constant Folding has been implemented now.
11353
11354         * expression.cs (Unary.Reduce): Do not throw an exception, catch
11355         the error instead on types that are not supported in one's
11356         complement. 
11357
11358         * constant.cs (Constant and all children): New set of functions to
11359         perform implict and explicit conversions.
11360
11361         * ecore.cs (EnumConstant): Implement the new functions to perform
11362         conversion by proxying to the child expression.
11363
11364         * codegen.cs: (ConstantCheckState): Constant evaluation has its
11365         own separate setting that can not be turned off from the command
11366         line using --unchecked or --checked and is only controlled using
11367         the checked/unchecked statements and expressions.  This setting is
11368         used by the constant folder to flag errors.
11369
11370         * expression.cs (CheckedExpr, UncheckedExpr): Set the
11371         ConstantCheckState as well.   
11372
11373         During Resolve, they also have to flag the state, because the
11374         constant folder runs completely in the Resolve phase.
11375
11376         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
11377         well.
11378
11379 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11380
11381         * cfold.cs: New file, this file contains the constant folder.
11382
11383         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
11384         argument to track whether we are using the resulting address to
11385         load or store a value and provide better error messages. 
11386
11387         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
11388         new AddressOf arguments.
11389
11390         * statement.cs (Foreach.EmitCollectionForeach): Update
11391
11392         * expression.cs (Argument.Emit): Call AddressOf with proper
11393         arguments to track usage.
11394
11395         (New.DoEmit): Call AddressOf with new arguments.
11396
11397         (Unary.Emit): Adjust AddressOf call.
11398
11399 2002-03-01  Ravi Pratap  <ravi@ximian.com>
11400
11401         * cs-parser.jay (member_access): Change the case for pre-defined types
11402         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
11403         this suggestion.
11404
11405         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
11406         a method body.
11407
11408         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
11409         essentially like methods and apply attributes like MethodImplOptions to them too.
11410
11411         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
11412         not being null.
11413
11414         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
11415         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
11416         is the DeclSpace.
11417
11418         * Update code everywhere accordingly.
11419
11420         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
11421
11422         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
11423
11424 2002-02-28  Ravi Pratap  <ravi@ximian.com>
11425
11426         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
11427         try performing lookups against those instead of jumping straight into using
11428         the 'using' clauses.
11429
11430         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
11431
11432         (LookupType): Perform lookups in implicit parents too.
11433
11434         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
11435         sequence as RootContext.LookupType. 
11436
11437         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
11438         the various cases of namespace lookups into this method.
11439
11440 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11441
11442         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
11443         in positional arguments)
11444
11445         * class.cs (Operator): Update the AllowedModifiers to contain
11446         extern. 
11447
11448         * cs-parser.jay: Update operator declaration to allow for the
11449         operator body to be empty.
11450
11451         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
11452         values. 
11453
11454 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
11455
11456         * class.cs (Method.Emit): Label parameters.
11457
11458         * driver.cs: Return 1 or 0 as the program exit code.
11459
11460 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
11461
11462         * expression.cs: Special case the `null' object when trying to
11463         auto-compute the type, as anything can be explicitly converted to
11464         that. 
11465
11466         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
11467         spotting this Paolo.
11468
11469         (Expression.ImplicitNumericConversion): Perform comparissions of
11470         the type using the underlying type in the case of an enumeration
11471         rather than using the enumeration type for the compare.
11472
11473         Cope with the underlying == type case, which is not possible to
11474         catch before. 
11475
11476         (Expression.ConvertNumericExplicit): Perform comparissions of
11477         the type using the underlying type in the case of an enumeration
11478         rather than using the enumeration type for the compare.
11479
11480         * driver.cs: If the user does not supply an extension, assume .exe
11481
11482         * cs-parser.jay (if_statement): Rewrote so that we can track the
11483         location for the if statement.
11484
11485         * expression.cs (Binary.ConstantFold): Only concat strings when
11486         the operation is "+", not everything ;-)
11487
11488         * statement.cs (Statement.EmitBoolExpression): Take a location
11489         argument. 
11490         (If, While, Do): Track location.
11491
11492         * expression.cs (Binary.ResolveOperator): In the object + string
11493         case, I was missing a call to ConvertImplicit
11494
11495 2002-02-25  Ravi Pratap  <ravi@ximian.com>
11496
11497         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
11498         Location arguments. Ensure we use RootContext.LookupType to do our work
11499         and not try to do a direct Type.GetType and ModuleBuilder.GetType
11500
11501         * interface.cs (PopulateMethod): Handle the type of the parameter being
11502         null gracefully.
11503
11504         * expression.cs (Invocation.BetterFunction): Handle the case when we 
11505         have a params method with no fixed arguments and a call is made with no
11506         arguments.
11507
11508 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
11509
11510         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
11511         the verbatim-string-literal
11512
11513         * support.cs (InternalParameters.ParameterModifier): handle null
11514         fixed parameters.
11515         (InternalParameters.ParameterType): ditto.
11516
11517         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
11518         duplicating the name of the variable parameter.
11519         (GetParameterByName): Fix bug where we were not looking up array
11520         paramters if they were the only present (thanks Paolo!).
11521         (GetParameterInfo): We only have an empty set of types if both
11522         fixed and array are set to null.
11523         (GetParameterInfo-idx): Handle FixedParameter == null
11524
11525         * cs-parser.jay: Handle the case where there is no catch
11526         statements (missing null test).
11527
11528 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
11529
11530         * driver.cs (MainDriver): Be conservative on our command line
11531         handling.
11532
11533         Catch DirectoryNotFoundException when calling GetFiles.
11534
11535         (SplitPathAndPattern): Used to split the input specification into
11536         a path and a pattern that we can feed to Directory.GetFiles.
11537
11538 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
11539
11540         * statement.cs (Fixed): Implement the last case of the Fixed
11541         statement (string handling).
11542
11543         * expression.cs (StringPtr): New class used to return a char * to
11544         a string;  Used by the Fixed statement.
11545
11546         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
11547
11548         * expression.cs (Binary.ResolveOperator): Remove redundant
11549         MemberLookup pn parent type.
11550         Optimize union call, we do not need a union if the types are the same.
11551         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
11552         type.
11553
11554         Specialize the use of MemberLookup everywhere, instead of using
11555         the default settings. 
11556
11557         (StackAlloc): Implement stackalloc keyword.
11558
11559         * cs-parser.jay: Add rule to parse stackalloc.
11560
11561         * driver.cs: Handle /h, /help, /?
11562
11563         * expression.cs (MakeByteBlob): Removed the hacks we had in place
11564         before we supported unsafe code.
11565
11566         * makefile: add --unsafe to the self compilation of mcs.
11567
11568 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
11569
11570         * expression.cs (PointerArithmetic): New class that is used to
11571         perform pointer arithmetic.
11572         (Binary.Resolve): Handle pointer arithmetic
11573         Handle pointer comparission.
11574         (ArrayPtr): Utility expression class that is used to take the
11575         address of an array.
11576
11577         (ElementAccess): Implement array access for pointers
11578
11579         * statement.cs (Fixed): Implement fixed statement for arrays, we
11580         are missing one more case before we are done.
11581
11582         * expression.cs (Indirection): Implement EmitAssign and set the
11583         ExprClass to Variable.  This allows pointer dereferences to be
11584         treated as variables, and to have values assigned to them.
11585
11586         * ecore.cs (Expression.StoreFromPtr): New utility function to
11587         store values dereferencing.
11588
11589 2002-02-20  Ravi Pratap  <ravi@ximian.com>
11590
11591         * expression.cs (Binary.ResolveOperator): Ensure that we are
11592         not trying to operate on a void type - this fixes the reported
11593         bug.
11594
11595         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
11596         the parent implementation is sealed.
11597
11598         * ../errors/cs0239.cs : Add.
11599
11600         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
11601
11602         * typemanager.cs (unverifiable_code_type): Corresponds to 
11603         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
11604         which have unsafe code in them.
11605
11606         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
11607         unsafe context.
11608
11609 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
11610
11611         * cs-tokenizer.cs: Add support for @"litreal strings"
11612
11613         Make tokenizer accept pre-processor directives
11614         on any column (remove the old C-like limitation). 
11615
11616         * rootcontext.cs (EmitCode): Emit any global attributes.
11617         (AddGlobalAttributes): Used to keep track of assembly attributes. 
11618
11619         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
11620
11621         * cs-parser.jay: Add support for global attributes.  
11622
11623 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
11624
11625         * expression.cs (Indirection): New helper class.  Unary will
11626         create Indirection classes to be able to implement the
11627         IMemoryLocation interface on it.
11628
11629 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
11630
11631         * cs-parser.jay (fixed_statement): reference the right statement.
11632
11633         * statement.cs (Fixed.Emit): Finish implementing the fixed
11634         statement for the &x case.
11635
11636 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
11637
11638         * class.cs (Property.Define, Method.Define): Remove newslot when
11639         `implementing'.  
11640
11641         * modifiers.cs: My use of NewSlot when `Abstract' was set was
11642         wrong.  NewSlot should only be used if the `new' keyword is present.
11643
11644         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
11645         locating our system dir.  Sorry about this.
11646
11647 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11648
11649         * driver.cs (GetSystemDir): Compute correctly the location of our
11650         system assemblies.  I was using the compiler directory instead of
11651         the library directory.
11652
11653 2002-02-13  Ravi Pratap  <ravi@ximian.com>
11654
11655         * expression.cs (BetterFunction): Put back in what Miguel commented out
11656         since it is the correct fix. The problem is elsewhere ;-)
11657
11658         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
11659         parameters of the parms method are themselves compatible or not !
11660
11661         (StandardConversionExists): Fix very dangerous bug where we were forgetting
11662         to check that a class implements an interface before saying that an implicit
11663         conversion was allowed. Use ImplementsInterface to do the checking.
11664
11665 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11666
11667         * class.cs (Method.Define): Track whether we are an explicit
11668         implementation or not.  And only call DefineMethodOverride if we
11669         are an explicit implementation.
11670
11671         (Property.DefineMethod): Ditto.
11672
11673 2002-02-11  Ravi Pratap  <ravi@ximian.com>
11674
11675         * expression.cs (BetterFunction): Catch hideous bug which was
11676          preventing us from detecting ambiguous calls due to implicit casts i.e
11677         cs0121.
11678
11679 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
11680
11681         * support.cs (Pair): Remove un-needed method.  I figured why I was
11682         getting the error in cs-parser.jay, the variable in a foreach loop
11683         is readonly, and the compiler does not really treat this as a variable.
11684
11685         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
11686         instead of EQUALS in grammar.  
11687
11688         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
11689
11690         * expression.cs (Unary.DoResolve): Check whether the argument is
11691         managed or not.
11692
11693 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
11694
11695         * support.cs: Api for Pair to set a value.  Despite the fact that
11696         the variables are public the MS C# compiler refuses to compile
11697         code that accesses the field if the variable is part of a foreach
11698         statement. 
11699
11700         * statement.cs (Fixed): Begin implementation of the fixed
11701         statement.
11702
11703         (Block.AddVariable): Return the VariableInfo on success and null
11704         on failure instead of true/false. 
11705
11706         * cs-parser.jay (foreach): Catch errors on variables already
11707         defined (we were ignoring this value before) and properly unwind
11708         the block hierarchy
11709
11710         (fixed_statement): grammar for the fixed statement.
11711
11712 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
11713
11714         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
11715         pointer types to be incretemented.
11716
11717         (SizeOf): Implement.
11718
11719         * cs-parser.jay (pointer_member_access): Implement
11720         expr->IDENTIFIER production.
11721
11722         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
11723         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
11724         on safe contexts.
11725
11726         (Unary): Implement indirection.
11727
11728         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
11729         use in non-unsafe context).
11730
11731         (SimpleName.DoResolve): Check for pointers in field access on safe
11732         contexts. 
11733
11734         (Expression.LoadFromPtr): Factor the load-indirect code in this
11735         function.  This was duplicated in UnboxCast and ParameterReference
11736
11737 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
11738
11739         * expression.cs (ComposedCast): report an error if a pointer cast
11740         is used in a safe region.
11741
11742         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
11743         pointer type casts in unsafe context.
11744
11745         * codegen.cs (EmitContext): Set up IsUnsafe.
11746
11747         * cs-parser.jay (non_expression_type): Add productions for pointer
11748         casts. 
11749
11750         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
11751         code.  We should not use force into static mode if the method is
11752         not virtual.  Fixes bug in MIS
11753
11754         * statement.cs (Do.Emit, While.Emit, For.Emit,
11755         Statement.EmitBoolExpression): Add support to Do and While to
11756         propagate infinite loop as `I do return' semantics.
11757
11758         Improve the For case to also test for boolean constants.
11759
11760         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
11761         to the list of attributes we can add.
11762
11763         Remove `EmitContext' argument.
11764
11765         * class.cs (Method.Define): Apply parameter attributes.
11766         (Constructor.Define): Apply parameter attributes.
11767         (MethodCore.LabelParameters): Move here the core of labeling
11768         parameters. 
11769
11770         * support.cs (ReflectionParameters.ParameterModifier,
11771         InternalParameters.ParameterModifier): Use IsByRef on the type and
11772         only return the OUT bit for these parameters instead of in/out/ref
11773         flags.
11774
11775         This is because I miss-understood things.  The ParameterInfo.IsIn
11776         and IsOut represent whether the parameter has the [In] and [Out]
11777         attributes set.  
11778
11779 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
11780
11781         * ecore.cs (FieldExpr.Emit): Release temporaries.
11782
11783         * assign.cs (LocalTemporary.Release): new function.
11784
11785         * codegen.cs (EmitContext.GetTemporaryStorage,
11786         EmitContext.FreeTemporaryStorage): Rework the way we deal with
11787         temporary storage.  Now we can "put back" localbuilders when we
11788         are done with them
11789
11790 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
11791
11792         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
11793         need to make a copy of the variable to generate verifiable code.
11794
11795 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
11796
11797         * driver.cs: Compute dynamically the system directory.
11798
11799         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
11800         Slower, but more generally useful.  Used by the abstract
11801         registering implementation. 
11802
11803         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
11804         the rules for the special rule on Type/instances.  First check if
11805         we have the same name, and if so, try that special static path
11806         rather than the instance path.
11807
11808 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
11809
11810         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
11811         for, while and if.
11812
11813         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
11814         Enum, ValueType, Delegate or Array for non-corlib compiles.
11815
11816         * cs-tokenizer.cs: Catch long identifiers (645)
11817
11818         * typemanager.cs (IndexerPropetyName): Ravi never tested this
11819         piece of code.
11820
11821         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
11822         fix, we were returning too early, so we were not registering
11823         pending methods from abstract classes.
11824
11825         Do not register pending methods if the class is abstract.
11826
11827         * expression.cs (Conditional.DoResolve): Report circular implicit
11828         conversions when we neecd to compute it for conditional
11829         expressions. 
11830
11831         (Is.DoResolve): If the expression is always of the provided type,
11832         flag warning 183.  If the expression can not ever be of the
11833         provided type flag warning 184.
11834
11835         * class.cs: Catch 169 as well.
11836
11837         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
11838         read. 
11839
11840 2002-01-18  Nick Drochak  <ndrochak@gol.com>
11841
11842         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
11843
11844 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
11845
11846         * interface.cs: (PopulateMethod): Check for pointers being defined
11847         only if the unsafe context is active.
11848         (PopulateProperty): ditto.
11849         (PopulateIndexer): ditto.
11850
11851         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
11852         specified.  If pointers are present, make sure that they are
11853         present in an unsafe context.
11854         (Constructor, Constructor.Define): ditto.
11855         (Field, Field.Define): ditto.
11856         (Property, Property.Define): ditto.
11857         (Event, Event.Define): ditto.
11858
11859         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
11860         hashtable if there are classes or structs defined.
11861
11862         * expression.cs (LocalVariableReference.DoResolve): Simplify this
11863         code, as the constant resolution moved.
11864
11865         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
11866         the metadata, so we can flag error 133. 
11867
11868         * decl.cs (MemberCore.UnsafeOK): New function to test that a
11869         pointer is being declared in an unsafe context.
11870
11871 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
11872
11873         * modifiers.cs (Modifiers.Check): Require a Location argument.
11874         Report error 227 for Unsafe use.
11875
11876         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
11877
11878         * statement.cs (For.Emit): If the test is null, then report that
11879         we do `return', as we wont reach anything afterwards.
11880
11881         (Switch.SwitchGoverningType): Track the expression that matched
11882         the conversion.
11883
11884         * driver.cs: Allow negative numbers as an error code to flag.
11885
11886         * cs-parser.jay: Handle 1551.
11887
11888         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
11889
11890 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11891
11892         * cs-parser.jay: Report 1518 (type declaration can only contain
11893         class, struct, interface, enum or delegate)
11894
11895         (switch_label): Report 1523 (keywords `case' or `default' must
11896         preced code)
11897
11898         (opt_switch_sections): Report 1522 (empty switch)
11899
11900         * driver.cs: Report 1515 (response file specified multiple times)
11901         Report 1516 (Source file specified multiple times).
11902
11903         * expression.cs (Argument.Resolve): Signal 1510
11904
11905         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
11906         access not allowed in static code)
11907
11908 2002-01-11  Ravi Pratap  <ravi@ximian.com>
11909
11910         * typemanager.cs (IsPointerType): Utility method which we are going
11911         to need a lot.
11912
11913         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
11914         the object type, so we take care of that.
11915
11916         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
11917
11918         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
11919         added to non-params parameters :-)
11920
11921         * typemanager.cs (CSharpName): Include 'void' type too. 
11922
11923         (void_ptr_type): Include in the set of core types.
11924
11925         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
11926         duplicating code.
11927
11928         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
11929         an unsafe context.
11930
11931         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
11932         completely forgotten about it.
11933
11934 2002-01-10  Ravi Pratap  <ravi@ximian.com>
11935
11936         * cs-parser.jay (pointer_type): Add. This begins our implementation
11937         of parsing rules for unsafe code.
11938
11939         (unsafe_statement): Implement.
11940
11941         (embedded_statement): Modify to include the above.
11942
11943         * statement.cs (Unsafe): Implement new class for unsafe blocks.
11944
11945         * codegen.cs (EmitContext.InUnsafe): Add. This determines
11946         if the current context is an unsafe one.
11947
11948         * cs-parser.jay (local_variable_pointer_type): Since local variable types
11949         are handled differently, we need separate rules for them.
11950
11951         (local_variable_declaration): Update to use local_variable_pointer_type
11952         to allow variable declarations of unmanaged pointer types.
11953
11954         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
11955         in unsafe contexts.
11956
11957         * ../errors/cs0214.cs : Add.
11958
11959 2002-01-16  Nick Drochak  <ndrochak@gol.com>
11960
11961         * makefile: remove 'response' file when cleaning.
11962
11963 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11964
11965         * cs-parser.jay: Report 1524.
11966
11967 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
11968
11969         * typemanager.cs (RegisterMethod): drop checking if we have
11970         registered this from here
11971
11972 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
11973
11974         * class.cs (Method.EmitDestructor): Implement calling our base
11975         destructor. 
11976
11977         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
11978         value of InFinally.
11979
11980         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
11981         this routine and will wrap the call in a try/catch block.  Deal
11982         with the case.
11983
11984 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
11985
11986         * ecore.cs (Expression.MemberLookup): instead of taking a
11987         parameter `same_type' that was used to tell whether we could
11988         access private members we compute our containing type from the
11989         EmitContext.
11990
11991         (FieldExpr): Added partial support for volatile fields.  This does
11992         not work for volatile fields exposed from assemblies, as I can not
11993         figure out how to extract the modreq from it.
11994
11995         Updated all the source files to use this.
11996
11997         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
11998         because it is referenced by MemberLookup very often. 
11999
12000 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12001
12002         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12003         TypeBuilder.GetCustomAttributes to retrieve what we need.
12004
12005         Get rid of redundant default_member_attr_type as this is the same as
12006         default_member_type which already exists.
12007
12008         * interface.cs, attribute.cs : Update accordingly.
12009
12010 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12011
12012         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12013         work for TYpeBuilders though.  Ravi, can you please fix this?
12014
12015         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12016
12017         * expression.cs (Argument.Emit): Handle the case of ref objects
12018         being passed to ref functions;  
12019
12020         (ParameterReference.EmitLoad): Loads the content of the pointer
12021         without dereferencing.
12022
12023 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12024
12025         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12026
12027 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12028
12029         * class.cs (Indexer.DefineMethod): Incorporate the interface
12030         type in the name of the method if we are doing explicit interface
12031         implementation.
12032
12033         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12034
12035         (BetterConversion): Fix extremely trivial bug where we were referring to
12036         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12037         again !
12038
12039         * ../errors/bug16.cs : Add although we have fixed it.
12040
12041 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12042
12043         * expression.cs (BaseIndexer): Begin implementation.
12044
12045         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12046
12047         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12048         production directly to remove a shift/reduce, and implement
12049         explicit interface implementation.
12050
12051         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
12052         after a floating point suffix.
12053
12054         * expression.cs (DoNumericPromotions): Improved the conversion for
12055         uint/uint.  If we have a constant, we avoid doing a typecast to a
12056         larger type.
12057
12058         * class.cs (Indexer): Implement explicit interface implementation
12059         for indexers.
12060
12061 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
12062
12063         * class.cs: make the default instance constructor public and hidebysig.
12064
12065 2001-01-03  Ravi Pratap  <ravi@ximian.com>
12066
12067         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
12068         so we can call it from elsewhere.
12069
12070         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
12071         we emit it internally if the class has a defined indexer; otherwise the user
12072         emits it by decorating the class definition with the DefaultMemberAttribute.
12073
12074         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
12075         attribute is not used on a type which defines an indexer.
12076
12077         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
12078         character when we skip whitespace.
12079
12080         * ../errors/cs0646.cs : Add.
12081
12082 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
12083
12084         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
12085         again. 
12086
12087         * makefile: Add practical target `mcs3.exe' which builds the third
12088         generation compiler. 
12089
12090         * expression.cs (New): Fix structures constructor calling.
12091
12092         * class.cs (Property, Method, Indexer): Emit Final flag on the
12093         method if we are an interface implementation and we are not
12094         abstract. 
12095
12096         * ecore.cs (PropertyExpr): New public field `IsBase', tells
12097         whether this property is referencing a `base' method.
12098
12099         * expression.cs (Invocation.EmitCall): take an extra argument:
12100         is_base, this is used to determine whether the `call' or
12101         `callvirt' opcode should be used.
12102
12103
12104         * delegate.cs: update EmitCall.
12105
12106         * class.cs (Method.Define): Set NewSlot for the cases where we are
12107         not implementing an interface method.
12108
12109         (Property.Define): ditto.
12110
12111 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
12112
12113         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
12114         'r'.  Allows mcs to parse itself fully.
12115
12116 2002-01-02  Ravi Pratap  <ravi@ximian.com>
12117
12118         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
12119         of the number of initializers that require the InitializeArray method.
12120
12121         (CheckIndices): Store the Expression in all cases - not the plain value. Also
12122         update the above field where necessary.
12123
12124         (MakeByteBlob): Update accordingly.
12125
12126         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
12127         greater than 2.
12128
12129         (EmitDynamicInitializers): Update in accordance with the new optimization.
12130
12131         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
12132         same OpCode applies.
12133
12134         * cs-parser.jay : Fix some glaring errors I introduced.
12135
12136 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
12137
12138         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
12139         so that we can check for name clashes there too.
12140
12141         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
12142         for interface indexers.
12143
12144         * interfaces.cs (Define): Emit the default member attribute.
12145
12146         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
12147         variable was being referred to while setting the value ;-)
12148
12149 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
12150
12151         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
12152         byte-by-byte information when we know the data is zero.
12153
12154         Make the block always a multiple of 4, because
12155         DefineInitializedData has a bug.
12156
12157         * assign.cs: Fix, we should assign from the temporary, not from
12158         the source. 
12159
12160         * expression.cs (MakeByteBlob): Fix my incorrect code.
12161
12162 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
12163
12164         * typemanager.cs (EnumToUnderlying): This function is used to get
12165         the underlying type from an enumeration, because it does not
12166         always work. 
12167
12168         * constant.cs: Use the I4_S form for values between -128 and 127.
12169
12170         * statement.cs (Block.LookupLabel): Looks up a label.
12171         (Block): Drop support for labeled blocks.
12172
12173         (LabeledStatement): New kind of statement that represents a label
12174         only.
12175
12176         (Goto): Finally implement this bad boy.
12177
12178         * cs-parser.jay: Update to reflect new mechanism to implement
12179         labels.
12180
12181 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
12182
12183         * codegen.cs (EmitContext.This): a codegen property that keeps the
12184         a single instance of this instead of creating many different this
12185         instances. 
12186
12187         * delegate.cs (Delegate.DoResolve): Update to use the property;
12188
12189         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
12190
12191         * expression.cs (BaseAccess.DoResolve): Ditto.
12192
12193 2001-12-29  Ravi Pratap  <ravi@ximian.com>
12194
12195         * typemanager.cs (methodimpl_attr_type): Add to hold the type
12196         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
12197
12198         (InitCoreTypes): Update accordingly.
12199
12200         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
12201         so we can quickly store the state.
12202
12203         (ApplyAttributes): Set the correct implementation flags
12204         for InternalCall methods.
12205
12206 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
12207
12208         * expression.cs (EmitCall): if a method is not virtual, then do
12209         not use callvirt on it.
12210
12211         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
12212         user defined stuff) requires the use of stobj, which takes an
12213         address on the stack instead of an array and an index.  So emit
12214         the Ldelema operation for it.
12215
12216         (EmitStoreOpcode): Use stobj for valuetypes.
12217
12218         (UnaryMutator.EmitCode): Use the right 1 value depending on
12219         whether we are dealing with int64/uint64, float or doubles.
12220
12221         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
12222         constructors that I implemented last night.
12223
12224         (Constructor.IsDefault): Fix to work properly for static
12225         constructors.
12226
12227         * cs-parser.jay (CheckDef): report method signature errors.
12228         Update error number 103 to be 132.
12229
12230         * decl.cs: New AdditionResult enumeration value: MethodExists.
12231         Although we do this check for methods later on in the semantic
12232         analysis, catching repeated default constructors is so easy that
12233         we catch these here. 
12234
12235         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
12236         promotions code.
12237
12238         (ParameterReference.EmitAssign, Emit): handle
12239         bools as bytes.
12240
12241         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
12242         (ArrayAccess.EmitStoreOpcode): ditto.
12243
12244         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
12245
12246         * expression.cs (MakeByteBlob): Complete all the missing types
12247         (uint, short, ushort, byte, sbyte)
12248
12249         * class.cs: Only init instance field initializers on instance
12250         constructors. 
12251
12252         Rename `constructors' to instance_constructors. 
12253
12254         (TypeContainer.AddConstructor): Only add constructors to the list
12255         if it is not static.
12256
12257         Make sure that we handle default_static_constructor independently
12258         everywhere where we handle instance_constructors
12259
12260 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
12261
12262         * class.cs: Do not lookup or create a base initializer for a
12263         static constructor.
12264
12265         (ConstructorInitializer.Resolve): use the proper type to lookup
12266         for constructors.
12267
12268         * cs-parser.jay: Report error 1585 (modifiers between type and name).
12269
12270         * enum.cs, interface.cs: Remove CloseType, this is taken care by
12271         in DeclSpace. 
12272
12273         * decl.cs: CloseType is now an virtual method, the default
12274         implementation just closes this type.
12275
12276 2001-12-28  Ravi Pratap  <ravi@ximian.com>
12277
12278         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
12279         to PreserveSig by default. Also emit HideBySig on such methods.
12280
12281         Basically, set the defaults to standard values.
12282
12283         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
12284         argument, if candidate is better, it can't be worse than the best !
12285
12286         (Invocation): Re-write bits to differentiate between methods being
12287         applicable in their expanded form and their normal form - for params
12288         methods of course.
12289
12290         Get rid of use_standard everywhere as only standard conversions are allowed
12291         in overload resolution. 
12292
12293         More spec conformance.
12294
12295 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12296
12297         * driver.cs: Add --timestamp, to see where the compiler spends
12298         most of its time.
12299
12300         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
12301         `this' in static code.
12302
12303         (SimpleName.DoResolve): Implement in terms of a helper function
12304         that allows static-references to be passed upstream to
12305         MemberAccess.
12306
12307         (Expression.ResolveWithSimpleName): Resolve specially simple
12308         names when called by MemberAccess to implement the special
12309         semantics. 
12310
12311         (Expression.ImplicitReferenceConversion): Handle conversions from
12312         Null to reference types before others, as Null's type is
12313         System.Object. 
12314
12315         * expression.cs (Invocation.EmitCall): Handle the special case of
12316         calling methods declared on a reference type from a ValueType
12317         (Base classes System.Object and System.Enum)
12318
12319         (MemberAccess.Resolve): Only perform lookups on Enumerations if
12320         the left hand side is a TypeExpr, not on every enumeration. 
12321
12322         (Binary.Resolve): If types are reference types, then do a cast to
12323         object on operators != and == of both arguments.
12324
12325         * typemanager.cs (FindMembers): Extract instance and static
12326         members if requested.
12327
12328         * interface.cs (PopulateProperty): Use void_type instead of null
12329         as the return type for the setter method.
12330
12331         (PopulateIndexer): ditto.
12332
12333 2001-12-27  Ravi Pratap  <ravi@ximian.com>
12334
12335         * support.cs (ReflectionParameters): Fix minor bug where we
12336         were examining the wrong parameter for the ParamArray attribute.
12337
12338         Cope with requests for the type of the parameter at position
12339         greater than the params parameter's. We now return the element
12340         type of the params array as that makes more sense.
12341
12342         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
12343         accordingly as we no longer have to extract the element type
12344         ourselves.
12345
12346         (Invocation.OverloadResolve): Update.
12347
12348 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12349
12350         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
12351         against IEnumerator, test whether the return value is a descendant
12352         of the IEnumerator interface.
12353
12354         * class.cs (Indexer.Define): Use an auxiliary method to implement
12355         the other bits of the method definition.  Begin support for
12356         explicit interface implementation.
12357
12358         (Property.DefineMethod): Use TypeManager.void_type instead of null
12359         for an empty return value.
12360
12361 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
12362
12363         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
12364         dealing with a FieldExpr which is composed of a FieldBuilder, in
12365         the code path we did extract the constant, but we should have
12366         obtained the underlying value to be able to cast it (otherwise we
12367         end up in an infinite loop, this is what Ravi was running into).
12368
12369         (ArrayCreation.UpdateIndices): Arrays might be empty.
12370
12371         (MemberAccess.ResolveMemberAccess): Add support for section
12372         14.5.4.1 that deals with the special case of E.I when E is a type
12373         and something else, that I can be a reference to a static member.
12374
12375         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
12376         handle a particular array type to create byte blobs, it is just
12377         something we dont generate byteblobs for.
12378
12379         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
12380         arguments. 
12381
12382         * location.cs (Push): remove the key from the hashtable that we
12383         are about to add.   This happens for empty files.
12384
12385         * driver.cs: Dispose files after we have parsed them.
12386
12387         (tokenize): new function that only runs the tokenizer on its
12388         input, for speed testing.
12389
12390 2001-12-26  Ravi Pratap  <ravi@ximian.com>
12391
12392         * class.cs (Event.Define): Define the private field only if there
12393         are no accessors defined.
12394
12395         * expression.cs (ResolveMemberAccess): If there is no associated
12396         field with the event, that means we have an event defined with its
12397         own accessors and we should flag error cs0070 since transforming
12398         ourselves into a field is not valid in that case.
12399
12400         * ecore.cs (SimpleName.DoResolve): Same as above.
12401
12402         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
12403         and charset to sane values.
12404
12405 2001-12-25  Ravi Pratap  <ravi@ximian.com>
12406
12407         * assign.cs (DoResolve): Perform check on events only if they 
12408         are being accessed outside the declaring type.
12409
12410         * cs-parser.jay (event_declarations): Update rules to correctly
12411         set the type of the implicit parameter etc.
12412
12413         (add_accessor, remove_accessor): Set current local parameters.
12414
12415         * expression.cs (Binary): For delegate addition and subtraction,
12416         cast the return value from the method into the appropriate delegate
12417         type.
12418
12419 2001-12-24  Ravi Pratap  <ravi@ximian.com>
12420
12421         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
12422         of these as the workaround is unnecessary.
12423
12424         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
12425         delegate data - none of that is needed at all.
12426
12427         Re-write bits to extract the instance expression and the delegate method
12428         correctly.
12429
12430         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
12431         on delegates too.
12432
12433         * attribute.cs (ApplyAttributes): New method to take care of common tasks
12434         of attaching attributes instead of duplicating code everywhere.
12435
12436         * everywhere : Update code to do attribute emission using the above method.
12437
12438 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12439
12440         * expression.cs (IsParamsMethodApplicable): if there are not
12441         parameters, return immediately.
12442
12443         * ecore.cs: The 0 literal can be implicity converted to an enum
12444         type. 
12445
12446         (SimpleName.DoResolve): First lookup the type, then lookup the
12447         members. 
12448
12449         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
12450         want to get its address.  If the InstanceExpression is not
12451         addressable, store the result in a temporary variable, then get
12452         the address of it.
12453
12454         * codegen.cs: Only display 219 errors on warning level or above. 
12455
12456         * expression.cs (ArrayAccess): Make it implement the
12457         IMemoryLocation interface.
12458
12459         (Binary.DoResolve): handle the operator == (object a, object b)
12460         and operator != (object a, object b) without incurring into a
12461         BoxedCast (because 5 != o should never be performed).
12462
12463         Handle binary enumerator operators.
12464
12465         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
12466         value type, otherwise use Ldelem_ref.
12467
12468         Use precomputed names;
12469
12470         (AddressOf): Implement address of
12471
12472         * cs-parser.jay (labeled_statement): Fix recursive block
12473         addition by reworking the production.
12474
12475         * expression.cs (New.DoEmit): New has a special case:
12476                 
12477                  If we are dealing with a ValueType, we have a few
12478                  situations to deal with:
12479                 
12480                     * The target of New is a ValueType variable, that is
12481                       easy, we just pass this as the variable reference
12482                 
12483                     * The target of New is being passed as an argument,
12484                       to a boxing operation or a function that takes a
12485                       ValueType.
12486                 
12487                       In this case, we need to create a temporary variable
12488                       that is the argument of New.
12489
12490
12491 2001-12-23  Ravi Pratap  <ravi@ximian.com>
12492
12493         * rootcontext.cs (LookupType): Check that current_type is not null before
12494         going about looking at nested types.
12495
12496         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
12497         not implement the IAssignMethod interface any more.
12498
12499         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
12500         where we tranform them into FieldExprs if they are being resolved from within
12501         the declaring type.
12502
12503         * ecore.cs (SimpleName.DoResolve): Do the same here.
12504
12505         * assign.cs (DoResolve, Emit): Clean up code considerably. 
12506
12507         * ../errors/bug10.cs : Add.
12508
12509         * ../errors/cs0070.cs : Add.
12510
12511         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
12512
12513         * assign.cs : Get rid of EventIsLocal everywhere.
12514
12515 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12516
12517         * ecore.cs (ConvertIntLiteral): finished the implementation.
12518
12519         * statement.cs (SwitchLabel): Convert the value we are using as a
12520         key before looking up the table.
12521
12522 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12523
12524         * codegen.cs (EmitTopBlock): Require a Location argument now.
12525
12526         * cs-parser.jay (constructor_declarator): We need to setup
12527         current_local_parameters before we parse the
12528         opt_constructor_initializer, to allow the variables to be bound
12529         to the constructor arguments.
12530
12531         * rootcontext.cs (LookupType): First lookup nested classes in our
12532         class and our parents before we go looking outside our class.
12533
12534         * expression.cs (ConstantFold): Extract/debox the values at the
12535         beginnning. 
12536
12537         * rootcontext.cs (EmitCode): Resolve the constants first before we
12538         resolve the types.  This is not really needed, but it helps debugging.
12539
12540         * statement.cs: report location.
12541
12542         * cs-parser.jay: pass location to throw statement.
12543
12544         * driver.cs: Small bug fix.
12545
12546         * report.cs: Updated format to be 4-zero filled digits.
12547
12548 2001-12-22  Ravi Pratap  <ravi@ximian.com>
12549
12550         * expression.cs (CheckIndices): Fix minor bug where the wrong
12551         variable was being referred to ;-)
12552
12553         (DoEmit): Do not call EmitStaticInitializers when the 
12554         underlying type is System.Object.
12555
12556 2001-12-21  Ravi Pratap  <ravi@ximian.com>
12557
12558         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
12559         and do the usual workaround for SRE.
12560
12561         * class.cs (MyEventBuilder.EventType): New member to get at the type
12562         of the event, quickly.
12563
12564         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
12565
12566         * assign.cs (Assign.DoResolve): Handle the case when the target
12567         is an EventExpr and perform the necessary checks.
12568
12569         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
12570         interface.
12571
12572         (SimpleName.MemberStaticCheck): Include check for EventExpr.
12573
12574         (EventExpr): Set the type in the constructor itself since we 
12575         are meant to be born fully resolved.
12576
12577         (EventExpr.Define): Revert code I wrote earlier.
12578                 
12579         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
12580         instance expression is null. The instance expression is a This in that case
12581         or a null, depending on whether it is a static method or not.
12582
12583         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
12584         refers to more than one method.
12585
12586         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
12587         and accordingly flag errors.
12588
12589 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12590
12591         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
12592
12593 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12594
12595         * location.cs (ToString): Provide useful rutine.
12596
12597 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12598
12599         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
12600         objects, return the actual integral boxed.
12601
12602         * statement.cs (SwitchLabel): define an ILLabel for each
12603         SwitchLabel. 
12604
12605         (Switch.CheckSwitch): If the value is a Literal, extract
12606         the underlying literal.
12607
12608         Also in the unused hashtable we had, add the SwitchLabel so we can
12609         quickly look this value up.
12610
12611         * constant.cs: Implement a bunch of new constants.  Rewrite
12612         Literal based on this.  Made changes everywhere to adapt to this.
12613
12614         * expression.cs (Expression.MakeByteBlob): Optimize routine by
12615         dereferencing array only once, and also copes with enumrations.
12616
12617         bytes are two bytes wide, not one.
12618
12619         (Cast): Perform constant conversions.
12620
12621         * ecore.cs (TryImplicitIntConversion): Return literals instead of
12622         wrappers to the literals here.
12623
12624         * expression.cs (DoNumericPromotions): long literals can converted
12625         to ulong implicity (this is taken care of elsewhere, but I was
12626         missing this spot).
12627
12628         * ecore.cs (Expression.Literalize): Make the return type Literal,
12629         to improve type checking.
12630
12631         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
12632
12633 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12634
12635         * literal.cs: Revert code from ravi that checked the bounds.  The
12636         bounds are sane by the definition of the type itself. 
12637
12638         * typemanager.cs: Fix implementation of ImplementsInterface.  We
12639         need to actually look up in our parent hierarchy for interfaces
12640         implemented. 
12641
12642         * const.cs: Use the underlying type for enumerations
12643
12644         * delegate.cs: Compute the basename for the delegate creation,
12645         that should fix the delegate test case, and restore the correct
12646         Type Lookup semantics in rootcontext
12647
12648         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
12649         referencing a nested type with the Reflection API is using the "+"
12650         sign. 
12651
12652         * cs-parser.jay: Do not require EOF token at the end.
12653
12654 2001-12-20  Ravi Pratap  <ravi@ximian.com>
12655
12656         * rootcontext.cs (LookupType): Concatenate type names with
12657         a '.' instead of a '+' The test suite passes again.
12658
12659         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
12660         field of the enumeration.
12661
12662         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
12663         the case when the member is an EventExpr.
12664
12665         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
12666         static has an associated instance expression.
12667
12668         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
12669
12670         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
12671
12672         * class.cs (Event.Define): Register event and perform appropriate checks
12673         for error #111.
12674
12675         We define the Add and Remove methods even if the use provides none because
12676         in that case, we provide default implementations ourselves.
12677
12678         Define a private field of the type of the event. This is done by the CSC compiler
12679         and we should be doing it too ;-)
12680
12681         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
12682         More methods we use in code we generate.
12683
12684         (multicast_delegate_type, delegate_type): Two separate types since the distinction
12685         is important.
12686
12687         (InitCoreTypes): Update accordingly for the above.
12688
12689         * class.cs (Event.Emit): Generate code for default accessors that we provide
12690
12691         (EmitDefaultMethod): Do the job in the above.
12692
12693         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
12694         appropriate place.
12695
12696 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12697
12698         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
12699         builders even if we were missing one.
12700
12701         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
12702         pass the Basename as our class name instead of the Name.  The
12703         basename will be correctly composed for us.
12704
12705         * parameter.cs (Paramters): Now takes a Location argument.
12706
12707         * decl.cs (DeclSpace.LookupType): Removed convenience function and
12708         make all the code call directly LookupType in RootContext and take
12709         this chance to pass the Location information everywhere.
12710
12711         * Everywhere: pass Location information.
12712
12713 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
12714
12715         * class.cs (Constructor.Define): Updated way of detecting the
12716         length of the parameters.
12717
12718         (TypeContainer.DefineType): Use basename as the type name for
12719         nested types.
12720
12721         (TypeContainer.Define): Do not recursively define types here, as
12722         definition is taken care in order by the RootContext.
12723
12724         * tree.cs: Keep track of namespaces in a per-file basis.
12725
12726         * parameter.cs (Parameter.ComputeSignature): Update to use
12727         DeclSpace. 
12728
12729         (Parameters.GetSignature): ditto.
12730
12731         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
12732         instead of a TypeContainer.
12733
12734         (Interface.SemanticAnalysis): Use `this' instead of our parent to
12735         resolve names.  Because we need to be resolve in our context, not
12736         our parents.
12737
12738         * driver.cs: Implement response files.
12739
12740         * class.cs (TypeContainer.DefineType): If we are defined, do not
12741         redefine ourselves.
12742
12743         (Event.Emit): Emit the code for add/remove handlers.
12744         (Event.Define): Save the MethodBuilders for add/remove.
12745
12746         * typemanager.cs: Use pair here too.
12747
12748         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
12749         DictionaryEntry requires the first argument to be non-null.  
12750
12751         (enum_declaration): Compute full name for registering the
12752         enumeration.
12753
12754         (delegate_declaration): Instead of using
12755         formal_parameter_list, use opt_formal_parameter_list as the list
12756         can be empty.
12757
12758         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
12759         (EventParsing): New property that controls whether `add' and
12760         `remove' are returned as tokens or identifiers (for events);
12761
12762 2001-12-19  Ravi Pratap  <ravi@ximian.com>
12763
12764         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
12765         use MyEventBuilder only and let it wrap the real builder for us.
12766
12767         (MyEventBuilder): Revamp constructor etc.
12768
12769         Implement all operations that we perform on EventBuilder in precisely the same
12770         way here too.
12771
12772         (FindMembers): Update to use the EventBuilder member.
12773
12774         (Event.Emit): Update accordingly.
12775
12776 2001-12-18  Ravi Pratap  <ravi@ximian.com>
12777
12778         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
12779         by calling the appropriate methods.
12780
12781         (GetCustomAttributes): Make stubs as they cannot possibly do anything
12782         useful.
12783
12784         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
12785
12786 2001-12-17  Ravi Pratap  <ravi@ximian.com>
12787
12788         * delegate.cs (Delegate.Populate): Check that the return type
12789         and various parameters types are indeed accessible.
12790
12791         * class.cs (Constructor.Define): Same here.
12792
12793         (Field.Define): Ditto.
12794
12795         (Event.Define): Ditto.
12796
12797         (Operator.Define): Check that the underlying Method defined itself
12798         correctly - so it's MethodBuilder should not be null.
12799
12800         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
12801         expression happens to be null.
12802
12803         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
12804         members but as of now we don't seem to be able to do anything really useful with it.
12805
12806         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
12807         not the EventBuilder.
12808
12809 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
12810
12811         * cs-tokenizer.cs: Add support for defines.
12812         Add support for #if, #elif, #else, #endif
12813
12814         (eval_var): evaluates a variable.
12815         (eval): stubbed for evaluating functions.
12816
12817         * cs-parser.jay: Pass the defines information
12818
12819         * driver.cs: Add --define command line option.
12820
12821         * decl.cs: Move MemberCore here.
12822
12823         Make it the base class for DeclSpace.  This allows us to catch and
12824         report 108 and 109 for everything now.
12825
12826         * class.cs (TypeContainer.Define): Extract all the members
12827         before populating and emit the warning 108 (new keyword required
12828         to override) instead of having each member implement this.
12829
12830         (MemberCore.Define): New abstract method, we will be using this in
12831         the warning reporting engine in Populate.
12832
12833         (Operator.Define): Adjust to new MemberCore protocol. 
12834
12835         * const.cs (Const): This does not derive from Expression, it is a
12836         temporary object we use to create fields, it is a MemberCore. 
12837
12838         * class.cs (Method.Define): Allow the entry point to be in a
12839         specific class.
12840
12841         * driver.cs: Rewrite the argument handler to clean it up a bit.
12842
12843         * rootcontext.cs: Made it just an auxiliary namespace feature by
12844         making everything static.
12845
12846         * driver.cs: Adapt code to use RootContext type name instead of
12847         instance variable.
12848
12849         * delegate.cs: Remove RootContext argument.
12850
12851         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
12852         argument. 
12853
12854         * class.cs (Event.Define): The lookup can fail.
12855
12856         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
12857
12858         * expression.cs: Resolve the this instance before invoking the code.
12859
12860 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
12861
12862         * cs-parser.jay: Add a production in element_access that allows
12863         the thing to become a "type" reference.  This way we can parse
12864         things like "(string [])" as a type.
12865
12866         Note that this still does not handle the more complex rules of
12867         casts. 
12868
12869
12870         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
12871
12872         * ecore.cs: (CopyNewMethods): new utility function used to
12873         assemble the list of methods from running FindMembers.
12874
12875         (MemberLookup): Rework FindMembers so that 
12876
12877 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
12878
12879         * class.cs (TypeContainer): Remove Delegates who fail to be
12880         defined.
12881
12882         * delegate.cs (Populate): Verify that we dont get null return
12883         values.   TODO: Check for AsAccessible.
12884
12885         * cs-parser.jay: Use basename to emit error 574 (destructor should
12886         have the same name as container class), not the full name.
12887
12888         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
12889         possible representation.  
12890
12891         Also implements integer type suffixes U and L.
12892
12893 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
12894
12895         * expression.cs (ArrayCreation.DoResolve): We need to do the
12896         argument resolution *always*.
12897
12898         * decl.cs: Make this hold the namespace.  Hold the root context as
12899         well.
12900         (LookupType): Move here.
12901
12902         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
12903
12904         * location.cs (Row, Name): Fixed the code, it was always returning
12905         references to the first file.
12906
12907         * interface.cs: Register properties defined through interfaces.
12908
12909         * driver.cs: Add support for globbing on the command line
12910
12911         * class.cs (Field): Make it derive from MemberCore as well.
12912         (Event): ditto.
12913
12914 2001-12-15  Ravi Pratap  <ravi@ximian.com>
12915
12916         * class.cs (Event::Define): Check that the type of the event is a delegate
12917         type else flag error #66.
12918
12919         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
12920         same.
12921
12922         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
12923         values of EntryPoint, CharSet etc etc.
12924
12925         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
12926
12927         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
12928         be null and we should ignore this. I am not sure if this is really clean. Apparently,
12929         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
12930         which needs this to do its work.
12931
12932         * ../errors/cs0066.cs : Add.
12933
12934 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
12935
12936         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
12937         helper functions.
12938
12939         * class.cs: (MethodSignature.MethodSignature): Removed hack that
12940         clears out the parameters field.
12941         (MemberSignatureCompare): Cleanup
12942
12943         (MemberCore): New base class used to share code between MethodCore
12944         and Property.
12945
12946         (RegisterRequiredImplementations) BindingFlags.Public requires
12947         either BindingFlags.Instace or Static.  Use instance here.
12948
12949         (Property): Refactored code to cope better with the full spec.
12950
12951         * parameter.cs (GetParameterInfo): Return an empty array instead
12952         of null on error.
12953
12954         * class.cs (Property): Abstract or extern properties have no bodies.
12955
12956         * parameter.cs (GetParameterInfo): return a zero-sized array.
12957
12958         * class.cs (TypeContainer.MethodModifiersValid): Move all the
12959         method modifier validation to the typecontainer so we can reuse
12960         this on properties.
12961
12962         (MethodCore.ParameterTypes): return an empty sized array of types.
12963
12964         (Property.Define): Test property modifier validity.
12965
12966         Add tests for sealed/override too.
12967
12968         (Method.Emit): abstract or extern methods have no bodies.
12969
12970 2001-12-14  Ravi Pratap  <ravi@ximian.com>
12971
12972         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
12973         thing.
12974
12975         (Method::Define, ::Emit): Modify accordingly.
12976
12977         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
12978
12979         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
12980
12981         * makefile: Pass in /unsafe.
12982
12983 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
12984
12985         * class.cs (MakeKey): Kill routine.
12986
12987         * class.cs (TypeContainer.Define): Correctly define explicit
12988         method implementations (they require the full interface name plus
12989         the method name).
12990
12991         * typemanager.cs: Deply the PtrHashtable here and stop using the
12992         lame keys.  Things work so much better.
12993
12994         This of course broke everyone who depended on `RegisterMethod' to
12995         do the `test for existance' test.  This has to be done elsewhere.
12996
12997         * support.cs (PtrHashtable): A hashtable that avoid comparing with
12998         the object stupid Equals method (because, that like fails all over
12999         the place).  We still do not use it.
13000
13001         * class.cs (TypeContainer.SetRequiredInterface,
13002         TypeContainer.RequireMethods): Killed these two routines and moved
13003         all the functionality to RegisterRequiredImplementations.
13004
13005         (TypeContainer.RegisterRequiredImplementations): This routine now
13006         registers all the implementations required in an array for the
13007         interfaces and abstract methods.  We use an array of structures
13008         which can be computed ahead of time to reduce memory usage and we
13009         also assume that lookups are cheap as most classes will not
13010         implement too many interfaces.
13011
13012         We also avoid creating too many MethodSignatures.
13013
13014         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13015         clear the "pending" bit if we find that there are problems with
13016         the declaration.
13017
13018         (TypeContainer.VerifyPendingMethods): Update to report errors of
13019         methods that look like implementations but are not.
13020
13021         (TypeContainer.Define): Add support for explicit interface method
13022         implementation. 
13023
13024 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13025
13026         * typemanager.cs: Keep track of the parameters here instead of
13027         being a feature of the TypeContainer.
13028
13029         * class.cs: Drop the registration of parameters here, as
13030         InterfaceMethods are also interface declarations.
13031
13032         * delegate.cs: Register methods with the TypeManager not only with
13033         the TypeContainer.  This code was buggy.
13034
13035         * interface.cs: Full registation here.
13036
13037 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13038
13039         * expression.cs: Remove reducer for binary expressions, it can not
13040         be done this way.
13041
13042         * const.cs: Put here the code that used to go into constant.cs
13043
13044         * constant.cs: Put here the code for constants, this is a new base
13045         class for Literals.
13046
13047         * literal.cs: Make Literal derive from Constant.
13048
13049 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13050
13051         * statement.cs (Return.Emit): Report error 157 if the user
13052         attempts to return from a finally block.
13053
13054         (Return.Emit): Instead of emitting a return, jump to the end of
13055         the function.
13056
13057         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
13058         LocalBuilder to store the result of the function.  ReturnLabel is
13059         the target where we jump.
13060
13061
13062 2001-12-09  Radek Doulik  <rodo@ximian.com>
13063
13064         * cs-parser.jay: remember alias in current namespace
13065
13066         * ecore.cs (SimpleName::DoResolve): use aliases for types or
13067         namespaces
13068
13069         * class.cs (LookupAlias): lookup alias in my_namespace
13070
13071         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
13072         aliases hashtable
13073         (LookupAlias): lookup alias in this and if needed in parent
13074         namespaces
13075
13076 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
13077
13078         * support.cs: 
13079
13080         * rootcontext.cs: (ModuleBuilder) Made static, first step into
13081         making things static.  I need this to avoid passing the
13082         TypeContainer when calling ParameterType.
13083
13084         * support.cs (InternalParameters.ParameterType): Remove ugly hack
13085         that did string manipulation to compute the type and then call
13086         GetType.  Use Parameter.ParameterType instead.
13087
13088         * cs-tokenizer.cs: Consume the suffix for floating values.
13089
13090         * expression.cs (ParameterReference): figure out whether this is a
13091         reference parameter or not.  Kill an extra variable by computing
13092         the arg_idx during emission.
13093
13094         * parameter.cs (Parameters.GetParameterInfo): New overloaded
13095         function that returns whether a parameter is an out/ref value or not.
13096
13097         (Parameter.ParameterType): The type of the parameter (base,
13098         without ref/out applied).
13099
13100         (Parameter.Resolve): Perform resolution here.
13101         (Parameter.ExternalType): The full type (with ref/out applied).
13102
13103         * statement.cs (Using.Emit, Using.EmitExpression): Implement
13104         support for expressions on the using statement.
13105
13106 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
13107
13108         * statement.cs (Using.EmitLocalVariableDecls): Split the
13109         localvariable handling of the using statement.
13110
13111         (Block.EmitMeta): Keep track of variable count across blocks.  We
13112         were reusing slots on separate branches of blocks.
13113
13114         (Try.Emit): Emit the general code block, we were not emitting it. 
13115
13116         Check the type of the declaration to be an IDisposable or
13117         something that can be implicity converted to it. 
13118
13119         Emit conversions if required.
13120
13121         * ecore.cs (EmptyExpression): New utility class.
13122         (Expression.ImplicitConversionExists): New utility function.
13123
13124 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
13125
13126         * statement.cs (Using): Implement.
13127
13128         * expression.cs (LocalVariableReference): Support read only variables.
13129
13130         * statement.cs: Remove the explicit emit for the Leave opcode.
13131         (VariableInfo): Add a readonly field.
13132
13133 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
13134
13135         * ecore.cs (ConvCast): new class used to encapsulate the various
13136         explicit integer conversions that works in both checked and
13137         unchecked contexts.
13138
13139         (Expression.ConvertNumericExplicit): Use new ConvCast class to
13140         properly generate the overflow opcodes.
13141
13142 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13143
13144         * statement.cs: The correct type for the EmptyExpression is the
13145         element_type, not the variable type.  Ravi pointed this out.
13146
13147 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13148
13149         * class.cs (Method::Define): Handle PInvoke methods specially
13150         by using DefinePInvokeMethod instead of the usual one.
13151
13152         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
13153         above to do the task of extracting information and defining the method.
13154
13155 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13156
13157         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
13158         of the condition for string type.
13159
13160         (Emit): Move that here. 
13161
13162         (ArrayCreation::CheckIndices): Keep string literals in their expression
13163         form.
13164
13165         (EmitDynamicInitializers): Handle strings appropriately.
13166
13167 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13168
13169         * codegen.cs (EmitContext): Replace multiple variables with a
13170         single pointer to the current Switch statement.
13171
13172         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
13173         EmitContext.
13174
13175 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13176
13177         * statement.cs 
13178
13179         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
13180         default'.
13181
13182         (Foreach.Emit): Foreach on arrays was not setting
13183         up the loop variables (for break/continue).
13184
13185         (GotoCase): Semi-implented.
13186
13187 2001-12-03  Ravi Pratap  <ravi@ximian.com>
13188
13189         * attribute.cs (CheckAttribute): Handle system attributes by using
13190         Attribute.GetAttributes to examine information we need.
13191
13192         (GetValidPlaces): Same here.
13193
13194         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
13195
13196         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
13197
13198         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
13199
13200         (Method::Define): Set appropriate flags if we have a DllImport attribute.
13201
13202         (Method::Emit): Handle the case when we are a PInvoke method.
13203
13204 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13205
13206         * expression.cs: Use ResolveWithSimpleName on compound names.
13207
13208 2001-12-02  Ravi Pratap  <ravi@ximian.com>
13209
13210         * constant.cs (EmitConstant): Make sure we resolve the associated expression
13211         before trying to reduce it.
13212
13213         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
13214
13215         * constant.cs (LookupConstantValue): Implement.
13216
13217         (EmitConstant): Use the above in emitting the constant.
13218
13219         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
13220         that are user-defined by doing a LookupConstantValue on them.
13221
13222         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
13223         too, like above.
13224
13225 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
13226
13227         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
13228
13229         (BaseAccess.DoResolve): Implement.
13230
13231         (MemberAccess.DoResolve): Split this routine into a
13232         ResolveMemberAccess routine that can be used independently
13233
13234 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
13235
13236         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
13237         As that share bits of the implementation.  Is returns a boolean,
13238         while As returns the Type that is being probed.
13239
13240 2001-12-01  Ravi Pratap  <ravi@ximian.com>
13241
13242         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
13243         instead of a Literal - much easier.
13244
13245         (EnumInTransit): Remove - utterly useless :-)
13246
13247         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
13248
13249         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
13250
13251         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
13252         chain when we have no associated expression.
13253
13254 2001-11-30  Ravi Pratap  <ravi@ximian.com>
13255
13256         * constant.cs (Define): Use Location while reporting the errror.
13257
13258         Also emit a warning when 'new' is used and there is no inherited
13259         member to hide.
13260
13261         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
13262         populated.
13263
13264         (LookupEnumValue): Implement to lookup an enum member's value and define it
13265         if necessary.
13266
13267         (Populate): Re-write accordingly to use the above routine.
13268
13269 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
13270
13271         * expression.cs (This): Fix prototype for DoResolveLValue to
13272         override the base class DoResolveLValue.
13273
13274         * cs-parser.cs: Report errors cs574 and cs575 (destructor
13275         declarations) 
13276
13277         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
13278         (we need to load the address of the field here).  This fixes
13279         test-22. 
13280
13281         (FieldExpr.DoResolveLValue): Call the DoResolve
13282         function to initialize the Instance expression.
13283
13284         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
13285         correctly the GetEnumerator operation on a value type.
13286
13287         * cs-parser.jay: Add more simple parsing error catches.
13288
13289         * statement.cs (Switch): Add support for string switches.
13290         Handle null specially.
13291
13292         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
13293
13294 2001-11-28  Ravi Pratap  <ravi@ximian.com>
13295
13296         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
13297
13298         (declare_local_constant): New helper function.
13299
13300         * statement.cs (AddConstant): Keep a separate record of constants
13301
13302         (IsConstant): Implement to determine if a variable is a constant.
13303
13304         (GetConstantExpression): Implement.
13305
13306         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
13307
13308         * statement.cs (IsVariableDefined): Re-write.
13309
13310 2001-11-27  Ravi Pratap  <ravi@ximian.com>
13311
13312         * class.cs (TypeContainer::FindMembers): Look for constants
13313         in the case when we are looking for MemberTypes.Field
13314
13315         * expression.cs (MemberAccess::DoResolve): Check that in the
13316         case we are a FieldExpr and a Literal, we are not being accessed
13317         by an instance reference.
13318
13319         * cs-parser.jay (local_constant_declaration): Implement.
13320
13321         (declaration_statement): Implement for constant declarations.
13322
13323 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
13324
13325         * statement.cs (Switch): Catch double defaults.
13326
13327         (Switch): More work on the switch() statement
13328         implementation.  It works for integral values now, need to finish
13329         string support.
13330
13331
13332 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13333
13334         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
13335         integer literals into other integer literals.  To be used by
13336         switch. 
13337
13338 2001-11-24  Ravi Pratap  <ravi@ximian.com>
13339
13340         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
13341         some memory.
13342
13343         (EmitDynamicInitializers): Cope with the above since we extract data
13344         directly from ArrayData now.
13345
13346         (ExpectInitializers): Keep track of whether initializers are mandatory
13347         or not.
13348
13349         (Bounds): Make it a hashtable to prevent the same dimension being 
13350         recorded for every element in that dimension.
13351
13352         (EmitDynamicInitializers): Fix bug which prevented the Set array method
13353         from being found.
13354
13355         Also fix bug which was causing the indices to be emitted in the reverse
13356         order.
13357
13358 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13359
13360         * expression.cs (ArrayCreation): Implement the bits that Ravi left
13361         unfinished.  They do not work, because the underlying code is
13362         sloppy.
13363
13364 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13365
13366         * cs-parser.jay: Remove bogus fixme.
13367
13368         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
13369         on Switch statement.
13370
13371 2001-11-23  Ravi Pratap  <ravi@ximian.com>
13372
13373         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
13374         the same. 
13375
13376         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
13377         parameter. Apparently, any expression is allowed. 
13378
13379         (ValidateInitializers): Update accordingly.
13380
13381         (CheckIndices): Fix some tricky bugs thanks to recursion.
13382
13383         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
13384         I was being completely brain-dead.
13385
13386         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
13387         and re-write acordingly.
13388
13389         (DelegateInvocation): Re-write accordingly.
13390
13391         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
13392
13393         (MakeByteBlob): Handle types more correctly.
13394
13395         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
13396         initialization from expressions but it is incomplete because I am a complete
13397         Dodo :-|
13398
13399 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13400
13401         * statement.cs (If.Emit): Fix a bug that generated incorrect code
13402         on If.  Basically, we have to return `true' (ie, we do return to
13403         our caller) only if both branches of the if return.
13404
13405         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
13406         short-circuit operators, handle them as short circuit operators. 
13407
13408         (Cast.DoResolve): Resolve type.
13409         (Cast.Cast): Take an expression as the target type.
13410
13411         * cs-parser.jay (cast_expression): Remove old hack that only
13412         allowed a limited set of types to be handled.  Now we take a
13413         unary_expression and we resolve to a type during semantic
13414         analysis.
13415
13416         Use the grammar productions from Rhys to handle casts (this is
13417         not complete like Rhys syntax yet, we fail to handle that corner
13418         case that C# has regarding (-x), but we will get there.
13419
13420 2001-11-22  Ravi Pratap  <ravi@ximian.com>
13421
13422         * class.cs (EmitFieldInitializer): Take care of the case when we have a
13423         field which is an array type.
13424
13425         * cs-parser.jay (declare_local_variables): Support array initialization too.
13426
13427         * typemanager.cs (MakeKey): Implement.
13428
13429         (everywhere): Use the above appropriately.
13430
13431         * cs-parser.jay (for_statement): Update for array initialization while
13432         declaring variables.
13433
13434         * ecore.cs : The error message was correct, it's the variable's names that
13435         were misleading ;-) Make the code more readable.
13436
13437         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
13438         the correct type etc.
13439
13440         (ConvertExplicit): Handle Enum types by examining the underlying type.
13441
13442 2001-11-21  Ravi Pratap  <ravi@ximian.com>
13443
13444         * parameter.cs (GetCallingConvention): Always return
13445         CallingConventions.Standard for now.
13446
13447 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13448
13449         * expression.cs (Binary.ResolveOperator): Update the values of `l'
13450         and `r' after calling DoNumericPromotions.
13451
13452         * ecore.cs: Fix error message (the types were in the wrong order).
13453
13454         * statement.cs (Foreach.ProbeCollectionType): Need to pass
13455         BindingFlags.Instance as well 
13456
13457         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
13458         implicit int literal conversion in an empty cast so that we
13459         propagate the right type upstream.
13460
13461         (UnboxCast): new class used to unbox value types.
13462         (Expression.ConvertExplicit): Add explicit type conversions done
13463         by unboxing.
13464
13465         (Expression.ImplicitNumericConversion): Oops, forgot to test for
13466         the target type before applying the implicit LongLiterals to ULong
13467         literal cast.
13468
13469 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
13470
13471         * cs-parser.jay (for_statement): Reworked the way For works: now
13472         we declare manually any variables that are introduced in
13473         for_initializer to solve the problem of having out-of-band code
13474         emition (that is what got for broken).
13475
13476         (declaration_statement): Perform the actual variable declaration
13477         that used to be done in local_variable_declaration here.
13478
13479         (local_variable_declaration): Do not declare anything, just pass
13480         the information on a DictionaryEntry
13481
13482 2001-11-20  Ravi Pratap  <ravi@ximian.com>
13483
13484         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
13485         re-write of the logic to now make it recursive.
13486
13487         (UpdateIndices): Re-write accordingly.
13488
13489         Store element data in a separate ArrayData list in the above methods.
13490
13491         (MakeByteBlob): Implement to dump the array data into a byte array.
13492
13493 2001-11-19  Ravi Pratap  <ravi@ximian.com>
13494
13495         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
13496         into CheckIndices.
13497
13498         * constant.cs (Define): Implement.
13499
13500         (EmitConstant): Re-write fully.
13501
13502         Pass in location info.
13503
13504         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
13505         respectively.
13506
13507         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
13508         DictionaryEntry since we need location info too.
13509
13510         (constant_declaration): Update accordingly.
13511
13512         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
13513         code into another method : UpdateIndices.
13514
13515 2001-11-18  Ravi Pratap  <ravi@ximian.com>
13516
13517         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
13518         some type checking etc.
13519
13520 2001-11-17  Ravi Pratap  <ravi@ximian.com>
13521
13522         * expression.cs (ArrayCreation::ValidateInitializers): Implement
13523         bits to provide dimension info if the user skips doing that.
13524
13525         Update second constructor to store the rank correctly.
13526
13527 2001-11-16  Ravi Pratap  <ravi@ximian.com>
13528
13529         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
13530         and try to implement.
13531
13532         * ../errors/cs0150.cs : Add.
13533
13534         * ../errors/cs0178.cs : Add.
13535
13536 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
13537
13538         * statement.cs: Implement foreach on multi-dimensional arrays. 
13539
13540         * parameter.cs (Parameters.GetParameterByName): Also lookup the
13541         name of the params argument.
13542
13543         * expression.cs: Use EmitStoreOpcode to get the right opcode while
13544         initializing the array.
13545
13546         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
13547         we can use this elsewhere.
13548
13549         * statement.cs: Finish implementation of foreach for single
13550         dimension arrays.
13551
13552         * cs-parser.jay: Use an out-of-band stack to pass information
13553         around, I wonder why I need this.
13554
13555         foreach_block: Make the new foreach_block the current_block.
13556
13557         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
13558         function used to return a static Parameters structure.  Used for
13559         empty parameters, as those are created very frequently.
13560
13561         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
13562
13563 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13564
13565         * interface.cs : Default modifier is private, not public. The
13566         make verify test passes again.
13567
13568 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13569
13570         * support.cs (ReflectionParameters): Fix logic to determine
13571         whether the last parameter is a params one. Test 9 passes again.
13572
13573         * delegate.cs (Populate): Register the builders we define with
13574         RegisterParameterForBuilder. Test 19 passes again.
13575
13576         * cs-parser.jay (property_declaration): Reference $6 instead
13577         of $$ to get at the location.
13578
13579         (indexer_declaration): Similar stuff.
13580
13581         (attribute): Ditto.
13582
13583         * class.cs (Property): Register parameters for the Get and Set methods
13584         if they exist. Test 23 passes again.
13585
13586         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
13587         call to EmitArguments as we are sure there aren't any params arguments. 
13588         Test 32 passes again.
13589
13590         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
13591         IndexOutOfRangeException. 
13592
13593         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
13594         Test 33 now passes again.
13595
13596 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
13597
13598         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
13599         broke a bunch of things.  Will have to come up with a better way
13600         of tracking locations.
13601
13602         * statement.cs: Implemented foreach for single dimension arrays.
13603
13604 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13605
13606         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
13607         an error.  This removes the lookup from the critical path.
13608
13609         * cs-parser.jay: Removed use of temporary_loc, which is completely
13610         broken. 
13611
13612 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
13613
13614         * support.cs (ReflectionParameters.ParameterModifier): Report
13615         whether the argument is a PARAMS argument or not.
13616
13617         * class.cs: Set the attribute `ParamArrayAttribute' on the
13618         parameter argument.
13619
13620         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
13621         and cons_param_array_attribute (ConstructorInfo for
13622         ParamArrayAttribute)., 
13623
13624         * codegen.cs: Emit the return using the `Return' statement, that
13625         way we can report the error correctly for missing return values. 
13626
13627         * class.cs (Method.Emit): Clean up.
13628
13629         * expression.cs (Argument.Resolve): Take another argument: the
13630         location where this argument is used.  Notice that this is not
13631         part of the "Argument" class as to reduce the size of the
13632         structure (we know the approximate location anyways).
13633
13634         Test if the argument is a variable-reference, if not, then
13635         complain with a 206.
13636
13637         (Argument.Emit): Emit addresses of variables.
13638
13639         (Argument.FullDesc): Simplify.
13640
13641         (Invocation.DoResolve): Update for Argument.Resolve.
13642
13643         (ElementAccess.DoResolve): ditto.
13644
13645         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
13646         method should be virtual, as this method is always virtual.
13647
13648         (NewDelegate.DoResolve): Update for Argument.Resolve.
13649
13650         * class.cs (ConstructorInitializer.DoResolve): ditto.
13651
13652         * attribute.cs (Attribute.Resolve): ditto.
13653
13654 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
13655
13656         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
13657
13658         * expression.cs (ParameterReference): Drop IStackStorage and implement
13659         IAssignMethod instead. 
13660
13661         (LocalVariableReference): ditto.
13662
13663         * ecore.cs (FieldExpr): Drop IStackStorage and implement
13664         IAssignMethod instead. 
13665
13666 2001-11-13  Miguel de Icaza <miguel@ximian.com>
13667
13668         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
13669         enumerations that are used in heavily used structures derive from
13670         byte in a laughable and pathetic attempt to reduce memory usage.
13671         This is the kind of pre-optimzations that you should not do at
13672         home without adult supervision.
13673
13674         * expression.cs (UnaryMutator): New class, used to handle ++ and
13675         -- separatedly from the other unary operators.  Cleans up the
13676         code, and kills the ExpressionStatement dependency in Unary.
13677
13678         (Unary): Removed `method' and `Arguments' from this class, making
13679         it smaller, and moving it all to SimpleCall, so I can reuse this
13680         code in other locations and avoid creating a lot of transient data
13681         strucutres when not required.
13682
13683         * cs-parser.jay: Adjust for new changes.
13684
13685 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
13686
13687         * enum.cs (Enum.Populate): If there is a failure during
13688         definition, return
13689
13690         * cs-parser.jay (opt_enum_base): we used to catch type errors
13691         here, but this is really incorrect.  The type error should be
13692         catched during semantic analysis.
13693
13694 2001-12-11  Ravi Pratap  <ravi@ximian.com>
13695
13696         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
13697         current_local_parameters as expected since I, in my stupidity, had forgotten
13698         to do this :-)
13699
13700         * attribute.cs (GetValidPlaces): Fix stupid bug.
13701
13702         * class.cs (Method::Emit): Perform check on applicability of attributes.
13703
13704         (Constructor::Emit): Ditto.
13705
13706         (Field::Emit): Ditto.
13707
13708         (Field.Location): Store location information.
13709
13710         (Property, Event, Indexer, Operator): Ditto.
13711
13712         * cs-parser.jay (field_declaration): Pass in location for each field.
13713
13714         * ../errors/cs0592.cs : Add.
13715
13716 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13717
13718         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
13719
13720         (InitCoreTypes): Update accordingly.
13721
13722         (RegisterAttrType, LookupAttr): Implement.
13723
13724         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
13725         info about the same.
13726
13727         (Resolve): Update to populate the above as necessary.
13728
13729         (Error592): Helper.
13730
13731         (GetValidPlaces): Helper to the above.
13732
13733         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
13734
13735         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
13736
13737 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13738
13739         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
13740
13741         * ../errors/cs0617.cs : Add.
13742
13743 2001-11-11  Ravi Pratap  <ravi@ximian.com>
13744
13745         * enum.cs (Emit): Rename to Populate to be more consistent with what
13746         we expect it to do and when exactly it is called.
13747
13748         * class.cs, rootcontext.cs : Update accordingly.
13749
13750         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
13751         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
13752
13753         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
13754
13755         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
13756         of a fieldinfo using the above, when dealing with a FieldBuilder.
13757
13758 2001-11-10  Ravi Pratap  <ravi@ximian.com>
13759
13760         * ../errors/cs0031.cs : Add.
13761
13762         * ../errors/cs1008.cs : Add.
13763
13764         * ../errrors/cs0543.cs : Add.
13765
13766         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
13767         enum type.
13768
13769         (FindMembers): Implement.
13770
13771         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
13772         enums and delegates too.
13773
13774         (enum_types): Rename to builder_to_enum.
13775
13776         (delegate_types): Rename to builder_to_delegate.
13777
13778         * delegate.cs (FindMembers): Implement.
13779
13780 2001-11-09  Ravi Pratap  <ravi@ximian.com>
13781
13782         * typemanager.cs (IsEnumType): Implement.
13783
13784         * enum.cs (Emit): Re-write parts to account for the underlying type
13785         better and perform checking etc.
13786
13787         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
13788         of the underlying type.
13789
13790         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
13791         value
13792
13793         * enum.cs (error31): Helper to report error #31.
13794
13795         * cs-parser.jay (enum_declaration): Store location of each member too.
13796
13797         * enum.cs (member_to_location): New hashtable. 
13798
13799         (AddEnumMember): Update location hashtable.
13800
13801         (Emit): Use the location of each member while reporting errors.
13802
13803 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13804
13805         * cs-parser.jay: A for_initializer if is a
13806         local_variable_declaration really ammount to have an implicit
13807         block with the variable declaration and no initializer for for.
13808
13809         * statement.cs (For.Emit): Cope with null initializers.
13810
13811         This fixes the infinite loop on for initializers.
13812
13813 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
13814
13815         * enum.cs: More cleanup.
13816
13817         * ecore.cs: Remove dead code.
13818
13819         * class.cs (Property.Emit): More simplification.
13820         (Event.Emit): ditto.
13821
13822         Reworked to have less levels of indentation.
13823
13824 2001-11-08  Ravi Pratap  <ravi@ximian.com>
13825
13826         * class.cs (Property): Emit attributes.
13827
13828         (Field): Ditto.
13829
13830         (Event): Ditto.
13831
13832         (Indexer): Ditto.
13833
13834         (Operator): Ditto.
13835
13836         * enum.cs (Emit): Ditto.
13837
13838         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
13839         Enums too.
13840
13841         * class.cs (Field, Event, etc.): Move attribute generation into the
13842         Emit method everywhere.
13843
13844         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
13845         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
13846         as we had no way of defining nested enums !
13847
13848         * rootcontext.cs : Adjust code accordingly.
13849
13850         * typemanager.cs (AddEnumType): To keep track of enum types separately.
13851
13852 2001-11-07  Ravi Pratap  <ravi@ximian.com>
13853
13854         * expression.cs (EvalConstantExpression): Move into ecore.cs
13855
13856         * enum.cs (Enum): Rename some members and make them public and readonly
13857         according to our convention.
13858
13859         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
13860         nothing else.
13861
13862         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
13863
13864         (Enum::Emit): Write a simple version for now which doesn't try to compute
13865         expressions. I shall modify this to be more robust in just a while.
13866
13867         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
13868
13869         (TypeContainer::CloseType): Create the Enum types too.
13870
13871         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
13872
13873         * expression.cs (EvalConstantExpression): Get rid of completely.
13874
13875         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
13876         user-defined values and other cases.
13877
13878         (IsValidEnumLiteral): Helper function.
13879
13880         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
13881         out there in the case we had a literal FieldExpr.
13882
13883         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
13884
13885         (Literalize): Revamp a bit to take two arguments.
13886
13887         (EnumLiteral): New class which derives from Literal to wrap enum literals.
13888
13889 2001-11-06  Ravi Pratap  <ravi@ximian.com>
13890
13891         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
13892
13893         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
13894
13895         (Resolve): Use the above to ensure we have proper initializers.
13896
13897 2001-11-05  Ravi Pratap  <ravi@ximian.com>
13898
13899         * expression.cs (Expression::EvalConstantExpression): New method to 
13900         evaluate constant expressions.
13901
13902         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
13903
13904 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
13905
13906         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
13907         in an array.
13908
13909         (Binary.ResolveOperator): Handle operator != (object a, object b)
13910         and operator == (object a, object b);
13911
13912         (Binary.DoNumericPromotions): Indicate whether the numeric
13913         promotion was possible.
13914
13915         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
13916         Implement.  
13917
13918         Made the ArrayAccess implement interface IAssignMethod instead of
13919         IStackStore as the order in which arguments are passed reflects
13920         this.
13921
13922         * assign.cs: Instead of using expr.ExprClass to select the way of
13923         assinging, probe for the IStackStore/IAssignMethod interfaces.
13924
13925         * typemanager.cs: Load InitializeArray definition.
13926
13927         * rootcontext.cs (RootContext.MakeStaticData): Used to define
13928         static data that can be used to initialize arrays. 
13929
13930 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
13931
13932         * expression.cs: Handle operator== and operator!= for booleans.
13933
13934         (Conditioal.Reduce): Implement reducer for the ?: operator.
13935
13936         (Conditional.Resolve): Implement dead code elimination.
13937
13938         (Binary.Resolve): Catch string literals and return a new
13939         concatenated string.
13940
13941         (Unary.Reduce): Implement reduction of unary expressions.
13942
13943         * ecore.cs: Split out the expression core handling here.
13944
13945         (Expression.Reduce): New method used to perform constant folding
13946         and CSE.  This is needed to support constant-expressions. 
13947
13948         * statement.cs (Statement.EmitBoolExpression): Pass true and false
13949         targets, and optimize for !x.
13950
13951 2001-11-04  Ravi Pratap  <ravi@ximian.com>
13952
13953         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
13954         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
13955         set custom atttributes.
13956
13957         * literal.cs (Literal::GetValue): New abstract method to return the actual
13958         value of the literal, cast as an object.
13959
13960         (*Literal): Implement GetValue method.
13961
13962         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
13963         expressions to the arraylist but objects of type Argument.
13964
13965         * class.cs (TypeContainer::Emit): Emit our attributes too.
13966
13967         (Method::Emit, Constructor::Emit): Ditto.
13968
13969         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
13970         to be ignoring earlier.
13971
13972 2001-11-03  Ravi Pratap  <ravi@ximian.com>
13973
13974         * attribute.cs (AttributeSection::Define): Implement to do the business
13975         of constructing a CustomAttributeBuilder.
13976
13977         (Attribute): New trivial class. Increases readability of code.  
13978
13979         * cs-parser.jay : Update accordingly.
13980
13981         (positional_argument_list, named_argument_list, named_argument): New rules
13982
13983         (attribute_arguments): Use the above so that we are more correct.
13984
13985 2001-11-02  Ravi Pratap  <ravi@ximian.com>
13986
13987         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
13988         to perform all checks for a method with a params parameter.
13989
13990         (Invocation::OverloadResolve): Update to use the above method and therefore
13991         cope correctly with params method invocations.
13992
13993         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
13994         params too.
13995
13996         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
13997         constructors in our parent too because we can't afford to miss out on 
13998         protected ones ;-)
13999
14000         * attribute.cs (AttributeSection): New name for the class Attribute
14001
14002         Other trivial changes to improve readability.
14003
14004         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14005         use the new class names.
14006
14007 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14008
14009         * class.cs (Method::Define): Complete definition for params types too
14010
14011         (Indexer::Define): Ditto.
14012
14013         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14014         Cope everywhere with a request for info about the array parameter.
14015
14016 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14017
14018         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14019
14020         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14021         local_variable_type to extract the string corresponding to the type.
14022
14023         (local_variable_type): Fixup the action to use the new helper method.
14024
14025         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14026         go.
14027
14028         * expression.cs : Clean out code which uses the above.
14029
14030 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14031
14032         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14033         and bale out if necessary by returning a false.
14034
14035         (RegisterProperty): Ditto.
14036
14037         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14038         and print out appropriate error messages.
14039
14040         * interface.cs (everywhere): Ditto.
14041
14042         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14043         location to constructor.
14044
14045         * class.cs (Property, Event, Indexer): Update accordingly.
14046
14047         * ../errors/cs111.cs : Added.
14048
14049         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14050         of a method, as laid down by the spec.
14051
14052         (Invocation::OverloadResolve): Use the above method.
14053
14054 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14055
14056         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
14057         now take a TypeContainer and a Parameters object.
14058
14059         (ParameterData): Modify return type of ParameterModifier method to be 
14060         Parameter.Modifier and not a string.
14061
14062         (ReflectionParameters, InternalParameters): Update accordingly.
14063
14064         * expression.cs (Argument::GetParameterModifier): Same here.
14065
14066         * support.cs (InternalParameters::ParameterType): Find a better way of determining
14067         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
14068         symbol in it at all so maybe this is only for now.
14069
14070 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14071
14072         * support.cs (InternalParameters): Constructor now takes an extra argument 
14073         which is the actual Parameters class.
14074
14075         (ParameterDesc): Update to provide info on ref/out modifiers.
14076
14077         * class.cs (everywhere): Update call to InternalParameters to pass in
14078         the second argument too.
14079
14080         * support.cs (ParameterData): Add ParameterModifier, which is a method 
14081         to return the modifier info [ref/out etc]
14082
14083         (InternalParameters, ReflectionParameters): Implement the above.
14084
14085         * expression.cs (Argument::ParameterModifier): Similar function to return
14086         info about the argument's modifiers.
14087
14088         (Invocation::OverloadResolve): Update to take into account matching modifiers 
14089         too.
14090
14091         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
14092         a new SetFormalParameters object which we pass to InternalParameters.
14093
14094 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14095
14096         * expression.cs (NewArray): Merge into the ArrayCreation class.
14097
14098 2001-10-29  Ravi Pratap  <ravi@ximian.com>
14099
14100         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
14101         NewUserdefinedArray into one as there wasn't much of a use in having
14102         two separate ones.
14103
14104         * expression.cs (Argument): Change field's name to ArgType from Type.
14105
14106         (Type): New readonly property which returns the proper type, taking into 
14107         account ref/out modifiers.
14108
14109         (everywhere): Adjust code accordingly for the above.
14110
14111         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
14112         whether we are emitting for a ref or out parameter.
14113
14114         * expression.cs (Argument::Emit): Use the above field to set the state.
14115
14116         (LocalVariableReference::Emit): Update to honour the flag and emit the
14117         right stuff.
14118
14119         * parameter.cs (Attributes): Set the correct flags for ref parameters.
14120
14121         * expression.cs (Argument::FullDesc): New function to provide a full desc.
14122
14123         * support.cs (ParameterData): Add method ParameterDesc to the interface.
14124
14125         (ReflectionParameters, InternalParameters): Implement the above method.
14126
14127         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
14128         reporting errors.
14129
14130         (Invocation::FullMethodDesc): Ditto. 
14131
14132 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
14133
14134         * cs-parser.jay: Add extra production for the second form of array
14135         creation. 
14136
14137         * expression.cs (ArrayCreation): Update to reflect the above
14138         change. 
14139
14140         * Small changes to prepare for Array initialization.
14141
14142 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
14143
14144         * typemanager.cs (ImplementsInterface): interface might be null;
14145         Deal with this problem;
14146
14147         Also, we do store negative hits on the cache (null values), so use
14148         this instead of calling t.GetInterfaces on the type everytime.
14149
14150 2001-10-28  Ravi Pratap  <ravi@ximian.com>
14151
14152         * typemanager.cs (IsBuiltinType): New method to help determine the same.
14153
14154         * expression.cs (New::DoResolve): Get rid of array creation code and instead
14155         split functionality out into different classes.
14156
14157         (New::FormArrayType): Move into NewBuiltinArray.
14158
14159         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
14160         quite useless.
14161
14162         (NewBuiltinArray): New class to handle creation of built-in arrays.
14163
14164         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
14165         account creation of one-dimensional arrays.
14166
14167         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
14168
14169         (NewUserdefinedArray::DoResolve): Implement.
14170
14171         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
14172
14173         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
14174         we maintain inside the TypeManager. This is necessary to perform lookups on the
14175         module builder.
14176
14177         (LookupType): Update to perform GetType on the module builders too.     
14178
14179         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
14180
14181         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
14182
14183 2001-10-23  Ravi Pratap  <ravi@ximian.com>
14184
14185         * expression.cs (New::DoResolve): Implement guts of array creation.
14186
14187         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
14188
14189 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
14190
14191         * expression.cs: Fix bug I introduced lsat night that broke
14192         Delegates. 
14193
14194         (Expression.Resolve): Report a 246 error (can not resolve name)
14195         if we find a SimpleName in the stream.
14196
14197         (Expression.ResolveLValue): Ditto.
14198
14199         (Expression.ResolveWithSimpleName): This function is a variant of
14200         ResolveName, this one allows SimpleNames to be returned without a
14201         warning.  The only consumer of SimpleNames is MemberAccess
14202
14203 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
14204
14205         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
14206         might arrive here.  I have my doubts that this is correct.
14207
14208         * statement.cs (Lock): Implement lock statement.
14209
14210         * cs-parser.jay: Small fixes to support `lock' and `using'
14211
14212         * cs-tokenizer.cs: Remove extra space
14213
14214         * driver.cs: New flag --checked, allows to turn on integer math
14215         checking. 
14216
14217         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
14218         Threading.Monitor.Exit 
14219
14220 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
14221
14222         * expression.cs (IndexerAccess::DoResolveLValue): Set the
14223         Expression Class to be IndexerAccess.
14224
14225         Notice that Indexer::DoResolve sets the eclass to Value.
14226
14227 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
14228
14229         * class.cs (TypeContainer::Emit): Emit code for indexers.
14230
14231         * assign.cs (IAssignMethod): New interface implemented by Indexers
14232         and Properties for handling assignment.
14233
14234         (Assign::Emit): Simplify and reuse code. 
14235
14236         * expression.cs (IndexerAccess, PropertyExpr): Implement
14237         IAssignMethod, clean up old code. 
14238
14239 2001-10-22  Ravi Pratap  <ravi@ximian.com>
14240
14241         * typemanager.cs (ImplementsInterface): New method to determine if a type
14242         implements a given interface. Provides a nice cache too.
14243
14244         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
14245         method.
14246
14247         (ConvertReferenceExplicit): Ditto.
14248
14249         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
14250         various methods, with correct names etc.
14251
14252         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
14253         Operator.UnaryNegation.
14254
14255         * cs-parser.jay (operator_declarator): Be a little clever in the case where
14256         we have a unary plus or minus operator.
14257
14258         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
14259         UnaryMinus.
14260
14261         * everywhere : update accordingly.
14262
14263         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
14264         respectively.
14265
14266         * class.cs (Method::Define): For the case where we are implementing a method
14267         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
14268         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
14269
14270 2001-10-21  Ravi Pratap  <ravi@ximian.com>
14271
14272         * interface.cs (FindMembers): Implement to work around S.R.E
14273         lameness.
14274
14275         * typemanager.cs (IsInterfaceType): Implement.
14276
14277         (FindMembers): Update to handle interface types too.
14278
14279         * expression.cs (ImplicitReferenceConversion): Re-write bits which
14280         use IsAssignableFrom as that is not correct - it doesn't work.
14281
14282         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
14283         and accordingly override EmitStatement.
14284
14285         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
14286         using the correct logic :-)
14287
14288 2001-10-19  Ravi Pratap  <ravi@ximian.com>
14289
14290         * ../errors/cs-11.cs : Add to demonstrate error -11 
14291
14292 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
14293
14294         * assign.cs (Assign::Resolve): Resolve right hand side first, and
14295         then pass this as a hint to ResolveLValue.
14296
14297         * expression.cs (FieldExpr): Add Location information
14298
14299         (FieldExpr::LValueResolve): Report assignment to readonly
14300         variable. 
14301
14302         (Expression::ExprClassFromMemberInfo): Pass location information.
14303
14304         (Expression::ResolveLValue): Add new method that resolves an
14305         LValue. 
14306
14307         (Expression::DoResolveLValue): Default invocation calls
14308         DoResolve. 
14309
14310         (Indexers): New class used to keep track of indexers in a given
14311         Type. 
14312
14313         (IStackStore): Renamed from LValue, as it did not really describe
14314         what this did.  Also ResolveLValue is gone from this interface and
14315         now is part of Expression.
14316
14317         (ElementAccess): Depending on the element access type
14318
14319         * typemanager.cs: Add `indexer_name_type' as a Core type
14320         (System.Runtime.CompilerServices.IndexerNameAttribute)
14321
14322         * statement.cs (Goto): Take a location.
14323
14324 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14325
14326         * delegate.cs (Delegate::VerifyDelegate): New method to verify
14327         if two delegates are compatible.
14328
14329         (NewDelegate::DoResolve): Update to take care of the case when
14330         we instantiate a delegate from another delegate.
14331
14332         * typemanager.cs (FindMembers): Don't even try to look up members
14333         of Delegate types for now.
14334
14335 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14336
14337         * delegate.cs (NewDelegate): New class to take care of delegate
14338         instantiation.
14339
14340         * expression.cs (New): Split the delegate related code out into 
14341         the NewDelegate class.
14342
14343         * delegate.cs (DelegateInvocation): New class to handle delegate 
14344         invocation.
14345
14346         * expression.cs (Invocation): Split out delegate related code into
14347         the DelegateInvocation class.
14348
14349 2001-10-17  Ravi Pratap  <ravi@ximian.com>
14350
14351         * expression.cs (New::DoResolve): Implement delegate creation fully
14352         and according to the spec.
14353
14354         (New::DoEmit): Update to handle delegates differently.
14355
14356         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
14357         because of which we were printing out arguments in reverse order !
14358
14359         * delegate.cs (VerifyMethod): Implement to check if the given method
14360         matches the delegate.
14361
14362         (FullDelegateDesc): Implement.
14363
14364         (VerifyApplicability): Implement.
14365
14366         * expression.cs (Invocation::DoResolve): Update to accordingly handle
14367         delegate invocations too.
14368
14369         (Invocation::Emit): Ditto.
14370
14371         * ../errors/cs1593.cs : Added.
14372
14373         * ../errors/cs1594.cs : Added.
14374
14375         * delegate.cs (InstanceExpression, TargetMethod): New properties.
14376
14377 2001-10-16  Ravi Pratap  <ravi@ximian.com>
14378
14379         * typemanager.cs (intptr_type): Core type for System.IntPtr
14380
14381         (InitCoreTypes): Update for the same.
14382
14383         (iasyncresult_type, asynccallback_type): Ditto.
14384
14385         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
14386         correct.
14387
14388         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
14389         too.
14390
14391         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
14392         the builders for the 4 members of a delegate type :-)
14393
14394         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
14395         type.
14396
14397         * expression.cs (New::DoResolve): Implement guts for delegate creation.
14398
14399         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
14400
14401 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
14402
14403         * statement.cs (Break::Emit): Implement.   
14404         (Continue::Emit): Implement.
14405
14406         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14407         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14408         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14409         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
14410         end loop
14411
14412         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
14413         properties that track the label for the current loop (begin of the
14414         loop and end of the loop).
14415
14416 2001-10-15  Ravi Pratap  <ravi@ximian.com>
14417
14418         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
14419         use of emitting anything at all.
14420
14421         * class.cs, rootcontext.cs : Get rid of calls to the same.
14422
14423         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
14424
14425         (Populate): Define the constructor correctly and set the implementation
14426         attributes.
14427
14428         * typemanager.cs (delegate_types): New hashtable to hold delegates that
14429         have been defined.
14430
14431         (AddDelegateType): Implement.
14432
14433         (IsDelegateType): Implement helper method.
14434
14435         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
14436
14437         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
14438         and accordingly handle it.
14439
14440         * delegate.cs (Populate): Take TypeContainer argument.
14441         Implement bits to define the Invoke method. However, I still haven't figured out
14442         how to take care of the native int bit :-(
14443
14444         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
14445         Qualify the name of the delegate, not its return type !
14446
14447         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
14448         conversion.
14449
14450         (StandardConversionExists): Checking for array types turns out to be recursive.
14451
14452         (ConvertReferenceExplicit): Implement array conversion.
14453
14454         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
14455
14456 2001-10-12  Ravi Pratap  <ravi@ximian.com>
14457
14458         * cs-parser.jay (delegate_declaration): Store the fully qualified
14459         name as it is a type declaration.
14460
14461         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
14462         readonly.
14463
14464         (DefineDelegate): Renamed from Define. Does the same thing essentially,
14465         as TypeContainer::DefineType.
14466
14467         (Populate): Method in which all the definition of the various methods (Invoke)
14468         etc is done.
14469
14470         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
14471         see.
14472
14473         (CloseDelegate): Finally creates the delegate.
14474
14475         * class.cs (TypeContainer::DefineType): Update to define delegates.
14476         (Populate, Emit and CloseType): Do the same thing here too.
14477
14478         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
14479         delegates in all these operations.
14480
14481 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
14482
14483         * expression.cs: LocalTemporary: a new expression used to
14484         reference a temporary that has been created.
14485
14486         * assign.cs: Handle PropertyAccess back here, so that we can
14487         provide the proper semantic access to properties.
14488
14489         * expression.cs (Expression::ConvertReferenceExplicit): Implement
14490         a few more explicit conversions. 
14491
14492         * modifiers.cs: `NEW' modifier maps to HideBySig.
14493
14494         * expression.cs (PropertyExpr): Make this into an
14495         ExpressionStatement, and support the EmitStatement code path. 
14496
14497         Perform get/set error checking, clean up the interface.
14498
14499         * assign.cs: recognize PropertyExprs as targets, and if so, turn
14500         them into toplevel access objects.
14501
14502 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
14503
14504         * expression.cs: PropertyExpr::PropertyExpr: use work around the
14505         SRE.
14506
14507         * typemanager.cs: Keep track here of our PropertyBuilders again to
14508         work around lameness in SRE.
14509
14510 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
14511
14512         * expression.cs (LValue::LValueResolve): New method in the
14513         interface, used to perform a second resolution pass for LValues. 
14514
14515         (This::DoResolve): Catch the use of this in static methods.
14516
14517         (This::LValueResolve): Implement.
14518
14519         (This::Store): Remove warning, assigning to `this' in structures
14520         is 
14521
14522         (Invocation::Emit): Deal with invocation of
14523         methods on value types.  We need to pass the address to structure
14524         methods rather than the object itself.  (The equivalent code to
14525         emit "this" for structures leaves the entire structure on the
14526         stack instead of a pointer to it). 
14527
14528         (ParameterReference::DoResolve): Compute the real index for the
14529         argument based on whether the method takes or not a `this' pointer
14530         (ie, the method is static).
14531
14532         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
14533         value types returned from functions when we need to invoke a
14534         method on the sturcture.
14535
14536
14537 2001-10-11  Ravi Pratap  <ravi@ximian.com>
14538
14539         * class.cs (TypeContainer::DefineType): Method to actually do the business of
14540         defining the type in the Modulebuilder or Typebuilder. This is to take
14541         care of nested types which need to be defined on the TypeBuilder using
14542         DefineNestedMethod.
14543
14544         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
14545         methods in RootContext, only ported to be part of TypeContainer.
14546
14547         (TypeContainer::GetInterfaceOrClass): Ditto.
14548
14549         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
14550
14551         * interface.cs (Interface::DefineInterface): New method. Does exactly
14552         what RootContext.CreateInterface did earlier, only it takes care of nested types 
14553         too.
14554
14555         (Interface::GetInterfaces): Move from RootContext here and port.
14556
14557         (Interface::GetInterfaceByName): Same here.
14558
14559         * rootcontext.cs (ResolveTree): Re-write.
14560
14561         (PopulateTypes): Re-write.
14562
14563         * class.cs (TypeContainer::Populate): Populate nested types too.
14564         (TypeContainer::Emit): Emit nested members too.
14565
14566         * typemanager.cs (AddUserType): Do not make use of the FullName property,
14567         instead just use the name argument passed in as it is already fully
14568         qualified.
14569
14570         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
14571         to TypeContainer mapping to see if a type is user-defined.
14572
14573         * class.cs (TypeContainer::CloseType): Implement. 
14574
14575         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
14576         the default constructor.
14577
14578         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
14579         twice.
14580
14581         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
14582
14583         * interface.cs (CloseType): Create the type here.
14584
14585         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
14586         the hierarchy.
14587
14588         Remove all the methods which are now in TypeContainer.
14589
14590 2001-10-10  Ravi Pratap  <ravi@ximian.com>
14591
14592         * delegate.cs (Define): Re-write bits to define the delegate
14593         correctly.
14594
14595 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
14596
14597         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
14598
14599         * expression.cs (ImplicitReferenceConversion): handle null as well
14600         as a source to convert to any reference type.
14601
14602         * statement.cs (Return): Perform any implicit conversions to
14603         expected return type.  
14604
14605         Validate use of return statement.  
14606
14607         * codegen.cs (EmitContext): Pass the expected return type here.
14608
14609         * class.cs (Method, Constructor, Property): Pass expected return
14610         type to EmitContext.
14611
14612 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
14613
14614         * expression.cs: Make DoResolve take an EmitContext instead of a
14615         TypeContainer.
14616
14617         Replaced `l' and `location' for `loc', for consistency.
14618
14619         (Error, Warning): Remove unneeded Tc argument.
14620
14621         * assign.cs, literal.cs, constant.cs: Update to new calling
14622         convention. 
14623
14624         * codegen.cs: EmitContext now contains a flag indicating whether
14625         code is being generated in a static method or not.
14626
14627         * cs-parser.jay: DecomposeQI, new function that replaces the old
14628         QualifiedIdentifier.  Now we always decompose the assembled
14629         strings from qualified_identifier productions into a group of
14630         memberaccesses.
14631
14632 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
14633
14634         * rootcontext.cs: Deal with field-less struct types correctly now
14635         by passing the size option to Define Type.
14636
14637         * class.cs: Removed hack that created one static field. 
14638
14639 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14640
14641         * statement.cs: Moved most of the code generation here. 
14642
14643 2001-10-09  Ravi Pratap  <ravi@ximian.com>
14644
14645         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
14646         seem very right.
14647
14648         (ElementAccess): Remove useless bits for now - keep checks as the spec
14649         says.
14650
14651 2001-10-08  Ravi Pratap  <ravi@ximian.com>
14652
14653         * expression.cs (ElementAccess::DoResolve): Remove my crap code
14654         and start performing checks according to the spec.
14655
14656 2001-10-07  Ravi Pratap  <ravi@ximian.com>
14657
14658         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
14659         rank_specifiers instead.
14660
14661         (rank_specifiers): Change the order in which the rank specifiers are stored
14662
14663         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
14664
14665         * expression.cs (ElementAccess): Implement the LValue interface too.
14666
14667 2001-10-06  Ravi Pratap  <ravi@ximian.com>
14668
14669         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
14670         except that user defined conversions are not included.
14671
14672         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
14673         perform the conversion of the return type, if necessary.
14674
14675         (New::DoResolve): Check whether we are creating an array or an object
14676         and accordingly do the needful.
14677
14678         (New::Emit): Same here.
14679
14680         (New::DoResolve): Implement guts of array creation.
14681
14682         (New::FormLookupType): Helper function.
14683
14684 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14685
14686         * codegen.cs: Removed most of the code generation here, and move the
14687         corresponding code generation bits to the statement classes. 
14688
14689         Added support for try/catch/finalize and throw.
14690
14691         * cs-parser.jay: Added support for try/catch/finalize.
14692
14693         * class.cs: Catch static methods having the flags override,
14694         virtual or abstract.
14695
14696         * expression.cs (UserCast): This user cast was not really doing
14697         what it was supposed to do.  Which is to be born in fully resolved
14698         state.  Parts of the resolution were being performed at Emit time! 
14699
14700         Fixed this code.
14701
14702 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14703
14704         * expression.cs: Implicity convert the result from UserCast.
14705
14706 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14707
14708         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
14709         prevented it from working correctly. 
14710
14711         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
14712         merely ConvertImplicit.
14713
14714 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14715
14716         * typemanager.cs: Make the LookupTypeContainer function static,
14717         and not per-instance.  
14718
14719         * class.cs: Make static FindMembers (the one that takes a Type
14720         argument). 
14721
14722         * codegen.cs: Add EmitForeach here.
14723
14724         * cs-parser.jay: Make foreach a toplevel object instead of the
14725         inline expansion, as we need to perform semantic analysis on it. 
14726
14727 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14728
14729         * expression.cs (Expression::ImplicitUserConversion): Rename to
14730         UserDefinedConversion.
14731
14732         (Expression::UserDefinedConversion): Take an extra argument specifying 
14733         whether we look for explicit user conversions too.
14734
14735         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
14736
14737         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
14738
14739         (ExplicitUserConversion): Make it a call to UserDefinedConversion
14740         with the appropriate arguments.
14741
14742         * cs-parser.jay (cast_expression): Record location too.
14743
14744         * expression.cs (Cast): Record location info.
14745
14746         (Expression::ConvertExplicit): Take location argument.
14747
14748         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
14749         to determine if we are doing explicit conversions.
14750
14751         (UserCast::Emit): Update accordingly.
14752
14753         (Expression::ConvertExplicit): Report an error if everything fails.
14754
14755         * ../errors/cs0030.cs : Add.
14756
14757 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
14758
14759         * modifiers.cs: If the ABSTRACT keyword is present, also set the
14760         virtual and newslot bits. 
14761
14762         * class.cs (TypeContainer::RegisterRequiredImplementations):
14763         Record methods we need.
14764
14765         (TypeContainer::MakeKey): Helper function to make keys for
14766         MethodBases, since the Methodbase key is useless.
14767
14768         (TypeContainer::Populate): Call RegisterRequiredImplementations
14769         before defining the methods.   
14770
14771         Create a mapping for method_builders_to_methods ahead of time
14772         instead of inside a tight loop.
14773
14774         (::RequireMethods):  Accept an object as the data to set into the
14775         hashtable so we can report interface vs abstract method mismatch.
14776
14777 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14778
14779         * report.cs: Make all of it static.
14780
14781         * rootcontext.cs: Drop object_type and value_type computations, as
14782         we have those in the TypeManager anyways.
14783
14784         Drop report instance variable too, now it is a global.
14785
14786         * driver.cs: Use try/catch on command line handling.
14787
14788         Add --probe option to debug the error reporting system with a test
14789         suite. 
14790
14791         * report.cs: Add support for exiting program when a probe
14792         condition is reached.
14793
14794 2001-10-03  Ravi Pratap  <ravi@ximian.com>
14795
14796         * expression.cs (Binary::DoNumericPromotions): Fix the case when
14797         we do a forcible conversion regardless of type, to check if 
14798         ForceConversion returns a null.
14799
14800         (Binary::error19): Use location to report error.
14801
14802         (Unary::error23): Use location here too.
14803
14804         * ../errors/cs0019.cs : Check in.
14805
14806         * ../errors/cs0023.cs : Check in.
14807
14808         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
14809         case of a non-null MethodInfo object with a length of 0 !
14810
14811         (Binary::ResolveOperator): Flag error if overload resolution fails to find
14812         an applicable member - according to the spec :-)
14813         Also fix logic to find members in base types.
14814
14815         (Unary::ResolveOperator): Same here.
14816
14817         (Unary::report23): Change name to error23 and make first argument a TypeContainer
14818         as I was getting thoroughly confused between this and error19 :-)
14819
14820         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
14821         (::FindMostEncompassedType): Implement.
14822         (::FindMostEncompassingType): Implement.
14823         (::StandardConversionExists): Implement.
14824
14825         (UserImplicitCast): Re-vamp. We now need info about most specific
14826         source and target types so that we can do the necessary conversions.
14827
14828         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
14829         mathematical union with no duplicates.
14830
14831 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14832
14833         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
14834         in order from base classes to child classes, so that we can in
14835         child classes look up in our parent for method names and
14836         attributes (required for handling abstract, virtual, new, override
14837         constructs: we need to instrospect our base class, and if we dont
14838         populate the classes in order, the introspection might be
14839         incorrect.  For example, a method could query its parent before
14840         the parent has any methods and would determine that the parent has
14841         no abstract methods (while it could have had them)).
14842
14843         (RootContext::CreateType): Record the order in which we define the
14844         classes.
14845
14846 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
14847
14848         * class.cs (TypeContainer::Populate): Also method definitions can
14849         fail now, keep track of this.
14850
14851         (TypeContainer::FindMembers): Implement support for
14852         DeclaredOnly/noDeclaredOnly flag.
14853
14854         (Constructor::Emit) Return the ConstructorBuilder.
14855
14856         (Method::Emit) Return the MethodBuilder. 
14857         Check for abstract or virtual methods to be public.
14858
14859         * rootcontext.cs (RootContext::CreateType): Register all the
14860         abstract methods required for the class to be complete and the
14861         interface methods that must be implemented. 
14862
14863         * cs-parser.jay: Report error 501 (method requires body if it is
14864         not marked abstract or extern).
14865
14866         * expression.cs (TypeOf::Emit): Implement.
14867
14868         * typemanager.cs: runtime_handle_type, new global type.
14869
14870         * class.cs (Property::Emit): Generate code for properties.
14871
14872 2001-10-02  Ravi Pratap  <ravi@ximian.com>
14873
14874         * expression.cs (Unary::ResolveOperator): Find operators on base type
14875         too - we now conform exactly to the spec.
14876
14877         (Binary::ResolveOperator): Same here.
14878
14879         * class.cs (Operator::Define): Fix minor quirk in the tests.
14880
14881         * ../errors/cs0215.cs : Added.
14882
14883         * ../errors/cs0556.cs : Added.
14884
14885         * ../errors/cs0555.cs : Added.
14886
14887 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14888
14889         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
14890         single integer which is really efficient
14891
14892 2001-10-01  Ravi Pratap  <ravi@ximian.com>
14893
14894         *  expression.cs (Expression::ImplicitUserConversion): Use location
14895         even in the case when we are examining True operators.
14896  
14897         * class.cs (Operator::Define): Perform extensive checks to conform
14898         with the rules for operator overloading in the spec.
14899
14900         * expression.cs (Expression::ImplicitReferenceConversion): Implement
14901         some of the other conversions mentioned in the spec.
14902
14903         * typemanager.cs (array_type): New static member for the System.Array built-in
14904         type.
14905
14906         (cloneable_interface): For System.ICloneable interface.
14907
14908         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
14909         we start resolving the tree and populating types.
14910
14911         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
14912  
14913 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14914
14915         * expression.cs (Expression::ExprClassFromMemberInfo,
14916         Expression::Literalize): Create literal expressions from
14917         FieldInfos which are literals.
14918
14919         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
14920         type casts, because they were wrong.  The test suite in tests
14921         caught these ones.
14922
14923         (ImplicitNumericConversion): ushort to ulong requires a widening
14924         cast. 
14925
14926         Int32 constant to long requires widening cast as well.
14927
14928         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
14929         for integers because the type on the stack is not i4.
14930
14931 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
14932
14933         * expression.cs (report118): require location argument. 
14934
14935         * parameter.cs: Do not dereference potential null value.
14936
14937         * class.cs: Catch methods that lack the `new' keyword when
14938         overriding a name.  Report warnings when `new' is used without
14939         anything being there to override.
14940
14941         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
14942
14943         * class.cs: Only add constructor to hashtable if it is non-null
14944         (as now constructors can fail on define).
14945
14946         (TypeManager, Class, Struct): Take location arguments.
14947
14948         Catch field instance initialization in structs as errors.
14949
14950         accepting_filter: a new filter for FindMembers that is static so
14951         that we dont create an instance per invocation.
14952
14953         (Constructor::Define): Catch errors where a struct constructor is
14954         parameterless 
14955
14956         * cs-parser.jay: Pass location information for various new
14957         constructs. 
14958
14959         * delegate.cs (Delegate): take a location argument.
14960
14961         * driver.cs: Do not call EmitCode if there were problesm in the
14962         Definition of the types, as many Builders wont be there. 
14963
14964         * decl.cs (Decl::Decl): Require a location argument.
14965
14966         * cs-tokenizer.cs: Handle properly hex constants that can not fit
14967         into integers, and find the most appropiate integer for it.
14968
14969         * literal.cs: Implement ULongLiteral.
14970
14971         * rootcontext.cs: Provide better information about the location of
14972         failure when CreateType fails.
14973
14974 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
14975
14976         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
14977         as well.
14978
14979         * expression.cs (Binary::CheckShiftArguments): Add missing type
14980         computation.
14981         (Binary::ResolveOperator): Add type to the logical and and logical
14982         or, Bitwise And/Or and Exclusive Or code paths, it was missing
14983         before.
14984
14985         (Binary::DoNumericPromotions): In the case where either argument
14986         is ulong (and most signed types combined with ulong cause an
14987         error) perform implicit integer constant conversions as well.
14988
14989 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14990
14991         * expression.cs (UserImplicitCast): Method should always be
14992         non-null. 
14993         (Invocation::BetterConversion): Simplified test for IntLiteral.
14994
14995         (Expression::ImplicitNumericConversion): Split this routine out.
14996         Put the code that performs implicit constant integer conversions
14997         here. 
14998
14999         (Expression::Resolve): Become a wrapper around DoResolve so we can
15000         check eclass and type being set after resolve.
15001
15002         (Invocation::Badness): Remove this dead function
15003
15004         (Binary::ResolveOperator): Do not compute the expensive argumnets
15005         unless we have a union for it.
15006
15007         (Probe::Emit): Is needs to do an isinst and then
15008         compare against null.
15009
15010         (::CanConvert): Added Location argument.  If the Location argument
15011         is null (Location.Null), then we do not report errors.  This is
15012         used by the `probe' mechanism of the Explicit conversion.  We do
15013         not want to generate an error for something that the user
15014         explicitly requested to be casted.  But the pipeline for an
15015         explicit cast first tests for potential implicit casts.
15016
15017         So for now, if the Location is null, it means `Probe only' to
15018         avoid adding another argument.   Might have to revise this
15019         strategy later.
15020
15021         (ClassCast): New class used to type cast objects into arbitrary
15022         classes (used in Explicit Reference Conversions).
15023
15024         Implement `as' as well.
15025
15026         Reverted all the patches from Ravi below: they were broken:
15027
15028                 * The use of `level' as a mechanism to stop recursive
15029                   invocations is wrong.  That was there just to catch the
15030                   bug with a strack trace but not as a way of addressing
15031                   the problem.
15032
15033                   To fix the problem we have to *understand* what is going
15034                   on and the interactions and come up with a plan, not
15035                   just get things going.
15036
15037                 * The use of the type conversion cache that I proposed
15038                   last night had an open topic: How does this work across
15039                   protection domains.  A user defined conversion might not
15040                   be public in the location where we are applying the
15041                   conversion, a different conversion might be selected
15042                   (ie, private A->B (better) but public B->A (worse),
15043                   inside A, A->B applies, but outside it, B->A will
15044                   apply).
15045
15046                 * On top of that (ie, even if the above is solved),
15047                   conversions in a cache need to be abstract.  Ie, `To
15048                   convert from an Int to a Short use an OpcodeCast', not
15049                   `To convert from an Int to a Short use the OpcodeCast on
15050                   the variable 5' (which is what this patch was doing).
15051
15052 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15053
15054         * expression.cs (Invocation::ConversionExists): Re-write to use
15055         the conversion cache
15056
15057         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
15058         cache all conversions done, not just user-defined ones.
15059
15060         (Invocation::BetterConversion): The real culprit. Use ConversionExists
15061         to determine if a conversion exists instead of acutually trying to 
15062         perform the conversion. It's faster too.
15063
15064         (Expression::ConvertExplicit): Modify to use ConversionExists to check
15065         and only then attempt the implicit conversion.
15066
15067 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15068
15069         * expression.cs (ConvertImplicit): Use a cache for conversions
15070         already found. Check level of recursion and bail out if necessary.
15071
15072 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15073
15074         * typemanager.cs (string_concat_string_string, string_concat_object_object):
15075         Export standard methods that we expect for string operations.
15076
15077         * statement.cs (Block::UsageWarning): Track usage of variables and
15078         report the errors for not used variables.
15079
15080         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
15081         operator. 
15082
15083 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15084
15085         * codegen.cs: remove unnneded code 
15086
15087         * expression.cs: Removed BuiltinTypeAccess class
15088
15089         Fix the order in which implicit conversions are
15090         done.  
15091
15092         The previous fixed dropped support for boxed conversions (adding a
15093         test to the test suite now)
15094
15095         (UserImplicitCast::CanConvert): Remove test for source being null,
15096         that code is broken.  We should not feed a null to begin with, if
15097         we do, then we should track the bug where the problem originates
15098         and not try to cover it up here.
15099
15100         Return a resolved expression of type UserImplicitCast on success
15101         rather than true/false.  Ravi: this is what I was talking about,
15102         the pattern is to use a static method as a "constructor" for
15103         objects. 
15104
15105         Also, do not create arguments until the very last minute,
15106         otherwise we always create the arguments even for lookups that
15107         will never be performed. 
15108
15109         (UserImplicitCast::Resolve): Eliminate, objects of type
15110         UserImplicitCast are born in a fully resolved state. 
15111
15112         * typemanager.cs (InitCoreTypes): Init also value_type
15113         (System.ValueType). 
15114
15115         * expression.cs (Cast::Resolve): First resolve the child expression.
15116
15117         (LValue): Add new method AddressOf to be used by
15118         the `&' operator.  
15119
15120         Change the argument of Store to take an EmitContext instead of an
15121         ILGenerator, because things like FieldExpr need to be able to call
15122         their children expression to generate the instance code. 
15123
15124         (Expression::Error, Expression::Warning): Sugar functions for
15125         reporting errors.
15126
15127         (Expression::MemberLookup): Accept a TypeContainer instead of a
15128         Report as the first argument.
15129
15130         (Expression::ResolvePrimary): Killed.  I still want to improve
15131         this as currently the code is just not right.
15132
15133         (Expression::ResolveMemberAccess): Simplify, but it is still
15134         wrong. 
15135
15136         (Unary::Resolve): Catch errors in AddressOf operators.
15137
15138         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
15139         index to a byte for the short-version, or the compiler will choose
15140         the wrong Emit call, which generates the wrong data.
15141
15142         (ParameterReference::Emit, ::Store): same.
15143
15144         (FieldExpr::AddressOf): Implement.
15145
15146         * typemanager.cs: TypeManager: made public variable instead of
15147         property.
15148
15149         * driver.cs: document --fatal.
15150
15151         * report.cs (ErrorMessage, WarningMessage): new names for the old
15152         Error and Warning classes.
15153
15154         * cs-parser.jay (member_access): Turn built-in access to types
15155         into a normal simplename
15156
15157 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15158
15159         * expression.cs (Invocation::BetterConversion): Fix to cope
15160         with q being null, since this was introducing a bug.
15161
15162         * expression.cs (ConvertImplicit): Do built-in conversions first.
15163
15164 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15165
15166         * expression.cs (UserImplicitCast::Resolve): Fix bug.
15167
15168 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15169
15170         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
15171         I had introduced long ago (what's new ?).
15172
15173         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
15174         the work of all the checking. 
15175         (ConvertImplicit): Call CanConvert and only then create object if necessary.
15176         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
15177
15178         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
15179         that is the right way. 
15180
15181         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
15182         overloading resolution. Use everywhere instead of cutting and pasting code.
15183
15184         (Binary::ResolveOperator): Use MakeUnionSet.
15185
15186         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
15187         we have to convert to bool types. Not complete yet.
15188
15189 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15190
15191         * typemanager.cs (TypeManager::CSharpName): support ushort.
15192
15193         * expression.cs (Expression::TryImplicitIntConversion): Attempts
15194         to provide an expression that performsn an implicit constant int
15195         conversion (section 6.1.6).
15196         (Expression::ConvertImplicitRequired): Reworked to include
15197         implicit constant expression conversions.
15198
15199         (Expression::ConvertNumericExplicit): Finished.
15200
15201         (Invocation::Emit): If InstanceExpression is null, then it means
15202         that we perform a call on this.
15203
15204 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15205
15206         * expression.cs (Unary::Emit): Remove some dead code.
15207         (Probe): Implement Resolve and Emit for `is'.
15208         (Expression::ConvertImplicitRequired): Attempt to do constant
15209         expression conversions here.  Maybe should be moved to
15210         ConvertImplicit, but I am not sure.
15211         (Expression::ImplicitLongConstantConversionPossible,
15212         Expression::ImplicitIntConstantConversionPossible): New functions
15213         that tell whether is it possible to apply an implicit constant
15214         expression conversion.
15215
15216         (ConvertNumericExplicit): Started work on explicit numeric
15217         conversions.
15218
15219         * cs-parser.jay: Update operator constants.
15220
15221         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
15222         (Parameters::GetSignature): Hook up VerifyArgs here.
15223         (Parameters::VerifyArgs): Verifies that no two arguments have the
15224         same name. 
15225
15226         * class.cs (Operator): Update the operator names to reflect the
15227         ones that the spec expects (as we are just stringizing the
15228         operator names).
15229
15230         * expression.cs (Unary::ResolveOperator): Fix bug: Use
15231         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
15232         previous usage did only work for our methods.
15233         (Expression::ConvertImplicit): Handle decimal implicit numeric
15234         conversions as well.
15235         (Expression::InternalTypeConstructor): Used to invoke constructors
15236         on internal types for default promotions.
15237
15238         (Unary::Emit): Implement special handling for the pre/post
15239         increment/decrement for overloaded operators, as they need to have
15240         the same semantics as the other operators.
15241
15242         (Binary::ResolveOperator): ditto.
15243         (Invocation::ConversionExists): ditto.
15244         (UserImplicitCast::Resolve): ditto.
15245
15246 2001-09-26  Ravi Pratap  <ravi@ximian.com>
15247
15248         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
15249         operator, return after emitting body. Regression tests pass again !
15250
15251         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
15252         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
15253         (Invocation::OverloadResolve): Ditto.
15254         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
15255
15256         * everywhere : update calls to the above methods accordingly.
15257
15258 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15259
15260         * assign.cs (Assign): Make it inherit from ExpressionStatement.
15261
15262         * expression.cs (ExpressionStatement): New base class used for
15263         expressions that can appear in statements, so that we can provide
15264         an alternate path to generate expression that do not leave a value
15265         on the stack.
15266
15267         (Expression::Emit, and all the derivatives): We no longer return
15268         whether a value is left on the stack or not.  Every expression
15269         after being emitted leaves a single value on the stack.
15270
15271         * codegen.cs (EmitContext::EmitStatementExpression): Use the
15272         facilties of ExpressionStatement if possible.
15273
15274         * cs-parser.jay: Update statement_expression.
15275
15276 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
15277
15278         * driver.cs: Change the wording of message
15279
15280 2001-09-25  Ravi Pratap  <ravi@ximian.com>
15281
15282         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
15283         the type of the expression to the return type of the method if
15284         we have an overloaded operator match ! The regression tests pass again !
15285         (Unary::ResolveOperator): Ditto.
15286
15287         * expression.cs (Invocation::ConversionExists): Correct the member lookup
15288         to find "op_Implicit", not "implicit" ;-)
15289         (UserImplicitCast): New class to take care of user-defined implicit conversions.
15290         (ConvertImplicit, ForceConversion): Take TypeContainer argument
15291
15292         * everywhere : Correct calls to the above accordingly.
15293
15294         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
15295         (ConvertImplicit): Do user-defined conversion if it exists.
15296
15297 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
15298
15299         * assign.cs: track location.
15300         (Resolve): Use implicit conversions on assignment.
15301
15302         * literal.cs: Oops.  Not good, Emit of short access values should
15303         pass (Bytes) or the wrong argument will be selected.
15304
15305         * expression.cs (Unary::Emit): Emit code for -expr.
15306
15307         (Unary::ResolveOperator): Handle `Substract' for non-constants
15308         (substract from zero from the non-constants).
15309         Deal with Doubles as well. 
15310
15311         (Expression::ConvertImplicitRequired): New routine that reports an
15312         error if no implicit conversion exists. 
15313
15314         (Invocation::OverloadResolve): Store the converted implicit
15315         expressions if we make them
15316
15317 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15318
15319         * class.cs (ConstructorInitializer): Take a Location argument.
15320         (ConstructorBaseInitializer): Same here.
15321         (ConstructorThisInitializer): Same here.
15322
15323         * cs-parser.jay : Update all calls accordingly.
15324
15325         * expression.cs (Unary, Binary, New): Take location argument.
15326         Update accordingly everywhere.
15327
15328         * cs-parser.jay : Update all calls to the above to take a location
15329         argument.
15330
15331         * class.cs : Ditto.
15332
15333 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15334
15335         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
15336         (Invocation::BetterConversion): Same here
15337         (Invocation::ConversionExists): Ditto.
15338
15339         (Invocation::ConversionExists): Implement.
15340
15341 2001-09-22  Ravi Pratap  <ravi@ximian.com>
15342
15343         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
15344         Also take an additional TypeContainer argument.
15345
15346         * All over : Pass in TypeContainer as argument to OverloadResolve.
15347
15348         * typemanager.cs (CSharpName): Update to check for the string type and return
15349         that too.
15350
15351         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
15352         a given method.
15353
15354 2001-09-21  Ravi Pratap  <ravi@ximian.com>
15355
15356         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
15357         (Invocation::BetterFunction): Implement.
15358         (Invocation::BetterConversion): Implement.
15359         (Invocation::ConversionExists): Skeleton, no implementation yet.
15360
15361         Okay, things work fine !
15362
15363 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
15364
15365         * typemanager.cs: declare and load enum_type, delegate_type and
15366         void_type. 
15367
15368         * expression.cs (Expression::Emit): Now emit returns a value that
15369         tells whether a value is left on the stack or not.  This strategy
15370         might be reveted tomorrow with a mechanism that would address
15371         multiple assignments.
15372         (Expression::report118): Utility routine to report mismatches on
15373         the ExprClass.
15374
15375         (Unary::Report23): Report impossible type/operator combination
15376         utility function.
15377
15378         (Unary::IsIncrementableNumber): Whether the type can be
15379         incremented or decremented with add.
15380         (Unary::ResolveOperator): Also allow enumerations to be bitwise
15381         complemented. 
15382         (Unary::ResolveOperator): Implement ++, !, ~,
15383
15384         (Invocation::Emit): Deal with new Emit convetion.
15385
15386         * All Expression derivatives: Updated their Emit method to return
15387         whether they leave values on the stack or not.
15388
15389         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
15390         stack for expressions that are statements. 
15391
15392 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15393
15394         * expression.cs (LValue): New interface.  Must be implemented by
15395         LValue objects.
15396         (LocalVariableReference, ParameterReference, FieldExpr): Implement
15397         LValue interface.
15398
15399         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
15400         interface for generating code, simplifies the code.
15401
15402 2001-09-20  Ravi Pratap  <ravi@ximian.com>
15403
15404         * expression.cs (everywhere): Comment out return statements in ::Resolve
15405         methods to avoid the warnings.
15406
15407 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15408
15409         * driver.cs (parse): Report error 2001 if we can not open the
15410         source file.
15411
15412         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
15413         not resolve it.
15414
15415         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
15416         object. 
15417
15418         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
15419         otherwise nested blocks end up with the same index.
15420
15421         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
15422
15423         * expression.cs:  Instead of having FIXMEs in the Resolve
15424         functions, throw exceptions so it is obvious that we are facing a
15425         bug. 
15426
15427         * cs-parser.jay (invocation_expression): Pass Location information.
15428
15429         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
15430         Use a basename for those routines because .NET does not like paths
15431         on them. 
15432
15433         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
15434         already defined.
15435
15436 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
15437
15438         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
15439         are loading the correct data types (throws an exception if not).
15440         (TypeManager::InitCoreTypes): Use CoreLookupType
15441
15442         * expression.cs (Unary::ResolveOperator): return the child
15443         expression for expressions which are just +expr.
15444         (Unary::ResolveOperator): Return negative literals for -LITERAL
15445         expressions (otherwise they are Unary {Literal}).
15446         (Invocation::Badness): Take into account `Implicit constant
15447         expression conversions'.
15448
15449         * literal.cs (LongLiteral): Implement long literal class.
15450         (IntLiteral): export the `Value' of the intliteral. 
15451
15452 2001-09-19  Ravi Pratap  <ravi@ximian.com>
15453
15454         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
15455
15456         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
15457         instead of 'Operator'
15458
15459         * expression.cs (Binary::ResolveOperator): Update accordingly.
15460         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
15461         and 'Minus'
15462
15463         * cs-parser.jay (unary_expression): Update to use the new names.
15464
15465         * gen-treedump.cs (GetUnary): Same here.
15466
15467         * expression.cs (Unary::Resolve): Implement.
15468         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
15469         operators are found instead of making noise ;-)
15470         (Unary::ResolveOperator): New method to do precisely the same thing which
15471         Binary::ResolveOperator does for Binary expressions.
15472         (Unary.method, .Arguments): Add.
15473         (Unary::OperName): Implement.   
15474         (Unary::ForceConversion): Copy and Paste !
15475
15476         * class.cs (Operator::Define): Fix a small bug for the case when we have 
15477         a unary operator.
15478
15479         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
15480         for the inbuilt operators. Only overloading works for now ;-)
15481
15482 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
15483
15484         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
15485         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
15486
15487         * expression.cs (This::Emit): Implement. 
15488         (This::Resolve): Implement.
15489         (TypeOf:Resolve): Implement.
15490         (Expression::ResolveSimpleName): Add an implicit this to instance
15491         field references. 
15492         (MemberAccess::Resolve): Deal with Parameters and Fields. 
15493         Bind instance variable to Field expressions.
15494         (FieldExpr::Instance): New field used to track the expression that
15495         represents the object instance.
15496         (FieldExpr::Resolve): Track potential errors from MemberLookup not
15497         binding 
15498         (FieldExpr::Emit): Implement.
15499
15500         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
15501         the last instruction contains a return opcode to avoid generating
15502         the last `ret' instruction (this generates correct code, and it is
15503         nice to pass the peverify output).
15504
15505         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
15506         initializer for static and instance variables.
15507         (Constructor::Emit): Allow initializer to be null in the case of
15508         static constructors.  Only emit initializer for instance
15509         constructors. 
15510
15511         (TypeContainer::FindMembers): Return a null array if there are no
15512         matches.
15513
15514         Also fix the code for the MemberTypes.Method branch, as it was not
15515         scanning that for operators (or tried to access null variables before).
15516
15517         * assign.cs (Assign::Emit): Handle instance and static fields. 
15518
15519         * TODO: Updated.
15520
15521         * driver.cs: Stop compilation if there are parse errors.
15522
15523         * cs-parser.jay (constructor_declaration): Provide default base
15524         initializer for non-static constructors.
15525         (constructor_declarator): Do not provide a default base
15526         initializers if none was specified.
15527         Catch the fact that constructors should not have parameters.
15528
15529         * class.cs: Do not emit parent class initializers for static
15530         constructors, that should be flagged as an error.
15531
15532 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15533
15534         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
15535         Move back code into TypeContainer::Populate.
15536
15537 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15538
15539         * class.cs (TypeContainer::AddConstructor): Fix the check to
15540         compare against Name, not Basename. 
15541         (Operator::OpType): Change Plus and Minus to Add and Subtract.
15542
15543         * cs-parser.jay : Update accordingly.
15544
15545         * class.cs (TypeContainer::FindMembers): For the case where we are searching
15546         for methods, don't forget to look into the operators too.
15547         (RegisterMethodBuilder): Helper method to take care of this for
15548         methods, constructors and operators.
15549         (Operator::Define): Completely revamp.
15550         (Operator.OperatorMethod, MethodName): New fields.
15551         (TypeContainer::Populate): Move the registering of builders into
15552         RegisterMethodBuilder.
15553         (Operator::Emit): Re-write.
15554
15555         * expression.cs (Binary::Emit): Comment out code path to emit method
15556         invocation stuff for the case when we have a user defined operator. I am
15557         just not able to get it right !
15558
15559 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15560
15561         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
15562         argument. 
15563
15564         (Expression::MemberLookup): Provide a version that allows to
15565         specify the MemberTypes and BindingFlags. 
15566
15567         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
15568         so it was not fetching variable information from outer blocks.
15569
15570         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
15571         Beforefieldinit as it was buggy.
15572
15573         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
15574         that Ravi put here.  
15575
15576         * class.cs (Constructor::Emit): Only emit if block is not null.
15577         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
15578         deal with this by semantically definining it as if the user had
15579         done it.
15580
15581         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
15582         constructors as we now "emit" them at a higher level.
15583
15584         (TypeContainer::DefineDefaultConstructor): Used to define the
15585         default constructors if none was provided.
15586
15587         (ConstructorInitializer): Add methods Resolve and Emit. 
15588
15589         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
15590
15591 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15592
15593         * class.cs (TypeContainer::EmitDefaultConstructor): Register
15594         the default constructor builder with our hashtable for methodbuilders
15595         to methodcores.
15596
15597         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
15598         and argument_count is 0 in which case we have a match.
15599         (Binary::ResolveOperator): More null checking and miscellaneous coding
15600         style cleanup.
15601
15602 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15603
15604         * rootcontext.cs (IsNameSpace): Compare against null.
15605
15606         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
15607
15608         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
15609         and Unary::Operator.
15610
15611         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
15612         accordingly.
15613
15614         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
15615         we have overloaded operators.
15616         (Binary::ResolveOperator): Implement the part which does the operator overload
15617         resolution.
15618
15619         * class.cs (Operator::Emit): Implement.
15620         (TypeContainer::Emit): Emit the operators we have too.
15621
15622         * expression.cs (Binary::Emit): Update to emit the appropriate code for
15623         the case when we have a user-defined operator.
15624
15625 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15626
15627         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
15628
15629 2001-09-16  Ravi Pratap  <ravi@ximian.com>
15630
15631         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
15632         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
15633         (Constructor::Emit): Implement.
15634         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
15635         if we have no work to do. 
15636         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
15637         Emit method.
15638
15639         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
15640         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
15641
15642         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
15643         of parent.parent.
15644
15645 2001-09-15  Ravi Pratap  <ravi@ximian.com>
15646
15647         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
15648         in the source.
15649         (Tree::RecordNamespace): Method to do what the name says ;-)
15650         (Tree::Namespaces): Property to get at the namespaces hashtable.
15651
15652         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
15653         keep track.
15654
15655         * rootcontext.cs (IsNamespace): Fixed it :-)
15656
15657 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15658
15659         * class.cs (TypeContainer::FindMembers): Add support for
15660         constructors. 
15661         (MethodCore): New class that encapsulates both the shared aspects
15662         of a Constructor and a Method.  
15663         (Method, Constructor): Factored pieces into MethodCore.
15664
15665         * driver.cs: Added --fatal which makes errors throw exceptions.
15666         Load System assembly as well as part of the standard library.
15667
15668         * report.cs: Allow throwing exceptions on errors for debugging.
15669
15670         * modifiers.cs: Do not use `parent', instead use the real type
15671         container to evaluate permission settings.
15672
15673         * class.cs: Put Ravi's patch back in.  He is right, and we will
15674         have to cope with the
15675
15676 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15677
15678         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
15679         FamORAssem, not FamANDAssem.
15680
15681 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15682
15683         * driver.cs: Added --parse option that only parses its input files
15684         and terminates.
15685
15686         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
15687         incorrect.  IsTopLevel is not used to tell whether an object is
15688         root_types or not (that can be achieved by testing this ==
15689         root_types).  But to see if this is a top-level *class* (not
15690         necessarly our "toplevel" container). 
15691
15692 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15693
15694         * enum.cs (Enum::Define): Modify to call the Lookup method on the
15695         parent instead of a direct call to GetType.
15696
15697 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15698
15699         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
15700         Modifiers.TypeAttr. This should just be a call to that method.
15701
15702         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
15703         object so that we can determine if we are top-level or not.
15704
15705         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
15706         TypeContainer too.
15707
15708         * enum.cs (Enum::Define): Ditto.
15709
15710         * modifiers.cs (FieldAttr): Re-write.
15711
15712         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
15713         (TypeContainer::HaveStaticConstructor): New property to provide access
15714         to precisely that info.
15715
15716         * modifiers.cs (MethodAttr): Re-write.
15717         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
15718
15719         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
15720         of top-level types as claimed.
15721
15722 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15723
15724         * expression.cs (MemberLookup): Fruitless attempt to lookup
15725         constructors.  Maybe I need to emit default constructors?  That
15726         might be it (currently .NET emits this for me automatically).
15727         (Invocation::OverloadResolve): Cope with Arguments == null.
15728         (Invocation::EmitArguments): new function, shared by the new
15729         constructor and us.
15730         (Invocation::Emit): Handle static and instance methods.  Emit
15731         proper call instruction for virtual or non-virtual invocations.
15732         (New::Emit): Implement.
15733         (New::Resolve): Implement.
15734         (MemberAccess:Resolve): Implement.
15735         (MethodGroupExpr::InstanceExpression): used conforming to the spec
15736         to track instances.
15737         (FieldExpr::Resolve): Set type.
15738
15739         * support.cs: Handle empty arguments.
15740                 
15741         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
15742         SimpleLookup): Auxiliary routines to help parse a qualifier
15743         identifier.  
15744
15745         Update qualifier_identifier rule.
15746
15747         * codegen.cs: Removed debugging messages.
15748
15749         * class.cs: Make this a global thing, this acts just as a "key" to
15750         objects that we might have around.
15751
15752         (Populate): Only initialize method_builders_to_methods once.
15753
15754         * expression.cs (PropertyExpr): Initialize type from the
15755         PropertyType. 
15756
15757         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
15758         Resolve pattern.  Attempt to implicitly convert value to boolean.
15759         Emit code.
15760
15761         * expression.cs: Set the type for the int32/int32 argument case.
15762         (Binary::ResolveOperator): Set the return type to boolean for
15763         comparission operators
15764
15765         * typemanager.cs: Remove debugging print code.
15766
15767         (Invocation::Resolve): resolve type.
15768
15769         * class.cs: Allocate a MemberInfo of the correct size, as the code
15770         elsewhere depends on the test to reflect the correct contents.
15771
15772         (Method::) Keep track of parameters, due to System.Reflection holes
15773
15774         (TypeContainer::Populate): Keep track of MethodBuilders to Method
15775         mapping here.
15776
15777         (TypeContainer::FindMembers): Use ArrayList and then copy an array
15778         of the exact size and return that.
15779
15780         (Class::LookupMethodByBuilder): New function that maps
15781         MethodBuilders to its methods.  Required to locate the information
15782         on methods because System.Reflection bit us again.
15783
15784         * support.cs: New file, contains an interface ParameterData and
15785         two implementations: ReflectionParameters and InternalParameters
15786         used to access Parameter information.  We will need to grow this
15787         as required.
15788
15789         * expression.cs (Invocation::GetParameterData): implement a cache
15790         and a wrapper around the ParameterData creation for methods. 
15791         (Invocation::OverloadResolve): Use new code.
15792
15793 2001-09-13  Ravi Pratap  <ravi@ximian.com>
15794
15795         * class.cs (TypeContainer::EmitField): Remove and move into 
15796         (Field::Define): here and modify accordingly.
15797         (Field.FieldBuilder): New member.
15798         (TypeContainer::Populate): Update accordingly.
15799         (TypeContainer::FindMembers): Implement.
15800
15801 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15802
15803         * statement.cs: (VariableInfo::VariableType): New field to be
15804         initialized with the full type once it is resolved. 
15805
15806 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
15807
15808         * parameter.cs (GetParameterInfo): Use a type cache to compute
15809         things only once, and to reuse this information
15810
15811         * expression.cs (LocalVariableReference::Emit): Implement.
15812         (OpcodeCast::Emit): fix.
15813
15814         (ParameterReference::Resolve): Implement.
15815         (ParameterReference::Emit): Implement.
15816
15817         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
15818         that are expressions need to stay as Expressions.
15819
15820         * typemanager.cs (CSharpName): Returns the C# name of a type if
15821         possible. 
15822
15823         * expression.cs (Expression::ConvertImplicit): New function that
15824         implements implicit type conversions.
15825
15826         (Expression::ImplicitReferenceConversion): Implements implicit
15827         reference conversions.
15828
15829         (EmptyCast): New type for transparent casts.
15830
15831         (OpcodeCast): New type for casts of types that are performed with
15832         a sequence of bytecodes.
15833
15834         (BoxedCast): New type used for casting value types into reference
15835         types.  Emits a box opcode.
15836
15837         (Binary::DoNumericPromotions): Implements numeric promotions of
15838         and computation of the Binary::Type.
15839
15840         (Binary::EmitBranchable): Optimization.
15841
15842         (Binary::Emit): Implement code emission for expressions.
15843
15844         * typemanager.cs (TypeManager): Added two new core types: sbyte
15845         and byte.
15846
15847 2001-09-12  Ravi Pratap  <ravi@ximian.com>
15848
15849         * class.cs (TypeContainer::FindMembers): Method which does exactly
15850         what Type.FindMembers does, only we don't have to use reflection. No
15851         implementation yet.
15852
15853         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
15854         typecontainer objects as we need to get at them.
15855         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
15856
15857         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
15858         typecontainer object.
15859
15860         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
15861         of just a Report object.
15862
15863 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15864
15865         * class.cs (Event::Define): Go back to using the prefixes "add_" and
15866         "remove_"
15867         (TypeContainer::Populate): Now define the delegates of the type too.
15868         (TypeContainer.Delegates): Property to access the list of delegates defined
15869         in the type.
15870
15871         * delegates.cs (Delegate::Define): Implement partially.
15872
15873         * modifiers.cs (TypeAttr): Handle more flags.
15874
15875 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15876
15877         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
15878         and not <=
15879         (Operator::Define): Re-write logic to get types by using the LookupType method
15880         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
15881         (Indexer::Define): Ditto.
15882         (Event::Define): Ditto.
15883         (Property::Define): Ditto.
15884
15885 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15886
15887         * class.cs (TypeContainer::Populate): Now define operators too. 
15888         (TypeContainer.Operators): New property to access the list of operators
15889         in a type.
15890         (Operator.OperatorMethodBuilder): New member to hold the method builder
15891         for the operator we are defining.
15892         (Operator::Define): Implement.
15893
15894 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15895
15896         * class.cs (Event::Define): Make the prefixes of the accessor methods
15897         addOn_ and removeOn_ 
15898
15899         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
15900         of the location being passed in too. Ideally, this should go later since all
15901         error reporting should be done through the Report object.
15902
15903         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
15904         (Populate): Iterate thru the indexers we have and define them too.
15905         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
15906         for the get and set accessors.
15907         (Indexer::Define): Implement.
15908
15909 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
15910
15911         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
15912         my previous implementation, did not work.
15913
15914         * typemanager.cs: Add a couple of missing types (the longs).
15915
15916         * literal.cs: Use TypeManager.bool_type instead of getting it.
15917
15918         * expression.cs (EventExpr): New kind of expressions.
15919         (Expressio::ExprClassFromMemberInfo): finish
15920
15921 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
15922
15923         * assign.cs: Emit stores to static fields differently.
15924
15925 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15926
15927         * Merge in changes and adjust code to tackle conflicts. Backed out my
15928         code in Assign::Resolve ;-) 
15929
15930 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15931
15932         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
15933         instead Report.Error and also pass in the location.
15934         (CSharpParser::Lexer): New readonly property to return the reference
15935         to the Tokenizer object.
15936         (declare_local_variables): Use Report.Error with location instead of plain 
15937         old error.
15938         (CheckDef): Ditto.
15939
15940         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
15941         (Operator.CheckBinaryOperator): Ditto.
15942
15943         * cs-parser.jay (operator_declarator): Update accordingly.
15944
15945         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
15946         (CheckBinaryOperator): Same here.
15947
15948         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
15949         on the name without any prefixes of namespace names etc. This is because we
15950         already might have something already fully qualified like 
15951         'System.Console.WriteLine'
15952
15953         * assign.cs (Resolve): Begin implementation. Stuck ;-)
15954
15955 2001-09-07  Ravi Pratap  <ravi@ximian.com>
15956
15957         * cs-tokenizer.cs (location): Return a string which also contains
15958         the file name.
15959
15960         * expression.cs (ElementAccess): New class for expressions of the
15961         type 'element access.'
15962         (BaseAccess): New class for expressions of the type 'base access.'
15963         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
15964         respectively.
15965
15966         * cs-parser.jay (element_access): Implement action.
15967         (base_access): Implement actions.
15968         (checked_expression, unchecked_expression): Implement.
15969
15970         * cs-parser.jay (local_variable_type): Correct and implement.
15971         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
15972
15973         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
15974
15975         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
15976         name and the specifiers.
15977
15978         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
15979
15980         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
15981         making them all public ;-)
15982
15983         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
15984         class anyways.
15985
15986 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
15987
15988         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
15989         PropertyExprs.
15990         (FieldExpr, PropertyExprs): New resolved expressions.
15991         (SimpleName::MemberStaticCheck): Perform static checks for access
15992         to non-static fields on static methods. Maybe this should be
15993         generalized for MemberAccesses. 
15994         (SimpleName::ResolveSimpleName): More work on simple name
15995         resolution. 
15996
15997         * cs-parser.jay (primary_expression/qualified_identifier): track
15998         the parameter index.
15999
16000         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16001         (EmitContext::EmitBoolExpression): Chain to expression generation
16002         instead of temporary hack.
16003         (::EmitStatementExpression): Put generic expression code generation.
16004
16005         * assign.cs (Assign::Emit): Implement variable assignments to
16006         local variables, parameters and fields.
16007
16008 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16009
16010         * statement.cs (Block::GetVariableInfo): New method, returns the
16011         VariableInfo for a variable name in a block.
16012         (Block::GetVariableType): Implement in terms of GetVariableInfo
16013
16014         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16015         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16016
16017 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16018
16019         * cs-parser.jay (operator_declaration): Continue on my quest : update
16020         to take attributes argument.
16021         (event_declaration): Ditto.
16022         (enum_declaration): Ditto.
16023         (indexer_declaration): Ditto.
16024
16025         * class.cs (Operator::Operator): Update constructor accordingly.
16026         (Event::Event): Ditto.
16027
16028         * delegate.cs (Delegate::Delegate): Same here.
16029
16030         * enum.cs (Enum::Enum): Same here.
16031
16032 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16033
16034         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16035
16036         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16037
16038         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16039         being passed around as an arraylist.
16040         (Attributes::AddAttribute): Method to add attribute sections.
16041
16042         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16043         (struct_declaration): Update accordingly.
16044         (constant_declaration): Update.
16045         (field_declaration): Update.
16046         (method_header): Update.
16047         (fixed_parameter): Update.
16048         (parameter_array): Ditto.
16049         (property_declaration): Ditto.
16050         (destructor_declaration): Ditto.
16051
16052         * class.cs (Struct::Struct): Update constructors accordingly.
16053         (Class::Class): Ditto.
16054         (Field::Field): Ditto.
16055         (Method::Method): Ditto.
16056         (Property::Property): Ditto.
16057         (TypeContainer::OptAttribute): update property's return type.
16058
16059         * interface.cs (Interface.opt_attributes): New member.
16060         (Interface::Interface): Update to take the extra Attributes argument.
16061
16062         * parameter.cs (Parameter::Parameter): Ditto.
16063
16064         * constant.cs (Constant::Constant): Ditto.
16065
16066         * interface.cs (InterfaceMemberBase): New OptAttributes field.
16067         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
16068         the attributes as a parameter.
16069         (InterfaceProperty): Update constructor call.
16070         (InterfaceEvent): Ditto.
16071         (InterfaceMethod): Ditto.
16072         (InterfaceIndexer): Ditto.
16073
16074         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
16075         pass the attributes too.
16076         (interface_event_declaration): Ditto.
16077         (interface_property_declaration): Ditto.
16078         (interface_method_declaration): Ditto.
16079         (interface_declaration): Ditto.
16080
16081 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
16082
16083         * class.cs (Method::Define): Track the "static Main" definition to
16084         create an entry point. 
16085
16086         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
16087         EntryPoint if we find it. 
16088
16089         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
16090         (EmitContext::ig): Make this variable public.
16091
16092         * driver.cs: Make the default output file be the first file name
16093         with the .exe extension.  
16094
16095         Detect empty compilations
16096
16097         Handle various kinds of output targets.  Handle --target and
16098         rename -t to --dumper.
16099
16100         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
16101         methods inherited from Expression return now an Expression.  This
16102         will is used during the tree rewriting as we resolve them during
16103         semantic analysis.
16104
16105         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
16106         the spec.  Missing entirely is the information about
16107         accessability of elements of it.
16108
16109         (Expression::ExprClassFromMemberInfo): New constructor for
16110         Expressions that creates a fully initialized Expression based on
16111         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
16112         a Type.
16113
16114         (Invocation::Resolve): Begin implementing resolution of invocations.
16115
16116         * literal.cs (StringLiteral):  Implement Emit.
16117
16118 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16119
16120         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
16121         member.
16122
16123 2001-09-04  Ravi Pratap  <ravi@ximian.com>
16124
16125         * cs-parser.jay (attribute_arguments): Implement actions.
16126         (attribute): Fix bug in production. Implement action.
16127         (attribute_list): Implement.
16128         (attribute_target): Implement.
16129         (attribute_target_specifier, opt_target_specifier): Implement
16130         (CheckAttributeTarget): New method to check if the attribute target
16131         is valid.
16132         (attribute_section): Implement.
16133         (opt_attributes): Implement.
16134
16135         * attribute.cs : New file to handle attributes.
16136         (Attribute): Class to hold attribute info.
16137
16138         * cs-parser.jay (opt_attribute_target_specifier): Remove production
16139         (attribute_section): Modify production to use 2 different rules to 
16140         achieve the same thing. 1 s/r conflict down !
16141         Clean out commented, useless, non-reducing dimension_separator rules.
16142
16143         * class.cs (TypeContainer.attributes): New member to hold list
16144         of attributes for a type.
16145         (Struct::Struct): Modify to take one more argument, the attribute list.
16146         (Class::Class): Ditto.
16147         (Field::Field): Ditto.
16148         (Method::Method): Ditto.
16149         (Property::Property): Ditto.
16150
16151         * cs-parser.jay (struct_declaration): Update constructor call to
16152         pass in the attributes too.
16153         (class_declaration): Ditto.
16154         (constant_declaration): Ditto.
16155         (field_declaration): Ditto.
16156         (method_header): Ditto.
16157         (fixed_parameter): Ditto.
16158         (parameter_array): Ditto.
16159         (property_declaration): Ditto.
16160
16161         * constant.cs (Constant::Constant): Update constructor similarly.
16162         Use System.Collections.
16163
16164         * parameter.cs (Parameter::Parameter): Update as above.
16165
16166 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16167
16168         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
16169         (TypeContainer.delegates): New member to hold list of delegates.
16170
16171         * cs-parser.jay (delegate_declaration): Implement the action correctly 
16172         this time as I seem to be on crack ;-)
16173
16174 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
16175
16176         * rootcontext.cs (RootContext::IsNamespace): new function, used to
16177         tell whether an identifier represents a namespace.
16178
16179         * expression.cs (NamespaceExpr): A namespace expression, used only
16180         temporarly during expression resolution.
16181         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
16182         utility functions to resolve names on expressions.
16183
16184 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
16185
16186         * codegen.cs: Add hook for StatementExpressions. 
16187
16188         * class.cs: Fix inverted test for static flag in methods.
16189
16190 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16191
16192         * class.cs (Operator::CheckUnaryOperator): Correct error number used
16193         to make it coincide with MS' number.
16194         (Operator::CheckBinaryOperator): Ditto.
16195
16196         * ../errors/errors.txt : Remove error numbers added earlier.
16197
16198         * ../errors/cs1019.cs : Test case for error # 1019
16199
16200         * ../errros/cs1020.cs : Test case for error # 1020
16201
16202         * cs-parser.jay : Clean out commented cruft.
16203         (dimension_separators, dimension_separator): Comment out. Ostensibly not
16204         used anywhere - non-reducing rule.
16205         (namespace_declarations): Non-reducing rule - comment out.
16206
16207         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
16208         with TypeContainer::AddEnum.
16209
16210         * delegate.cs : New file for delegate handling classes.
16211         (Delegate): Class for declaring delegates.
16212
16213         * makefile : Update.
16214
16215         * cs-parser.jay (delegate_declaration): Implement.
16216
16217 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
16218
16219         * class.cs (Event::Define): Implement.
16220         (Event.EventBuilder): New member.
16221
16222         * class.cs (TypeContainer::Populate): Update to define all enums and events
16223         we have.
16224         (Events): New property for the events arraylist we hold. Shouldn't we move to using
16225         readonly fields for all these cases ?
16226
16227 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16228
16229         * class.cs (Property): Revamp to use the convention of making fields readonly.
16230         Accordingly modify code elsewhere.
16231
16232         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
16233         the Define method of the Property class.
16234
16235         * class.cs : Clean up applied patch and update references to variables etc. Fix 
16236         trivial bug.
16237         (TypeContainer::Populate): Update to define all the properties we have. Also
16238         define all enumerations.
16239
16240         * enum.cs (Define): Implement.
16241
16242 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16243
16244         * cs-parser.jay (overloadable_operator): The semantic value is an
16245         enum of the Operator class.
16246         (operator_declarator): Implement actions.
16247         (operator_declaration): Implement.
16248
16249         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
16250         validity of definitions.
16251         (Operator::CheckBinaryOperator): Static method to check for binary operators
16252         (TypeContainer::AddOperator): New method to add an operator to a type.
16253
16254         * cs-parser.jay (indexer_declaration): Added line to actually call the
16255         AddIndexer method so it gets added ;-)
16256
16257         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
16258         already taken care of by the MS compiler ?  
16259
16260 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16261
16262         * class.cs (Operator): New class for operator declarations.
16263         (Operator::OpType): Enum for the various operators.
16264
16265 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16266
16267         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
16268         ostensibly handle this in semantic analysis.
16269
16270         * cs-parser.jay (general_catch_clause): Comment out
16271         (specific_catch_clauses, specific_catch_clause): Ditto.
16272         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
16273         (catch_args, opt_catch_args): New productions.
16274         (catch_clause): Rewrite to use the new productions above
16275         (catch_clauses): Modify accordingly.
16276         (opt_catch_clauses): New production to use in try_statement
16277         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
16278         and re-write the code in the actions to extract the specific and
16279         general catch clauses by being a little smart ;-)
16280
16281         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
16282         Hooray, try and catch statements parse fine !
16283
16284 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16285
16286         * statement.cs (Block::GetVariableType): Fix logic to extract the type
16287         string from the hashtable of variables.
16288
16289         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
16290         I end up making that mistake ;-)
16291         (catch_clauses): Fixed gross error which made Key and Value of the 
16292         DictionaryEntry the same : $1 !!
16293
16294 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16295
16296         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
16297
16298         * cs-parser.jay (event_declaration): Correct to remove the semicolon
16299         when the add and remove accessors are specified. 
16300
16301 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16302
16303         * cs-parser.jay (IndexerDeclaration): New helper class to hold
16304         information about indexer_declarator.
16305         (indexer_declarator): Implement actions.
16306         (parsing_indexer): New local boolean used to keep track of whether
16307         we are parsing indexers or properties. This is necessary because 
16308         implicit_parameters come into picture even for the get accessor in the 
16309         case of an indexer.
16310         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
16311
16312         * class.cs (Indexer): New class for indexer declarations.
16313         (TypeContainer::AddIndexer): New method to add an indexer to a type.
16314         (TypeContainer::indexers): New member to hold list of indexers for the
16315         type.
16316
16317 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16318
16319         * cs-parser.jay (add_accessor_declaration): Implement action.
16320         (remove_accessor_declaration): Implement action.
16321         (event_accessors_declaration): Implement
16322         (variable_declarators): swap statements for first rule - trivial.
16323
16324         * class.cs (Event): New class to hold information about event
16325         declarations.
16326         (TypeContainer::AddEvent): New method to add an event to a type
16327         (TypeContainer::events): New member to hold list of events.
16328
16329         * cs-parser.jay (event_declaration): Implement actions.
16330
16331 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16332
16333         * cs-parser.jay (dim_separators): Implement. Make it a string
16334         concatenating all the commas together, just as they appear.
16335         (opt_dim_separators): Modify accordingly
16336         (rank_specifiers): Update accordingly. Basically do the same
16337         thing - instead, collect the brackets here.
16338         (opt_rank_sepcifiers): Modify accordingly.
16339         (array_type): Modify to actually return the complete type string
16340         instead of ignoring the rank_specifiers.
16341         (expression_list): Implement to collect the expressions
16342         (variable_initializer): Implement. We make it a list of expressions
16343         essentially so that we can handle the array_initializer case neatly too.
16344         (variable_initializer_list): Implement.
16345         (array_initializer): Make it a list of variable_initializers
16346         (opt_array_initializer): Modify accordingly.
16347
16348         * expression.cs (New::NType): Add enumeration to help us
16349         keep track of whether we have an object/delegate creation
16350         or an array creation.
16351         (New:NewType, New::Rank, New::Indices, New::Initializers): New
16352         members to hold data about array creation.
16353         (New:New): Modify to update NewType
16354         (New:New): New Overloaded contructor for the array creation
16355         case.
16356
16357         * cs-parser.jay (array_creation_expression): Implement to call
16358         the overloaded New constructor.
16359
16360 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
16361
16362         * class.cs (TypeContainer::Constructors): Return member
16363         constructors instead of returning null.
16364
16365 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
16366
16367         * typemanager.cs (InitCoreTypes): Initialize the various core
16368         types after we have populated the type manager with the user
16369         defined types (this distinction will be important later while
16370         compiling corlib.dll)
16371
16372         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
16373         on Expression Classification.  Now all expressions have a method
16374         `Resolve' and a method `Emit'.
16375
16376         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
16377         generation from working.     Also add some temporary debugging
16378         code. 
16379
16380 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
16381
16382         * codegen.cs: Lots of code generation pieces.  This is only the
16383         beginning, will continue tomorrow with more touches of polish.  We
16384         handle the fundamentals of if, while, do, for, return.  Others are
16385         trickier and I need to start working on invocations soon.
16386
16387         * gen-treedump.cs: Bug fix, use s.Increment here instead of
16388         s.InitStatement. 
16389
16390         * codegen.cs (EmitContext): New struct, used during code
16391         emission to keep a context.   Most of the code generation will be
16392         here. 
16393
16394         * cs-parser.jay: Add embedded blocks to the list of statements of
16395         this block.  So code generation proceeds in a top down fashion.
16396
16397 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
16398
16399         * statement.cs: Add support for multiple child blocks.
16400
16401 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
16402
16403         * codegen.cs (EmitCode): New function, will emit the code for a
16404         Block of code given a TypeContainer and its ILGenerator. 
16405
16406         * statement.cs (Block): Standard public readonly optimization.
16407         (Block::Block constructors): Link children. 
16408         (Block::Child): Child Linker.
16409         (Block::EmitVariables): Emits IL variable declarations.
16410
16411         * class.cs: Drop support for MethodGroups here, delay until
16412         Semantic Analysis.
16413         (Method::): Applied the same simplification that I did before, and
16414         move from Properties to public readonly fields.
16415         (Method::ParameterTypes): Returns the parameter types for the
16416         function, and implements a cache that will be useful later when I
16417         do error checking and the semantic analysis on the methods is
16418         performed.
16419         (Constructor::GetCallingConvention): Renamed from CallingConvetion
16420         and made a method, optional argument tells whether this is a class
16421         or a structure to apply the `has-this' bit.
16422         (Method::GetCallingConvention): Implement, returns the calling
16423         convention. 
16424         (Method::Define): Defines the type, a second pass is performed
16425         later to populate the methods.
16426
16427         (Constructor::ParameterTypes): implement a cache similar to the
16428         one on Method::ParameterTypes, useful later when we do semantic
16429         analysis. 
16430
16431         (TypeContainer::EmitMethod):  New method.  Emits methods.
16432
16433         * expression.cs: Removed MethodGroup class from here.
16434
16435         * parameter.cs (Parameters::GetCallingConvention): new method.
16436
16437 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
16438
16439         * class.cs (TypeContainer::Populate): Drop RootContext from the
16440         argument. 
16441
16442         (Constructor::CallingConvention): Returns the calling convention.
16443         (Constructor::ParameterTypes): Returns the constructor parameter
16444         types. 
16445
16446         (TypeContainer::AddConstructor): Keep track of default constructor
16447         and the default static constructor.
16448
16449         (Constructor::) Another class that starts using `public readonly'
16450         instead of properties. 
16451
16452         (Constructor::IsDefault): Whether this is a default constructor. 
16453
16454         (Field::) use readonly public fields instead of properties also.
16455
16456         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
16457         track of static constructors;  If none is used, turn on
16458         BeforeFieldInit in the TypeAttributes. 
16459
16460         * cs-parser.jay (opt_argument_list): now the return can be null
16461         for the cases where there are no arguments. 
16462
16463         (constructor_declarator): If there is no implicit `base' or
16464         `this', then invoke the default parent constructor. 
16465
16466         * modifiers.cs (MethodAttr): New static function maps a set of
16467         modifiers flags into a MethodAttributes enum
16468         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
16469         MethodAttr, TypeAttr to represent the various mappings where the
16470         modifiers are used.
16471         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
16472
16473 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
16474
16475         * parameter.cs (GetParameterInfo): Fix bug where there would be no
16476         method arguments.
16477
16478         * interface.cs (PopulateIndexer): Implemented the code generator
16479         for interface indexers.
16480
16481 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
16482
16483         * interface.cs (InterfaceMemberBase): Now we track the new status
16484         here.  
16485
16486         (PopulateProperty): Implement property population.  Woohoo!  Got
16487         Methods and Properties going today. 
16488
16489         Removed all the properties for interfaces, and replaced them with
16490         `public readonly' fields. 
16491
16492 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
16493
16494         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
16495         initialize their hashtables/arraylists only when they are needed
16496         instead of doing this always.
16497
16498         * parameter.cs: Handle refs and out parameters.
16499
16500         * cs-parser.jay: Use an ArrayList to construct the arguments
16501         instead of the ParameterCollection, and then cast that to a
16502         Parameter[] array.
16503
16504         * parameter.cs: Drop the use of ParameterCollection and use
16505         instead arrays of Parameters.
16506
16507         (GetParameterInfo): Use the Type, not the Name when resolving
16508         types. 
16509
16510 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
16511
16512         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
16513         and instead use public readonly fields.
16514
16515         * class.cs: Put back walking code for type containers.
16516
16517 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
16518
16519         * class.cs (MakeConstant): Code to define constants.
16520
16521         * rootcontext.cs (LookupType): New function.  Used to locate types 
16522
16523
16524 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
16525
16526         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
16527         this System.Reflection code is.  Kudos to Microsoft
16528
16529         * typemanager.cs: Implement a type cache and avoid loading all
16530         types at boot time.  Wrap in LookupType the internals.  This made
16531         the compiler so much faster.  Wow.  I rule!
16532
16533         * driver.cs: Make sure we always load mscorlib first (for
16534         debugging purposes, nothing really important).
16535
16536         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
16537         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
16538
16539         * rootcontext.cs: Lookup types on their namespace;  Lookup types
16540         on namespaces that have been imported using the `using' keyword.
16541
16542         * class.cs (TypeContainer::TypeAttr): Virtualize.
16543         (Class::TypeAttr): Return attributes suitable for this bad boy.
16544         (Struct::TypeAttr): ditto.
16545         Handle nested classes.
16546         (TypeContainer::) Remove all the type visiting code, it is now
16547         replaced with the rootcontext.cs code
16548
16549         * rootcontext.cs (GetClassBases): Added support for structs. 
16550
16551 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
16552
16553         * interface.cs, statement.cs, class.cs, parameter.cs,
16554         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
16555         Drop use of TypeRefs, and use strings instead.
16556
16557 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
16558
16559         * rootcontext.cs: 
16560
16561         * class.cs (Struct::Struct): set the SEALED flags after
16562         checking the modifiers.
16563         (TypeContainer::TypeAttr): new property, returns the
16564         TypeAttributes for a class.  
16565
16566         * cs-parser.jay (type_list): Oops, list production was creating a
16567         new list of base types.
16568
16569         * rootcontext.cs (StdLib): New property.
16570         (GetInterfaceTypeByName): returns an interface by type name, and
16571         encapsulates error handling here.
16572         (GetInterfaces): simplified.
16573         (ResolveTree): Encapsulated all the tree resolution here.
16574         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
16575         types. 
16576
16577         * driver.cs: Add support for --nostdlib, to avoid loading the
16578         default assemblies.
16579         (Main): Do not put tree resolution here. 
16580
16581         * rootcontext.cs: Beginning of the class resolution.
16582
16583 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
16584
16585         * rootcontext.cs: Provide better error reporting. 
16586
16587         * cs-parser.jay (interface_base): set our $$ to be interfaces.
16588
16589         * rootcontext.cs (CreateInterface): Handle the case where there
16590         are no parent interfaces.
16591
16592         (CloseTypes): Routine to flush types at the end.
16593         (CreateInterface): Track types.
16594         (GetInterfaces): Returns an array of Types from the list of
16595         defined interfaces.
16596
16597         * typemanager.c (AddUserType): Mechanism to track user types (puts
16598         the type on the global type hash, and allows us to close it at the
16599         end). 
16600
16601 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
16602
16603         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
16604         RecordInterface instead.
16605
16606         * cs-parser.jay: Updated to reflect changes above.
16607
16608         * decl.cs (Definition): Keep track of the TypeBuilder type that
16609         represents this type here.  Not sure we will use it in the long
16610         run, but wont hurt for now.
16611
16612         * driver.cs: Smaller changes to accomodate the new code.
16613
16614         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
16615         when done. 
16616
16617         * rootcontext.cs (CreateInterface):  New method, used to create
16618         the System.TypeBuilder type for interfaces.
16619         (ResolveInterfaces): new entry point to resolve the interface
16620         hierarchy. 
16621         (CodeGen): Property, used to keep track of the code generator.
16622
16623 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
16624
16625         * cs-parser.jay: Add a second production for delegate_declaration
16626         with `VOID'.
16627
16628         (enum_body): Put an opt_comma here instead of putting it on
16629         enum_body or enum_member_declarations so we can handle trailing
16630         commas on enumeration members.  Gets rid of a shift/reduce.
16631
16632         (type_list): Need a COMMA in the middle.
16633
16634         (indexer_declaration): Tell tokenizer to recognize get/set
16635
16636         * Remove old targets.
16637
16638         * Re-add the parser target.
16639
16640 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16641
16642         * cs-parser.jay: Add precendence rules for a number of operators
16643         ot reduce the number of shift/reduce conflicts in the grammar.
16644
16645 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
16646
16647         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
16648         and put it here.
16649
16650         Get rid of old crufty code.
16651
16652         * rootcontext.cs: Use this to keep track of the parsed
16653         representation and the defined types available to the program. 
16654
16655         * gen-treedump.cs: adjust for new convention.
16656
16657         * type.cs: Split out the type manager, and the assembly builder
16658         from here. 
16659
16660         * typemanager.cs: the type manager will live here now.
16661
16662         * cil-codegen.cs: And the code generator here. 
16663
16664 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
16665
16666         * makefile: Fixed up for easy making.
16667
16668 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16669
16670         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
16671         the 
16672
16673         (unary_expression): Expand pre_increment_expression and
16674         post_decrement_expression to reduce a shift/reduce.
16675
16676 2001-07-11  Simon Cozens
16677
16678         * cs-tokenizer.cs: Hex numbers should begin with a 0.
16679
16680         Improve allow_keyword_as_indent name.
16681
16682 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
16683
16684         * Adjustments for Beta2. 
16685
16686 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
16687
16688         * decl.cs: Added `Define' abstract method.
16689         (InTransit): new property, used to catch recursive definitions. 
16690
16691         * interface.cs: Implement `Define'. 
16692
16693         * modifiers.cs: Map Modifiers.constants to
16694         System.Reflection.TypeAttribute flags.
16695
16696         * class.cs: Keep track of types and user-defined types.
16697         (BuilderInit): New method for creating an assembly
16698         (ResolveType): New function to launch the resolution process, only
16699         used by interfaces for now.
16700
16701         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
16702         that are inserted into the name space. 
16703
16704 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
16705
16706         * ARGH.  I have screwed up my tree so many times due to the use of
16707         rsync rather than using CVS.  Going to fix this at once. 
16708
16709         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
16710         load types.
16711
16712 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
16713
16714         * Experiment successful: Use System.Type rather that our own
16715         version of Type.  
16716
16717 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
16718
16719         * cs-parser.jay: Removed nsAliases from here.
16720
16721         Use new namespaces, handle `using XXX;' 
16722
16723         * namespace.cs: Reimplemented namespace handling, use a recursive
16724         definition of the class.  Now we can keep track of using clauses
16725         and catch invalid using clauses.
16726
16727 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
16728
16729         * gen-treedump.cs: Adapted for all the renaming.
16730
16731         * expression.cs (Expression): this class now has a Type property
16732         which returns an expression Type.
16733
16734         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
16735         `Type', as this has a different meaning now in the base
16736
16737 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
16738
16739         * interface.cs, class.cs: Removed from all the sources the
16740         references to signature computation, as we can not do method
16741         signature computation during the parsing time, as we are not
16742         trying to solve at that point distinguishing:
16743
16744         class X {
16745                 void a (Blah x) {}
16746                 void a (NS.Blah x) {}
16747         }
16748
16749         Which depending on the context might be valid or not, as we do not
16750         know if Blah is the same thing as NS.Blah at that point.
16751
16752         * Redid everything so the code uses TypeRefs now instead of
16753         Types.  TypeRefs are just temporary type placeholders, that need
16754         to be resolved.  They initially have a pointer to a string and the
16755         current scope in which they are used.  This is used later by the
16756         compiler to resolve the reference to an actual Type. 
16757
16758         * DeclSpace is no longer a CIR.Type, and neither are
16759         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
16760         are all DeclSpaces, but no Types. 
16761
16762         * type.cs (TypeRefManager): This implements the TypeRef manager,
16763         which keeps track of all the types that need to be resolved after
16764         the parsing has finished. 
16765
16766 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
16767
16768         * ARGH.  We are going to have to store `foreach' as a class rather
16769         than resolving it, as we need to verify error 1579 after name
16770         resolution.   *OR* we could keep a flag that says `This request to
16771         IEnumerator comes from a foreach statement' which we can then use
16772         to generate the error.
16773
16774 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
16775
16776         * class.cs (TypeContainer.AddMethod): we now add methods to the
16777         MethodGroup instead of the method hashtable.  
16778
16779         * expression.cs: Add MethodGroup abstraction, which gets us one
16780         step closer to the specification in the way we handle method
16781         declarations.  
16782
16783         * cs-parser.jay (primary_expression): qualified_identifier now
16784         tried to match up an identifier to a local variable reference or
16785         to a parameter reference.
16786
16787         current_local_parameters is now a parser global variable that
16788         points to the current parameters for the block, used during name
16789         lookup.
16790
16791         (property_declaration): Now creates an implicit `value' argument to
16792         the set accessor.
16793
16794 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
16795
16796         * parameter.cs: Do not use `param' arguments as part of the
16797         signature, per the spec.
16798
16799 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
16800
16801         * decl.cs: Base class for classes, structs and interfaces.  This
16802         is the "Declaration Space" 
16803
16804         * cs-parser.jay: Use CheckDef for checking declaration errors
16805         instead of having one on each function.
16806
16807         * class.cs: Factor out some code for handling error handling in
16808         accordance to the "Declarations" section in the "Basic Concepts"
16809         chapter in the ECMA C# spec.
16810
16811         * interface.cs: Make all interface member classes derive from
16812         InterfaceMemberBase.
16813
16814 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
16815
16816         * Many things: all interfaces are parsed and generated in
16817         gen-treedump.  Support for member variables, constructors,
16818         destructors, properties, constants is there.
16819
16820         Beginning of the IL backend, but very little done, just there for
16821         testing purposes. 
16822
16823 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
16824
16825         * cs-parser.jay: Fix labeled statement.
16826
16827         * cs-tokenizer.cs (escape): Escape " and ' always.
16828         ref_line, ref_name: keep track of the line/filename as instructed
16829         by #line by the compiler.
16830         Parse #line.
16831
16832 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
16833
16834         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
16835         to match the values in System.CodeDOM.
16836
16837         Divid renamed to Divide.
16838
16839         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
16840         statements. 
16841         (Statements.set): remove.
16842
16843         * System.CodeDOM/CodeCatchClause.cs: always have a valid
16844         statements. 
16845
16846         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
16847         falseStatements always have valid values. 
16848
16849         * cs-parser.jay: Use System.CodeDOM now.
16850