f265e7ea828edede0f099b19e2b5e8684c81baf0
[mono.git] / mcs / mcs / ChangeLog
1 2004-10-20  Marek Safar  <marek.safar@seznam.cz>
2
3         * class.cs (MethodCore.CheckBase): Add errors 505, 533, 544,
4         561 report.
5         (PropertyBase.FindOutParentMethod): Add errors 545, 546 report.
6
7 2004-10-18  Martin Baulig  <martin@ximian.com>
8
9         Merged latest changes into gmcs.  Please keep this comment in
10         here, it makes it easier for me to see what changed in MCS since
11         the last time I merged.
12
13 2004-10-18  Martin Baulig  <martin@ximian.com>
14
15         * statement.cs (Fixed.Resolve): Don't access the TypeExpr's
16         `Type' directly, but call ResolveType() on it.
17         (Catch.Resolve): Likewise.
18         (Foreach.Resolve): Likewise.
19
20 2004-10-18  Martin Baulig  <martin@ximian.com>
21
22         * expression.cs (Cast.DoResolve): Don't access the TypeExpr's
23         `Type' directly, but call ResolveType() on it.
24         (Probe.DoResolve): Likewise.
25         (ArrayCreation.LookupType): Likewise.
26         (TypeOf.DoResolve): Likewise.
27         (SizeOf.DoResolve): Likewise.
28
29 2004-10-18  Martin Baulig  <martin@ximian.com>
30
31         * expression.cs (Invocation.BetterFunction): Put back
32         TypeManager.TypeToCoreType().
33
34 2004-10-18  Raja R Harinath  <rharinath@novell.com>
35
36         * class.cs (FieldMember.DoDefine): Reset ec.InUnsafe after doing
37         the ResolveType.
38
39 2004-10-18  Martin Baulig  <martin@ximian.com>
40
41         * parameter.cs (Parameter.Resolve):  Don't access the TypeExpr's
42         `Type' directly, but call ResolveType() on it.
43
44 2004-10-18  Martin Baulig  <martin@ximian.com>
45
46         * class.cs (FieldMember.Define): Don't access the TypeExpr's
47         `Type' directly, but call ResolveType() on it.
48         (MemberBase.DoDefine): Likewise.
49
50         * expression.cs (New.DoResolve): Don't access the TypeExpr's
51         `Type' directly, but call ResolveType() on it.
52         (ComposedCast.DoResolveAsTypeStep): Likewise.
53
54         * statement.cs (LocalInfo.Resolve): Don't access the TypeExpr's
55         `Type' directly, but call ResolveType() on it.
56
57 2004-10-17  John Luke  <john.luke@gmail.com>
58
59         * class.cs (Operator.GetSignatureForError): use CSharpName
60
61         * parameter.cs (Parameter.GetSignatureForError): Returns
62         correct name even if was not defined.
63
64 2004-10-13  Raja R Harinath  <rharinath@novell.com>
65
66         Fix #65816.
67         * class.cs (TypeContainer.EmitContext): New property.
68         (DefineNestedTypes): Create an emitcontext for each part.
69         (MethodCore.DoDefineParameters): Use container's emitcontext.
70         Pass type array to InternalParameters.
71         (MemberBase.DoDefine): Use container's emitcontext.
72         (FieldMember.Define): Likewise.
73         (Event.Define): Likewise.
74         (SetMethod.GetParameterInfo): Change argument to EmitContext.
75         Pass type array to InternalParameters.
76         (SetIndexerMethod.GetParameterInfo): Likewise.
77         (SetMethod.Define): Pass emitcontext to GetParameterInfo.
78         * delegate.cs (Define): Pass emitcontext to
79         ComputeAndDefineParameterTypes and GetParameterInfo.  Pass type
80         array to InternalParameters.
81         * expression.cs (ParameterReference.DoResolveBase): Pass
82         emitcontext to GetParameterInfo.
83         (ComposedCast.DoResolveAsTypeStep): Remove check on
84         ec.ResolvingTypeTree.
85         * parameter.cs (Parameter.Resolve): Change argument to
86         EmitContext.  Use ResolveAsTypeTerminal.
87         (Parameter.GetSignature): Change argument to EmitContext.
88         (Parameters.ComputeSignature): Likewise.
89         (Parameters.ComputeParameterTypes): Likewise.
90         (Parameters.GetParameterInfo): Likewise.
91         (Parameters.ComputeAndDefineParameterTypes): Likewise.
92         Re-use ComputeParameterTypes.  Set ec.ResolvingTypeTree.
93         * support.cs (InternalParameters..ctor): Remove variant that takes
94         a DeclSpace.
95         * typemanager.cs (system_intptr_expr): New.
96         (InitExpressionTypes): Initialize it.
97
98 2004-10-12  Chris Toshok  <toshok@ximian.com>
99
100         * cs-parser.jay: fix location for try_statement and catch_clause.
101
102 2004-10-11  Martin Baulig  <martin@ximian.com>
103
104         * report.cs: Don't make --fatal abort on warnings, we have
105         -warnaserror for that.
106
107 2004-10-07  Raja R Harinath  <rharinath@novell.com>
108
109         More DeclSpace.ResolveType avoidance.
110         * decl.cs (MemberCore.InUnsafe): New property.
111         * class.cs (MemberBase.DoDefine): Use ResolveAsTypeTerminal 
112         with newly created EmitContext.
113         (FieldMember.Define): Likewise.
114         * delegate.cs (Delegate.Define): Likewise.
115         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup with alias
116         only if normal name-lookup fails.
117         (TypeExpr.DoResolve): Enable error-checking.
118         * expression.cs (ArrayCreation.DoResolve): Use ResolveAsTypeTerminal.
119         (SizeOf.DoResolve): Likewise.
120         (ComposedCast.DoResolveAsTypeStep): Likewise.
121         (StackAlloc.DoResolve): Likewise.
122         * statement.cs (Block.Flags): Add new flag 'Unsafe'.
123         (Block.Unsafe): New property.
124         (Block.EmitMeta): Set ec.InUnsafe as appropriate.
125         (Unsafe): Set 'unsafe' flag of contained block.
126         (LocalInfo.Resolve): Use ResolveAsTypeTerminal.
127         (Fixed.Resolve): Likewise.
128         (Catch.Resolve): Likewise.
129         (Using.ResolveLocalVariableDecls): Likewise.
130         (Foreach.Resolve): Likewise.
131
132 2004-10-05  John Luke <john.luke@gmail.com>
133
134         * cs-parser.jay: add location to error CS0175
135
136 2004-10-04  Miguel de Icaza  <miguel@ximian.com>
137
138         * ecore.cs (Expression.Constantity): Add support for turning null
139         into a constant.
140
141         * const.cs (Const.Define): Allow constants to be reference types
142         as long as the value is Null.
143
144 2004-10-04  Juraj Skripsky  <js@hotfeet.ch>
145
146         * namespace.cs (NamespaceEntry.Using): No matter which warning
147         level is set, check if this namespace name has already been added.
148
149 2004-10-03 Ben Maurer  <bmaurer@ximian.com>
150
151         * expression.cs: reftype [!=]= null should always use br[true,false].
152         # 67410
153
154 2004-10-03  Marek Safar  <marek.safar@seznam.cz>
155
156         Fix #67108
157         * attribute.cs: Enum conversion moved to 
158         GetAttributeArgumentExpression to be applied to the all
159         expressions.
160
161 2004-10-01  Raja R Harinath  <rharinath@novell.com>
162
163         Fix #65833, test-300.cs, cs0122-5.cs, cs0122-6.cs.
164         * class.c (TypeContainer.DefineType): Flag error if
165         base types aren't accessible due to access permissions.
166         * decl.cs (DeclSpace.ResolveType): Move logic to
167         Expression.ResolveAsTypeTerminal.
168         (DeclSpace.ResolveTypeExpr): Thin layer over
169         Expression.ResolveAsTypeTerminal.
170         (DeclSpace.CheckAccessLevel, DeclSpace.FamilyAccess):
171         Refactor code into NestedAccess.  Use it.
172         (DeclSpace.NestedAccess): New.
173         * ecore.cs (Expression.ResolveAsTypeTerminal): Add new
174         argument to silence errors.  Check access permissions.
175         (TypeExpr.DoResolve, TypeExpr.ResolveType): Update.
176         * expression.cs (ProbeExpr.DoResolve): Use ResolveAsTypeTerminal.
177         (Cast.DoResolve): Likewise.
178         (New.DoResolve): Likewise.
179         (InvocationOrCast.DoResolve,ResolveStatement): Likewise.
180         (TypeOf.DoResolve): Likewise.
181
182         * expression.cs (Invocation.BetterConversion): Return the Type of
183         the better conversion.  Implement section 14.4.2.3 more faithfully.
184         (Invocation.BetterFunction): Make boolean.  Make correspondence to
185         section 14.4.2.2 explicit.
186         (Invocation.OverloadResolve): Update.
187         (Invocation): Remove is_base field.
188         (Invocation.DoResolve): Don't use is_base.  Use mg.IsBase.
189         (Invocation.Emit): Likewise.
190
191 2004-09-27  Raja R Harinath  <rharinath@novell.com>
192
193         * README: Update to changes.
194
195 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
196
197         * cs-parser.jay: Reverted 642 warning fix.
198
199 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
200
201         Fix bug #66615
202         * decl.cs (FindMemberWithSameName): Indexer can have more than
203         1 argument.
204
205 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
206
207         * expression.cs (LocalVariableReference.DoResolveLValue):
208         Do not report warning 219 for out values.
209         (EmptyExpression.Null): New member to avoid extra allocations.
210
211 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
212
213         * cs-parser.jay: Fix wrong warning 642 report.
214
215         * cs-tokenizer.cs (CheckNextToken): New helper;
216         Inspect next character if is same as expected.
217
218 2004-09-23  Martin Baulig  <martin@ximian.com>
219
220         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
221         (Convert.ImplicitReferenceConversionExists): Likewise.
222
223 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
224
225         * class.cs (Operator.Define): Add error 448 and 559 report.
226
227 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
228
229         * class.cs (MemberBase.IsTypePermitted): New protected
230         method for checking error CS0610.
231
232 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
233
234         * class.cs (TypeContainer.HasExplicitLayout): New property
235         Returns whether container has StructLayout attribute set Explicit.
236         (FieldMember): New abstract class for consts and fields.
237         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
238         (Field): Reuse FieldMember.
239
240         * const.cs (Const): Reuse FieldMember.
241
242         * rootcontext.cs: EmitConstants call moved to class.
243
244 2004-09-22  Martin Baulig  <martin@ximian.com>
245
246         Thanks to Peter Sestoft for this bug report.
247
248         * expression.cs (Conditional): If both the `trueExpr' and the
249         `falseExpr' is a NullLiteral, return a NullLiteral.
250
251 2004-09-22  Martin Baulig  <martin@ximian.com>
252
253         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
254         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
255         for the "get_Current" call.
256
257 2004-09-22  Martin Baulig  <martin@ximian.com>
258
259         Marek and me just fixed one of our oldest bugs: #28562 :-)
260
261         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
262
263         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
264         we're an EnumConstant, just return that.
265         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
266         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
267         to get the value which'll actually be written into the attribute.
268         However, we have to use GetValue() to access the attribute's value
269         in the compiler.        
270
271 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
272
273         * constant.cs (Constant.IsNegative): New abstract property
274         IsNegative.
275
276         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
277         (StackAlloc.DoResolve): Reused IsNegative.
278
279 2004-09-21  Martin Baulig  <martin@ximian.com>
280
281         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
282         if we're used in an iterator, we may be called from different
283         methods.
284
285         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
286         we actually have an exception block.
287
288 2004-09-20  John Luke <jluke@cfl.rr.com>
289
290         * class.cs, cs-parser.jay: Improve the error report for 1520:
291         report the actual line where the error happens, not where the
292         class was declared.
293
294         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
295         Pass location information that was available elsewhere.
296
297 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
298
299         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
300         runtime to delay sign assemblies.
301
302 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
303
304         * cs-parser.jay: Do not report the stack trace, this is barely
305         used nowadays.
306
307 2004-08-22  John Luke  <john.luke@gmail.com>
308  
309         * driver.cs : check that a resource id is not already used
310         before adding it, report CS1508 if it is, bug #63637
311
312 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
313
314         * ecore.cs: Removed dead code.
315
316 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
317
318         * class.cs: Do not report warning CS0067 on the interfaces.
319
320 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
321
322         * cs-parser.jay: Add error 504 report.
323
324 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
325
326         * rootcontext.cs: WarningLevel is 4 by default now.
327
328         * statement.cs (Fixed.Resolve): Do not null
329         VariableInfo.
330
331 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
332
333         Fixed bug #55780
334         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
335         deep search when property is not virtual.
336         (PropertyExpr.ResolveAccessors): Make one call for both
337         accessors.
338
339 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
340
341         Fixed bug #65766
342         * statement.cs: Error 152 report constains also location.
343
344 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
345
346         Fixed bug #65766
347         * const.cs: Explicitly set constant as static.
348
349 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
350
351         Fixed bug #64226
352         * cs-parser.jay: Add error 1017 report.
353
354 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
355
356         Fixed bug #59980, #64224
357         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
358
359         * typemanager.cs (IsSpecialMethod): Simplified
360
361 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
362
363         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
364         condition with better params.
365
366 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
367
368         Fixed bug #65238
369         * attribute.cs (Resolve): Property has to have both
370         accessors.
371
372 2004-09-14  Martin Baulig  <martin@ximian.com>
373
374         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
375
376 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
377
378         Fixed bug #61902
379         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
380         called and is obsolete then this member suppress message
381         when call is inside next [Obsolete] method or type.
382
383         * expression.cs: Use TestObsoleteMethodUsage member.
384
385 2004-09-14  Martin Baulig  <martin@ximian.com>
386
387         * cs-parser.jay: Sync a bit with the GMCS version.
388
389 2004-09-14  Martin Baulig  <martin@ximian.com>
390
391         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
392         (CSharpParser.yacc_verbose_flag): New public field.
393
394         * genericparser.cs: Removed.
395
396 2004-09-14  Raja R Harinath  <rharinath@novell.com>
397
398         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
399
400 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
401
402         * class.cs (MethodCore.CheckBase): Fix bug #65757.
403
404 2004-09-10  Martin Baulig  <martin@ximian.com>
405
406         Backported my MemberName changes from GMCS into MCS.
407
408         - we are now using a special `MemberName' class instead of using
409         strings; in GMCS, the `MemberName' also contains the type
410         arguments.
411
412         - changed the grammar rules a bit:
413           * the old `member_name' is now a `namespace_or_type_name':
414             The rule is that we use `namespace_or_type_name' everywhere
415             where we expect either a "member name" (GetEnumerator) or a
416             "member name" with an explicit interface name
417             (IEnumerable.GetEnumerator).
418             In GMCS, the explicit interface name may include type arguments
419             (IEnumerable<T>.GetEnumerator).
420           * we use `member_name' instead of just `IDENTIFIER' for
421             "member names":
422             The rule is that we use `member_name' wherever a member may
423             have type parameters in GMCS.       
424
425         * decl.cs (MemberName): New public class.
426         (MemberCore.MemberName): New public readonly field.
427         (MemberCore.ctor): Take a `MemberName' argument, not a string.
428         (DeclSpace): Likewise.
429
430         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
431         * enum.cs (Enum.ctor): Likewise.
432
433         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
434         MemberName.     
435         (AliasEntry.ctor): Take a MemberName, not an Expression.
436         (AliasEntry.UsingAlias): Likewise.
437
438         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
439         (IMethodData.MemberName): Changed type from string to MemberName.
440         (MemberBase.ExplicitInterfaceName): Likewise.
441         (AbstractPropertyEventMethod.SetupName): Make this private.
442         (AbstractPropertyEventMethod.ctor): Added `string prefix'
443         argument; compute the member name here.
444         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
445         on the `member.MemberName' and the `prefix'.
446
447         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
448         not `type_name'.
449         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
450         thus, we get a `MemberName' instead of a `string'.  These
451         declarations may have type parameters in GMCS.
452         (interface_method_declaration, delegate_declaration): Likewise.
453         (class_declaration, interface_declaration): Likewise.
454         (method_header): Use `namespace_or_type_name' instead of
455         `member_name'.  We may be an explicit interface implementation.
456         (property_declaration, event_declaration): Likewise.
457         (member_name): This is now just an `IDENTIFIER', not a
458         `namespace_or_type_name'.
459         (type_name, interface_type): Removed.
460         (namespace_or_type_name): Return a MemberName, not an Expression.
461         (primary_expression): Use `member_name' instead of `IDENTIFIER';
462         call GetTypeExpression() on the MemberName to get an expression.
463         (IndexerDeclaration.interface_type): Changed type from string to
464         MemberName.
465         (MakeName): Operate on MemberName's instead of string's.
466
467 2004-09-13  Raja R Harinath  <rharinath@novell.com>
468
469         Fix bug #55770.
470         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
471         (NamespaceEntry.Lookup): Add new argument to flag if we want the
472         lookup to avoid symbols introduced by 'using'.
473         * rootcontext.cs (NamespaceLookup): Update.
474
475 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
476
477         * class.cs (TypeContainer.DoDefineMembers): Do not call
478         DefineDefaultConstructor for static classes.
479
480 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
481
482         * attribute.cs (Attribute.Resolve): Add error 653 report.
483
484         * class.cs (Class.ApplyAttributeBuilder): Add error 641
485         report.
486         (Method.ApplyAttributeBuilder): Add error 685 report.
487         (Operator.Define): Add error 564 report.
488
489         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
490
491         * expression.cs (Invocation.DoResolve): Add error
492         245 and 250 report.
493
494         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
495         error 674 report.
496
497 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
498
499         * class.cs (ConstructorInitializer.Resolve):
500         Wrong error number (515->516).
501
502 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
503
504         * class.cs (Indexer.Define): Add error 631 report.
505
506 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
507
508         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
509
510 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
511
512         * expression.cs (Probe.DoResolve): Add error CS0241 report.
513
514 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
515
516         * cs-parser.jay: Added error CS0241 report.
517
518 2004-09-10  Raja R Harinath  <rharinath@novell.com>
519
520         * cs-parser.jay (fixed_statement): Introduce a scope for the
521         declaration in the 'fixed' statement.
522
523 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
524
525         * cs-parser.jay: Added CS0230 error report.
526
527 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
528
529         * cs-parser.jay: Added errors CS0231 and CS0257 report.
530
531 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
532
533         * expression.cs (Argument.Resolve): Added error CS0192 and
534         CS0199 report.
535
536 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
537
538         C# 2.0 #pragma warning feature
539
540         * cs-tokenizer.cs (PreProcessPragma): New method; 
541         Handles #pragma directive.
542
543         * report.cs (WarningRegions): New class; Support
544         class for #pragma warning directive. It tests whether
545         warning is enabled for a given line.
546
547 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
548
549         * const.cs: Add more descriptive error report, tahnks to
550         Sebastien. 
551
552 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
553
554         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
555
556 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
557
558         * expression.cs: Apply patch from Ben: Remove dead code from
559         ArrayCreation, and remove the TurnintoConstant call in const.cs,
560         as that code just threw an exception anwyays.
561
562         * const.cs: Remove the call to the turnintoconstant, for details
563         see bug: #63144
564         
565         * literal.cs: The type of the null-literal is the null type;  So
566         we use a placeholder type (literal.cs:System.Null, defined here)
567         for it.
568
569         * expression.cs (Conditional.DoResolve): Remove some old code that
570         is no longer needed, conversions have been fixed.
571
572         (ArrayCreationExpression.DoResolve): Return false if we fail to
573         resolve the inner expression.
574
575 2004-09-07  Raja R Harinath  <rharinath@novell.com>
576
577         Fix test-290.cs.
578         * cs-parser.jay (delegate_declaration): Record a delegate
579         declaration as a type declaration.
580         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
581
582 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
583
584         * parameter.cs: Do not crash if the type can not be resolved. 
585
586         * expression.cs: Report errors with unsafe pointers, fixes #64896
587
588 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
589
590         * expression.cs: Pointer arith always needs to do a conv.i
591         if the operand is a long. fix 65320
592
593 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
594
595         Fixed cs0619-37.cs, cs0619-38.cs
596
597         * enum.cs (GetObsoleteAttribute): Removed.
598
599         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
600         on Enum member is double staged. The first is tested member
601         and then enum.
602
603 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
604
605         Fixed #56986, #63631, #65231
606
607         * class.cs: (TypeContainer.AddToMemberContainer): New method,
608         adds member to name container.
609         (TypeContainer.AddToTypeContainer): New method, adds type to
610         name container.
611         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
612         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
613         AddOperator): Simplified by reusing AddToMemberContainer.
614         (TypeContainer.UserDefinedStaticConstructor): Changed to property
615         instead of field.
616         (Method.CheckForDuplications): Fixed implementation to test all
617         possibilities.
618         (MemberBase): Detection whether member is explicit interface
619         implementation is now in constructor.
620         (MemberBase.UpdateMemberName): Handles IndexerName.
621         (Accessor): Changed to keep also location information.
622         (AbstractPropertyEventMethod): Is derived from MemberCore.
623         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
624         will be emited or not.
625         (PropertyBase.AreAccessorsDuplicateImplementation):
626         Tests whether accessors are not in collision with some method.
627         (Operator): Is derived from MethodCore to simplify common
628         operations.
629
630         * decl.cs (Flags.TestMethodDuplication): Test for duplication
631         must be performed.
632         (DeclSpace.AddToContainer): Adds the member to defined_names
633         table. It tests for duplications and enclosing name conflicts.
634
635         * enum.cs (EnumMember): Clean up to reuse the base structures
636
637 2004-09-03  Martin Baulig  <martin@ximian.com>
638
639         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
640         into TypeContainer, to make partial classes work again.
641
642 2004-09-03  Martin Baulig  <martin@ximian.com>
643
644         * rootcontext.cs (RootContext.V2): Removed.
645
646 2004-03-23  Martin Baulig  <martin@ximian.com>
647
648         * expression.cs (Invocation.OverloadResolve): Added `bool
649         may_fail' argument and use it instead of the Location.IsNull() hack.
650
651 2004-09-03  Martin Baulig  <martin@ximian.com>
652
653         Merged latest changes into gmcs.  Please keep this comment in
654         here, it makes it easier for me to see what changed in MCS since
655         the last time I merged.
656
657 2004-09-03  Raja R Harinath  <rharinath@novell.com>
658
659         Fix #61128.
660         * expression.cs (BetterConversion): Don't allow either conversion 
661         to be null.  Remove redundant implicit conversion test when 'q ==
662         null' -- when this function is invoked, we already know that the
663         implicit conversion exists.
664         (BetterFunction): Assume that 'best' is non-null.  Remove
665         redundant reimplementation of IsApplicable when 'best' is null.
666         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
667         number of arguments.
668         (IsAncestralType): Extract from OverloadResolve.
669         (OverloadResolve): Make robust to the MethodGroupExpr being
670         unsorted.  Implement all the logic of Section 14.5.5.1, and
671         support overloading of methods from multiple applicable types.
672         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
673
674         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
675         (RealError, Warning): Append type of report to related symbol.
676
677 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
678
679         * enum.cs: Fixed CLS-Compliance checks for enum members.
680         Error tests cs3008-8.cs, cs3014-8.cs
681
682 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
683
684         Fixed bug #62342, #63102
685         * class.cs: ImplementIndexer uses member.IsExplicitImpl
686         like ImplementMethod.
687
688 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
689
690         * attribute.cs (Attribute.GetAttributeArgumentExpression):
691         Fixed bug #65170.
692
693 2004-09-02  Martin Baulig  <martin@ximian.com>
694
695         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
696         TypeManager.GetArgumentTypes() rather than calling GetParameters()
697         on the MethodBase.
698
699 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
700
701         C# 2.0 Static classes implemented
702
703         * class.cs (TypeContainer): instance_constructors,
704         initialized_fields, initialized_static_fields,
705         default_constructor, base_inteface_types are protected to be
706         accessible from StaticClass.
707         (TypeContainer.DefineDefaultConstructor): New virtual method
708         for custom default constructor generating
709         (StaticClass): New class to handle "Static classes" feature.
710
711         * cs-parser.jay: Handle static keyword on class like instance
712         of StaticClass.
713
714         * driver.cs: Added "/langversion" command line switch with two
715         options (iso-1, default).
716
717 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
718
719         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
720
721 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
722
723         * delegate.cs: Style.
724
725 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
726
727         * delegate.cs: Add seperate instance expr field for miguel.
728
729 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
730
731         * PointerArithmetic (Resolve): make sure we are not doing
732         pointer arith on void*. Also, make sure we are resolved
733         by not setting eclass until resolve.
734
735         All callers: Make sure that PointerArithmetic gets resolved.
736
737 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
738
739         * ArrayCreation (LookupType): If the type does not resolve 
740         to an array, give an error.
741
742 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
743
744         * statement.cs (Try.Resolve): Fixed bug #64222
745
746 2004-08-27  Martin Baulig  <martin@ximian.com>
747
748         * class.cs
749         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
750         crash here.     
751
752 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
753
754         * ecore.cs (Constantify): Get underlying type via
755         System.Enum.GetUnderlyingType to avoid StackOverflow on the
756         Windows in special cases.
757
758 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
759
760         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
761         for obtaining also private methods.
762         (GetRemoveMethod): Used GetRemoveMethod (true)
763         for obtaining also private methods.
764
765 2004-08-24  Martin Baulig  <martin@ximian.com>
766
767         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
768         MethodAttributes.HideBySig for operators.
769
770 2004-08-23  Martin Baulig  <martin@ximian.com>
771
772         Back to the old error reporting system :-)
773
774         * report.cs (Message): Removed.
775         (Report.MessageData, ErrorData, WarningData): Removed.
776         (Report.Error, Warning): Back to the old system.
777
778 2004-08-23  Martin Baulig  <martin@ximian.com>
779
780         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
781
782         * class.cs (TypeContainer.ParentContainer): New public virtual
783         method; replaces the explicit interface implementation.
784         (ClassPart.ParentContainer): Override.
785
786 2004-08-23  Martin Baulig  <martin@ximian.com>
787
788         * statement.cs (Switch): Added support for constant switches; see
789         #59428 or test-285.cs.
790
791 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
792
793         Fixed bug #62740.
794         * statement.cs (GetEnumeratorFilter): Removed useless
795         logic because C# specs is strict. GetEnumerator must be
796         public.
797
798 2004-08-22  Martin Baulig  <martin@ximian.com>
799
800         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
801         a switch and may break, reset the barrier.  Fixes #59867.
802
803 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
804
805         CLS-Compliance speed up (~5% for corlib)
806
807         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
808         New method. Tests container for CLS-Compliant names
809
810         * class.cs (TypeContainer.VerifyClsName): New method.
811         Checks whether container name is CLS Compliant.
812         (Constructor): Implements IMethodData.
813
814         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
815         low-case table for CLS Compliance test.
816         (MemberCache.VerifyClsParameterConflict): New method.
817         Checks method parameters for CS3006 error.
818
819         * enum.cs (EnumMember): Is derived from MemberCore.
820         (Enum.VerifyClsName): Optimized for better performance.
821
822 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
823
824         * report.cs: Renamed Error_T to Error and changed all
825         references.
826
827 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
828
829         * class.cs (TypeContainer.IndexerArrayList): New inner class
830         container for indexers.
831         (TypeContainer.DefaultIndexerName): New constant for default
832         indexer name. Replaced all "Item" with this constant.
833         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
834
835         * typemanager.cs (TypeManager.default_member_ctor): Cache here
836         DefaultMemberAttribute constructor.
837
838 2004-08-05  Martin Baulig  <martin@ximian.com>
839
840         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
841         Fix bug #59429.
842
843 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
844
845         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
846         multi platforms problem.
847
848         * compiler.csproj: Included shared files.
849
850 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
851
852         Fix bug 60333, 55971 in the more general way
853         * attribute.cs (Attribute.GetAttributeArgumentExpression):
854         Added arg_type argument for constant conversion.
855         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
856
857 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
858
859         Fix bug #59760
860         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
861         OperatorArrayList, MethodCoreArrayList for typecontainer
862         containers. Changed class member types to these new types.
863         (MethodArrayList.DefineMembers): Added test for CS0659.
864
865 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
866
867         * cfold.cs: Synchronize the folding with the code in expression.cs
868         Binary.DoNumericPromotions for uint operands.
869
870         * attribute.cs: Revert patch from Raja, it introduced a regression
871         while building Blam-1.2.1 (hard to isolate a test case).
872
873 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
874
875         Fix for #55382
876         * class.cs:
877         (TypeContainer.Define): Renamed to DefineContainerMembers because of
878         name collision.
879         (MethodCore.parent_method): New member. The method we're overriding
880         if this is an override method.
881         (MethodCore.CheckBase): Moved from Method class and made common.
882         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
883         private.
884         (MethodCore.CheckForDuplications): New abstract method. For custom
885         member duplication search in a container
886         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
887         method and its return type.
888         (Event.conflict_symbol): New member. Symbol with same name in the
889         parent class.
890
891         * decl.cs:
892         (MemberCache.FindMemberWithSameName): New method. The method
893         is looking for conflict with inherited symbols.
894
895 2004-08-04  Martin Baulig  <martin@ximian.com>
896
897         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
898
899         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
900
901 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
902
903         * report.cs (Message): New enum for better error, warning reference in
904         the code.
905         (MessageData): New inner abstract class. It generally handles printing of
906         error and warning messages.
907         Removed unused Error, Warning, Message methods.
908
909 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
910
911         Fix for cs0592-8.cs test
912         * attribute.cs
913         (Attributable.ValidAttributeTargets): Made public.
914         (Attribute.ExplicitTarget): New member for explicit target value.
915         (Attribute.CheckTargets): Now we translate explicit attribute
916         target to Target here.
917
918 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
919
920         * ecore.cs (MethodGroupExpr): new IsBase property.
921
922         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
923
924         * delegate.cs (DelegateCreation): store a MethodGroupExpr
925         rather than an instance expr.
926
927         (DelegateCreation.Emit): Use the method group rather than
928         the instance expression. Also, if you have base.Foo as the
929         method for a delegate, make sure to emit ldftn, not ldftnvirt.
930
931         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
932
933         (NewDelegate.DoResolve): Only check for the existance of Invoke
934         if the method is going to be needed. Use MethodGroupExpr.
935
936         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
937
938         * expression.cs: For pointer arith., make sure to use
939         the size of the type, not the size of the pointer to
940         the type.
941
942 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
943
944         Fix for #60722
945         * class.cs (Class): Added error CS0502 test.
946
947 2004-08-03  John Luke  <jluke@cfl.rr.com>
948             Raja R Harinath  <rharinath@novell.com>
949
950         Fix for #60997.
951         * attribute.cs (Attribute.complained_before): New flag.
952         (Attribute.ResolveType, Attribute.Resolve),
953         (Attribute.DefinePInvokeMethod): Set it.
954         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
955         
956 2004-08-03  Martin Baulig  <martin@ximian.com>
957
958         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
959         use a user-defined operator; we still need to do numeric
960         promotions in case one argument is a builtin type and the other
961         one has an implicit conversion to that type.  Fixes #62322.
962
963 2004-08-02  Martin Baulig  <martin@ximian.com>
964
965         * statement.cs (LocalInfo.Flags): Added `IsThis'.
966         (LocalInfo.IsThis): New public property.
967         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
968
969 2004-08-01  Martin Baulig  <martin@ximian.com>
970
971         * class.cs (TypeContainer.GetClassBases): Don't set the default
972         here since we may get called from GetPartialBases().
973         (TypeContainer.DefineType): If GetClassBases() didn't return a
974         parent, use the default one.
975
976 2004-07-30  Duncan Mak  <duncan@ximian.com>
977
978         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
979
980 2004-07-30  Martin Baulig  <martin@ximian.com>
981
982         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
983
984         * class.cs (SourceMethod): New public class, derive from the
985         symbol writer's ISourceMethod.
986         (Method): Use the new symbol writer API.
987
988         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
989         as argument and use the new symbol writer.
990
991         * location.cs
992         (SourceFile): Implement the symbol writer's ISourceFile.
993         (Location.SymbolDocument): Removed.
994         (Location.SourceFile): New public property.
995
996         * symbolwriter.cs: Use the new symbol writer API.
997
998 2004-07-30  Raja R Harinath  <rharinath@novell.com>
999
1000         * Makefile (install-local): Remove.  Functionality moved to
1001         executable.make.
1002
1003 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
1004
1005         * Makefile: Install mcs.exe.config file together with mcs.exe.
1006         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
1007         correct runtime version.
1008         
1009 2004-07-25  Martin Baulig  <martin@ximian.com>
1010
1011         * class.cs
1012         (TypeContainer.RegisterOrder): Removed, this was unused.
1013         (TypeContainer, interface_order): Removed.
1014         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
1015         TypeContainer as argument since we can also be called with a
1016         `PartialContainer' for a partial class/struct/interface.
1017         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
1018         of checking whether we're an `Interface' - we could be a
1019         `PartialContainer'.
1020         (PartialContainer.Register): Override; call
1021         AddClass()/AddStruct()/AddInterface() on our parent.
1022
1023         * cs-parser.jay (interface_member_declaration): Add things to the
1024         `current_container', not the `current_class'.
1025
1026         * rootcontext.cs (RegisterOrder): The overloaded version which
1027         takes an `Interface' was unused, removed.
1028
1029         * typemanager.cs (TypeManager.LookupInterface): Return a
1030         `TypeContainer', not an `Interface'.
1031         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
1032         contain a `PartialContainer' for an interface, so check it's
1033         `Kind' to figure out what it is.
1034
1035 2004-07-25  Martin Baulig  <martin@ximian.com>
1036
1037         * class.cs (Class.DefaultTypeAttributes): New public constant.
1038         (Struct.DefaultTypeAttributes): Likewise.
1039         (Interface.DefaultTypeAttributes): Likewise.
1040         (PartialContainer.TypeAttr): Override this and add the
1041         DefaultTypeAttributes.
1042
1043 2004-07-25  Martin Baulig  <martin@ximian.com>
1044
1045         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
1046         we can just use the `Parent' field instead.
1047
1048 2004-07-25  Martin Baulig  <martin@ximian.com>
1049
1050         * class.cs (TypeContainer.Emit): Renamed to EmitType().
1051
1052 2004-07-25  Martin Baulig  <martin@ximian.com>
1053
1054         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
1055         our parts before defining any methods.
1056         (TypeContainer.VerifyImplements): Make this virtual.
1057         (ClassPart.VerifyImplements): Override and call VerifyImplements()
1058         on our PartialContainer.
1059
1060 2004-07-25  Martin Baulig  <martin@ximian.com>
1061
1062         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1063
1064         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1065         argument, we can just use the `Parent' field instead.
1066
1067         * class.cs
1068         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1069         (MemberBase.DoDefine): Likewise.
1070
1071 2004-07-24  Martin Baulig  <martin@ximian.com>
1072
1073         * decl.cs (MemberCore.Parent): New public field.
1074         (DeclSpace.Parent): Moved to MemberCore.
1075
1076         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1077         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1078         parent's .ctor.
1079         (FieldBase, Field, Operator): Likewise.
1080         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1081         (EventField, Event): Likewise.
1082
1083 2004-07-23  Martin Baulig  <martin@ximian.com>
1084
1085         * class.cs (PartialContainer): New public class.
1086         (ClassPart): New public class.
1087         (TypeContainer): Added support for partial classes.
1088         (TypeContainer.GetClassBases): Splitted some of the functionality
1089         out into GetNormalBases() and GetPartialBases().
1090
1091         * cs-tokenizer.cs (Token.PARTIAL): New token.
1092         (Tokenizer.consume_identifier): Added some hacks to recognize
1093         `partial', but only if it's immediately followed by `class',
1094         `struct' or `interface'.
1095
1096         * cs-parser.jay: Added support for partial clases.
1097
1098 2004-07-23  Martin Baulig  <martin@ximian.com>
1099
1100         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1101         a `DeclSpace' and also made it readonly.
1102         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1103         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1104         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1105
1106         * cs-parser.jay: Pass the `current_class', not the
1107         `current_container' (at the moment, this is still the same thing)
1108         to a new Method, Property, Event, Indexer or Constructor.
1109
1110 2004-07-23  Martin Baulig  <martin@ximian.com>
1111
1112         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1113         and removed the `current_interface' one.
1114         (struct_declaration, class_declaration, interface_declaration):
1115         Set `current_class' to the newly created class/struct/interface;
1116         set their `Bases' and call Register() before parsing their body.
1117
1118 2004-07-23  Martin Baulig  <martin@ximian.com>
1119
1120         * class.cs (Kind): New public enum.
1121         (TypeContainer): Made this class abstract.
1122         (TypeContainer.Kind): New public readonly field.
1123         (TypeContainer.CheckDef): New public method; moved here from
1124         cs-parser.jay.
1125         (TypeContainer.Register): New public abstract method.
1126         (TypeContainer.GetPendingImplementations): New public abstract
1127         method.
1128         (TypeContainer.GetClassBases): Removed the `is_class' and
1129         `is_iface' parameters.
1130         (TypeContainer.DefineNestedTypes): Formerly known as
1131         DoDefineType().
1132         (ClassOrStruct): Made this class abstract.
1133
1134         * tree.cs (RootTypes): New public type. 
1135
1136 2004-07-20  Martin Baulig  <martin@ximian.com>
1137
1138         * tree.cs (Tree.RecordNamespace): Removed.
1139         (Tree.Namespaces): Removed.
1140
1141         * rootcontext.cs (RootContext.IsNamespace): Removed.
1142
1143         * cs-parser.jay (namespace_declaration): Just create a new
1144         NamespaceEntry here.
1145
1146 2004-07-20  Martin Baulig  <martin@ximian.com>
1147
1148         * statement.cs (ExceptionStatement): New abstract class.  This is
1149         now used as a base class for everyone who's using `finally'.
1150         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
1151         our local variables before using them.
1152
1153         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
1154         virtual method.  This is used by Yield.Resolve() to "steal" an
1155         outer block's `finally' clauses.
1156         (FlowBranchingException): The .ctor now takes an ExceptionStatement
1157         argument.
1158
1159         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
1160         version which takes an ExceptionStatement.  This version must be
1161         used to create exception branchings.
1162
1163         * iterator.cs
1164         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
1165         (Iterator.EmitMoveNext): Added exception support; protect the
1166         block with a `fault' clause, properly handle 'finally' clauses.
1167         (Iterator.EmitDispose): Run all the `finally' clauses here.
1168
1169 2004-07-20  Martin Baulig  <martin@ximian.com>
1170
1171         * iterator.cs: This is the first of a set of changes in the
1172         iterator code.  Match the spec more closely: if we're an
1173         IEnumerable, then GetEnumerator() must be called.  The first time
1174         GetEnumerator() is called, it returns the current instance; all
1175         subsequent invocations (if any) must create a copy.
1176
1177 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
1178
1179         * expression.cs: Resolve the constant expression before returning
1180         it. 
1181
1182 2004-07-19  Martin Baulig  <martin@ximian.com>
1183
1184         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
1185         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
1186         the return type of the new EmitContext.
1187
1188 2004-07-18  Martin Baulig  <martin@ximian.com>
1189
1190         * class.cs (Property.Define): Fix iterators.
1191
1192         * iterators.cs (Iterator.Define): Moved the
1193         `container.AddInterator (this)' call here from the .ctor; only do
1194         it if we resolved successfully.
1195
1196 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
1197
1198         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
1199         `true' for preprocessing directives that we parse.  The return
1200         value indicates whether we should return to regular tokenizing or
1201         not, not whether it was parsed successfully.
1202
1203         In the past if we were in: #if false ... #line #endif, we would
1204         resume parsing after `#line'.  See bug 61604.
1205
1206         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
1207         building: IsEnumType should return true only for enums, not for
1208         enums or System.Enum itself.  This fixes #61593.
1209
1210         Likely what happened is that corlib was wrong: mcs depended on
1211         this bug in some places.  The bug got fixed, we had to add the
1212         hack, which caused bug 61593.
1213
1214         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
1215         that was a workaround for the older conditions.
1216
1217 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
1218
1219         * assign.cs: IAssignMethod has a new interface, as documented
1220         inline. All assignment code now uses this new api.
1221
1222         * ecore.cs, expression.cs: All classes which implement
1223         IAssignMethod now use the new interface.
1224
1225         * expression.cs (Invocation): add a hack to EmitCall so that
1226         IndexerAccess can be the target of a compound assignment without
1227         evaluating its arguments twice.
1228
1229         * statement.cs: Handle changes in Invocation api.
1230
1231 2004-07-16  Martin Baulig  <martin@ximian.com>
1232
1233         * iterators.cs: Rewrote this.  We're now using one single Proxy
1234         class for both the IEnumerable and the IEnumerator interface and
1235         `Iterator' derives from Class so we can use the high-level API.
1236
1237         * class.cs (TypeContainer.AddIterator): New method.
1238         (TypeContainer.DoDefineType): New protected virtual method, which
1239         is called from DefineType().
1240         (TypeContainer.DoDefineMembers): Call DefineType() and
1241         DefineMembers() on all our iterators.
1242         (TypeContainer.Emit): Call Emit() on all our iterators.
1243         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1244
1245         * codegen.cs (EmitContext.CurrentIterator): New public field.
1246
1247 2004-07-15  Martin Baulig  <martin@ximian.com>
1248
1249         * typemanager.cs
1250         (TypeManager.not_supported_exception_type): New type.   
1251
1252 2004-07-14  Martin Baulig  <martin@ximian.com>
1253
1254         * iterators.cs: Use real error numbers.
1255
1256 2004-07-14  Martin Baulig  <martin@ximian.com>
1257
1258         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1259         requires this to be a System.Collection.IEnumerable and not a
1260         class implementing that interface.
1261         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1262
1263 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1264
1265         * class.cs: Fixed previous fix, it broke some error tests.
1266
1267 2004-07-12  Martin Baulig  <martin@ximian.com>
1268
1269         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1270         Fixes #61293.
1271
1272 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1273
1274         * assign.cs (LocalTemporary): Add new argument: is_address,If
1275         `is_address' is true, then the value that we store is the address
1276         to the real value, and not the value itself.
1277         
1278         * ecore.cs (PropertyExpr): use the new local temporary
1279         stuff to allow us to handle X.Y += z (where X is a struct)
1280
1281 2004-07-08  Martin Baulig  <martin@ximian.com>
1282
1283         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1284         not always return, just like we're doing in Using.Resolve().
1285
1286 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1287
1288         * cs-parser.jay (fixed_statement): flag this as Pinned.
1289
1290 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1291
1292         * typemanager.cs (TypeManager): Removed MakePinned method, this
1293         mechanism is replaced with the .NET 2.x compatible mechanism of
1294         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1295
1296         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1297         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1298         `IsFixed' property which has a different meaning.
1299
1300 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1301
1302         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1303         visible from inside a nested class, not just the names of the
1304         immediately enclosing class.
1305         Fix for bug #60730.
1306
1307 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1308
1309         * expression.cs (BetterConversion): Remove buggy special-case
1310         handling of "implicit constant expression conversions".  At this
1311         point, we already know that the conversion is possible -- we're
1312         only checking to see which is better.
1313
1314 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1315
1316         * cs-parser.jay: Added error CS0210 test.
1317
1318 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1319
1320         * cs-parser.jay: Added error CS0134 test.
1321
1322 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1323
1324         Fix bug #52507
1325         * cs-parser.jay: Added error CS0145 test.
1326
1327 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1328
1329         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1330
1331 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1332         
1333         * expression.cs (StackAlloc.Resolve): The argument may not
1334         be a constant; deal with this case.
1335         
1336 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1337
1338         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1339         GetIndexerAttributeValue.
1340         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1341
1342         * class.cs (Indexer.Define): Added error tests for CS0415,
1343         CS0609.
1344
1345 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1346
1347         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1348         property code.
1349
1350 2004-06-23  Martin Baulig  <martin@ximian.com>
1351
1352         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1353         neither return nor throw, reset the barrier as well.  Fixes #60457.
1354
1355 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1356
1357         * class.cs : EventAttributes is now set to None by default.
1358           This fixes bug #60459.
1359
1360 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1361
1362         Fix bug #60219
1363         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1364         Don't throw exception but return null (it's sufficient now).
1365
1366 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1367
1368         * typemanager.cs (GetArgumentTypes): Faster implementation.
1369
1370 2004-06-18  Martin Baulig  <martin@ximian.com>
1371
1372         * attribute.cs (Attribute.Resolve): Check whether we're an
1373         EmptyCast which a Constant child.  Fixes #60333.
1374
1375 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1376
1377         * statement.cs (EmitCollectionForeach): Account for the fact that
1378         not all valuetypes are in areas which we can take the address of.
1379         For these variables, we store to a temporary variable. Also, make
1380         sure that we dont emit a `callvirt' on a valuetype method.
1381
1382 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1383
1384         * expression.cs (StackAlloc.DoReSolve): Added test for
1385         negative parameter (CS0247).
1386
1387 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1388
1389         Fix bug #59792
1390         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1391
1392 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1393
1394         Fix bug #59781
1395         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1396         ulong.
1397
1398 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1399
1400         Fix bug #58254 & cs1555.cs, cs1556.cs
1401         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1402
1403 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1404
1405         * cs-parser.jay: Added error CS1669 test for indexers.
1406
1407 2004-06-11  Martin Baulig  <martin@ximian.com>
1408
1409         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1410         call this twice: for params and varargs methods.
1411
1412 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1413
1414         * class.cs:
1415         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1416
1417 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1418
1419         * attribute.cs (Attribute.GetValidTargets): Made public.
1420
1421         * class.cs: 
1422         (AbstractPropertyEventMethod): New class for better code sharing.
1423         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1424         CS1667 report.
1425         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1426
1427 2004-06-11  Raja R Harinath  <rharinath@novell.com>
1428
1429         Fix bug #59477.
1430         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
1431         that the call to Resolve is part of a MemberAccess.
1432         (Expression.Resolve): Use it for SimpleName resolution.
1433         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
1434         Add 'intermediate' boolean argument.
1435         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
1436         error message when the SimpleName can be resolved ambiguously
1437         between an expression and a type.
1438         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
1439         public.
1440         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
1441         call on the left-side.
1442
1443 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1444
1445         * class.cs:
1446         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
1447
1448 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1449
1450         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
1451
1452 2004-06-11  Martin Baulig  <martin@ximian.com>
1453
1454         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
1455         varargs methods if applicable.
1456
1457 2004-06-11  Martin Baulig  <martin@ximian.com>
1458
1459         * expression.cs (Invocation.EmitCall): Don't use
1460         `method.CallingConvention == CallingConventions.VarArgs' since the
1461         method could also have `CallingConventions.HasThis'.
1462
1463 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1464
1465         * class.cs (Event.GetSignatureForError): Implemented.
1466         Fixed crash in error test cs3010.cs
1467
1468 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
1469
1470         * cs-tokenizer.cs: Change the way we track __arglist to be
1471         consistent with the other keywords.
1472
1473 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
1474
1475         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
1476         tomorrow.
1477
1478 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
1479
1480         * codegen.cs: Check that all referenced assemblies have a strongname
1481         before strongnaming the compiled assembly. If not report error CS1577.
1482         Fix bug #56563. Patch by Jackson Harper.
1483         * typemanager.cs: Added a method to return all referenced assemblies.
1484         Fix bug #56563. Patch by Jackson Harper.
1485
1486 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1487
1488         * class.cs:
1489         (Method.ApplyAttributeBuilder): Moved and added conditional
1490         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
1491
1492         * delegate.cs:
1493         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
1494
1495 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1496
1497         Fixed #59640
1498         * class.cs: (EventField.attribute_targets): Changed default target.
1499
1500 2004-06-08  Martin Baulig  <martin@ximian.com>
1501
1502         * expression.cs (Invocation.EmitCall): Enable varargs methods.
1503
1504 2004-06-08  Martin Baulig  <martin@ximian.com>
1505
1506         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
1507
1508 2004-06-07  Martin Baulig  <martin@ximian.com>
1509
1510         Added support for varargs methods.
1511
1512         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
1513         keyword.
1514
1515         * cs-parser.jay: Added support for `__arglist'.
1516
1517         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
1518
1519         * expression.cs (Argument.AType): Added `ArgList'.
1520         (Invocation): Added support for varargs methods.
1521         (ArglistAccess): New public class.
1522         (Arglist): New public class.
1523
1524         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
1525
1526         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
1527         a method's top-level block if the method has varargs.
1528
1529         * support.cs (ReflectionParameters, InternalParameters): Added
1530         support for varargs methods.    
1531
1532 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
1533
1534         * class.cs: Provide location in indexer error report.
1535
1536         * driver.cs: Use standard names.
1537
1538         * namespace.cs: Catch the use of using after a namespace has been
1539         declared also on using aliases.
1540
1541 2004-06-03  Raja R Harinath  <rharinath@novell.com>
1542
1543         Bug #50820.
1544         * typemanager.cs (closure_private_ok, closure_invocation_type)
1545         (closure_qualifier_type, closure_invocation_assembly)
1546         (FilterWithClosure): Move to ...
1547         (Closure): New internal nested class.
1548         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
1549         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
1550         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
1551         (MemberLookup, MemberLookupFailed): Use it.
1552         * expression.cs (New.DoResolve): Treat the lookup for the
1553         constructor as being qualified by the 'new'ed type.
1554         (Indexers.GetIndexersForTypeOrInterface): Update.
1555
1556 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
1557
1558         * attribute.cs
1559         (GetConditionalAttributeValue): New method. Returns
1560         condition of ConditionalAttribute.
1561         (SearchMulti): New method.  Returns all attributes of type 't'.
1562         Use it when attribute is AllowMultiple = true.
1563         (IsConditionalMethodExcluded): New method.
1564
1565         * class.cs
1566         (Method.IsExcluded): Implemented. Returns true if method has conditional
1567         attribute and the conditions is not defined (method is excluded).
1568         (IMethodData): Extended interface for ConditionalAttribute support.
1569         (PropertyMethod.IsExcluded): Implemented.
1570
1571         * decl.cs
1572         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
1573
1574         * expression.cs
1575         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
1576         on the method.
1577
1578 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
1579
1580         * expression.cs (ArrayCreationExpression): Make this just an
1581         `expression'. It can't be a statement, so the code here was
1582         dead.
1583
1584 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1585
1586         Fixed #59072
1587         * typemanager.cs (GetFullNameSignature): New method for
1588         MethodBase types.
1589
1590 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1591
1592         Fixed #56452
1593         * class.cs (MemberBase.GetSignatureForError): New virtual method.
1594         Use this method when MethodBuilder is null.
1595         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
1596         Added test for error CS0626 (MONO reports error for this situation).
1597         (IMethodData.GetSignatureForError): Extended interface.
1598
1599 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1600
1601         * attribute.cs
1602         (AttributeTester.GetObsoleteAttribute): Returns instance of
1603         ObsoleteAttribute when type is obsolete.
1604
1605         * class.cs
1606         (TypeContainer.VerifyObsoleteAttribute): Override.
1607         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1608         (MethodCode.VerifyObsoleteAttribute): Override.
1609         (MemberBase.VerifyObsoleteAttribute): Override.
1610
1611         * decl.cs
1612         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1613         and report proper error.
1614
1615         *delegate.cs
1616         Delegate.VerifyObsoleteAttribute): Override.
1617
1618         * ecore.cs
1619         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1620         and report proper error.
1621         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1622
1623         * enum.cs
1624         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1625         and enum member.
1626
1627         * expression.cs
1628         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1629         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1630         Added test for ObsoleteAttribute.
1631
1632         * statement.cs
1633         (Catch): Derived from Statement.
1634
1635 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1636  
1637         Fixed bug #59071 & cs0160.cs
1638  
1639         * statement.cs (Try.Resolve): Check here whether order of catch
1640         clauses matches their dependencies.
1641
1642 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
1643
1644         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
1645         caused a regression: #59343.  Referencing nested classes from an
1646         assembly stopped working.
1647
1648 2004-05-31  Martin Baulig  <martin@ximian.com>
1649
1650         MCS is now frozen for beta 2.
1651
1652 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1653
1654         * convert.cs: add a trivial cache for overload operator resolution.
1655
1656 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1657
1658         * decl.cs: If possible, use lookuptypedirect here. We can only do
1659         this if there is no `.' after the namespace. Avoids using
1660         LookupType, which does lots of slow processing.
1661         (FindNestedType) New method, does what it says :-).
1662         * namespace.cs: use LookupTypeDirect.
1663         * rootcontext.cs: use membercache, if possible.
1664         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1665
1666 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1667
1668         * expression.cs:
1669         According to the spec, 
1670
1671         In a member access of the form E.I, if E is a single identifier,
1672         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1673         field, property, localvariable, or parameter with the same type as
1674         the meaning of E as a type-name (§3.8), then both possible
1675         meanings of E are permitted.
1676
1677         We did not check that E as a simple-name had the same type as E as
1678         a type name.
1679
1680         This trivial check gives us 5-7% on bootstrap time.
1681
1682 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1683
1684         * expression.cs (Invocation.OverloadResolve): Avoid the
1685         use of hashtables and boxing here by allocating on demand.
1686
1687 2004-05-30  Martin Baulig  <martin@ximian.com>
1688
1689         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1690         we're doing a silent lookup.  Don't try to lookup nested types in
1691         TypeManager.object_type (thanks to Ben Maurer).
1692
1693 2004-05-30  Martin Baulig  <martin@ximian.com>
1694
1695         Committing a patch from Ben Maurer.
1696
1697         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1698
1699 2004-05-29  Martin Baulig  <martin@ximian.com>
1700
1701         * class.cs (IMethodData.ShouldIgnore): New method.
1702
1703         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1704         `Location' argument, we don't need it anywhere.  Use
1705         `IMethodData.ShouldIgnore ()' instead of
1706         `MethodData.GetMethodFlags ()'.
1707         (TypeManager.AddMethod): Removed.
1708         (TypeManager.AddMethod2): Renamed to AddMethod.
1709
1710 2004-05-29  Martin Baulig  <martin@ximian.com>
1711
1712         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1713
1714         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1715         converting from a class type S to an interface type and we already
1716         have an object on the stack, don't box it again.  Fixes #52578.
1717
1718 2004-05-29  Martin Baulig  <martin@ximian.com>
1719
1720         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1721         Added support for `params' parameters.  Fixes #59267.
1722
1723 2004-05-29  Martin Baulig  <martin@ximian.com>
1724
1725         * literal.cs (NullPointer): Provide a private .ctor which sets
1726         `type' to TypeManager.object_type.  Fixes #59048.
1727
1728 2004-05-29  Martin Baulig  <martin@ximian.com>
1729
1730         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1731         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1732
1733         * ecore.cs (EventExpr.instance_expr): Make the field private.
1734
1735 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1736
1737         Fixed bug #50080 & cs0214-2.cs
1738         * expression.cs (Cast.DoResolve): Check unsafe context here.
1739         
1740         * statement.cs (Resolve.DoResolve): Likewise.
1741
1742 2004-05-26  Martin Baulig  <martin@ximian.com>
1743
1744         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1745
1746         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1747         (RootContext.LookupType): Pass down the `silent' flag.
1748
1749 2004-05-25  Martin Baulig  <martin@ximian.com>
1750
1751         * expression.cs
1752         (MethodGroupExpr.IdenticalTypeName): New public property.
1753         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1754         expression actually refers to a type.
1755
1756 2004-05-25  Martin Baulig  <martin@ximian.com>
1757
1758         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1759         for #56176 and made it actually work.
1760
1761 2004-05-25  Martin Baulig  <martin@ximian.com>
1762
1763         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1764         (FieldExpr, PropertyExpr): Override and implement
1765         CacheTemporaries.  Fixes #52279.
1766
1767 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1768
1769         * location.cs: In the new compiler listing a file twice is a
1770         warning, not an error.
1771
1772 2004-05-24  Martin Baulig  <martin@ximian.com>
1773
1774         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1775         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1776
1777 2004-05-24  Martin Baulig  <martin@ximian.com>
1778
1779         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1780         walking the `using' list.  Fixes #53921.
1781
1782 2004-05-24  Martin Baulig  <martin@ximian.com>
1783
1784         * const.cs (Const.LookupConstantValue): Added support for
1785         EmptyCast's; fixes #55251.
1786
1787 2004-05-24  Martin Baulig  <martin@ximian.com>
1788
1789         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1790         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1791         which does the CS0135 check.  The reason is that we first need to
1792         check whether the variable actually exists.
1793
1794 2004-05-24  Martin Baulig  <martin@ximian.com>
1795
1796         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1797         than RootContext.LookupType() to find the explicit interface
1798         type.  Fixes #58584.
1799
1800 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1801
1802         * Makefile: Simplify.  Use executable.make.
1803         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1804
1805 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1806
1807         * decl.cs:
1808         * enum.cs:
1809         Use the invariant culture when doing String.Compare for CLS case
1810         sensitivity.
1811         
1812 2004-05-23  Martin Baulig  <martin@ximian.com>
1813
1814         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1815         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1816
1817         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1818         
1819 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1820
1821         * class.cs (MemberBase.Define): Reuse MemberType member for 
1822         resolved type. Other methods can use it too.
1823
1824 2004-05-23  Martin Baulig  <martin@ximian.com>
1825
1826         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1827         the variable also exists in the current block (otherwise, we need
1828         to report a CS0103).  Fixes #58670.
1829
1830 2004-05-23  Martin Baulig  <martin@ximian.com>
1831
1832         * flowanalysis.cs (Reachability.Reachable): Compute this
1833         on-the-fly rather than storing it as a field.
1834
1835 2004-05-23  Martin Baulig  <martin@ximian.com>
1836
1837         * flowanalysis.cs (Reachability.And): Manually compute the
1838         resulting `barrier' from the reachability.      
1839        
1840 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1841
1842         Fix bug #57835
1843         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1844         instance of ObsoleteAttribute when symbol is obsolete.
1845
1846         * class.cs
1847         (IMethodData): Extended interface for ObsoleteAttribute support.
1848
1849 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1850
1851         * attribute.cs: Fix bug #55970
1852
1853 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1854
1855         Fix bug #52705
1856         * attribute.cs
1857         (GetObsoleteAttribute): New method. Creates the instance of
1858         ObsoleteAttribute.
1859         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1860         ObsoleteAttribute when member is obsolete.
1861         (AttributeTester.Report_ObsoleteMessage): Common method for
1862         Obsolete error/warning reporting.
1863
1864         * class.cs
1865         (TypeContainer.base_classs_type): New member for storing parent type.
1866
1867         * decl.cs
1868         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1869         for this MemberCore.
1870
1871 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1872
1873         * attribute.cs, const.cs: Fix bug #58590
1874
1875 2004-05-21  Martin Baulig  <martin@ximian.com>
1876
1877         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1878         out parameters if the end of the method is unreachable.  Fixes
1879         #58098. 
1880
1881 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1882
1883         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1884         Hari was right, why extra method.
1885
1886 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1887
1888         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1889
1890 2004-05-20  Martin Baulig  <martin@ximian.com>
1891
1892         Merged this back from gmcs to keep the differences to a minumum.
1893
1894         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
1895         instead of a Declspace.
1896         (Attribute.ResolveType): Likewise.
1897         (Attributes.Search): Likewise.
1898         (Attributes.Contains): Likewise.
1899         (Attributes.GetClsCompliantAttribute): Likewise.
1900
1901         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
1902         argument.
1903         (MethodData.ApplyAttributes): Take an EmitContext instead of a
1904         DeclSpace.
1905
1906 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1907
1908         Fix bug #58688 (MCS does not report error when the same attribute
1909         is assigned twice)
1910
1911         * attribute.cs (Attribute.Emit): Distinction between null and default.
1912
1913 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1914
1915         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1916         of a top-level attribute without an attribute target.
1917         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1918         Make non-static.
1919         (Attribute.Conditional_GetConditionName), 
1920         (Attribute.Obsolete_GetObsoleteMessage): Update.
1921         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1922         part of ScanForIndexerName.
1923         (Attribute.CanIgnoreInvalidAttribute): New function.
1924         (Attribute.ScanForIndexerName): Move to ...
1925         (Attributes.ScanForIndexerName): ... here.
1926         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1927         (Attributes.Search): New internal variant that can choose not to
1928         complain if types aren't resolved.  The original signature now
1929         complains.
1930         (Attributes.GetClsCompliantAttribute): Use internal variant, with
1931         complaints suppressed.
1932         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1933         only if it not useful.
1934         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1935         top-level for attributes that are shared between the assembly
1936         and a top-level class.
1937         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1938         * class.cs: Update to reflect changes.
1939         (DefineIndexers): Fuse loops.
1940         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1941         a couple more variants of attribute names.
1942
1943 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1944
1945         Fix bug #52585 (Implemented explicit attribute declaration)
1946
1947         * attribute.cs:
1948         (Attributable.ValidAttributeTargets): New abstract method. It gets
1949         list of valid attribute targets for explicit target declaration.
1950         (Attribute.Target): It holds target itself.
1951         (AttributeSection): Removed.
1952         (Attribute.CheckTargets): New method. It checks whether attribute
1953         target is valid for the current element.
1954
1955         * class.cs:
1956         (EventProperty): New class. For events that are declared like
1957         property (with add and remove accessors).
1958         (EventField): New class. For events that are declared like field.
1959         class.cs
1960
1961         * cs-parser.jay: Implemented explicit attribute target declaration.
1962
1963         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1964         Override ValidAttributeTargets.
1965
1966         * parameter.cs:
1967         (ReturnParameter): Class for applying custom attributes on 
1968         the return type.
1969         (ParameterAtribute): New class. Class for applying custom
1970         attributes on the parameter type.
1971
1972 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1973
1974         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1975         definitions. 
1976
1977         (Method): Allow UNSAFE here.
1978
1979         * modifiers.cs: Support unsafe reporting.
1980
1981 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1982
1983         * decl.cs: Fix bug #58478.
1984
1985 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1986
1987         * statement.cs: When checking for unreachable code on an EmptyStatement,
1988         set the location. Fixes bug #58488.
1989
1990 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1991
1992         * driver.cs: Add -pkg handling.
1993
1994         From Gonzalo: UseShelLExecute=false
1995
1996 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1997
1998         * attribute.cs:
1999         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
2000         for attribute.
2001         (Attribute.IsClsCompliaceRequired): Moved to base for better
2002         accesibility.
2003         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
2004         when attribute is AttributeUsageAttribute.
2005         (Attribute.GetValidTargets): Simplified.
2006         (Attribute.GetAttributeUsage): New method returns AttributeUsage
2007         attribute for this type.
2008         (Attribute.ApplyAttributes): Method renamed to Emit and make
2009         non-static.
2010         (GlobalAttributeSection): New class for special handling of global
2011         attributes (assembly, module).
2012         (AttributeSection.Emit): New method.
2013
2014         * class.cs: Implemented Attributable abstract methods.
2015         (MethodCore.LabelParameters): Moved to Parameter class.
2016         (Accessor): Is back simple class.
2017         (PropertyMethod): Implemented Attributable abstract class.
2018         (DelegateMethod): Implemented Attributable abstract class.
2019         (Event): New constructor for disctintion between normal Event
2020         and Event with accessors.
2021
2022         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
2023
2024         * codegen.cs, const.cs, decl.cs, delegate.cs:
2025         (CommonAssemblyModulClass): Implemented Attributable abstract class
2026         and simplified.
2027
2028         * enum.cs: Implement IAttributeSupport interface.
2029         (EnumMember): New class for emum members. Implemented Attributable
2030         abstract class
2031
2032         * parameter.cs:
2033         (ParameterBase): Is abstract.
2034         (ReturnParameter): New class for easier [return:] attribute handling.
2035
2036         * typemanager.cs: Removed builder_to_attr.
2037
2038 2004-05-11  Raja R Harinath  <rharinath@novell.com>
2039
2040         Fix bug #57151.
2041         * attribute.cs (Attribute.GetPositionalValue): New function.
2042         * class.cs (TypeContainer.VerifyMembers): New function.
2043         (TypeContainer.Emit): Use it.
2044         (ClassOrStruct): New base class for Class and Struct.
2045         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
2046         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
2047         class.
2048         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
2049         then each non-static field should have a FieldOffset attribute.
2050         Otherwise, none of the fields should have a FieldOffset attribute.
2051         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
2052         and FieldOffset attributes.
2053         * typemanager.cs (TypeManager.struct_layout_attribute_type)
2054         (TypeManager.field_offset_attribute_type): New core types.
2055         (TypeManager.InitCoreTypes): Initialize them.
2056
2057 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
2058
2059         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
2060         Return correct type.
2061         From bug #58270.
2062
2063 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
2064
2065         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
2066         be implicitly converted to ulong.
2067         
2068         * expression.cs: The logic for allowing operator &, | and ^ worked
2069         was wrong, it worked before because we did not report an error in
2070         an else branch.  Fixes 57895.
2071
2072         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
2073         allow volatile fields to be reference types.
2074
2075 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
2076
2077         * driver.cs: Add support for /debug-
2078
2079 2004-05-07  Raja R Harinath  <rharinath@novell.com>
2080
2081         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
2082         Add a 'complain' parameter to silence errors.
2083         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
2084         silently overlooked type-resolutions.
2085         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
2086         to reflect changes.
2087         (Attributes.Search): New function.
2088         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
2089         (Attributes.GetAttributeFullName): Remove hack.
2090         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
2091         Update to reflect changes.
2092         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
2093         Use Attributes.Search instead of nested loops.
2094
2095 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
2096
2097         * decl.cs:
2098         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
2099         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
2100         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
2101
2102         * report.cs: (Report.Warning): Renamed to Warning_T because of
2103         parameter collision.
2104
2105 2004-05-05  Raja R Harinath  <rharinath@novell.com>
2106
2107         * expression.cs (MemberAccess.ResolveMemberAccess):
2108         Exit with non-zero status after Report.Error.
2109         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
2110         Likewise.
2111         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
2112
2113 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2114
2115         * support.cs: Don't hang when the file is empty.
2116
2117 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
2118
2119         * support.cs: In SeekableStreamReader, compute the preamble size of the
2120           underlying stream. Position changes should take into account that initial
2121           count of bytes.
2122
2123 2004-05-03  Todd Berman  <tberman@sevenl.net>
2124
2125         * driver.cs: remove unused GetSysVersion function.
2126
2127 2004-05-03  Todd Berman  <tberman@sevenl.net>
2128
2129         * driver.cs: Remove the hack from saturday, as well as the hack
2130         from jackson (LoadAssemblyFromGac), also adds the CWD to the
2131         link_paths to get that bit proper.
2132
2133 2004-05-01  Todd Berman  <tberman@sevenl.net>
2134
2135         * driver.cs: Try a LoadFrom before a Load, this checks the current
2136         path. This is currently a bug in mono that is be fixed, however, this
2137         provides a workaround for now. This will be removed when the bug
2138         is fixed.
2139
2140 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
2141
2142         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2143         incomplete key pairs (#57941).
2144
2145 2004-05-01  Todd Berman  <tberman@sevenl.net>
2146
2147         * driver.cs: Remove '.' from path_chars, now System.* loads properly
2148         from the GAC
2149
2150 2004-04-30  Jackson Harper  <jackson@ximian.com>
2151
2152         * codegen.cs: Open keys readonly.
2153         
2154 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
2155
2156         * typemanager.cs: don't report cyclic struct layout when a struct
2157         contains 2 or more fields of the same type. Failed for Pango.AttrShape
2158         which has 2 Pango.Rectangle fields.
2159
2160 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2161
2162         * expression.cs: Handle IntPtr comparisons with IL code
2163         rather than a method call.
2164
2165 2004-04-29  Martin Baulig  <martin@ximian.com>
2166
2167         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
2168         the list of PropertyInfo's in class hierarchy and find the
2169         accessor.  Fixes #56013.
2170
2171 2004-04-29  Martin Baulig  <martin@ximian.com>
2172
2173         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2174
2175 2004-04-29  Martin Baulig  <martin@ximian.com>
2176
2177         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2178
2179         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2180
2181 2004-04-29  Martin Baulig  <martin@ximian.com>
2182
2183         * class.cs (ConstructorInitializer.Resolve): Check whether the
2184         parent .ctor is accessible.  Fixes #52146.
2185
2186 2004-04-29  Martin Baulig  <martin@ximian.com>
2187
2188         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2189
2190         * statement.cs (Using.EmitLocalVariableDecls): Use
2191         TypeManager.idisposable_type, not typeof (IDisposable).
2192         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2193
2194 2004-04-29  Martin Baulig  <martin@ximian.com>
2195
2196         * class.cs (Event.Define): Don't emit the field and don't set
2197         RTSpecialName and SpecialName for events on interfaces.  Fixes
2198         #57703. 
2199
2200 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2201
2202         Refactor Attribute.ApplyAttributes.
2203         * attribute.cs (Attributable): New base class for objects that can
2204         have Attributes applied on them.
2205         (Attribute): Make AttributeUsage fields public.
2206         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2207         (Attribute.IsInternalCall): New property.
2208         (Attribute.UsageAttr): Convert to a public read-only property.
2209         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2210         (Attribute.ResolveType, Attribute.Resolve)
2211         (Attribute.ScanForIndexerName): Update to reflect changes.
2212         (Attribute.CheckAttributeTarget): Re-format.
2213         (Attribute.ApplyAttributes): Refactor, to various
2214         Attributable.ApplyAttributeBuilder methods.
2215         * decl.cs (MemberCore): Make Attributable.
2216         * class.cs (Accessor): Make Attributable.
2217         (MethodData.ApplyAttributes): Use proper attribute types, not
2218         attribute names.
2219         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2220         (TypeContainer.ApplyAttributeBuilder)
2221         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2222         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2223         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2224         (Operator.ApplyAttributeBuilder): New factored-out methods.
2225         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2226         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2227         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2228         * parameter.cs (ParameterBase): New Attributable base class
2229         that can also represent Return types.
2230         (Parameter): Update to the changes.
2231
2232 2004-04-29  Jackson Harper  <jackson@ximian.com>
2233
2234         * driver.cs: Prefer the corlib system version when looking for
2235         assemblies in the GAC. This is still a hack, but its a better hack
2236         now.
2237         
2238 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2239
2240         * decl.cs, enum.cs: Improved error 3005 reporting.
2241   
2242         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2243         (related_symbols): New private member for list of symbols
2244         related to reported error/warning.
2245         
2246         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2247
2248 2004-04-29  Martin Baulig  <martin@ximian.com>
2249
2250         * ecore.cs (Expression.Constantify): If we're an enum and
2251         TypeManager.TypeToCoreType() doesn't give us another type, use
2252         t.UnderlyingSystemType.  Fixes #56178.  
2253
2254 2004-04-29  Martin Baulig  <martin@ximian.com>
2255
2256         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2257         interfaces and for each interface, only add members directly
2258         declared in that interface.  Fixes #53255.
2259
2260 2004-04-28  Martin Baulig  <martin@ximian.com>
2261
2262         * expression.cs (ConditionalLogicalOperator): Use a temporary
2263         variable for `left' to avoid that we evaluate it more than once;
2264         bug #52588.
2265
2266 2004-04-28  Martin Baulig  <martin@ximian.com>
2267
2268         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2269         `void[]' (CS1547).
2270
2271 2004-04-28  Martin Baulig  <martin@ximian.com>
2272
2273         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2274         void (CS1547).
2275
2276         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2277         whether the type is not void (CS1547).
2278
2279 2004-04-28  Martin Baulig  <martin@ximian.com>
2280
2281         * expression.cs (Unary.DoResolveLValue): Override this and report
2282         CS0131 for anything but Operator.Indirection.
2283
2284 2004-04-28  Martin Baulig  <martin@ximian.com>
2285
2286         Committing a patch from Ben Maurer; see bug #50820.
2287
2288         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2289         check for classes.
2290
2291         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2292         classes.        
2293
2294 2004-04-28  Martin Baulig  <martin@ximian.com>
2295
2296         Committing a patch from Ben Maurer; see bug #50820.
2297
2298         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2299         check for classes.
2300
2301         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2302         classes.        
2303
2304 2004-04-28  Martin Baulig  <martin@ximian.com>
2305
2306         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2307         (Block.AddLabel): Call DoLookupLabel() to only search in the
2308         current block.
2309
2310 2004-04-28  Martin Baulig  <martin@ximian.com>
2311
2312         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2313         comparing StringConstants and NullLiterals in Equality and Inequality.
2314
2315 2004-04-28  Jackson Harper  <jackson@ximian.com>
2316
2317         * driver.cs: Attempt to load referenced assemblies from the
2318         GAC. This is the quick and dirty version of this method that
2319         doesnt take into account versions and just takes the first
2320         canidate found. Will be good enough for now as we will not have more
2321         then one version installed into the GAC until I update this method.
2322
2323 2004-04-28  Martin Baulig  <martin@ximian.com>
2324
2325         * typemanager.cs (TypeManager.CheckStructCycles): New public
2326         static method to check for cycles in the struct layout.
2327
2328         * rootcontext.cs (RootContext.PopulateTypes): Call
2329         TypeManager.CheckStructCycles() for each TypeContainer.
2330         [Note: We only need to visit each type once.]
2331
2332 2004-04-28  Martin Baulig  <martin@ximian.com>
2333
2334         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2335
2336         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2337         success and added `out object value'.  Use a `bool resolved' field
2338         to check whether we've already been called rather than
2339         `ConstantValue != null' since this breaks for NullLiterals.
2340
2341 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2342
2343         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2344         setting of this flag, since the 'set' method may be non-public.
2345
2346 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2347
2348         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2349         check on current_vector.Block.
2350
2351 2004-04-27  Martin Baulig  <martin@ximian.com>
2352
2353         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2354         a field initializer.  Fixes #56459.
2355
2356 2004-04-27  Martin Baulig  <martin@ximian.com>
2357
2358         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2359         we're not attempting to use an indexer.  Fixes #52154.
2360
2361 2004-04-27  Martin Baulig  <martin@ximian.com>
2362
2363         * statement.cs (Return): Don't create a return label if we don't
2364         need it; reverts my change from January 20th.  Thanks to Ben
2365         Maurer for this.
2366
2367 2004-04-27  Martin Baulig  <martin@ximian.com>
2368
2369         According to the spec, `goto' can only leave a nested scope, but
2370         never enter it.
2371
2372         * statement.cs (Block.LookupLabel): Only lookup in the current
2373         block, don't recurse into parent or child blocks.
2374         (Block.AddLabel): Check in parent and child blocks, report
2375         CS0140/CS0158 if we find a duplicate.
2376         (Block): Removed this indexer for label lookups.
2377         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2378         this already does the error reporting for us.
2379
2380         * flowanalysis.cs
2381         (FlowBranching.UsageVector.Block): New public variable; may be null.
2382         (FlowBranching.CreateSibling): Added `Block' argument.
2383         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2384         label for the target of a `goto' and check whether we're not
2385         leaving a `finally'.
2386
2387 2004-04-27  Martin Baulig  <martin@ximian.com>
2388
2389         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2390         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2391         just for returns).
2392
2393 2004-04-27  Martin Baulig  <martin@ximian.com>
2394
2395         * statement.cs (Block.AddLabel): Also check for implicit blocks
2396         and added a CS0158 check.
2397
2398 2004-04-27  Martin Baulig  <martin@ximian.com>
2399
2400         * flowanalysis.cs (FlowBranchingLoop): New class.
2401         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2402         UsageVector's instead of an ArrayList.
2403         (FlowBranching.Label): Likewise.
2404         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2405         (FlowBranching.AddBreakVector): New method.
2406
2407 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2408
2409         * attribute.cs: Small regression fix: only convert the type if we
2410         the type is different, fixes System.Drawing build.
2411
2412 2004-04-27  Martin Baulig  <martin@ximian.com>
2413
2414         * attribute.cs (Attribute.Resolve): If we have a constant value
2415         for a named field or property, implicity convert it to the correct
2416         type.
2417
2418 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2419
2420         * statement.cs (Block.Block): Implicit blocks share
2421         'child_variable_names' fields with parent blocks.
2422         (Block.AddChildVariableNames): Remove.
2423         (Block.AddVariable): Mark variable as "used by a child block" in
2424         every surrounding block.
2425         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2426         been used in a child block, complain about violation of "Invariant
2427         meaning in blocks" rule.
2428         * cs-parser.jay (declare_local_variables): Don't use
2429         AddChildVariableNames.
2430         (foreach_statement): Don't create an implicit block: 'foreach'
2431         introduces a scope.
2432
2433 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2434
2435         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2436         converting from 0L to ulong.  Fixes 57522.
2437
2438 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2439
2440         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2441         derived class hides via 'new' keyword field from base class (test-242.cs).
2442         TODO: Handle this in the more general way.
2443         
2444         * class.cs (CheckBase): Ditto.
2445
2446 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2447
2448         * decl.cs (caching_flags): New member for storing cached values
2449         as bit flags.
2450         (MemberCore.Flags): New enum where bit flags for caching_flags
2451         are defined.
2452         (MemberCore.cls_compliance): Moved to caching_flags.
2453         (DeclSpace.Created): Moved to caching_flags.
2454
2455         * class.cs: Use caching_flags instead of DeclSpace.Created
2456         
2457 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2458
2459         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2460         if we are only a derived class, not a nested class.
2461
2462         * typemanager.cs: Same as above, but do this at the MemberLookup
2463         level (used by field and methods, properties are handled in
2464         PropertyExpr).   Allow for the qualified access if we are a nested
2465         method. 
2466
2467 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2468
2469         * class.cs: Refactoring.
2470         (IMethodData): New inteface; Holds links to parent members
2471         to avoid member duplication (reduced memory allocation).
2472         (Method): Implemented IMethodData interface.
2473         (PropertyBase): New inner classes for get/set methods.
2474         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2475         (Event): New inner classes for add/remove methods.
2476         (Event.DelegateMethod): Implemented IMethodData interface.
2477
2478         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2479         EmitContext (related to class.cs refactoring).
2480
2481 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2482
2483         * delegate.cs (Delegate.VerifyApplicability): If the number of
2484         arguments are the same as the number of parameters, first try to
2485         verify applicability ignoring  any 'params' modifier on the last
2486         parameter.
2487         Fixes #56442.
2488
2489 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2490
2491         * class.cs (TypeContainer.AddIndexer): Use
2492         'ExplicitInterfaceName' to determine if interface name was
2493         explicitly specified.  'InterfaceType' is not initialized at this time.
2494         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2495         Indexers array is already in the required order.  Initialize
2496         'IndexerName' only if there are normal indexers.
2497         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2498         (TypeContainer.Emit): Emit DefaultMember attribute only if
2499         IndexerName is initialized.
2500         Fixes #56300.
2501
2502 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2503
2504         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2505         Fixes #57007
2506
2507 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2508
2509         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2510         attributes.
2511         Fix for #56456.
2512
2513         * attribute.cs (Attribute.Resolve): Check for duplicate named
2514         attributes.
2515         Fix for #56463.
2516
2517 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2518
2519         * iterators.cs (MarkYield): track whether we are in an exception,
2520         and generate code accordingly.  Use a temporary value to store the
2521         result for our state.
2522
2523         I had ignored a bit the interaction of try/catch with iterators
2524         since their behavior was not entirely obvious, but now it is
2525         possible to verify that our behavior is the same as MS .NET 2.0
2526
2527         Fixes 54814
2528
2529 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2530
2531         * iterators.cs: Avoid creating temporaries if there is no work to
2532         do. 
2533
2534         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2535         Enumerations, use TypeManager.EnumToUnderlying and call
2536         recursively. 
2537
2538         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2539         bug #57013
2540
2541         (This.Emit): Use EmitContext.EmitThis to emit our
2542         instance variable.
2543
2544         (This.EmitAssign): Ditto.
2545
2546         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2547         codepaths, we will move all the functionality into
2548         Mono.CSharp.This 
2549
2550         (FieldExpr.EmitAssign): Ditto.
2551
2552         This fixes several hidden bugs that I uncovered while doing a code
2553         review of this today.
2554
2555         * codegen.cs (EmitThis): reworked so the semantics are more clear
2556         and also support value types "this" instances.
2557
2558         * iterators.cs: Changed so that for iterators in value types, we
2559         do not pass the value type as a parameter.  
2560
2561         Initialization of the enumerator helpers is now done in the caller
2562         instead of passing the parameters to the constructors and having
2563         the constructor set the fields.
2564
2565         The fields have now `assembly' visibility instead of private.
2566
2567 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2568
2569         * expression.cs (Argument.Resolve): Check if fields passed as ref
2570         or out are contained in a MarshalByRefObject.
2571
2572         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2573         another compiler type.
2574
2575 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2576
2577         * class.cs (Indexer.Define): use the new name checking method.
2578         Also, return false on an error.
2579         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2580         (is_identifier_[start/part]_character): make static.
2581
2582 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2583
2584         * expression.cs (Binary.ResolveOperator): Do no append strings
2585         twice: since we can be invoked more than once (array evaluation)
2586         on the same concatenation, take care of this here.  Based on a fix
2587         from Ben (bug #56454)
2588
2589 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2590
2591         * codegen.cs: Fix another case where CS1548 must be reported (when 
2592         delay-sign isn't specified and no private is available #56564). Fix
2593         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2594         error when MCS is used on the MS runtime and we need to delay-sign 
2595         (which seems unsupported by AssemblyBuilder - see #56621).
2596
2597 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2598
2599         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2600         (TypeManager.ComputeNamespaces): Faster implementation for
2601         Microsoft runtime.
2602
2603         * compiler.csproj: Updated AssemblyName to mcs.
2604
2605 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2606
2607         * rootcontext.cs: Add new types to the boot resolution.
2608
2609         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2610         MulticastDelegate is not allowed.
2611
2612         * typemanager.cs: Add new types to lookup: System.TypedReference
2613         and ArgIterator.
2614
2615         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2616         check for TypedReference or ArgIterator, they are not allowed. 
2617
2618         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2619         makes us properly catch 1510 in some conditions (see bug 56016 for
2620         details). 
2621
2622 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2623
2624         * CryptoConvert.cs: update from corlib version
2625         with endian fixes.
2626
2627 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2628
2629         * class.cs (Indexer.Define): Check indexername declaration
2630
2631 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2632
2633         * attribute.cs (IsClsCompliant): Fixed problem with handling
2634         all three states (compliant, not-compliant, undetected).
2635
2636 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2637
2638         * attribute.cs (Attribute): Location is now public.
2639         (Resolve): Store resolved arguments (pos_values) in attribute class.
2640         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2641         (GetClsCompliantAttributeValue): New method that gets
2642         CLSCompliantAttribute value.
2643         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2644         if exists else null.
2645         (AttributeTester): New class for CLS-Compliant verification routines.
2646
2647         * class.cs (Emit): Add CLS-Compliant verification.
2648         (Method.GetSignatureForError): Implemented.
2649         (Constructor.GetSignatureForError): Implemented
2650         (Constructor.HasCompliantArgs): Returns if constructor has
2651         CLS-Compliant arguments.
2652         (Constructor.Emit): Override.
2653         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2654         is needed to test only parameters.
2655         (FieldBase.GetSignatureForError): Implemented.
2656         (TypeContainer): New member for storing base interfaces.
2657         (TypeContainer.FindMembers): Search in base interfaces too.
2658
2659         * codegen.cs (GetClsComplianceAttribute): New method that gets
2660         assembly or module CLSCompliantAttribute value.
2661         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2662         for assembly.
2663         (ModuleClass.Emit): Add error 3012 test.
2664
2665         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2666
2667         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2668         state for all decl types.
2669         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2670         if CLS-Compliant tests are required.
2671         (IsClsCompliaceRequired): New method. Analyze whether code
2672         must be CLS-Compliant.
2673         (IsExposedFromAssembly): New method. Returns true when MemberCore
2674         is exposed from assembly.
2675         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2676         value or gets cached value.
2677         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2678         is explicitly marked with CLSCompliantAttribute.
2679         (IsIdentifierClsCompliant): New abstract method. This method is
2680         used to testing error 3005.
2681         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2682         for identifier and parameters CLS-Compliant testing.
2683         (VerifyClsCompliance): New method. The main virtual method for
2684         CLS-Compliant verifications.
2685         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2686         null. I don't know why is null (too many public members !).
2687         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2688         and get value of first CLSCompliantAttribute that found.
2689
2690         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2691         (VerifyClsCompliance): Override and add extra tests.
2692
2693         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2694         clscheck- disable CLS-Compliant verification event if assembly is has
2695         CLSCompliantAttribute(true).
2696
2697         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2698         ApllyAttribute is now called in emit section as in the other cases.
2699         Possible future Emit integration.
2700         (IsIdentifierClsCompliant): New override.
2701         (VerifyClsCompliance): New override.
2702         (GetEnumeratorName): Returns full enum name.
2703
2704         * parameter.cs (GetSignatureForError): Implemented.
2705
2706         * report.cs (WarningData): New struct for Warning message information.
2707         (LocationOfPreviousError): New method.
2708         (Warning): New method. Reports warning based on the warning table.
2709         (Error_T): New method. Reports error based on the error table.
2710
2711         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2712         verifications are done here.
2713
2714         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2715
2716         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2717         CLSCompliantAttribute.
2718         (all_imported_types): New member holds all imported types from other
2719         assemblies.
2720         (LoadAllImportedTypes): New method fills static table with exported types
2721         from all referenced assemblies.
2722         (Modules): New property returns all assembly modules.
2723
2724 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2725
2726         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2727         throwing a parser error.
2728
2729         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2730         which removes the hardcoded get_/set_ prefixes for properties, as
2731         IL allows for the properties to be named something else.  
2732
2733         Bug #56013
2734
2735         * expression.cs: Do not override operand before we know if it is
2736         non-null.  Fix 56207
2737
2738 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2739
2740         * typemanager.cs: support for pinned variables.
2741
2742 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2743
2744         * decl.cs, typemanager.cs: Avoid using an arraylist
2745         as a buffer if there is only one result set.
2746
2747 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2748
2749         * expression.cs: Make sure you cant call a static method
2750         with an instance expression, bug #56174.
2751
2752 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
2753
2754         * class.cs (IsDuplicateImplementation): Improve error reporting to
2755         flag 663 (method only differs in parameter modifier).
2756
2757         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
2758         in preprocessor directives.
2759
2760         * location.cs (LookupFile): Allow for the empty path.
2761
2762         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
2763         better approach for some of that patch, but its failing with the
2764         CharSet enumeration.  For now try/catch will do.
2765
2766         * typemanager.cs: Do not crash if a struct does not have fields.
2767         Fixes 56150.
2768
2769 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2770
2771         * expression.cs: cs0213, cant fix a fixed expression.
2772         fixes 50231.
2773
2774 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2775
2776         * cs-parser.jay: detect invalid embeded statements gracefully.
2777         bug #51113.
2778
2779 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2780
2781         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
2782         As a regex:
2783         s/
2784         the invocation type may not be a subclass of the tye of the item/
2785         The type of the item must be a subclass of the invocation item.
2786         /g
2787
2788         Fixes bug #50820.
2789
2790 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
2791
2792         * attribute.cs: Added methods to get a string and a bool from an
2793         attribute. Required to information from AssemblyKeyFileAttribute,
2794         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
2795         * codegen.cs: Modified AssemblyName creation to include support for
2796         strongnames. Catch additional exceptions to report them as CS1548.
2797         * compiler.csproj: Updated include CryptoConvert.cs.
2798         * compiler.csproj.user: Removed file - user specific configuration.
2799         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
2800         Mono.Security assembly. The original class is maintained and tested in
2801         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
2802         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
2803         like CSC 8.0 (C# v2) supports.
2804         * Makefile: Added CryptoConvert.cs to mcs sources.
2805         * rootcontext.cs: Added new options for strongnames.
2806
2807 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
2808
2809         * driver.cs: For --expect-error, report error code `2'
2810         if the program compiled with no errors, error code `1' if
2811         it compiled with an error other than the one expected.
2812
2813 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
2814
2815         * compiler.csproj: Updated for Visual Studio .NET 2003.
2816         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
2817         * compiler.sln: Updated for Visual Studio .NET 2003.
2818
2819 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
2820
2821         * expression.cs: Fix bug #47234. We basically need to apply the
2822         rule that we prefer the conversion of null to a reference type
2823         when faced with a conversion to 'object' (csc behaviour).
2824
2825 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2826
2827         * statement.cs: Shorter form for foreach, eliminates
2828         a local variable. r=Martin.
2829
2830 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2831
2832         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
2833         checks if we can use brtrue/brfalse to test for 0.
2834         * expression.cs: use the above in the test for using brtrue/brfalse.
2835         cleanup code a bit.
2836
2837 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2838
2839         * expression.cs: Rewrite string concat stuff. Benefits:
2840
2841         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
2842         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
2843         rather than a concat chain.
2844
2845         * typemanager.cs: Add lookups for more concat overloads.
2846
2847 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2848
2849         * expression.cs: Emit shorter il code for array init.
2850
2851         newarr
2852         dup
2853         // set 1
2854
2855         // set 2
2856
2857         newarr
2858         stloc.x
2859
2860         ldloc.x
2861         // set 1
2862
2863         ldloc.x
2864         // set 2
2865
2866 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
2867
2868         * statement.cs: Before, two switch blocks would be merged if the
2869         total size of the blocks (end_item - begin_item + 1) was less than
2870         two times the combined sizes of the blocks.
2871
2872         Now, it will only merge if after the merge at least half of the
2873         slots are filled.
2874
2875         fixes 55885.
2876
2877 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
2878
2879         * class.cs : csc build fix for GetMethods(). See bug #52503.
2880
2881 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
2882
2883         * expression.cs: Make sure fp comparisons work with NaN.
2884         This fixes bug #54303. Mig approved this patch a long
2885         time ago, but we were not able to test b/c the runtime
2886         had a related bug.
2887
2888 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
2889
2890         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
2891
2892 2004-03-19  Martin Baulig  <martin@ximian.com>
2893
2894         * class.cs (MemberCore.IsDuplicateImplementation): Report the
2895         error here and not in our caller.
2896
2897 2004-03-19  Martin Baulig  <martin@ximian.com>
2898
2899         * interface.cs: Completely killed this file.
2900         (Interface): We're now a TypeContainer and live in class.cs.
2901
2902         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
2903         argument; we're now also called for interfaces.
2904         (TypeContainer.DefineMembers): Allow this method being called
2905         multiple times.
2906         (TypeContainer.GetMethods): New public method; formerly known as
2907         Interface.GetMethod().  This is used by PendingImplementation.
2908         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
2909         it's now private and non-static.
2910         (Interface): Moved this here; it's now implemented similar to
2911         Class and Struct.
2912         (Method, Property, Event, Indexer): Added `bool is_interface'
2913         argument to their .ctor's.
2914         (MemberBase.IsInterface): New public field.
2915
2916         * cs-parser.jay: Create normal Method, Property, Event, Indexer
2917         instances instead of InterfaceMethod, InterfaceProperty, etc.
2918         (opt_interface_base): Removed; we now use `opt_class_base' instead.
2919         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
2920
2921 2004-03-19  Martin Baulig  <martin@ximian.com>
2922
2923         * class.cs (MethodCore.IsDuplicateImplementation): New private
2924         method which does the CS0111 checking.
2925         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
2926         Use IsDuplicateImplementation().
2927
2928 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
2929
2930         * decl.cs (FindMemberToOverride): New method to find the correct
2931         method or property to override in the base class.
2932         * class.cs
2933             - Make Method/Property use the above method to find the
2934               version in the base class.
2935             - Remove the InheritableMemberSignatureCompare as it is now
2936               dead code.
2937
2938         This patch makes large code bases much faster to compile, as it is
2939         O(n) rather than O(n^2) to do this validation.
2940
2941         Also, it fixes bug 52458 which is that nested classes are not
2942         taken into account when finding the base class member.
2943
2944         Reviewed/Approved by Martin.
2945
2946 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
2947
2948         * interface.cs: In all interface classes removed redundant
2949         member initialization.
2950
2951 2004-03-16  Martin Baulig  <martin@ximian.com>
2952
2953         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
2954
2955 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
2956
2957         * decl.cs (DefineTypeAndParents): New helper method to define a
2958         type's containers before the type itself is defined;  This is a
2959         bug exposed by the recent changes to Windows.Forms when an
2960         implemented interface was defined inside a class that had not been
2961         built yet.   
2962
2963         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
2964
2965         (Check): Loop correctly to report errors modifiers
2966         (UNSAFE was not in the loop, since it was the same as TOP).
2967
2968         * interface.cs: Every interface member now takes a ModFlags,
2969         instead of a "is_new" bool, which we set on the base MemberCore. 
2970
2971         Every place where we called "UnsafeOk" in the interface, now we
2972         call the proper member (InterfaceMethod.UnsafeOK) instead to get
2973         the unsafe settings from the member declaration instead of the
2974         container interface. 
2975
2976         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
2977
2978         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
2979         `set_indexer_name' to the pending bits (one per type).
2980
2981         We fixed a bug today that was picking the wrong method to
2982         override, since for properties the existing InterfaceMethod code
2983         basically ignored the method name.  Now we make sure that the
2984         method name is one of the valid indexer names.
2985
2986 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
2987  
2988         * support.cs (SeekableStreamReader): Keep track of stream byte
2989         positions and don't mix them with character offsets to the buffer.
2990
2991         Patch from Gustavo Giráldez
2992
2993 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
2994
2995         * interface.cs (InterfaceSetGetBase): Removed double member
2996         initialization, base class does it as well.
2997
2998 2004-03-13  Martin Baulig  <martin@ximian.com>
2999
3000         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3001         when compiling corlib.
3002
3003 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3004
3005         * convert.cs (ExplicitConversion): We were reporting an error on
3006         certain conversions (object_type source to a value type, when the
3007         expression was `null') before we had a chance to pass it through
3008         the user defined conversions.
3009
3010         * driver.cs: Replace / and \ in resource specifications to dots.
3011         Fixes 50752
3012
3013         * class.cs: Add check for duplicate operators.  Fixes 52477
3014
3015 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3016
3017         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3018         that are in the middle of the statements, not only at the end.
3019         Fixes #54987
3020
3021         * class.cs (TypeContainer.AddField): No longer set the
3022         `HaveStaticConstructor' flag, now we call it
3023         `UserDefineStaticConstructor' to diferentiate the slightly
3024         semantic difference.
3025
3026         The situation is that we were not adding BeforeFieldInit (from
3027         Modifiers.TypeAttr) to classes that could have it.
3028         BeforeFieldInit should be set to classes that have no static
3029         constructor. 
3030
3031         See:
3032
3033         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3034
3035         And most importantly Zoltan's comment:
3036
3037         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3038
3039         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3040          before its static fields are used', i.e. initialization does not need
3041          to be triggered by the first access to the type. Setting this flag
3042          helps the JIT to compile better code, since it can run the static
3043          constructor at JIT time, and does not need to generate code to call it
3044          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3045          this flag for lots of classes like String. 
3046          
3047          csc sets this flag if the type does not have an explicit static 
3048          constructor. The reasoning seems to be that if there are only static
3049          initalizers for a type, and no static constructor, then the programmer
3050          does not care when this initialization happens, so beforefieldinit
3051          can be used.
3052          
3053          This bug prevents the AOT compiler from being usable, since it 
3054          generates so many calls to mono_runtime_class_init that the AOT code
3055          is much slower than the JITted code. The JITted code is faster, 
3056          because it does not generate these calls if the vtable is type is
3057          already initialized, which is true in the majority of cases. But the
3058          AOT compiler can't do this."
3059
3060 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3061
3062         * class.cs (MethodData.Emit): Refactor the code so symbolic
3063         information is generated for destructors;  For some reasons we
3064         were taking a code path that did not generate symbolic information
3065         before. 
3066
3067 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3068
3069         * class.cs: Create a Constructor.CheckBase method that
3070         takes care of all validation type code. The method
3071         contains some code that was moved from Define.
3072
3073         It also includes new code that checks for duplicate ctors.
3074         This fixes bug #55148.
3075
3076 2004-03-09  Joshua Tauberer <tauberer@for.net>
3077
3078         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3079         a { ... }-style array creation invokes EmitStaticInitializers
3080         which is not good for reference-type arrays.  String, decimal
3081         and now null constants (NullCast) are not counted toward
3082         static initializers.
3083
3084 2004-03-05  Martin Baulig  <martin@ximian.com>
3085
3086         * location.cs (SourceFile.HasLineDirective): New public field;
3087         specifies whether the file contains or is referenced by a "#line"
3088         directive.
3089         (Location.DefineSymbolDocuments): Ignore source files which
3090         either contain or are referenced by a "#line" directive.        
3091
3092 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3093
3094         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3095         direct access to our parent, so check the method inline there.
3096
3097 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3098
3099         * expression.cs (Invocation.EmitCall): Miguel's last commit
3100         caused a regression. If you had:
3101
3102             T t = null;
3103             t.Foo ();
3104
3105         In Foo the implict this would be null.
3106
3107 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3108
3109         * expression.cs (Invocation.EmitCall): If the method is not
3110         virtual, do not emit a CallVirt to it, use Call.
3111
3112         * typemanager.cs (GetFullNameSignature): Improve the method to
3113         cope with ".ctor" and replace it with the type name.
3114
3115         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3116         as an argument the ConstructorBuilder where it is being defined,
3117         to catch the recursive constructor invocations.
3118
3119 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3120
3121         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3122         routines to check if a type is an enumerable/enumerator allow
3123         classes that implement the IEnumerable or IEnumerator interfaces.
3124
3125         * class.cs (Property, Operator): Implement IIteratorContainer, and
3126         implement SetYields.
3127
3128         (Property.Define): Do the block swapping for get_methods in the
3129         context of iterators.   We need to check if Properties also
3130         include indexers or not.
3131
3132         (Operator): Assign the Block before invoking the
3133         OperatorMethod.Define, so we can trigger the Iterator code
3134         replacement. 
3135
3136         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3137         Property and Operator classes are not created when we parse the
3138         declarator but until we have the block completed, so we use a
3139         singleton SimpleIteratorContainer.Simple to flag whether the
3140         SetYields has been invoked.
3141
3142         We propagate this setting then to the Property or the Operator to
3143         allow the `yield' to function.
3144
3145 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3146
3147         * codegen.cs: Implemented attribute support for modules.
3148         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3149         Assembly/Module functionality.
3150
3151         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3152         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3153         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3154
3155 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3156
3157         * interface.cs (FindMembers): The operation is performed on all base
3158         interfaces and not only on the first. It is required for future CLS Compliance patch.
3159
3160 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3161
3162         * statement.cs, codegen.cs:
3163         This patch deals with patterns such as:
3164
3165         public class List : IEnumerable {
3166
3167                 public MyEnumerator GetEnumerator () {
3168                         return new MyEnumerator(this);
3169                 }
3170
3171                 IEnumerator IEnumerable.GetEnumerator () {
3172                         ...
3173                 }
3174                 
3175                 public struct MyEnumerator : IEnumerator {
3176                         ...
3177                 }
3178         }
3179
3180         Before, there were a few things we did wrong:
3181         1) we would emit callvirt on a struct, which is illegal
3182         2) we emited ldarg when we needed to emit ldarga
3183         3) we would mistakenly call the interface methods on an enumerator
3184         type that derived from IEnumerator and was in another assembly. For example:
3185
3186         public class MyEnumerator : IEnumerator
3187
3188         Would have the interface methods called, even if there were public impls of the
3189         method. In a struct, this lead to invalid IL code.
3190
3191 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3192
3193         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3194           renamed to Emit.
3195
3196         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3197
3198 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3199
3200         * cs-parser.jay: Fix small regression: we were not testing V2
3201         compiler features correctly.
3202
3203         * interface.cs: If the emit context is null, then create one
3204
3205 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3206
3207         * decl.cs (GetSignatureForError): New virtual method to get full name
3208           for error messages.
3209
3210         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3211           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3212
3213         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3214           Duplicated members and code in these classes has been removed.
3215           Better encapsulation in these classes.
3216
3217 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3218
3219         * assign.cs (Assign.DoResolve): When dealing with compound
3220         assignments, there is a new rule in ECMA C# 2.4 (might have been
3221         there before, but it is documented here) that states that in:
3222
3223         a op= b;
3224
3225         If b is of type int, and the `op' is a shift-operator, then the
3226         above is evaluated as:
3227
3228         a = (int) a op b 
3229
3230         * expression.cs (Binary.ResolveOperator): Instead of testing for
3231         int/uint/long/ulong, try to implicitly convert to any of those
3232         types and use that in pointer arithmetic.
3233
3234         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3235         method to print information for from the type, not from the
3236         null-method we were given.
3237
3238 2004-02-01  Duncan Mak  <duncan@ximian.com>
3239
3240         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3241         parsing for cmd, fixes bug #53694.
3242
3243 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3244
3245         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3246         in the member name duplication tests. Property and operator name duplication
3247         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3248
3249 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3250
3251         * interface.cs (PopulateMethod): Fixed crash when interface method
3252         returns not existing type (error test cs0246-3.cs).
3253
3254 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3255
3256         * cs-parser.jay (interface_accessors): Re-write actions to also
3257         store attributes attached to get and set methods. Fix spelling
3258         while at it.
3259
3260         (inteface_property_declaration): Modify accordingly.
3261
3262         (InterfaceAccessorInfo): New helper class to store information to pass
3263         around between rules that use interface_accessors.
3264
3265         * interface.cs (Emit): Apply attributes on the get and set
3266         accessors of properties and indexers too.
3267
3268         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3269         right MethodBuilder when applying attributes to the get and set accessors.
3270
3271 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3272
3273         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3274
3275 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3276
3277         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3278
3279 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3280
3281         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3282         changes that treat `yield' specially when present before `break'
3283         or `return' tokens.
3284
3285         * cs-tokenizer.cs: yield is no longer a keyword.
3286
3287 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3288
3289         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3290         setting for default constructors.
3291         For default constructors are almost every time set wrong Modifier. The
3292         generated IL code has been alright. But inside mcs this values was
3293         wrong and this was reason why several of my CLS Compliance tests
3294         failed.
3295
3296 2004-01-22  Martin Baulig  <martin@ximian.com>
3297
3298         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3299         not a QualifiedIdentifier.  This is what `type_name_expression'
3300         was previously doing.
3301         (type_name_expression): Removed; the code is now in
3302         `namespace_or_type_name'.
3303         (qualified_identifier): Removed, use `namespace_or_type_name'
3304         instead.
3305         (QualifiedIdentifier): Removed this class.      
3306
3307 2004-01-22  Martin Baulig  <martin@ximian.com>
3308
3309         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3310         not a string as alias name.
3311
3312 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3313
3314         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3315         #52730 bug, and instead compute correctly the need to use a
3316         temporary variable when requesting an address based on the
3317         static/instace modified of the field and the constructor.
3318  
3319 2004-01-21  Martin Baulig  <martin@ximian.com>
3320
3321         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3322         class and namespace before looking up aliases.  Fixes #52517.
3323
3324 2004-01-21  Martin Baulig  <martin@ximian.com>
3325
3326         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3327         assinged in a 'try'; fixes exception4.cs.
3328
3329 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3330         * class.cs : Implemented parameter-less constructor for TypeContainer
3331
3332         * decl.cs: Attributes are now stored here. New property OptAttributes
3333
3334         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3335
3336         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3337
3338 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3339
3340         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3341           (CSharpSignature): New method for indexer and property signature.
3342
3343 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3344
3345         * pending.cs (IsVirtualFilter): Faster implementation.
3346
3347 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3348
3349         * typemanager.cs: Avoid inclusion of same assembly more than once.
3350
3351 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3352
3353         * cs-parser.jay: Fixed problem where the last assembly attribute
3354           has been applied also to following declaration (class, struct, etc.)
3355           
3356 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3357
3358         * class.cs: Added error CS0538, CS0539 reporting.
3359         Fixed crash on Microsoft runtime when field type is void.
3360
3361         * cs-parser.jay: Added error CS0537 reporting.
3362
3363         * pending.cs: Added error CS0535 reporting.
3364         Improved error report for errors CS0536, CS0534.
3365
3366 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3367
3368         Merge a few bits from the Anonymous Method MCS tree.
3369
3370         * statement.cs (ToplevelBlock): New class for toplevel methods,
3371         will hold anonymous methods, lifted variables.
3372
3373         * cs-parser.jay: Create toplevel blocks for delegates and for
3374         regular blocks of code. 
3375
3376 2004-01-20  Martin Baulig  <martin@ximian.com>
3377
3378         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3379         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3380         and `NeedExplicitReturn'; added `IsLastStatement'.
3381         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3382         have a `ReturnLabel' or we're not unreachable.
3383
3384         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3385         child's reachability; don't just override ours with it.  Fixes
3386         #58058 (lluis's example).
3387         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3388         InFinally(), InLoop(), InSwitch() and
3389         BreakCrossesTryCatchBoundary() methods.
3390
3391         * statement.cs (Return): Do all error checking in Resolve().
3392         Unless we are the last statement in a top-level block, always
3393         create a return label and jump to it.
3394         (Break, Continue): Do all error checking in Resolve(); also make
3395         sure we aren't leaving a `finally'.
3396         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3397         statement in a top-level block.
3398         (Block.Flags): Added `IsDestructor'.
3399         (Block.IsDestructor): New public property.
3400
3401 2004-01-20  Martin Baulig  <martin@ximian.com>
3402
3403         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3404
3405 2004-01-20  Martin Baulig  <martin@ximian.com>
3406
3407         * statement.cs (Statement.ResolveUnreachable): New public method.
3408         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3409         (Block.Resolve): Resolve unreachable statements.
3410
3411 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3412
3413         * expression.cs: We need to fix the case where we do
3414         not have a temp variable here.
3415
3416         * assign.cs: Only expression compound assignments need
3417         temporary variables.
3418
3419 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3420
3421         * flowanalysis.cs: Reduce memory allocation in a few ways:
3422           - A block with no variables should not allocate a bit
3423             vector for itself.
3424           - A method with no out parameters does not need any tracking
3425             for assignment of the parameters, so we need not allocate
3426             any data for it.
3427           - The arrays:
3428                 public readonly Type[] VariableTypes;
3429                 public readonly string[] VariableNames;
3430             Are redundant. The data is already stored in the variable
3431             map, so we need not allocate another array for it.
3432           - We need to add alot of checks for if (params | locals) == null
3433             due to the first two changes.
3434
3435 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3436
3437         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3438         implement IMemoryLocation, we store a copy on a local variable and
3439         take the address of it.  Patch from Benjamin Jemlich
3440
3441         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3442         to use a special "type_name_expression" rule which reduces the
3443         number of "QualifiedIdentifier" classes created, and instead
3444         directly creates MemberAccess expressions.
3445
3446 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3447
3448         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3449         that fixes #52853.  Null literal assignment to ValueType
3450
3451         * class.cs (MethodData.Emit): Instead of checking the name of the
3452         method to determine if its a destructor, create a new derived
3453         class from Method called Destructor, and test for that.  
3454
3455         * cs-parser.jay: Create a Destructor object instead of a Method.  
3456
3457         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3458
3459         Fixes: 52933
3460
3461 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3462
3463         * expression.cs (Binary.ResolveOperator): Perform an implicit
3464         conversion from MethodGroups to their delegate types on the
3465         Addition operation.
3466
3467         * delegate.cs: Introduce a new class DelegateCreation that is the
3468         base class for `NewDelegate' and `ImplicitDelegateCreation',
3469         factor some code in here.
3470
3471         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3472         conversion from MethodGroups to compatible delegate types. 
3473
3474         * ecore.cs (Expression.Resolve): Do not flag error 654
3475         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3476         we allow conversions from MethodGroups to delegate types now.
3477
3478         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3479         assignments in v2 either.
3480
3481 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3482
3483         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3484         static read-only fields in ctors.
3485
3486         Applied patch from Benjamin Jemlich 
3487
3488         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3489
3490 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3491
3492         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3493         here to return true, as they can be used like this:
3494
3495                 (XXX) int.MEMBER ()
3496
3497         Fixed 49836 and all the other dups
3498
3499 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3500
3501         * driver.cs: Implement /win32res and /win32icon.
3502
3503 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
3504
3505         * cs-parser.jay: Add a rule to improve error handling for the
3506         common mistake of placing modifiers after the type.
3507
3508 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
3509
3510         * cs-parser.jay (interface_event_declaration): Catch
3511         initialization of events on interfaces, and report cs0068
3512
3513         * cs-parser.jay (interface_event_declaration): Catch
3514         initialization of events. 
3515
3516         * ecore.cs: Better report missing constructors.
3517
3518         * expression.cs (Binary.ResolveOperator): My previous bug fix had
3519         the error reporting done in the wrong place.  Fix.
3520
3521         * expression.cs (Binary.ResolveOperator): Catch the 
3522         operator + (E x, E y) error earlier, and later allow for implicit
3523         conversions in operator +/- (E e, U x) from U to the underlying
3524         type of E.
3525
3526         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
3527         52596, if the container class is abstract, the default constructor
3528         is protected otherwise its public (before, we were always public).
3529
3530         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
3531         fixed statement.
3532
3533         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
3534         Jemlich that fixes bug #52597, MCS was generating invalid code for
3535         idisposable structs.   Thanks to Ben for following up with this
3536         bug as well.
3537
3538 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
3539
3540         * driver.cs: Allow assemblies without code to be generated, fixes
3541         52230.
3542
3543 2004-01-07  Nick Drochak <ndrochak@gol.com>
3544
3545         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
3546
3547 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
3548
3549         * cs-parser.jay: Add rules to improve error reporting if fields or
3550         methods are declared at the namespace level (error 116)
3551
3552         * Add rules to catch event add/remove
3553
3554 2004-01-04  David Sheldon <dave-mono@earth.li>
3555
3556   * expression.cs: Added matching ")" to error message for 
3557   CS0077
3558
3559 2004-01-03 Todd Berman <tberman@gentoo.org>
3560
3561         * ecore.cs, attribute.cs:
3562         Applying fix from #52429.
3563
3564 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3565
3566         * ecore.cs, expression.cs, statement.cs:
3567         Total rewrite of how we handle branching. We
3568         now handle complex boolean expressions with fewer
3569         jumps. As well if (x == 0) no longer emits a ceq.
3570
3571         if (x is Foo) is much faster now, because we generate
3572         better code.
3573
3574         Overall, we get a pretty big improvement on our benchmark
3575         tests. The code we generate is smaller and more readable.
3576
3577         I did a full two-stage bootstrap. The patch was reviewed
3578         by Martin and Miguel.
3579
3580 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3581
3582         * cs-parser.jay: Make primary_expression not take a QI.
3583         we dont need this because the member_access rule covers
3584         us here. So we replace the rule with just IDENTIFIER.
3585
3586         This has two good effects. First, we remove a s/r conflict.
3587         Second, we allocate many fewer QualifiedIdentifier objects.
3588
3589 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3590
3591         * attribute.cs: Handle MarshalAs attributes as pseudo, and
3592         set the correct information via SRE. This prevents
3593         hanging on the MS runtime. Fixes #29374.
3594
3595 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3596
3597         * convert.cs: correctly handle conversions to value types
3598         from Enum and ValueType as unboxing conversions.
3599
3600         Fixes bug #52569. Patch by Benjamin Jemlich.
3601
3602 2004-01-02  Ravi Pratap  <ravi@ximian.com>
3603
3604         * expression.cs (BetterConversion): Prefer int -> uint
3605         over int -> ulong (csc's behaviour). This fixed bug #52046.
3606
3607 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3608
3609         * decl.cs (MemberCache.FindMembers): now returns a
3610         MemberInfo [].
3611
3612         * typemanager.cs: In general, go with with ^^.
3613         (CopyNewMethods): take an IList.
3614         (RealMemberLookup): Only allocate an arraylist
3615         if we copy from two sets of methods.
3616
3617         This change basically does two things:
3618         1) Fewer array lists allocated due to CopyNewMethods.
3619         2) the explicit cast in MemberList costed ALOT.
3620
3621 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
3622
3623         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
3624         a hashtable to avoid needless string allocations when an identifier is
3625         used more than once (the common case).
3626
3627 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3628
3629         * pending.cs: MS's TypeBuilder.GetInterfaces ()
3630         is broken, it will not return anything. So, we
3631         have to use the information we have in mcs to
3632         do the task.
3633
3634         * typemanager.cs: Add a cache for GetInterfaces,
3635         since this will now be used more often (due to ^^)
3636
3637         (GetExplicitInterfaces) New method that gets the
3638         declared, not effective, interfaces on a type
3639         builder (eg, if you have interface IFoo, interface
3640         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
3641         { IBar }.
3642
3643         This patch makes MCS able to bootstrap itself on
3644         Windows again.
3645
3646 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3647
3648         * expression.cs: Remove the Nop's that Miguel put
3649         in by mistake.
3650
3651 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3652
3653         * report.cs, codegen.cs: Give the real stack trace to
3654         the error when an exception is thrown.
3655
3656 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3657
3658         * decl.cs: only allocate hashtables for ifaces if 
3659         it is an iface!
3660
3661 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3662
3663         * expression.cs: fix the error from cs0121-2.cs
3664         (a parent interface has two child interfaces that
3665         have a function with the same name and 0 params
3666         and the function is called through the parent).
3667
3668 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3669
3670         * class.cs, rootcontext.cs, typmanager.cs: do not
3671         leak pointers.
3672
3673 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3674
3675         * codegen.cs: remove stack for the ec flow branching.
3676         It is already a linked list, so no need.
3677
3678 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3679
3680         * Makefile: Allow custom profiler here.
3681
3682 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3683
3684         * typemanager.cs (LookupType):
3685           - Use a static char [], because split takes
3686             a param array for args, so it was allocating
3687             every time.
3688           - Do not store true in a hashtable, it boxes.
3689
3690 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3691
3692         * flowanalysis.cs: bytify common enums.
3693
3694 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3695
3696         * modifiers.cs: Add a new set of flags for the
3697         flags allowed on explicit interface impls.
3698         * cs-parser.jay: catch the use of modifiers in
3699         interfaces correctly.
3700         * class.cs: catch private void IFoo.Blah ().
3701
3702         All related to bug #50572.
3703
3704 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3705
3706         * decl.cs: Rewrite the consistant accessability checking.
3707         Accessability is not linear, it must be implemented in
3708         a tableish way. Fixes #49704.
3709
3710 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3711
3712         * expression.cs: Handle negation in a checked context.
3713         We must use subtraction from zero. Fixes #38674.
3714
3715 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3716
3717         * class.cs: Ignore static void main in DLLs.
3718         * rootcontext.cs: Handle the target type here,
3719         since we are have to access it from class.cs
3720         * driver.cs: account for the above.
3721
3722 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3723
3724         * report.cs: Give line numbers and files if available.
3725
3726 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
3727
3728         * driver.cs: Implement /addmodule.
3729
3730         * typemanager.cs:  Change 'modules' field so it now contains Modules not
3731         ModuleBuilders.
3732
3733 2003-12-20  Martin Baulig  <martin@ximian.com>
3734
3735         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
3736         (FieldBase.IsAssigned): Removed this field.
3737         (FieldBase.SetAssigned): New public method.
3738         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
3739
3740 2003-12-20  Martin Baulig  <martin@ximian.com>
3741
3742         * expression.cs (LocalVariableReference.DoResolve): Don't set
3743         `vi.Used' if we're called from DoResolveLValue().
3744
3745         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
3746         returns the usage vector it just merged into the current one -
3747         pass this one to UsageWarning().
3748         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
3749         of the `EmitContext', don't call this recursively on our children.
3750
3751 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
3752
3753         * driver.cs: Implement /target:module.
3754
3755 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
3756
3757         * support.cs (CharArrayHashtable): New helper class.
3758
3759         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
3760         char arrays, not strings, so we can avoid creating a string in
3761         consume_identifier if the identifier is a keyword.
3762
3763 2003-12-16  Martin Baulig  <martin@ximian.com>
3764
3765         * statement.cs (LocalInfo.Assigned): Removed this property.
3766         (LocalInfo.Flags): Removed `Assigned'.
3767         (LocalInfo.IsAssigned): New public method; takes the EmitContext
3768         and uses flow analysis.
3769         (Block.UsageWarning): Made this method private.
3770         (Block.Resolve): Call UsageWarning() if appropriate.
3771
3772         * expression.cs (LocalVariableReference.DoResolve): Always set
3773         LocalInfo.Used here.
3774
3775 2003-12-13  Martin Baulig  <martin@ximian.com>
3776
3777         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
3778         any value here; we're now using flow analysis to figure out
3779         whether a statement/block returns a value.
3780
3781 2003-12-13  Martin Baulig  <martin@ximian.com>
3782
3783         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
3784         working again.
3785         (FlowBranching.MergeFinally): Don't call
3786         `branching.CheckOutParameters()' here, this is called in
3787         MergeTopBlock().
3788         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
3789         when adding the `finally' vector.       
3790
3791 2003-12-13  Martin Baulig  <martin@ximian.com>
3792
3793         * flowanalysis.cs
3794         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
3795         actually work and also fix #48962.
3796
3797 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3798
3799         * decl.cs: Do not check System.Object for nested types,
3800         since we know it does not have any. Big bang for buck:
3801
3802         BEFORE:
3803            Run 1:   8.35 seconds
3804            Run 2:   8.32 seconds
3805            corlib:  17.99 seconds
3806         AFTER:
3807            Run 1:   8.17 seconds
3808            Run 2:   8.17 seconds
3809            corlib:  17.39 seconds
3810
3811 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3812
3813         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
3814         time we are returning 0 members, so we save alot here.
3815
3816 2003-12-11  Martin Baulig  <martin@ximian.com>
3817
3818         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
3819         `MergeChild()', also just take the `FlowBranching' as argument;
3820         call Merge() on it and return the result.
3821         (FlowBranching.Merge): We don't need to do anything if we just
3822         have one sibling.
3823
3824 2003-12-11  Martin Baulig  <martin@ximian.com>
3825
3826         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
3827         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
3828         Maurer for this idea.
3829
3830 2003-12-11  Martin Baulig  <martin@ximian.com>
3831
3832         * flowanalysis.cs (MergeResult): This class is now gone; we now
3833         use the `UsageVector' for this.  The reason for this is that if a
3834         branching just has one sibling, we don't need to "merge" them at
3835         all - that's the next step to do.
3836         (FlowBranching.Merge): We now return a `UsageVector' instead of a
3837         `MergeResult'.
3838
3839 2003-12-11  Martin Baulig  <martin@ximian.com>
3840
3841         Reworked flow analyis and made it more precise and bug-free.  The
3842         most important change is that we're now using a special `Reachability'
3843         class instead of having "magic" meanings of `FlowReturns'.  I'll
3844         do some more cleanups and optimizations and also add some more
3845         documentation this week.
3846
3847         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
3848         largely reworked this class.
3849         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
3850         the new `Reachability' class instead of having "magic" values here.
3851         (FlowBranching): We're now using an instance of `Reachability'
3852         instead of having separate `Returns', `Breaks' etc. fields.
3853
3854         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
3855         based on flow analysis; ignore the return value of block.Emit ().
3856
3857 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
3858
3859         * driver.cs typemanager.cs: Find the mono extensions to corlib even
3860         if they are private.
3861
3862 2003-12-09  Martin Baulig  <martin@ximian.com>
3863
3864         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
3865         call them directly on the UsageVector.
3866
3867 2003-12-09  Martin Baulig  <martin@ximian.com>
3868
3869         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
3870         Changed return type from `FlowReturns' to `Reachability'.
3871
3872 2003-12-09  Martin Baulig  <martin@ximian.com>
3873
3874         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
3875         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
3876         `Reachable' fields with a single `Reachability' one.
3877
3878 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3879
3880         * class.cs (FindMembers): Remove foreach's.
3881
3882         Bootstrap times:
3883
3884         BEFORE
3885                 Run 1:   8.74 seconds
3886                 Run 2:   8.71 seconds
3887
3888         AFTER
3889                 Run 1:   8.64 seconds
3890                 Run 2:   8.58 seconds
3891
3892
3893 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3894
3895         * cs-parser.jay:
3896         * gen-treedump.cs:
3897         * statement.cs:
3898         This patch does a few things:
3899                 1. EmptyStatement is now a singleton, so it is never reallocated.
3900                 2. All blah is EmptyStatement constructs have been changed to
3901                    blah == EmptyStatement.Value, which is much faster and valid
3902                    now that EmptyStatement is a singleton.
3903                 3. When resolving a block, rather than allocating a new array for
3904                    the non-empty statements, empty statements are replaced with
3905                    EmptyStatement.Value
3906                 4. Some recursive functions have been made non-recursive.
3907         Mainly the performance impact is from (3), however (1) and (2) are needed for
3908         this to work. (4) does not make a big difference in normal situations, however
3909         it makes the profile look saner.
3910
3911         Bootstrap times:
3912
3913         BEFORE
3914         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3915         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3916         Total memory allocated: 56397 KB
3917
3918         AFTER
3919         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
3920         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
3921         Total memory allocated: 55666 KB
3922
3923 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3924
3925         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
3926         than the hashtable in a hashtable version
3927
3928         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
3929         we always end up concating a string. This results in a huge perf
3930         loss, because many strings have to be tracked by the GC. In this
3931         patch, we first use a hashtable that works with two keys, so that
3932         the strings do not need to be concat'ed.
3933
3934         Bootstrap times:
3935         BEFORE
3936                 Run 1:   8.74 seconds
3937                 Run 2:   8.71 seconds
3938
3939         AFTER
3940                 Run 1:   8.65 seconds
3941                 Run 2:   8.56 seconds
3942
3943 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3944
3945         * Makefile: Add a new target `do-time' that does a quick and simple
3946         profile, leaving easy to parse output.
3947
3948 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
3949
3950         * codegen.cs (Init): Create the dynamic assembly with 
3951         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
3952
3953 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3954
3955         * support.cs: Make the PtrHashtable use only one
3956         instance of its comparer.
3957
3958 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
3959
3960         * typemanager.cs: Fix lookup of GetNamespaces.
3961
3962 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
3963
3964         * expression.cs: Removed redundant line.
3965
3966         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
3967         ArrayLists, use for loops with bounds.  
3968
3969         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
3970         arraylist.
3971
3972         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
3973         arraylists, use for loop with bounds.
3974
3975         The above three changes give us a 0.071 second performance
3976         improvement out of 3.294 seconds down to 3.223.  On my machine
3977         the above changes reduced the memory usage by 1,387 KB during
3978         compiler bootstrap.
3979
3980         * cs-parser.jay (QualifiedIdentifier): New class used to represent
3981         QualifiedIdentifiers.  Before we created a new string through
3982         concatenation, and mostly later on, the result would be
3983         manipulated by DecomposeQI through string manipulation.
3984
3985         This reduced the compiler memory usage for bootstrapping from
3986         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
3987         compile times in 0.05 seconds.
3988
3989 2003-11-28  Dick Porter  <dick@ximian.com>
3990
3991         * support.cs: Do string compares with the Invariant culture.
3992
3993         * rootcontext.cs: 
3994         * gen-treedump.cs: 
3995         * expression.cs: 
3996         * driver.cs: 
3997         * decl.cs: 
3998         * codegen.cs: 
3999         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4000         the comparison is done with the Invariant culture.
4001
4002 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4003
4004         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4005         GetEnumerator method.
4006
4007         (ProbeCollectionType): Iterate starting at the most specific type
4008         upwards looking for a GetEnumerator
4009
4010         * expression.cs: Shift count can be up to 31 for int/uint and 63
4011         for long/ulong.
4012
4013 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4014
4015         * statement.cs (Block.LookupLabel): Also look for the label on the
4016         children blocks.  Use a hash table to keep track of visited
4017         nodes. 
4018
4019         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4020         we actually did transform the other operand, otherwise fall back
4021         to the common codepath that casts to long.
4022
4023         * cs-tokenizer.cs: Use the same code pattern as the int case.
4024         Maybe I should do the parsing myself, and avoid depending on the
4025         Parse routines to get this done.
4026
4027 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4028
4029         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4030         which fixes bug 51347.  This time test it.
4031
4032         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4033         attributes for example can not tell the difference between these.
4034         The difference was only a syntax feature of the language. 
4035
4036         * attribute.cs: Apply attributes to delegates.
4037
4038         * delegate.cs: Call the apply attributes method.
4039
4040 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4041
4042         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4043         comparing 0 vs Byte.MinValue, not the value
4044
4045         (ImplicitConversionRequired): When reporting a conversion error,
4046         use error 31 to print out the constant error instead of the
4047         simpler 29.
4048
4049         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4050         which fixes bug 51347.
4051
4052 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4053
4054         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4055         which fixes the -warnaserror command line option.
4056
4057 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4058
4059         * cfold.cs (DoNumericPromotions): During constant folding of
4060         additions on UIntConstant, special case intconstants with
4061         IntConstants like we do on the expression binary operator. 
4062
4063 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4064
4065         * convert.cs (ImplicitReferenceConversion): We were missing a case
4066         (System.Enum are not value types or class types, so we need to
4067         classify them separatedly).
4068
4069         * driver.cs: We do not support error 2007.
4070
4071 2003-11-12 Jackson Harper <jackson@ximian.com>
4072
4073         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4074         system directory. Also use the full file name so users can
4075         libraries names mscorlib-o-tron.dll in a non system dir.
4076
4077 2003-11-10  Martin Baulig  <martin@ximian.com>
4078
4079         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4080         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4081         calling `ResolveType()' on them, directly assign their `Type'.
4082
4083 2003-11-08  Martin Baulig  <martin@ximian.com>
4084
4085         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4086         return value and the `out parent' parameter.
4087         (TypeContainer.DefineType): Moved the CS0644 check into
4088         GetClassBases().  Don't pass the interface types to the
4089         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4090         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4091
4092         * ecore.cs (TypeExpr.IsAttribute): New property.
4093         (TypeExpr.GetInterfaces): New method.
4094
4095         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4096         TypeExpr instead of a Type.
4097         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4098         (Interface.DefineType): Don't pass the interface types to the
4099         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4100         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4101
4102         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4103         instead of a `Type[]'.
4104         (TypeManager.RegisterBuilder): Likewise.
4105         (TypeManager.AddUserInterface): Likewise.
4106         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4107         `Type[]' and also return a `TypeExpr[]'.
4108         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4109
4110 2003-11-08  Martin Baulig  <martin@ximian.com>
4111
4112         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4113         Expression.     
4114
4115 2003-11-08  Martin Baulig  <martin@ximian.com>
4116
4117         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4118         TypeManager.ResolveExpressionTypes().
4119
4120         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4121         instead of an Expression.
4122         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4123         (TypeExpression): New public class; formerly known as `TypeExpr'.
4124
4125         * expression.cs (ComposedCast): Derive from TypeExpr.
4126
4127         * typemanager.cs (TypeManager.system_*_expr): These are now
4128         TypExpr's instead of Expression's.
4129         (TypeManager.ResolveExpressionTypes): New public static function;
4130         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4131         of them.        
4132
4133 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4134
4135         * expression.cs (New.DoResolve): Do not dereference value that
4136         might be a null return.
4137
4138         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4139         sure that the constant value has the right type.  Fixes an
4140         unreported bug, similar to 50425.
4141
4142         * const.cs (Const.LookupConstantValue): Call
4143         ImplicitStandardConversionExists before doing a conversion to
4144         avoid havng the TypeManager.ChangeType do conversions.
4145
4146         Reduced the number of casts used
4147
4148         (Const.ChangeType): New routine to enable reuse of the constant
4149         type changing code from statement.
4150
4151         * typemanager.cs (ChangeType): Move common initialization to
4152         static global variables.
4153
4154         Fixes #50425.
4155
4156         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4157         every value type to go through, even if it was void.  Fix that. 
4158
4159         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4160         character of the define, and the is_identifier_part_character for
4161         the rest of the string.
4162
4163 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4164
4165         * expression.cs (UnaryMutator.EmitCode): When I updated
4166         LocalVariableReference.DoResolve, I overdid it, and dropped an
4167         optimization done on local variable references.
4168
4169 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4170
4171         * ecore.cs: Convert the return from Ldlen into an int.
4172
4173 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4174
4175         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4176         the accessibility, this is a special case for toplevel non-public
4177         classes (internal for instance).
4178
4179 2003-10-20  Nick Drochak <ndrochak@gol.com>
4180
4181         * ecore.cs: Fix typo and build.  Needed another right paren.
4182
4183 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4184
4185         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4186         `internal' case regular and protected, but not allowing protected
4187         to be evaluated later.  Bug 49840
4188
4189 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4190
4191         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4192         to kb.Nlast, and not the kb.nFirst to isolate the switch
4193         statement.
4194
4195         Extract the underlying type, so enumerations of long/ulong are
4196         treated like long/ulong.
4197
4198 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4199
4200         * expression.cs (New): Overload the meaning of RequestedType to
4201         track the possible creation of the NewDelegate type, since
4202         DoResolve is invoked more than once for new constructors on field
4203         initialization.
4204
4205         See bugs: #48800 and #37014
4206
4207         * cs-parser.jay (declare_local_constants): Take an arraylist
4208         instead of a single constant.
4209
4210         (local_constant_declaration): It should take a
4211         constant_declarators, not a constant_declarator.  Fixes 49487
4212
4213         * convert.cs: Fix error report.
4214
4215 2003-10-13 Jackson Harper <jackson@ximian.com>
4216
4217         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4218         bug #49611
4219
4220 2003-10-09  Martin Baulig  <martin@ximian.com>
4221
4222         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4223         to the .ctor.
4224         (MethodCore.DoDefineParameters): Removed the TypeContainer
4225         argument; use the DeclSpace which was passed to the .ctor instead.
4226         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4227         TypeContainer; we only need a DeclSpace here.
4228
4229 2003-10-09  Martin Baulig  <martin@ximian.com>
4230
4231         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4232         to the .ctor.
4233         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4234         EmitContext's .ctor.    
4235
4236 2003-10-09  Martin Baulig  <martin@ximian.com>
4237
4238         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4239         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4240         AsAccessible(), moved them as well.
4241
4242         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4243
4244 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
4245
4246         * cs-parser.jay : Renamed yyName to yyNames related to jay.
4247
4248 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4249
4250         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4251         generation for >=, as spotted by Paolo, bug 48679.  
4252         Patch from David Waite.
4253
4254         * cs-tokenizer.cs: Add handling for #pragma.
4255
4256         * cs-parser.jay: Allow for both yield and yield return in the
4257         syntax.  The anti-cobolization of C# fight will go on!
4258
4259         * class.cs (TypeBuilder.DefineType): Catch error condition here
4260         (Parent.DefineType erroring out and returning null).
4261
4262         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4263         coping with enumerations variables, we were mistakenly processing
4264         them as a regular value type instead of built-in types.  Fixes the
4265         bug #48063
4266
4267         * typemanager.cs (IsBuiltinOrEnum): New method.
4268
4269 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
4270
4271         * cs-parser.jay: Upgrade: yield now needs the return clause.
4272
4273 2003-09-19  Martin Baulig  <martin@ximian.com>
4274
4275         * decl.cs (MemberCache.SetupCacheForInterface): Take a
4276         `MemberCache parent' argument.  Normally, an interface doesn't
4277         have a parent type except System.Object, but we use this in gmcs
4278         for generic type parameters.
4279
4280 2003-09-18  Martin Baulig  <martin@ximian.com>
4281
4282         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
4283         on `type.IsInterface'; don't check whether the type has a parent
4284         to determine whether it's an interface.
4285
4286 2003-09-15  Martin Baulig  <martin@ximian.com>
4287
4288         * class.cs (TypeContainer.DefineType): Added an error flag to
4289         avoid reporting duplicate CS0146's ("class definition is
4290         circular.").
4291
4292         * driver.cs (Driver.MainDriver): Abort if
4293         RootContext.ResolveTree() reported any errors.
4294
4295 2003-09-07  Martin Baulig  <martin@ximian.com>
4296
4297         * report.cs (Error, Warning): Added overloaded versions which take
4298         a `params object[] args' and call String.Format().
4299
4300 2003-09-07  Martin Baulig  <martin@ximian.com>
4301
4302         * decl.cs (DeclSpace..ctor): Don't call
4303         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
4304         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
4305         (DeclSpace.RecordDecl): New method.
4306
4307         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
4308
4309 2003-09-02  Ravi Pratap  <ravi@ximian.com>
4310
4311         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
4312         value attributes to be applied to ParameterBuilders.
4313
4314         * class.cs (MethodCore.LabelParameters): Make static and more
4315         generic so that it can be used from other places - like interface
4316         methods, for instance.
4317
4318         * interface.cs (Interface.Emit): Call LabelParameters before
4319         emitting attributes on the InterfaceMethod.
4320
4321 2003-08-26  Martin Baulig  <martin@ximian.com>
4322
4323         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
4324         resolving aliases; fixes #47927.
4325
4326 2003-08-26  Martin Baulig  <martin@ximian.com>
4327
4328         * statement.cs (Using.DoResolve): This is internally emitting a
4329         try/finally clause, so we need to set ec.NeedExplicitReturn if we
4330         do not always return.  Fixes #47681.
4331
4332 2003-08-26  Martin Baulig  <martin@ximian.com>
4333
4334         * decl.cs (MemberCore): Moved WarningNotHiding(),
4335         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
4336         into MemberBase.
4337         (AdditionResult): Make this nested in DeclSpace.
4338         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
4339         argument; call NamespaceEntry.Define() unless we're nested in a
4340         class or struct.
4341
4342         * namespace.cs (Namespace.DefineName): New public function.  This
4343         is called from DeclSpace's .ctor to add 
4344         (Namespace.Lookup): Include DeclSpaces in the lookup.
4345
4346         * class.cs (Operator): Derive from MemberBase, not MemberCore.
4347
4348         * const.cs (Const): Derive from MemberBase, not MemberCore.     
4349
4350 2003-08-25  Martin Baulig  <martin@ximian.com>
4351
4352         * convert.cs (Convert.ExplicitReferenceConversion): When
4353         converting from an interface type to a class, unbox if the target
4354         type is a struct type.  Fixes #47822.
4355
4356 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4357
4358         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
4359         #47854.
4360
4361 2003-08-22  Martin Baulig  <martin@ximian.com>
4362
4363         * class.cs (TypeManager.DefineType): When defining a nested type,
4364         call DefineType() on our parent; fixes #47801.
4365
4366 2003-08-22  Martin Baulig  <martin@ximian.com>
4367
4368         * class.cs (MethodData.Define): While checking if a method is an
4369         interface implementation, improve the test a bit more to fix #47654.
4370
4371 2003-08-22  Martin Baulig  <martin@ximian.com>
4372
4373         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
4374         correctly; fixes #47722.
4375
4376 2003-08-22  Martin Baulig  <martin@ximian.com>
4377
4378         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
4379         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
4380
4381         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
4382
4383 2003-08-22  Martin Baulig  <martin@ximian.com>
4384
4385         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
4386         can only be assigned in static constructors.  Fixes #47161.
4387
4388 2003-08-22  Martin Baulig  <martin@ximian.com>
4389
4390         Rewrote and improved the flow analysis code.
4391
4392         * flowbranching.cs (FlowBranching): Make this class abstract.
4393         (FlowBranching.CreateBranching): New static function to create a
4394         new flow branching.
4395         (FlowBranchingBlock, FlowBranchingException): New classes.
4396         (FlowBranching.UsageVector.Type): New public readonly field.
4397         (FlowBranching.UsageVector.Breaks): Removed the setter.
4398         (FlowBranching.UsageVector.Returns): Removed the setter.
4399         (FlowBranching.UsageVector): Added Break(), Return(),
4400         NeverReachable() and Throw() methods to modify the reachability.
4401         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
4402         done by FlowBranching.Merge().
4403         (FlowBranching.UsageVector.MergeChild): New method; merges the
4404         merge result into the current vector.
4405         (FlowBranching.Merge): New abstract method to merge a branching.
4406
4407 2003-08-12  Martin Baulig  <martin@ximian.com>
4408
4409         * expression.cs (Indirection.CacheTemporaries): Create the
4410         LocalTemporary with the pointer type, not its element type.
4411
4412 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
4413
4414         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
4415         token was a keyword or not.
4416
4417         Add `error' options where an IDENTIFIER was expected;  Provide
4418         CheckToken and CheckIdentifierToken convenience error reporting
4419         functions. 
4420
4421         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
4422
4423         * decl.cs: Rename `NamespaceEntry Namespace' public field into
4424         NameSpaceEntry NameSpaceEntry.
4425
4426         (LookupInterfaceOrClass): Avoid creating a full qualified name
4427         from namespace and name: avoid doing lookups when we know the
4428         namespace is non-existant.   Use new Tree.LookupByNamespace which
4429         looks up DeclSpaces based on their namespace, name pair.
4430
4431         * driver.cs: Provide a new `parser verbose' to display the
4432         exception thrown during parsing.  This is turned off by default
4433         now, so the output of a failure from mcs is more graceful.
4434
4435         * namespace.cs: Track all the namespaces defined in a hashtable
4436         for quick lookup.
4437
4438         (IsNamespace): New method
4439
4440 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
4441
4442         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
4443         we know that we need to concatenate (full typename can never be
4444         null). 
4445
4446         * class.cs: ditto.
4447
4448         * statement.cs: Use a bitfield;  Do not initialize to null things
4449         which are done by the constructor by default.
4450
4451         * cs-parser.jay: bug fix, parameter was 4, not 3.
4452
4453         * expression.cs: Just use the property;
4454
4455         * statement.cs: No need for GetVariableInfo method.
4456
4457 2003-08-08  Martin Baulig  <martin@ximian.com>
4458
4459         * flowanalysis.cs (FlowReturns): This is now nested in the
4460         `FlowBranching' class.
4461         (MyBitVector): Moved this here from statement.cs.
4462         (FlowBranching.SiblingType): New enum type.
4463         (FlowBranching.CreateSibling): Added `SiblingType' argument.
4464
4465 2003-08-07  Martin Baulig  <martin@ximian.com>
4466
4467         * flowanalysis.cs (FlowBranchingType): This is now nested in the
4468         `FlowBranching' class and called `BranchingType'.
4469
4470 2003-08-07  Martin Baulig  <martin@ximian.com>
4471
4472         * flowanalysis.cs: Moved all the control flow analysis code into
4473         its own file.
4474
4475 2003-08-07  Martin Baulig  <martin@ximian.com>
4476
4477         * assign.cs (Assign.DoResolve): `target' must either be an
4478         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
4479         #37319.
4480
4481 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
4482
4483         * expression.cs (BinaryMethod): This kind of expression is created by the
4484         Binary class if it determines that the operator has to be handled
4485         by a method.
4486
4487         (BinaryDelegate): This kind of expression is created if we are
4488         dealing with a + or - operator on delegates.
4489
4490         (Binary): remove method, argumetns, and DelegateOperator: when
4491         dealing with methods, 
4492
4493         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
4494
4495         * statement.cs (Block): use bitfields for the three extra booleans
4496         we had in use.   Remove unused topblock parameter.
4497
4498         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
4499
4500         * assign.cs: Drop extra unneeded tests.
4501
4502 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
4503
4504         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
4505
4506         * statement.cs (Foreach): Use VariableStorage instead of
4507         LocalBuilders.   
4508
4509         * codegen.cs (VariableStorage): New class used by clients that
4510         require a variable stored: locals or fields for variables that
4511         need to live across yield.
4512
4513         Maybe provide a convenience api for EmitThis+EmitLoad?
4514
4515         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
4516         these bad boys.
4517
4518 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
4519
4520         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
4521         RemapParameterLValue): New methods that are used to turn a
4522         precomputed FieldInfo into an expression like this:
4523
4524                 instance.FieldInfo
4525
4526         The idea is to use this instead of making LocalVariableReference
4527         have more than one meaning.
4528
4529         * cs-parser.jay: Add error production to BASE.
4530
4531         * ecore.cs: Deal with TypeManager.GetField returning null, which
4532         is now a valid return value.
4533
4534         (FieldExprNoAddress): New expression for Fields whose address can
4535         not be taken.
4536
4537         * expression.cs (LocalVariableReference): During the resolve
4538         phases, create new expressions if we are in a remapping context.
4539         Remove code that dealt with remapping here.
4540
4541         (ParameterReference): same.
4542
4543         (ProxyInstance): New expression, like the `This' expression, but
4544         it is born fully resolved.  We know what we are doing, so remove
4545         the errors that are targeted to user-provided uses of `this'.
4546
4547         * statement.cs (Foreach): our variable is now stored as an
4548         Expression;  During resolution, follow the protocol, dont just
4549         assume it will return this.
4550
4551 2003-08-06  Martin Baulig  <martin@ximian.com>
4552
4553         * support.cs (SeekableStreamReader.cs): New public class.
4554
4555         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
4556         SeekableStreamReader instead of the normal StreamReader.
4557
4558 2003-08-04  Martin Baulig  <martin@ximian.com>
4559
4560         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
4561         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
4562         deambiguate casts and delegate invocations.
4563         (parenthesized_expression): Use the new tokens to ensure this is
4564         not a cast of method invocation.
4565
4566         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
4567         when reading a `)' and Deambiguate_CloseParens () was previously
4568         called.
4569
4570         * expression.cs (ParenthesizedExpression): New class.  This is
4571         just used for the CS0075 test.
4572         (Binary.DoResolve): Check for CS0075.   
4573
4574 2003-07-29  Ravi Pratap  <ravi@ximian.com>
4575
4576         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
4577         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
4578         reference comparison.
4579
4580         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
4581         examine the ReturnType for equality - this is necessary in the
4582         cases of implicit and explicit operators whose signature also
4583         includes the return type.
4584
4585 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
4586
4587         * namespace.cs: Cache the result of the namespace computation,
4588         instead of computing it every time.
4589
4590 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
4591
4592         * decl.cs: Use a global arraylist that we reuse over invocations
4593         to avoid excesive memory consumption.  Reduces memory usage on an
4594         mcs compile by one meg (45 average).
4595
4596         * typemanager.cs (LookupTypeReflection): In .NET pointers are
4597         private, work around that.
4598
4599 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
4600
4601         * literal.cs (IntLiteral): Define Zero and One static literals. 
4602
4603         * cs-parser.jay (integer_literal): use static literals to reduce
4604         memory usage for the most used literals (0, 1 and -1).  211kb
4605         reduced in memory usage.
4606
4607         Replace all calls to `new ArrayList' with `new
4608         ArrayList(4)' which is a good average number for most allocations,
4609         and also requires only 16 bytes of memory for its buffer by
4610         default. 
4611
4612         This reduced MCS memory usage in seven megabytes for the RSS after
4613         bootstrapping.
4614
4615 2003-07-28  Ravi Pratap  <ravi@ximian.com>
4616
4617         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
4618         handle params methods the correct way by forming only one
4619         applicable set with params and normal methods in them. Earlier we
4620         were looking at params methods only if we found no normal methods
4621         which was not the correct thing to do.
4622
4623         (Invocation.BetterFunction): Take separate arguments indicating
4624         when candidate and the best method are params methods in their
4625         expanded form.
4626
4627         This fixes bugs #43367 and #46199.
4628
4629         * attribute.cs: Documentation updates.
4630
4631         (CheckAttribute): Rename to CheckAttributeTarget.
4632         (GetValidPlaces): Rename to GetValidTargets.
4633
4634         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
4635         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
4636
4637         Fixes bug #44468.
4638
4639 2003-07-28  Martin Baulig  <martin@ximian.com>
4640
4641         * class.cs (TypeContainer.DefineMembers): Use the base type's full
4642         name when looking up the base class of a nested class.  Fixes #46977.
4643
4644 2003-07-26  Martin Baulig  <martin@ximian.com>
4645
4646         * expression.cs (Indexers.Indexer): New nested struct; contains
4647         getter, setter and the indexer's type.
4648         (Indexers.Properties): This is now an ArrayList of
4649         Indexers.Indexer's.
4650         (IndexerAccess.DoResolveLValue): Correctly set the type if the
4651         indexer doesn't have any getters.
4652
4653         * assign.cs (Assign.DoResolve): Also do the implicit conversions
4654         for embedded property and indexer assignments.
4655
4656 2003-07-26  Martin Baulig  <martin@ximian.com>
4657
4658         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
4659         preprocessor directive is not the first non-whitespace character
4660         on a line.
4661
4662 2003-07-26  Martin Baulig  <martin@ximian.com>
4663
4664         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
4665         namespace parsing, follow the spec more closely.
4666
4667         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
4668         NamespaceEntry.Lookup().
4669
4670 2003-07-25  Martin Baulig  <martin@ximian.com>
4671
4672         * MethodCore.cs (OverridesSomething): New public field; it's set
4673         from TypeContainer.DefineMembers if this method overrides
4674         something (which doesn't need to be a method).  Fix #39462.
4675
4676 2003-07-25  Ravi Pratap  <ravi@ximian.com>
4677
4678         * typemanager.cs (GetMembers): Ensure that the list of members is
4679         reversed. This keeps things in sync.
4680
4681         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
4682         find an AttributeUsage attribute.
4683
4684         * expression.cs (Invocation.OverloadResolve): Perform the check
4685         which disallows Invoke to be directly called on a Delegate.
4686
4687         (Error_InvokeOnDelegate): Report error cs1533.
4688
4689 2003-07-25  Martin Baulig  <martin@ximian.com>
4690
4691         * expression.cs (Indexers.GetIndexersForType): Only look in the
4692         interface hierarchy if the requested type is already an
4693         interface.  Fixes #46788 while keeping #46502 fixed.
4694
4695 2003-07-25  Martin Baulig  <martin@ximian.com>
4696
4697         * class.cs (TypeContainer.DefineMembers): Check whether all
4698         readonly fields have been assigned and report warning CS0649 if
4699         not.
4700
4701         * statement.cs (LocalInfo.IsFixed): Always return true if this is
4702         a valuetype.
4703
4704 2003-07-24  Ravi Pratap  <ravi@ximian.com>
4705
4706         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
4707         returned from GetMethods to make things consistent with the
4708         assumptions MCS makes about ordering of methods.
4709
4710         This should comprehensively fix bug #45127 and it does :-)
4711
4712         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
4713         ordering is actually reverse.
4714
4715         * Clean up some debug messages I left lying around.
4716
4717         * interface.cs (Populate*): Get rid of code which emits attributes
4718         since the stage in which we emit attributes is the 'Emit' stage,
4719         not the define stage.
4720
4721         (Emit): Move attribute emission for interface members here.
4722
4723 2003-07-22  Ravi Pratap  <ravi@ximian.com>
4724
4725         * expression.cs (Invocation.OverloadResolve): Follow the spec more
4726         closely: we eliminate methods in base types when we have an
4727         applicable method in a top-level type.
4728
4729         Please see section 14.5.5.1 for an exact description of what goes
4730         on. 
4731
4732         This fixes bug #45127 and a host of other related to corlib compilation.
4733
4734         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
4735         array is the method corresponding to the top-level type (this is
4736         because of the changes made to icall.c) so we change this
4737         accordingly.
4738
4739         (MethodGroupExpr.Name): This too.
4740
4741         * typemanager.cs (GetElementType): New method which does the right
4742         thing when compiling corlib. 
4743
4744         * everywhere: Make use of the above in the relevant places.
4745
4746 2003-07-22  Martin Baulig  <martin@ximian.com>
4747
4748         * cs-parser.jay (invocation_expression): Moved
4749         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
4750         `cast_expression', but create a InvocationOrCast which later
4751         resolves to either an Invocation or a Cast.
4752
4753         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
4754         method; call this before EmitStatement() to make sure that this
4755         expression can be used as a statement.
4756
4757         * expression.cs (InvocationOrCast): New class; resolves to either
4758         an Invocation or a Cast.
4759
4760         * statement.cs (StatementExpression): Call ResolveStatement() on
4761         the ExpressionStatement before emitting it.
4762
4763 2003-07-21  Martin Baulig  <martin@ximian.com>
4764
4765         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
4766         `ref' and `out' attributes match; fixes #46220.
4767         (MemberAccess.ResolveMemberAccess): You can't reference a type
4768         through an expression; fixes #33180.
4769         (Indexers.GetIndexersForType): Don't return the indexers from
4770         interfaces the class implements; fixes #46502.
4771
4772 2003-07-21  Martin Baulig  <martin@ximian.com>
4773
4774         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
4775         CS0661 checks; fixes bug #30442.
4776
4777 2003-07-21  Martin Baulig  <martin@ximian.com>
4778
4779         * decl.cs (AdditionResult): Added `Error'.
4780
4781         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
4782
4783         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
4784         makes cs0031.cs actually work.
4785
4786 2003-07-20  Martin Baulig  <martin@ximian.com>
4787
4788         * namespace.cs: Fixed that bug which caused a crash when compiling
4789         the debugger's GUI.
4790
4791 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
4792
4793         * typemanager.cs (LookupTypeReflection): Never expose types which
4794         are NotPublic, NestedPrivate, NestedAssembly, or
4795         NestedFamANDAssem.  We used to return these, and later do a check
4796         that would report a meaningful error, but the problem is that we
4797         would not get the real match, if there was a name override.
4798
4799 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
4800
4801         * namespace.cs (Namespace, Name): Do not compute the namespace
4802         name dynamically, compute it in the constructor.  This reduced
4803         memory usage by 1697 KB.
4804
4805         * driver.cs: Use --pause to pause at the end.
4806
4807 2003-07-17  Peter Williams  <peter@newton.cx>
4808
4809         * Makefile: Change the name of the test target so that it doesn't
4810         conflict with the recursive test target.
4811
4812 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
4813
4814         * expression.cs (LocalVariableReference.Emit, EmitAssign,
4815         AddressOf): Do not use EmitThis, that was wrong, use the actual
4816         this pointer.
4817
4818 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
4819
4820         * class.cs (MethodData.Define): While checking if a method is an
4821         interface implementation, improve the test: If we are not public
4822         (use new test here: use the computed MethodAttributes directly,
4823         instead of the parsed modifier flags) check if the `implementing'
4824         method comes from an interface or not.
4825
4826         * pending.cs (VerifyPendingMethods): Slightly better error
4827         message.
4828
4829         * makefile: add test target that does the mcs bootstrap.
4830
4831 2003-07-16  Ravi Pratap  <ravi@ximian.com>
4832
4833         * interface.cs (Define): Do nothing here since there are no
4834         members to populate etc. Move the attribute emission out of here
4835         since this was just totally the wrong place to put it. Attribute
4836         application happens during the 'Emit' phase, not in the 'Define'
4837         phase.
4838
4839         (Emit): Add this method and move the attribute emission here
4840
4841         * rootcontext.cs (EmitCode): Call the Emit method on interface
4842         types too.
4843
4844 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4845
4846         * expression.cs (OverloadResolve): Report error only if Location
4847         is not 'Null' which means that there was a probe going on.
4848
4849 2003-07-14  Martin Baulig  <martin@ximian.com>
4850
4851         * expression.cs (ConditionalLogicalOperator): New public class to
4852         implement user defined conditional logical operators.
4853         This is section 14.11.2 in the spec and bug #40505.
4854
4855 2003-07-14  Martin Baulig  <martin@ximian.com>
4856
4857         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
4858
4859 2003-07-14  Martin Baulig  <martin@ximian.com>
4860
4861         * codegen.cs (EmitContext.InFixedInitializer): New public field.
4862
4863         * ecore.cs (IVariable.VerifyFixed): New interface method.
4864
4865         * expression.cs (Unary.ResolveOperator): When resolving the `&'
4866         operator, check whether the variable is actually fixed.  Fixes bug
4867         #36055.  Set a variable definitely assigned when taking its
4868         address as required by the spec.
4869
4870         * statement.cs (LocalInfo.IsFixed): New field.
4871         (LocalInfo.MakePinned): Set `IsFixed' to true.
4872
4873 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4874
4875         * attribute.cs (Attribute.Resolve): While doing a Member lookup
4876         for .ctors, ensure that we only ask for members declared in the
4877         attribute type (BindingFlags.DeclaredOnly).
4878
4879         Fixes bug #43632.
4880
4881         * expression.cs (Error_WrongNumArguments): Report error 1501
4882         correctly the way CSC does.
4883
4884 2003-07-13  Martin Baulig  <martin@ximian.com>
4885
4886         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
4887         lookup on the fully qualified name, to make things like "X.X" work
4888         where "X.X" is a fully qualified type name, but we also have a
4889         namespace "X" in the using list.  Fixes #41975.
4890
4891 2003-07-13  Martin Baulig  <martin@ximian.com>
4892
4893         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
4894         function. If we're a CompoundAssign, we need to create an embedded
4895         CompoundAssign, not an embedded Assign.
4896         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
4897         Fixes #45854.
4898
4899 2003-07-13  Martin Baulig  <martin@ximian.com>
4900
4901         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
4902         work to fix bug #46088.
4903
4904 2003-07-13  Ravi Pratap <ravi@ximian.com>
4905
4906         * class.cs (Operator.Emit): Do not emit attributes here - it is
4907         taken care of by the Method class that we delegate too. This takes
4908         care of bug #45876.
4909
4910 2003-07-10  Martin Baulig  <martin@ximian.com>
4911
4912         * expression.cs (TypeOfVoid): New class.
4913         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
4914
4915 2003-07-10  Martin Baulig  <martin@ximian.com>
4916
4917         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
4918         bug #35957.
4919
4920 2003-07-10  Martin Baulig  <martin@ximian.com>
4921
4922         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
4923         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
4924
4925         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
4926
4927         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
4928
4929 2003-07-10  Martin Baulig  <martin@ximian.com>
4930
4931         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
4932         of decimal.  Fixes #42850.
4933
4934         NOTE: I also fixed the created byte blob, but this doesn't work on
4935         the MS runtime and csc never produces any byte blobs for decimal
4936         arrays.
4937
4938 2003-07-10  Martin Baulig  <martin@ximian.com>
4939
4940         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
4941         structs; fixes #32068.
4942         (Block.AddChildVariableNames): Fixed #44302.
4943
4944 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4945
4946         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
4947
4948 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4949
4950         * attribute.cs: And this test is onger needed.
4951
4952 2003-07-08  Martin Baulig  <martin@ximian.com>
4953
4954         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
4955         inaccessible types.  Fixes #36313.
4956
4957         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
4958
4959         * namespace.cs (NamespaceEntry): Create implicit entries for all
4960         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
4961         implicit entries for N1.N2 and N1.
4962
4963 2003-07-08  Martin Baulig  <martin@ximian.com>
4964
4965         Rewrote the handling of namespaces to fix a lot of the issues
4966         wrt. `using' aliases etc.
4967
4968         * namespace.cs (Namespace): Splitted this class into a
4969         per-assembly `Namespace' and a per-file `NamespaceEntry'.
4970
4971         * typemanager.cs (TypeManager.IsNamespace): Removed.
4972         (TypeManager.ComputeNamespaces): Only compute namespaces from
4973         loaded assemblies here, not the namespaces from the assembly we're
4974         currently compiling.
4975
4976 2003-07-08  Martin Baulig  <martin@ximian.com>
4977
4978         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
4979
4980 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4981
4982         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
4983         already fixed it.  
4984
4985         I thought about the memory savings here, but LookupTypeReflection
4986         is used under already very constrained scenarios.  Compiling
4987         corlib or mcs only exposes one hit, so it would not really reduce
4988         any memory consumption.
4989
4990 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4991
4992         * typemanager.cs: fixes bug #45889 by only adding public types from
4993         other assemblies to the list of known types.
4994
4995 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4996
4997         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
4998         on the type we resolved.
4999
5000 2003-07-05  Martin Baulig  <martin@ximian.com>
5001
5002         * pending.cs (PendingImplementation.ParentImplements): Don't
5003         create the proxy if the parent is abstract.
5004
5005         * class.cs (TypeContainer.DefineIndexers): Process explicit
5006         interface implementations first.  Fixes #37714.
5007
5008 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5009
5010         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5011         defined recursively;  but since we modify the input parameters
5012         (left is set to `this' temporarily), we reset this value if the
5013         left_is_explicit is false, which gives the original semantics to
5014         the code.  
5015
5016         * literal.cs (NullPointer): new class used to represent a null
5017         literal in a pointer context.
5018
5019         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5020         type is a pointer, use a NullPointer object instead of a
5021         NullLiteral.   Closes 43687
5022
5023         (ExplicitConversion): Convert pointer values using
5024         the conv opcode to the proper type.
5025
5026         * ecore.cs (New): change ValueTypeVariable property into a method,
5027         that returns whether the valuetype is suitable for being used.
5028
5029         * expression.cs (Binary.DoNumericPromotions): Only return if we
5030         the int constant was a valid uint, and we can return both left and
5031         right as uints.  If not, we continue processing, to trigger the
5032         type conversion.  This fixes 39018.
5033
5034         * statement.cs (Block.EmitMeta): During constant resolution, set
5035         the CurrentBlock property on the emitcontext, so that we resolve
5036         constants propertly.
5037
5038 2003-07-02  Martin Baulig  <martin@ximian.com>
5039
5040         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5041         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5042
5043         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5044         than emitting it here.
5045
5046         * statement.cs: Fixed some more flow analysis bugs.
5047
5048 2003-07-02  Martin Baulig  <martin@ximian.com>
5049
5050         * class.cs (MethodData.Define): When implementing interface
5051         methods, set Final unless we're Virtual.
5052
5053         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5054         check work for interface methods.
5055
5056 2003-07-01  Martin Baulig  <martin@ximian.com>
5057
5058         * ecore.cs (EmitContext.This): Replaced this property with a
5059         GetThis() method which takes a Location argument.  This ensures
5060         that we get the correct error location for a CS0188.
5061
5062 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5063
5064         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5065         ImplicitStandardConversion.
5066
5067         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5068
5069 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5070
5071         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5072         optimization.
5073
5074 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5075
5076         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5077         constructors.
5078
5079         (MethodData.Define): Turn off initlocals for unsafe methods.
5080
5081 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5082
5083         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5084         complete;  Fixes #37521.
5085
5086         * delegate.cs: Use Modifiers.TypeAttr to compute the
5087         TypeAttributes, instead of rolling our own.  This makes the flags
5088         correct for the delegates.
5089
5090 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5091
5092         * class.cs (Constructor.Define): Set the private flag for static
5093         constructors as well.
5094
5095         * cs-parser.jay (statement_expression): Set the return value to
5096         null, to avoid a crash when we catch an error.
5097
5098 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5099
5100         * cs-parser.jay: Applied patch from Jackson that adds support for
5101         extern and unsafe modifiers to destructor declarations.
5102
5103         * expression.cs: Report error 21 if the user is trying to index a
5104         System.Array.
5105
5106         * driver.cs: Add an error message, suggested by the bug report.
5107
5108         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5109         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5110
5111 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5112
5113         * namespace.cs: Add some information to reduce FAQs.
5114
5115 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5116
5117         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5118         underlying enumeration types.  Fixes #43915.
5119
5120         * expression.cs: Treat ushort/short as legal values to be used in
5121         bitwise operations.
5122
5123 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5124
5125         * delegate.cs: transfer custom attributes for paramenters from
5126         the delegate declaration to Invoke and BeginInvoke.
5127
5128 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5129
5130         * attribute.cs: handle custom marshalers and emit marshal info
5131         for fields, too.
5132
5133 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5134
5135         * makefile.gnu: Added anonymous.cs to the compiler sources.
5136
5137 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
5138
5139         * iterators.cs: Change the name of the proxy class to include two
5140         underscores.
5141
5142         * cs-parser.jay: Update grammar to include anonymous methods.
5143
5144         * anonymous.cs: new file.
5145
5146 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
5147
5148         * class.cs (Field.Define): Add missing test for pointers and
5149         safety. 
5150
5151 2003-05-27  Ravi Pratap  <ravi@ximian.com>
5152
5153         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
5154         we use the stobj opcode.
5155
5156         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
5157         since it wasn't the correct fix. 
5158
5159         It still is puzzling that we are required to use stobj for IntPtr
5160         which seems to be a ValueType.
5161
5162 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
5163
5164         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
5165         during regular simple name resolution.   Now, the trick is that
5166         instead of returning for processing the simplename, we do a
5167         TypeManager.LookupType (ie, a rooted lookup as opposed to a
5168         contextual lookup type).   If a match is found, return that, if
5169         not, return for further composition.
5170
5171         This fixes long-standing 30485.
5172
5173         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5174         using the address to initialize an object, do an Stobj instead of
5175         using the regular Stelem.
5176
5177         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
5178         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
5179         Because if we are a BaseIndexerAccess that value will be true.
5180         Fixes 43643.
5181
5182         * statement.cs (GotoCase.Resolve): Return after reporting an
5183         error, do not attempt to continue. 
5184
5185         * expression.cs (PointerArithmetic.Emit): If our operand is a
5186         long, convert our constants to match the operand before
5187         multiplying.  Convert to I type before adding.   Fixes 43670.
5188
5189 2003-05-14  Ravi Pratap  <ravi@ximian.com>
5190
5191         * enum.cs (ImplicitConversionExists) : Rename to
5192         ImplicitEnumConversionExists to remove ambiguity. 
5193
5194         * ecore.cs (NullCast): New type of cast expression class which
5195         basically is very similar to EmptyCast with the difference being
5196         it still is a constant since it is used only to cast a null to
5197         something else
5198         (eg. (string) null)
5199
5200         * convert.cs (ImplicitReferenceConversion): When casting a null
5201         literal, we return a NullCast.
5202
5203         * literal.cs (NullLiteralTyped): Remove - I don't see why this
5204         should be around anymore.
5205
5206         The renaming (reported was slightly wrong). Corrections:
5207
5208         ConvertImplicitStandard -> ImplicitConversionStandard
5209         ConvertExplicitStandard -> ExplicitConversionStandard
5210
5211         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
5212         before passing them in !
5213
5214         * convert.cs (ImplicitConversionStandard): When comparing for
5215         equal expr and target types, ensure that expr is not a
5216         NullLiteral.
5217
5218         In general, we must not be checking (expr_type ==
5219         target_type) in the top level conversion methods
5220         (ImplicitConversion, ExplicitConversion etc). This checking is
5221         done in the methods that they delegate to.
5222
5223 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
5224
5225         * convert.cs: Move Error_CannotConvertType,
5226         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
5227         ImplicitNumericConversion, ImplicitConversionExists,
5228         ImplicitUserConversionExists, StandardConversionExists,
5229         FindMostEncompassedType, FindMostSpecificSource,
5230         FindMostSpecificTarget, ImplicitUserConversion,
5231         ExplicitUserConversion, GetConversionOperators,
5232         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
5233         TryImplicitIntConversion, Error_CannotConvertImplicit,
5234         ConvertImplicitRequired, ConvertNumericExplicit,
5235         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
5236         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
5237         its own file.
5238
5239         Perform the following renames:
5240
5241         StandardConversionExists -> ImplicitStandardConversionExists
5242         ConvertImplicit -> ImplicitConversion
5243         ConvertImplicitStandard -> ImplicitStandardConversion
5244         TryImplicitIntConversion -> ImplicitIntConversion
5245         ConvertImplicitRequired -> ImplicitConversionRequired
5246         ConvertNumericExplicit -> ExplicitNumericConversion
5247         ConvertReferenceExplicit -> ExplicitReferenceConversion
5248         ConvertExplicit -> ExplicitConversion
5249         ConvertExplicitStandard -> ExplicitStandardConversion
5250
5251 2003-05-19  Martin Baulig  <martin@ximian.com>
5252
5253         * statement.cs (TypeInfo.StructInfo): Made this type protected.
5254         (TypeInfo): Added support for structs having structs as fields.
5255
5256         * ecore.cs (FieldExpr): Implement IVariable.
5257         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
5258         VariableInfo for the field.
5259
5260 2003-05-18  Martin Baulig  <martin@ximian.com>
5261
5262         * expression.cs (This.DoResolve): Report a CS0027 if we're
5263         emitting a field initializer.
5264
5265 2003-05-18  Martin Baulig  <martin@ximian.com>
5266
5267         * expression.cs (This.ResolveBase): New public function.
5268         (This.DoResolve): Check for CS0188.
5269
5270         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
5271         This.Resolve().
5272
5273         * ecore.cs (MethodGroupExpr.DoResolve): Set the
5274         `instance_expression' to null if we don't have any non-static
5275         methods.
5276
5277 2003-05-18  Martin Baulig  <martin@ximian.com>
5278
5279         Reworked the way how local variables and parameters are handled by
5280         the flow analysis code.
5281
5282         * statement.cs (TypeInfo, VariableMap): New public classes.
5283         (VariableInfo): New public class.  This is now responsible for
5284         checking whether a variable has been assigned.  It is used for
5285         parameters and local variables.
5286         (Block.EmitMeta): Take the InternalParameters as argument; compute
5287         the layout of the flow vectors here.
5288         (Block.LocalMap, Block.ParameterMap): New public properties.
5289         (FlowBranching): The .ctor doesn't get the InternalParameters
5290         anymore since Block.EmitMeta() now computes the layout of the flow
5291         vector.
5292         (MyStructInfo): This class is now known as `StructInfo' and nested
5293         in `TypeInfo'; we don't access this directly anymore.
5294
5295         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
5296         property and removed IsAssigned(), IsFieldAssigned(),
5297         SetAssigned() and SetFieldAssigned(); we now call them on the
5298         VariableInfo so we don't need to duplicate this code everywhere.
5299
5300         * expression.cs (ParameterReference): Added `Block block' argument
5301         to the .ctor.
5302         (LocalVariableReference, ParameterReference, This): The new
5303         VariableInfo class is now responsible for all the definite
5304         assignment stuff.
5305
5306         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
5307         IsParameterAssigned, SetParameterAssigned): Removed.
5308
5309 2003-05-18  Martin Baulig  <martin@ximian.com>
5310
5311         * typemanager.cs (InitCoreTypes): Try calling
5312         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
5313         the 3-args-version.  Corlib now also needs our `void_type'.
5314         (GetMethod): Added overloaded version which takes an optional
5315         `bool report_errors' to allow lookups of optional methods.
5316
5317 2003-05-12  Martin Baulig  <martin@ximian.com>
5318
5319         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
5320         only used for locals and not for parameters.
5321
5322 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
5323
5324         * support.cs (InternalParameters.ParameterType): Return the
5325         ExternalType of the parameter.
5326
5327         * parameter.cs (Parameter.ExternalType): drop the two arguments,
5328         they were unused.
5329
5330 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
5331
5332         * class.cs (MethodData.Define): Do not set the `newslot' on
5333         interface members, if they are also flagged as "override".
5334
5335         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
5336         better code for ++i and i++.  This only works for static fields
5337         and local variables.
5338
5339         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
5340         want to pull the DeclSpace out of the builder_to_declspace instead
5341         of the TypeBuilder (like in TypeContainer.FindMembers).
5342
5343         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
5344         instead of LookupTypeContainer.  Fixes the crash on .NET for
5345         looking up interface members.
5346
5347         * const.cs: Create our own emit context during the Definition
5348         stage, so that constants are evaluated in the proper context, when
5349         a recursive definition happens.
5350
5351 2003-05-11  Martin Baulig  <martin@ximian.com>
5352
5353         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
5354         new block for a switch section.
5355         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
5356         the adding/lookup in the switch block.  Fixes #39828.
5357
5358 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
5359
5360         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
5361         functionality: I needed to convert the data after I had performed
5362         the add/sub operation into the operands type size.
5363
5364         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
5365         pass the type for the box operation, otherwise the resulting
5366         object would have been of type object.
5367
5368         (BoxedCast): Add constructor to specify the type to box as.
5369
5370 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
5371
5372         * iterators.cs: I was reusing the `count' variable inadvertently,
5373         take steps to not allow this to happen.
5374
5375 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
5376
5377         * attribute.cs (Attribute.Resolve): Params attributes are encoded
5378         by creating an array at the point where the params starts and
5379         putting all those arguments there, then adjusting the size of the
5380         array.
5381
5382 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
5383
5384         * expression.cs (New.AddressOf): Implement interface
5385         IMemoryLocation.  This is used when the `new' operator is used in
5386         the context of an invocation to a method on a value type.
5387
5388         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
5389         example. 
5390
5391         * namespace.cs: Also check the using aliases here.
5392
5393         * driver.cs: Move the test for using validity after the types have
5394         been entered, so we do a single pass that also includes the using
5395         aliases. 
5396
5397         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
5398         in the regular case.   CreateSiblingForFinally is doing extra
5399         error checking.
5400
5401         * attribute.cs (GetAttributeArgumentExpression): Store the result
5402         on an out value, and use the return value to indicate failure
5403         instead of using null (which is a valid return for Constant.GetValue).
5404
5405         * statement.cs: Perform the analysis flow for the increment
5406         portion after the statement, because this will be the real flow of
5407         execution.  Fixes #42385
5408
5409         * codegen.cs (EmitContext.EmitArgument,
5410         EmitContext.EmitStoreArgument): New helper functions when the
5411         RemapToProxy flag is set.
5412
5413         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
5414         function.
5415
5416         Add support for remapping parameters. 
5417
5418         * iterators.cs: Propagate parameter values;  Store parameter
5419         values in the proxy classes.
5420
5421 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
5422
5423         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
5424         need a proxy reference;  I do not know what I was thinking
5425
5426         * cs-parser.jay (constructor_initializer): catch another error,
5427         and display nice message.
5428
5429         (field_declaration): catch void field declaration
5430         to flag a better error. 
5431
5432         * class.cs (MemberBase.CheckBase): Report an error instead of a
5433         warning if a new protected member is declared in a struct. 
5434         (Field.Define): catch the error of readonly/volatile.
5435
5436         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
5437
5438         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
5439         volatile variable is taken
5440
5441 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
5442
5443         * statement.cs (Fixed.Resolve): Report an error if we are not in
5444         an unsafe context.
5445
5446 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
5447
5448         * typemanager.cs: reuse the code that handles type clashes for
5449         delegates and enumerations.
5450
5451         * class.cs (Report28): Always report.
5452
5453         * expression.cs (EncodeAsAttribute): Allow nulls here.
5454
5455 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
5456
5457         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
5458         the functionality for testing whether an expression is valid for
5459         an attribute here.  Also handle the case of arrays of elements
5460         being stored. 
5461
5462         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
5463         encoding a linear array into an array of objects that are suitable
5464         to be passed to an CustomAttributeBuilder.
5465
5466         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
5467
5468         * ecore.cs: (FieldExpr): Handle field remapping here.
5469
5470         * iteratators.cs: Pass the instance variable (if the method is an
5471         instance method) to the constructors, so we can access the field
5472         variables on the class.
5473
5474         TODO: Test this with structs.  I think the THIS variable on
5475         structs might have to be a pointer, and not a refenrece
5476
5477 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
5478
5479         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
5480         local variables to fields in a proxy class.
5481
5482         * iterators.cs (PopulateProxy): Rename our internal fields to
5483         <XXX>.  
5484         Create a <THIS> field if we are an instance method, so we can
5485         reference our parent container variables.
5486         (MapVariable): Called back from the EmitContext code to enter a
5487         new variable to field mapping into the proxy class (we just create
5488         a FieldBuilder).
5489
5490         * expression.cs
5491         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
5492         for using the remapped locals to fields.
5493
5494         I placed the code here, because that gives the same semantics to
5495         local variables, and only changes the Emit code.
5496
5497         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
5498         statements inside iterators.
5499         (VariableInfo): Add a FieldBuilder for the cases when we are
5500         remapping local variables to fields in a proxy class
5501
5502         * ecore.cs (SimpleNameResolve): Avoid testing two times for
5503         current_block != null.
5504
5505         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
5506         not cope with strings, as it has been moved to the
5507         TableSwitchEmit.  Fixed bug in switch generation.
5508
5509         * expression.cs (New.DoResolve): Provide more context for the user
5510         when reporting an error.
5511
5512         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
5513         pointers. 
5514
5515         * expression.cs (MemberAccess.DoResolve): When we get a type back,
5516         check the permissions for it.  Note than in a type-resolution
5517         context the check was already present in DeclSpace.ResolveType,
5518         but was missing from the MemberAccess.
5519
5520         (ArrayCreation.CheckIndices): warn if the user has
5521         more nested levels of expressions, but there are no more
5522         dimensions specified.  Avoids crash on bug 41906.
5523
5524 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
5525
5526         * statement.cs (Block): replace Implicit bool, for a generic
5527         flags.   
5528         New flag: `Unchecked'.  This is used during the EmitMeta phase
5529         (which is out-of-line with the regular Resolve/Emit process for a
5530         statement, as this is done ahead of time, but still gets a chance
5531         to call constant resolve).
5532
5533         (Block.Flags): new enum for adding a new flag.
5534
5535         (Block.EmitMeta): track the state of unchecked.
5536
5537         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
5538         to enable constant resolution to work there as well.
5539
5540 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
5541
5542         * typemanager.cs (ienumerable_type): Also look up
5543         System.Collections.IEnumerable. 
5544
5545 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
5546
5547         TODO: Test more than one conditional per method.
5548
5549         * class.cs (Indexer.Define): Report the location where the user is
5550         referencing the unsupported feature.
5551
5552         (MethodData): Overload the use of `conditionals' to
5553         minimize the creation of needless ArrayLists.   This saves roughly
5554         212kb on my machine.
5555
5556         (Method): Implement the new IIteratorContainer interface.
5557         (Method.SetYields): Implement the method by setting the ModFlags
5558         to contain METHOD_YIELDS.
5559
5560         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
5561         which just got set to null.
5562
5563         * iterators.cs: New file.
5564
5565         (Yield, YieldBreak): New statements.
5566
5567         * statement.cs (Return.Resolve): Flag an error if we are used in
5568         an iterator method.
5569
5570         * codegen.cs (InIterator): New flag set if the code is being
5571         compiled in an iterator method.
5572
5573         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
5574         internal modifier, and we just use it to avoid adding extra
5575         fields, as this is seldom used.  
5576
5577         * cs-parser.jay: Add yield_statement (yield and yield break).
5578
5579         * driver.cs: New flag -v2 to turn on version 2 features. 
5580
5581         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
5582         hashtable when v2 is enabled.
5583
5584 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
5585
5586         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
5587         there is already a namespace defined with this name.
5588
5589         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
5590         people upgraded their corlibs.
5591
5592         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
5593         always use fully qualified types, no need to use the compiler
5594         front end.
5595
5596         (TypeManager.IsNamespace): Use binarysearch.
5597
5598         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
5599         AddDelegate): I did not quite use the new IsValid API properly: I
5600         have to pass the short-name and the fullname.  I was passing only
5601         the basename instead of the fullname sometimes. 
5602
5603         (TypeContainer.DefineType): call NamespaceClash.
5604
5605         * interface.cs (Interface.DefineType): use NamespaceClash before
5606         defining the type.
5607
5608         * delegate.cs (Delegate.DefineType): use NamespaceClash before
5609         defining the type.
5610
5611         * enum.cs: (Enum.DefineType): use NamespaceClash before
5612         defining the type.
5613
5614         * typemanager.cs (: 3-line patch that gives us some tasty 11%
5615         speed increase.  First, use the negative_hits cache when we get a
5616         negative.  Second, add the type with its full original name
5617         instead of the new . and + encoded name (reflection uses + to
5618         separate type from a nested type).  Use LookupTypeReflection
5619         directly which bypasses the type->name hashtable (that we already
5620         know does not contain the type.
5621
5622         * decl.cs (DeclSpace.ResolveTypeExpr): track the
5623         location/container type. 
5624
5625         * driver.cs: When passing utf8, use directly the UTF8Encoding.
5626
5627 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
5628
5629         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
5630
5631         * delegate.cs (NewDelegate.Resolve): Test whether an instance
5632         method is being referenced in the method group from a static
5633         context, and report error 120 if so.
5634
5635         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
5636         Error118. 
5637
5638         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
5639         is created, we create the A namespace).
5640
5641         * cs-parser.jay: A namespace also introduces a DeclarationFound.
5642         Fixes #41591
5643
5644 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
5645
5646         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
5647         invocation to ModuleBuilder.GetType with the same values will
5648         return a new type instance, so we need to cache its return
5649         values. 
5650
5651         * expression.cs (Binary.ResolveOperator): Only allow the compare
5652         operators on enums if they are of the same type.
5653
5654         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
5655         types of ValueType on their own case.  Before we were giving them
5656         the same treatment as objects.
5657
5658         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
5659         fullname.  Short name is used to compare against container name.
5660         Fullname is used to check against defined namespace names.
5661
5662         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
5663         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
5664
5665         (Method.CheckBase): Call parent.
5666         (MemberBase.CheckBase): Check for protected members on sealed
5667         classes.
5668         (PropertyBase.CheckBase): Call parent.
5669         (Field.Define): Call parent.
5670
5671         * report.cs: Negative error codes are now mapped to 8000 - code,
5672         so that the display is render more nicely.
5673
5674         * typemanager.cs: Do not use try/catch, instead report a regular
5675         error. 
5676
5677         (GetPointerType, GetReferenceType): These methods provide
5678         mechanisms to obtain the T* and T& from a T.  We had the code
5679         previously scattered around the code base, and it also used
5680         TypeManager.LookupType that would go through plenty of caches.
5681         This one goes directly to the type source.
5682
5683         In some places we did the Type.GetType followed by
5684         ModuleBuilder.GetType, but not in others, so this unifies the
5685         processing as well.
5686
5687         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
5688         statements now that we have namespace information.
5689
5690         * typemanager.cs (IsNamespace): New method, returns whether the
5691         string presented is a namespace or not.
5692
5693         (ComputeNamespaces): New public entry point, computes the list of
5694         available namespaces, using the GetNamespaces API call in Mono, or
5695         the slower version in MS.NET.   
5696
5697         Now before we start the semantic analysis phase, we have a
5698         complete list of namespaces including everything that the user has
5699         provided.
5700
5701         Deleted old code to cache namespaces in .nsc files.
5702
5703 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
5704
5705         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
5706         class/struct location definition Location for the implicit
5707         constructor location.
5708
5709         (Operator.Define): Use the location of the operator for the
5710         implicit Method definition.
5711
5712         (Constructor.Emit): use the constructor location for the implicit
5713         base initializer constructor.
5714
5715         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
5716         and the Expression class now contains two new methods:
5717
5718         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
5719         isolate type lookup from the rest of the resolution process.
5720
5721         Since we use Expressions to hold type definitions due to the way
5722         we parse the input we have historically overloaded Resolve to
5723         perform the Type lookups if a special flag is passed.  Now this is
5724         eliminated and two methods take their place. 
5725
5726         The differences in the two methods between xStep and xTerminal is
5727         that xStep is involved in our current lookup system that uses
5728         SimpleNames to compose a name, while xTerminal is used just to
5729         catch the case where the simplename lookup failed.
5730
5731 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
5732
5733         * expression.cs (ResolveMemberAccess): Remove redundant code.
5734         TypeExpr expressions are always born fully resolved.
5735
5736         * interface.cs (PopulateMethod): Do not lookup the types twice.
5737         We were doing it once during SemanticAnalysis and once during
5738         PopulateMethod.
5739
5740         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
5741         in local variable type definitions, were being returned as a
5742         SimpleName (we decomposed everything into a string), that is
5743         because primary_expression was being used instead of a type in the
5744         grammar (reduce/reduce conflicts).
5745
5746         The part that was wrong is that we converted the expression into a
5747         string (an oversimplification in one hand, compounded with primary
5748         expressions doing string concatenation).
5749
5750         So things like:
5751
5752         A.B.C [] x;
5753
5754         Would return "A.B.C[]" as a SimpleName.  This stopped things like
5755         using clauses from working on this particular context.  And a type
5756         was being matched directly against "A.B.C[]".
5757
5758         We now use the correct approach, and allow for ComposedCast to be
5759         part of the unary expression.  So the "A.B.C []" become a composed
5760         cast of "A.B.C" (as a nested group of MemberAccess with a
5761         SimpleName at the end) plus the rank composition "[]". 
5762
5763         Also fixes 35567
5764
5765 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
5766
5767         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
5768         for the access level checking.
5769
5770         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
5771         `TypeContainer container', because I kept getting confused when I
5772         was debugging this code.
5773
5774         * expression.cs (Indexers): Instead of tracking getters/setters,
5775         we now track them in parallel.  We create one arraylist less, but
5776         most importantly it is possible now for the LValue code to find a
5777         matching get for a set.
5778
5779         (IndexerAccess.DoResolveLValue): Update the code.
5780         GetIndexersForType has been modified already to extract all the
5781         indexers from a type.  The code assumed it did not.
5782
5783         Also make the code set the correct return type for the indexer.
5784         This was fixed a long time ago for properties, but was missing for
5785         indexers.  It used to be void_type.
5786
5787         (Binary.Emit): Test first for doubles instead of
5788         floats, as they are more common.
5789
5790         (Binary.EmitBranchable): Use the .un version of the branch opcodes
5791         when dealing with floats and the <=, >= operators.  This fixes bug
5792         #39314 
5793
5794         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
5795         to load the array value by emitting a load on the foreach variable
5796         type.  This was incorrect.  
5797
5798         We now emit the code to load an element using the the array
5799         variable type, and then we emit the conversion operator.
5800
5801         Fixed #40176
5802
5803 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
5804
5805         * attribute.cs: Avoid allocation of ArrayLists in the common case.
5806
5807 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
5808
5809         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
5810         test for protection before we test for signatures. 
5811
5812         (MethodSignature.ToString): implement.
5813
5814         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
5815         to the case where we reduced into a LongConstant.
5816
5817         * decl.cs (CheckAccessLevel): If the type is an array, we can not
5818         depend on whether the information is acurrate, because the
5819         Microsoft runtime will always claim that the array type is public,
5820         regardless of the real state.
5821
5822         If the type is a pointer, another problem happens: the type is
5823         reported as non-public in Microsoft.  
5824
5825         In both cases we have to call CheckAccessLevel recursively with
5826         the underlying type as the argument to be tested.
5827
5828 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
5829
5830         * assign.cs (Assign.Emit): If we are dealing with a compound
5831         assignment expression, we should use the code path that stores the
5832         intermediate result in a temporary value.  This fixes #40903.
5833
5834         *expression.cs (Indirection.ToString): Provide ToString method for
5835         debugging. 
5836
5837 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
5838
5839         * class.cs: Null out fields holding references to Block objects so
5840         they can be garbage collected.
5841
5842         * expression.cs (OverloadResolve): Remove unused local.
5843
5844 2003-04-07  Martin Baulig  <martin@ximian.com>
5845
5846         * codegen.cs (EmitContext.CurrentFile): New public field.
5847         (EmitContext.Mark): Use the CurrentFile to check whether the
5848         location is in the correct file.
5849         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
5850
5851 2003-04-07  Martin Baulig  <martin@ximian.com>
5852
5853         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
5854
5855         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
5856         location.  [FIXME: The location argument which gets passed to this
5857         method is sometimes wrong!]
5858
5859 2003-04-07  Nick Drochak <ndrochak@gol.com>
5860
5861         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
5862
5863 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
5864
5865         * expression.cs (Indirection.EmitAssign): We were using the
5866         temporary, but returning immediately instead of continuing the
5867         EmitAssing flow.
5868
5869 2003-04-06  Martin Baulig  <martin@ximian.com>
5870
5871         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
5872         if it's a nested child, but also deriving from the outer class.
5873         See test 190.cs.
5874
5875         * typemanager.cs (IsNestedChildOf): Make this work if it's a
5876         nested child, but also deriving from the outer class.  See
5877         test-190.cs.
5878         (FilterWithClosure): We may access private members of the outer
5879         class if we're a nested child and deriving from the outer class.
5880         (RealMemberLookup): Only set `closure_private_ok' if the
5881         `original_bf' contained BindingFlags.NonPublic.
5882
5883 2003-04-05  Martin Baulig  <martin@ximian.com>
5884
5885         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
5886
5887 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
5888
5889         * class.cs (Event.Define): Do not allow abstract events to have
5890         initializers. 
5891
5892 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
5893
5894         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
5895         block in event declarations.
5896
5897         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
5898         value type, get its address.
5899
5900         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
5901         leaving a class on the stack instead of a boolean value (int
5902         0/1).  Change the code so we compare against null, and then the
5903         result against zero.
5904
5905         * class.cs (TypeContainer.GetClassBases): We were checking for the
5906         parent class being sealed too late.
5907
5908         * expression.cs (Binary.Emit): For <= and >= when dealing with
5909         floating point values, use cgt.un and clt.un instead of cgt and
5910         clt alone.
5911
5912 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
5913
5914         * statement.cs: Apply the same optimization as MS: skip the 
5915         GetEnumerator returning an IEnumerator, and use the one returning a 
5916         CharEnumerator instead. This allows us to avoid the try-finally block 
5917         and the boxing.
5918
5919 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
5920
5921         * cs-parser.jay: Attributes cannot be applied to
5922                          namespaces. Fixes #40473
5923
5924 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5925
5926         * class.cs:
5927         (Add*): check if the name is valid using the full name for constants,
5928         fields, properties and events.
5929
5930 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
5931
5932         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
5933         char constants to be part of the enumeration.
5934
5935         * expression.cs (Conditional.DoResolve): Add support for operator
5936         true. Implements the missing functionality from 14.12
5937
5938         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
5939         operator true/false as required by the spec.
5940
5941         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
5942         implicit conversion to boolean.
5943
5944         * statement.cs (Statement.ResolveBoolean): A boolean expression is
5945         also one where the type implements `operator true'. 
5946
5947         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
5948         get an expression that will invoke operator true based on an
5949         expression.  
5950
5951         (GetConversionOperators): Removed the hack that called op_True
5952         here.  
5953
5954         (Expression.ResolveBoolean): Move this from Statement.
5955
5956 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
5957
5958         * ecore.cs (FieldExpr): do not allow initialization of initonly
5959         fields on derived classes
5960
5961 2003-03-13  Martin Baulig  <martin@ximian.com>
5962
5963         * statement.cs (Block.Emit): Call ig.BeginScope() and
5964         ig.EndScope() when compiling with debugging info; call
5965         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
5966
5967 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
5968
5969         * expression.cs (Indexers): Do not construct immediately, allow
5970         for new members to be appended as we go.  Fixes 38143
5971
5972 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5973
5974         * expression.cs: save/restore context when resolving an unchecked
5975         expression.
5976
5977 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
5978
5979         * cfold.cs: Catch division by zero in modulus operator during
5980         constant folding.
5981
5982 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
5983
5984         * interface.cs (Interface.DefineMembers): Avoid defining members
5985         twice. 
5986
5987 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
5988
5989         * driver.cs: handle the +/- options for -noconfig
5990
5991         * statement.cs (Unckeched.Resolve): Also track the state of
5992         unchecked in the Resolve phase.
5993
5994 2003-02-27  Martin Baulig  <martin@ximian.com>
5995
5996         * ecore.cs (Expression.MemberLookup): Don't create a
5997         MethodGroupExpr for something which is not a method.  Fixes #38291.
5998
5999 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6000
6001         * class.cs (MemberBase.CheckParameters): Also check that the type
6002         is unmanaged if it is a pointer.
6003
6004         * expression.cs (SizeOf.Resolve): Add location information.
6005
6006         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6007         a managed type is declared.
6008
6009         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6010         parameter modifiers as well.  Fixes bug 38606
6011
6012         * class.cs: Very sad.  Am backing out the speed up changes
6013         introduced by the ArrayList -> Array in the TypeContainer, as they
6014         were not actually that much faster, and introduced a bug (no error
6015         reports on duplicated methods).
6016
6017         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6018         source first, this will guarantee that we have a valid expression
6019         before calling in lower levels functions that will require a
6020         resolved object.  Then use this original_source in the
6021         target.ResolveLValue instead of the original source that was
6022         passed to us.
6023
6024         Another change.  Use target.Resolve instead of LValueResolve.
6025         Although we are resolving for LValues, we will let the Assign code
6026         take care of that (it will be called again from Resolve).  This
6027         basically allows code like this:
6028
6029         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6030         class Y { void A (X x) { x [0] += o; }
6031
6032         The problem was that the indexer was trying to resolve for
6033         set_Item (idx, object o) and never finding one.  The real set_Item
6034         was set_Item (idx, X).  By delaying the process we get the right
6035         semantics. 
6036
6037         Fixes bug 36505
6038
6039 2003-02-23  Martin Baulig  <martin@ximian.com>
6040
6041         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6042         while calling DoEmit ().
6043
6044         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6045         source files; if you use the #line directive inside a method, the
6046         compiler stops emitting line numbers for the debugger until it
6047         reaches the end of the method or another #line directive which
6048         restores the original file.
6049
6050 2003-02-23  Martin Baulig  <martin@ximian.com>
6051
6052         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6053
6054 2003-02-23  Martin Baulig  <martin@ximian.com>
6055
6056         * statement.cs (Block.AddChildVariableNames): We need to call this
6057         recursively, not just for our immediate children.
6058
6059 2003-02-23  Martin Baulig  <martin@ximian.com>
6060
6061         * class.cs (Event.Define): Always make the field private, like csc does.
6062
6063         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6064         actually work, fixes bug #37521.
6065
6066 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6067
6068         * delegate.cs: When creating the various temporary "Parameters"
6069         classes, make sure that we call the ComputeAndDefineParameterTypes
6070         on those new parameters (just like we do with the formal ones), to
6071         allow them to be resolved in the context of the DeclSpace.
6072
6073         This fixes the bug that Dick observed in Bugzilla #38530.
6074
6075 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6076
6077         * expression.cs (ResolveMemberAccess): When resolving a constant,
6078         do not attempt to pull a constant if the value was not able to
6079         generate a valid constant.
6080
6081         * const.cs (LookupConstantValue): Do not report more errors than required.
6082
6083 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6084
6085         * expression.cs: fixes bug #38328.
6086
6087 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6088
6089         * class.cs: Changed all the various members that can be part of a
6090         class from being an ArrayList to be an Array of the right type.
6091         During the DefineType type_list, interface_list, delegate_list and
6092         enum_list are turned into types, interfaces, delegates and enums
6093         arrays.  
6094
6095         And during the member population, indexer_list, event_list,
6096         constant_list, field_list, instance_constructor_list, method_list,
6097         operator_list and property_list are turned into their real arrays.
6098
6099         Although we could probably perform this operation earlier, for
6100         good error reporting we need to keep the lists and remove the
6101         lists for longer than required.
6102
6103         This optimization was triggered by Paolo profiling the compiler
6104         speed on the output of `gen-sample-program.pl' perl script. 
6105
6106         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6107         not crash in methods like MemberLookupFailed that use this field.  
6108
6109         This problem arises when the compiler fails to resolve a type
6110         during interface type definition for example.
6111
6112 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6113
6114         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
6115         inherit from System.Object, so we have to stop at null, not only
6116         when reaching System.Object.
6117
6118 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
6119
6120         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
6121         DeclaredOnly because the parent indexer might have had a different
6122         name, but did not loop until the top of the hierarchy was reached.
6123
6124         The problem this one fixes is 35492: when a class implemented an
6125         indexer from an interface, we were getting the interface method
6126         (which was abstract) and we were flagging an error (can not invoke
6127         abstract method).
6128
6129         This also keeps bug 33089 functioning, and test-148 functioning.
6130
6131         * typemanager.cs (IsSpecialMethod): The correct way of figuring
6132         out if a method is special is to see if it is declared in a
6133         property or event, or whether it is one of the predefined operator
6134         names.   This should fix correctly #36804.
6135
6136 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
6137
6138         The goal here is to remove the dependency on EmptyCast.Peel ().
6139         Killing it completely.
6140
6141         The problem is that currently in a number of places where
6142         constants are expected, we have to "probe" for an EmptyCast, and
6143         Peel, which is not the correct thing to do, as this will be
6144         repetitive and will likely lead to errors. 
6145
6146         The idea is to remove any EmptyCasts that are used in casts that
6147         can be reduced to constants, so we only have to cope with
6148         constants. 
6149
6150         This bug hunt was triggered by Bug 37363 and the desire to remove
6151         the duplicate pattern where we were "peeling" emptycasts to check
6152         whether they were constants.  Now constants will always be
6153         constants.
6154
6155         * ecore.cs: Use an enumconstant here instead of wrapping with
6156         EmptyCast.  
6157
6158         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
6159         throwing me off.  By handling this we can get rid of a few hacks.
6160
6161         * statement.cs (Switch): Removed Peel() code.
6162
6163 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
6164
6165         * class.cs: Location information for error 508
6166
6167         * expression.cs (New.DoResolve): Add a guard against double
6168         resolution of an expression.  
6169
6170         The New DoResolve might be called twice when initializing field
6171         expressions (see EmitFieldInitializers, the call to
6172         GetInitializerExpression will perform a resolve on the expression,
6173         and later the assign will trigger another resolution
6174
6175         This leads to bugs (#37014)
6176
6177         * delegate.cs: The signature for EndInvoke should contain any ref
6178         or out parameters as well.  We were not doing this in the past. 
6179
6180         * class.cs (Field.Define): Do not overwrite the type definition
6181         inside the `volatile' group.  Turns out that volatile enumerations
6182         were changing the type here to perform a validity test, which
6183         broke conversions. 
6184
6185 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
6186
6187         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
6188         and structs, we do not want to load the instance variable
6189
6190         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
6191         enum_type has to be handled like an object reference (implicit
6192         conversions exists from this to object), but the regular IsClass
6193         and IsValueType tests will never return true for this one.
6194
6195         Also we use TypeManager.IsValueType instead of type.IsValueType,
6196         just for consistency with the rest of the code (this is only
6197         needed if we ever use the construct exposed by test-180.cs inside
6198         corlib, which we dont today).
6199
6200 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
6201
6202         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
6203         just InternalCall.
6204
6205 2003-02-09  Martin Baulig  <martin@ximian.com>
6206
6207         * namespace.cs (Namespace..ctor): Added SourceFile argument.
6208         (Namespace.DefineNamespaces): New static public method; this is
6209         called when we're compiling with debugging to add all namespaces
6210         to the symbol file.
6211
6212         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
6213         pass it to the Namespace's .ctor.
6214
6215         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
6216         and MethodBase arguments; pass the namespace ID to the symwriter;
6217         pass the MethodBase instead of the token to the symwriter.
6218         (SymbolWriter.DefineNamespace): New method to add a namespace to
6219         the symbol file.
6220
6221 2003-02-09  Martin Baulig  <martin@ximian.com>
6222
6223         * symbolwriter.cs: New file.  This is a wrapper around
6224         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
6225         methods here in near future.
6226
6227 2003-02-09  Martin Baulig  <martin@ximian.com>
6228
6229         * codegen.cs (EmitContext.Mark): Just pass the arguments to
6230         ILGenerator.MarkSequencePoint() which are actually used by the
6231         symbol writer.
6232
6233 2003-02-09  Martin Baulig  <martin@ximian.com>
6234
6235         * location.cs (SourceFile): New public sealed class.  This
6236         contains the name and an index which is used in the location's token.
6237         (Location): Reserve an appropriate number of bits in the token for
6238         the source file instead of walking over that list, this gives us a
6239         really huge performance improvement when compiling with debugging.
6240
6241         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
6242         `SourceFile' argument instead of a string.
6243         (Driver.ProcessFile): Add all the files via Location.AddFile(),
6244         but don't parse/tokenize here, we need to generate the list of all
6245         source files before we do that.
6246         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
6247         the files.
6248
6249         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
6250         instead of a string.
6251
6252         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
6253         of a string.
6254
6255 2003-02-09  Martin Baulig  <martin@ximian.com>
6256
6257         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
6258         filename on `#line default'.
6259
6260 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
6261
6262         * statement.cs: don't clear the pinned var when the fixed statement
6263         returns from the method (fixes bug#37752).
6264
6265 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
6266
6267         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
6268         to IsValueType.
6269
6270 2003-02-07  Martin Baulig  <martin@ximian.com>
6271
6272         * driver.cs: Removed the `--debug-args' command line argument.
6273
6274         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
6275         automatically by the AsssemblyBuilder.
6276         (CodeGen.InitializeSymbolWriter): We don't need to call any
6277         initialization function on the symbol writer anymore.  This method
6278         doesn't take any arguments.
6279
6280 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
6281
6282         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
6283         from referenced assemblies as well.
6284
6285 2003-02-02  Martin Baulig  <martin@ximian.com>
6286
6287         * class.cs (MethodData.Emit): Generate debugging info for external methods.
6288
6289 2003-02-02  Martin Baulig  <martin@ximian.com>
6290
6291         * class.cs (Constructor.Emit): Open the symbol writer before
6292         emitting the constructor initializer.
6293         (ConstructorInitializer.Emit): Call ec.Mark() to allow
6294         single-stepping through constructor initializers.
6295
6296 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
6297
6298         * class.cs: Handle error 549: do not allow virtual methods in
6299         sealed classes. 
6300
6301 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
6302
6303         * decl.cs: Check access levels when resolving types
6304
6305 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
6306
6307         * statement.cs: Add parameters and locals set in catch blocks that might 
6308         return to set vector
6309
6310 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
6311
6312         * class.cs (Operator): Set the SpecialName flags for operators.
6313
6314         * expression.cs (Invocation.DoResolve): Only block calls to
6315         accessors and operators on SpecialName methods.
6316
6317         (Cast.TryReduce): Handle conversions from char constants.
6318
6319
6320 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
6321
6322         * statement.cs: small memory and time optimization in FlowBranching.
6323
6324 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
6325
6326         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
6327         problem that the last fix but in the other sid (Set).
6328
6329         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
6330         access when there is no indexer in the hierarchy.
6331
6332 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
6333
6334         * class.cs: Combine some if statements.
6335
6336 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6337
6338         * driver.cs: fixed bug #37187.
6339
6340 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
6341
6342         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
6343         any indexer, it's needed to build a list with all the indexers in the
6344         hierarchy (AllGetters), else we have problems. Fixes #35653.
6345
6346 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
6347
6348         * class.cs (MethodData.Define): It is wrong for an interface
6349         implementation to be static in both cases: explicit and implicit.
6350         We were only handling this in one case.
6351
6352         Improve the if situation there to not have negations.
6353
6354         * class.cs (Field.Define): Turns out that we do not need to check
6355         the unsafe bit on field definition, only on usage.  Remove the test.
6356
6357 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6358
6359         * driver.cs: use assembly.Location instead of Codebase (the latest
6360         patch made mcs fail when using MS assemblies).
6361
6362 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
6363
6364         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
6365         get the path to *corlib.dll.
6366
6367 2003-01-21  Nick Drochak <ndrochak@gol.com>
6368
6369         * cs-tokenizer.cs:
6370         * pending.cs:
6371         * typemanager.cs: Remove compiler warnings
6372
6373 2003-01-20  Duncan Mak  <duncan@ximian.com>
6374
6375         * AssemblyInfo.cs: Bump the version number to 0.19.
6376
6377 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6378
6379         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
6380
6381 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
6382
6383         * class.cs (Constructor::Emit): Emit debugging info for constructors.
6384
6385 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
6386
6387         * cs-parser.jay: Small fix: we were not comparing the constructor
6388         name correctly.   Thanks to Zoltan for the initial pointer.
6389
6390 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
6391
6392         * cs-tokenizer.cs: Set file name when specified with #line
6393
6394 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
6395
6396         * cs-parser.jay: Only perform the constructor checks here if we
6397         are named like the class;  This will help provider a better
6398         error.  The constructor path is taken when a type definition is
6399         not found, but most likely the user forgot to add the type, so
6400         report that rather than the constructor error.
6401
6402 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
6403
6404         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
6405         allocations.
6406
6407 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6408
6409         * cs-parser.jay: Add cleanup call.
6410
6411 2003-01-13  Duncan Mak  <duncan@ximian.com>
6412
6413         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
6414         consistent with other methods.
6415
6416 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6417
6418         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
6419
6420 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
6421
6422         * attribute.cs: only set GuidAttr to true when we have a
6423         GuidAttribute.
6424
6425 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6426
6427         * ecore.cs:
6428         * expression.cs:
6429         * typemanager.cs: fixes to allow mcs compile corlib with the new
6430         Type.IsSubclassOf fix.
6431
6432 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
6433
6434         * expression.cs (LocalVariableReference.DoResolve): Classify a
6435         constant as a value, not as a variable.   Also, set the type for
6436         the variable.
6437
6438         * cs-parser.jay (fixed_statement): take a type instead of a
6439         pointer_type, so we can produce a better error message later.
6440
6441         * statement.cs (Fixed.Resolve): Flag types that are not pointers
6442         as an error.  
6443
6444         (For.DoEmit): Make inifinite loops have a
6445         non-conditional branch back.
6446
6447         (Fixed.DoEmit): First populate the pinned variables, then emit the
6448         statement, then clear the variables.  Before I was emitting the
6449         code once for each fixed piece.
6450
6451
6452 2003-01-08  Martin Baulig  <martin@ximian.com>
6453
6454         * statement.cs (FlowBranching.MergeChild): A break in a
6455         SWITCH_SECTION does not leave a loop.  Fixes #36155.
6456
6457 2003-01-08  Martin Baulig  <martin@ximian.com>
6458
6459         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
6460         lives in the same number space than `param_map'.  Fixes #36154.
6461
6462 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
6463
6464         * cs-parser.jay (constructor_declaration): Set the
6465         Constructor.ModFlags before probing for it.  This makes the
6466         compiler report 514, 515 and 132 (the code was there, but got
6467         broken). 
6468
6469         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
6470         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
6471         (GotoCase.Resolve): Set `Returns' to ALWAYS.
6472
6473 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
6474
6475         * enum.cs: create the enum static fields using the enum type.
6476
6477 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
6478
6479         * class.cs: don't try to create the ParamBuilder for the return
6480         type if it's not needed (and handle it breaking for the ms runtime
6481         anyway).
6482
6483 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
6484
6485         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
6486
6487 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
6488
6489         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
6490         the command.   This showed up while compiling the JANET source
6491         code, which used \r as its only newline separator.
6492
6493 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
6494
6495         * class.cs (Method.Define): If we are an operator (because it
6496         reuses our code), then set the SpecialName and HideBySig.  #36128
6497
6498 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
6499
6500         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
6501         exception, report error 120 `object reference required'.
6502
6503         * driver.cs: Add --pause option, used during to measure the size
6504         of the process as it goes with --timestamp.
6505
6506         * expression.cs (Invocation.DoResolve): Do not allow methods with
6507         SpecialName to be invoked.
6508
6509 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
6510
6511         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
6512         number before adding it.
6513
6514 2002-12-21  Ravi Pratap  <ravi@ximian.com>
6515
6516         * ecore.cs (StandardImplicitConversion): When in an unsafe
6517         context, we allow conversion between void * to any other pointer
6518         type. This fixes bug #35973.
6519
6520 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
6521
6522         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
6523         is not thrown when extensionless outputs are used 
6524
6525 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6526
6527         * rootcontext.cs: fixed compilation of corlib.
6528
6529 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
6530
6531         * attribute.cs (Attributes.Contains): Add new method.
6532
6533         * class.cs (MethodCore.LabelParameters): if the parameter is an
6534         `out' parameter, check that no attribute `[In]' has been passed.
6535
6536         * enum.cs: Handle the `value__' name in an enumeration.
6537
6538 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
6539
6540         * decl.cs: Added special case to allow overrides on "protected
6541         internal" methods
6542
6543 2002-12-18  Ravi Pratap  <ravi@ximian.com>
6544
6545         * attribute.cs (Attributes.AddAttributeSection): Rename to this
6546         since it makes much more sense.
6547
6548         (Attributes.ctor): Don't require a Location parameter.
6549
6550         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
6551
6552         * attribute.cs (ApplyAttributes): Remove extra Location parameters
6553         since we already have that information per attribute.
6554
6555         * everywhere : make appropriate changes.
6556
6557         * class.cs (LabelParameters): Write the code which actually
6558         applies attributes to the return type. We can't do this on the MS
6559         .NET runtime so we flag a warning in the case an exception is
6560         thrown.
6561
6562 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
6563
6564         * const.cs: Handle implicit null conversions here too.
6565
6566 2002-12-17  Ravi Pratap  <ravi@ximian.com>
6567
6568         * class.cs (MethodCore.LabelParameters): Remove the extra
6569         Type [] parameter since it is completely unnecessary. Instead
6570         pass in the method's attributes so that we can extract
6571         the "return" attribute.
6572
6573 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
6574
6575         * cs-parser.jay (parse): Use Report.Error to flag errors instead
6576         of ignoring it and letting the compile continue.
6577
6578         * typemanager.cs (ChangeType): use an extra argument to return an
6579         error condition instead of throwing an exception.
6580
6581 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
6582
6583         * expression.cs (Unary.TryReduce): mimic the code for the regular
6584         code path.  Perform an implicit cast in the cases where we can
6585         implicitly convert to one of the integral types, and then reduce
6586         based on that constant.   This fixes bug #35483.
6587
6588 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6589
6590         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
6591
6592 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6593
6594         * namespace.cs: fixed bug #35489.
6595
6596 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
6597
6598         * class.cs: Remove some dead code.
6599
6600         * cs-parser.jay: Estimate the number of methods needed
6601         (RootContext.MethodCount);
6602
6603         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
6604         numbers instead of StringBuilders.
6605
6606         * support.cs (PtrHashtable): Add constructor with initial size;
6607         We can now reduce reallocations of the method table.
6608
6609 2002-12-10  Ravi Pratap  <ravi@ximian.com>
6610
6611         * attribute.cs (ApplyAttributes): Keep track of the emitted
6612         attributes on a per-target basis. This fixes bug #35413.
6613
6614 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
6615
6616         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
6617         default to the Windows 1252 encoding.
6618
6619         (UnixParseOption): Support version, thanks to Alp for the missing
6620         pointer. 
6621
6622         * AssemblyInfo.cs: Add nice assembly information.
6623
6624         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
6625         (bug 35169).
6626
6627         * cs-parser.jay: Allow a trailing comma before the close bracked
6628         in the attribute_section production.
6629
6630         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
6631         address of the instance was being taken, I will take this out,
6632         because we take the address of the object immediately here.
6633
6634 2002-12-09  Ravi Pratap  <ravi@ximian.com>
6635
6636         * typemanager.cs (AreMultipleAllowed): Take care of the most
6637         obvious case where attribute type is not in the current assembly -
6638         stupid me ;-)
6639
6640 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
6641
6642         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
6643         definitions, instead of doing that afterwards.  
6644
6645         Also we use a nice little hack, depending on the constructor, we
6646         know if we are a "composed" name or a simple name.  Hence, we
6647         avoid the IndexOf test, and we avoid 
6648
6649         * codegen.cs: Add code to assist in a bug reporter to track down
6650         the source of a compiler crash. 
6651
6652 2002-12-07  Ravi Pratap  <ravi@ximian.com>
6653
6654         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
6655         types have been emitted for a given element and flag an error
6656         if something which does not have AllowMultiple set is used more
6657         than once.
6658
6659         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
6660         attribute types and their corresponding AllowMultiple properties
6661
6662         (AreMultipleAllowed): Check the property for a given type.
6663
6664         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
6665         property in the case we have a TypeContainer.
6666
6667         (Attributes.AddAttribute): Detect duplicates and just skip on
6668         adding them. This trivial fix catches a pretty gross error in our
6669         attribute emission - global attributes were being emitted twice!
6670
6671         Bugzilla bug #33187 is now fixed.
6672
6673 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
6674
6675         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
6676         instead of pp_and).
6677
6678         * expression.cs (Binary.ResolveOperator): I can only use the
6679         Concat (string, string, string) and Concat (string, string,
6680         string, string) if the child is actually a concatenation of
6681         strings. 
6682
6683 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
6684
6685         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
6686         context where we need a 2-character lookahead.
6687
6688         * pending.cs (PendingImplementation): Rework so we can keep track
6689         of interface types all the time, and flag those which were
6690         implemented by parents as optional.
6691
6692 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
6693
6694         * expression.cs (Binary.ResolveOperator): Use
6695         String.Concat(string,string,string) or
6696         String.Concat(string,string,string,string) when possible. 
6697
6698         * typemanager: More helper methods.
6699
6700
6701 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
6702
6703         * pending.cs: remove the bogus return from GetMissingInterfaces()
6704         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
6705
6706 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6707
6708         * namespace.cs: avoid duplicated 'using xxx' being added to
6709         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
6710         when we get more than one 'using' statement for the same namespace.
6711         Report a CS0105 warning for it.
6712
6713 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
6714
6715         * cs-tokenizer.cs (consume_identifier): use read directly, instead
6716         of calling getChar/putback, uses internal knowledge of it.    
6717
6718         (xtoken): Reorder tokenizer so most common patterns are checked
6719         first.  This reduces the compilation time in another 5% (from 8.11s
6720         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
6721
6722         The parsing time is 22% of the compilation in mcs, and from that
6723         64% is spent on the tokenization process.  
6724
6725         I tried using a binary search for keywords, but this is slower
6726         than the hashtable.  Another option would be to do a couple of
6727         things:
6728
6729                 * Not use a StringBuilder, instead use an array of chars,
6730                   with a set value.  Notice that this way we could catch
6731                   the 645 error without having to do it *afterwards*.
6732
6733                 * We could write a hand-parser to avoid the hashtable
6734                   compares altogether.
6735
6736         The identifier consumption process takes 37% of the tokenization
6737         time.  Another 15% is spent on is_number.  56% of the time spent
6738         on is_number is spent on Int64.Parse:
6739
6740                 * We could probably choose based on the string length to
6741                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
6742                   computations. 
6743
6744         Another 3% is spend on wrapping `xtoken' in the `token' function.
6745
6746         Handle 0xa0 as whitespace (#34752)
6747
6748 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
6749
6750         * typemanager.cs (IsCLRType): New routine to tell whether a type
6751         is one of the builtin types.  
6752
6753         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
6754         typecode in more places instead of doing pointer comparissions.
6755         We could leverage some knowledge about the way the typecodes are
6756         laid out.
6757
6758         New code to cache namespaces in assemblies, it is currently not
6759         invoked, to be used soon.
6760
6761         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
6762
6763         * expression.cs (Binary.ResolveOperator): specially handle
6764         strings, and do not perform user-defined operator overloading for
6765         built-in types.
6766
6767 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
6768
6769         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
6770         internalcall as it is a pretty simple operation;  Avoid whenever
6771         possible to call Char.IsLetter.
6772
6773         (consume_identifier): Cut by half the number of
6774         hashtable calls by merging the is_keyword and GetKeyword behavior.
6775
6776         Do not short-circuit, because if we do, we
6777         report errors (ie, #if false && true would produce an invalid
6778         directive error);
6779
6780
6781 2002-11-24  Martin Baulig  <martin@ximian.com>
6782
6783         * expression.cs (Cast.TryReduce): If we're in checked syntax,
6784         check constant ranges and report a CS0221.  Fixes #33186.
6785
6786 2002-11-24  Martin Baulig  <martin@ximian.com>
6787
6788         * cs-parser.jay: Make this work for uninitialized variable
6789         declarations in the `for' initializer.  Fixes #32416.
6790
6791 2002-11-24  Martin Baulig  <martin@ximian.com>
6792
6793         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
6794         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
6795
6796 2002-11-24  Martin Baulig  <martin@ximian.com>
6797
6798         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
6799         argument; if true, we also check for user-defined conversions.
6800         This is only needed if both arguments are of a user-defined type.
6801         Fixes #30443, added test-175.cs.
6802         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
6803
6804         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
6805
6806 2002-11-24  Martin Baulig  <martin@ximian.com>
6807
6808         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
6809         function to get the store opcode.
6810         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
6811         only emit the Ldelema if the store opcode is Stobj.  You must run
6812         both test-34 and test-167 to test this.  Fixes #34529.
6813
6814 2002-11-23  Martin Baulig  <martin@ximian.com>
6815
6816         * ecore.cs (Expression.MemberLookup): Added additional
6817         `qualifier_type' argument which is used when we're being called
6818         from MemberAccess.DoResolve() and null if we're called from a
6819         SimpleName lookup.
6820         (Expression.MemberLookupFailed): New method to report errors; this
6821         does the CS1540 check and reports the correct error message.
6822
6823         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
6824         argument for the CS1540 check and redone the way how we're dealing
6825         with private members.  See the comment in the source code for details.
6826         (FilterWithClosure): Reverted this back to revision 1.197; renamed
6827         `closure_start_type' to `closure_qualifier_type' and check whether
6828         it's not null.  It was not this filter being broken, it was just
6829         being called with the wrong arguments.
6830
6831         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
6832         and pass it the correct `qualifier_type'; this also does the error
6833         handling for us.
6834
6835 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
6836
6837         * expression.cs (Invocation.EmitParams): If the we are dealing
6838         with a non-built-in value type, load its address as well.
6839
6840         (ArrayCreation): Use a a pretty constant instead
6841         of the hardcoded value 2.   Use 6 instead of 2 for the number of
6842         static initializers.  
6843
6844         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
6845         because they are not really value types, just glorified integers. 
6846
6847         * driver.cs: Do not append .exe, the CSC compiler does not do it.
6848
6849         * ecore.cs: Remove redundant code for enumerations, make them use
6850         the same code path as everything else, fixes the casting issue
6851         with enumerations in Windows.Forms.
6852
6853         * attribute.cs: Do only cast to string if it is a string, the
6854         validation happens later.
6855
6856         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
6857         people upgrade their corlibs.
6858
6859         * ecore.cs: Oops, enumerations were not following the entire code path
6860
6861 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
6862
6863         * typemanager.cs (FilterWithClosure): Commented out the test for
6864         1540 in typemanager.cs, as it has problems when accessing
6865         protected methods from a parent class (see test-174.cs). 
6866
6867         * attribute.cs (Attribute.ValidateGuid): new method.
6868         (Attribute.Resolve): Use above.
6869
6870 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
6871
6872         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
6873
6874         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
6875         handling for enumerations, as we only needed the TypeContainer
6876         functionality to begin with (this is required for the fix below to
6877         work for enums that reference constants in a container class for
6878         example). 
6879
6880         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
6881
6882         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
6883         a valid TypeBuilder to perform lookups on.o
6884
6885         * class.cs (InheritableMemberSignatureCompare): Use true in the
6886         call to GetGetMethod and GetSetMethod, because we are comparing
6887         the signature, and we need to get the methods *even* if they are
6888         private. 
6889
6890         (PropertyBase.CheckBase): ditto.
6891
6892         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
6893         GotoCase.Resolve): Use Peel on EmpytCasts.
6894
6895         * ecore.cs (EmptyCast): drop child, add Peel method.
6896
6897 2002-11-17  Martin Baulig  <martin@ximian.com>
6898
6899         * ecore.cs (EmptyCast.Child): New public property.
6900
6901         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
6902         label resolved to an EmptyCast.  Fixes #34162.
6903         (GotoCase.Resolve): Likewise.
6904         (Block.EmitMeta): Likewise.
6905
6906 2002-11-17  Martin Baulig  <martin@ximian.com>
6907
6908         * expression.cs (Invocation.BetterConversion): Prefer int over
6909         uint; short over ushort; long over ulong for integer literals.
6910         Use ImplicitConversionExists instead of StandardConversionExists
6911         since we also need to check for user-defined implicit conversions.
6912         Fixes #34165.  Added test-173.cs.
6913
6914 2002-11-16  Martin Baulig  <martin@ximian.com>
6915
6916         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
6917         with the `true' and `false' literals.  Fixes #33151.
6918
6919 2002-11-16  Martin Baulig  <martin@ximian.com>
6920
6921         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
6922         October 22nd; don't do the cs1540 check for static members.
6923
6924         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
6925         now using our own filter here and doing the cs1540 check again.
6926
6927 2002-11-16  Martin Baulig  <martin@ximian.com>
6928
6929         * support.cs (InternalParameters): Don't crash if we don't have
6930         any fixed parameters.  Fixes #33532.
6931
6932 2002-11-16  Martin Baulig  <martin@ximian.com>
6933
6934         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
6935         when looking up static methods to make this work on Windows.
6936         Fixes #33773.
6937
6938 2002-11-16  Martin Baulig  <martin@ximian.com>
6939
6940         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
6941         a setter rather than using PropertyInfo.CanWrite.
6942
6943 2002-11-15  Nick Drochak  <ndrochak@gol.com>
6944
6945         * class.cs: Allow acces to block member by subclasses. Fixes build
6946         breaker.
6947
6948 2002-11-14  Martin Baulig  <martin@ximian.com>
6949
6950         * class.cs (Constructor.Emit): Added the extern/block check.
6951         Fixes bug #33678.
6952
6953 2002-11-14  Martin Baulig  <martin@ximian.com>
6954
6955         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
6956         iteration while looking for indexers, this is needed because the
6957         indexer may have a different name in our base classes.  Fixed the
6958         error reporting (no indexers at all, not get accessor, no
6959         overloaded match).  Fixes bug #33089.
6960         (IndexerAccess.DoResolveLValue): Likewise.
6961
6962 2002-11-14  Martin Baulig  <martin@ximian.com>
6963
6964         * class.cs (PropertyBase.CheckBase): Make this work for multiple
6965         indexers.  Fixes the first part of bug #33089.
6966         (MethodSignature.InheritableMemberSignatureCompare): Added support
6967         for properties.
6968
6969 2002-11-13  Ravi Pratap  <ravi@ximian.com>
6970
6971         * attribute.cs (Attribute.Resolve): Catch the
6972         NullReferenceException and report it since it isn't supposed to
6973         happen. 
6974
6975 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
6976
6977         * expression.cs (Binary.EmitBranchable): Also handle the cases for
6978         LogicalOr and LogicalAnd that can benefit from recursively
6979         handling EmitBranchable.  The code now should be nice for Paolo.
6980
6981 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
6982
6983         * typemanager.cs (LookupType): Added a negative-hit hashtable for
6984         the Type lookups, as we perform quite a number of lookups on
6985         non-Types.  This can be removed once we can deterministically tell
6986         whether we have a type or a namespace in advance.
6987
6988         But this might require special hacks from our corlib.
6989
6990         * TODO: updated.
6991
6992         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
6993         and double which avoids a conversion from an integer to a double.
6994
6995         * expression.cs: tiny optimization, avoid calling IsConstant,
6996         because it effectively performs the lookup twice.
6997
6998 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
6999
7000         But a bogus return here to keep the semantics of the old code
7001         until the Mono runtime is fixed.
7002
7003         * pending.cs (GetMissingInterfaces): New method used to remove all
7004         the interfaces that are already implemented by our parent
7005         classes from the list of pending methods. 
7006
7007         * interface.cs: Add checks for calls after ResolveTypeExpr.
7008
7009 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7010
7011         * class.cs (Class.Emit): Report warning 67: event not used if the
7012         warning level is beyond 3.
7013
7014         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7015         being a NullLiteral.
7016
7017         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7018         specifiers. 
7019
7020         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7021         path that might fail if a type can not be resolved.
7022
7023         * expression.cs (Binary.Emit): Emit unsigned versions of the
7024         operators. 
7025
7026         * driver.cs: use error 5.
7027
7028 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7029
7030         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7031
7032 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7033
7034         * cs-parser.jay (switch_section): A beautiful patch from Martin
7035         Baulig that fixed 33094.
7036
7037 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7038
7039         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7040         Check whether the base is abstract and report an error if so.
7041
7042         * expression.cs (IndexerAccess.DoResolveLValue,
7043         IndexerAccess.DoResolve): ditto. 
7044
7045         (Invocation.DoResolve): ditto.
7046
7047         (Invocation.FullMethodDesc): Improve the report string.
7048
7049         * statement.cs (Block): Eliminate IsVariableDefined as it is
7050         basically just a wrapper for GetVariableInfo.
7051
7052         * ecore.cs (SimpleName): Use new 
7053
7054         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7055         type, as we return the actual parameter ref/unref state on a
7056         different call.
7057
7058 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7059
7060         * support.cs: Return proper flags REF/OUT fixing the previous
7061         commit.  
7062
7063         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7064         not used to mean `ref' but `ref or out' in ParameterReference
7065
7066         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7067         full type signature instead of calling TypeManger.CSharpName
7068         ourselves. 
7069
7070         * support.cs (InternalParameters.ParameterDesc): Do not compare
7071         directly to the modflags, because REF/OUT will actually be bitsets
7072         if set. 
7073
7074         * delegate.cs (VerifyMethod): Check also the modifiers.
7075
7076         * cs-tokenizer.cs: Fix bug where floating point values with an
7077         exponent where a sign was missing was ignored.
7078
7079         * driver.cs: Allow multiple assemblies to be specified in a single
7080         /r: argument
7081
7082 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7083
7084         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7085         because identifiers after a parenthesis would end up in this kind
7086         of production, and we needed to desamiguate it for having casts
7087         like:
7088
7089                 (UserDefinedType *) xxx
7090
7091 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7092
7093         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7094         we should set on the Bindingflags.NonPublic, but not turn on
7095         private_ok.  private_ok controls whether a Private member is
7096         returned (this is chekced on the filter routine), while the
7097         BindingFlags.NonPublic just controls whether private/protected
7098         will be allowed.   This fixes the problem part of the problem of
7099         private properties being allowed to be used in derived classes.
7100
7101         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7102         so we can call the children DoResolveLValue method (this will
7103         properly signal errors on lvalue assignments to base properties)
7104
7105         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7106         getter are null, and we have a property info, we know that this
7107         happened because the lookup failed, so we report an error 122 for
7108         protection level violation.
7109
7110         We also silently return if setter and getter are null in the
7111         resolve functions, this condition only happens if we have flagged
7112         the error before.  This is the other half of the problem. 
7113
7114         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
7115         not have accessibility information, that is why we were returning
7116         true in the filter function in typemanager.cs.
7117
7118         To properly report 122 (property is inaccessible because of its
7119         protection level) correctly, we report this error in ResolveAccess
7120         by failing if both the setter and the getter are lacking (ie, the
7121         lookup failed). 
7122
7123         DoResolve and DoLResolve have been modified to check for both
7124         setter/getter being null and returning silently, the reason being
7125         that I did not want to put the knowledge about this error in upper
7126         layers, like:
7127
7128         int old = Report.Errors;
7129         x = new PropertyExpr (...);
7130         if (old != Report.Errors)
7131                 return null;
7132         else
7133                 return x;
7134
7135         So the property expr is returned, but it is invalid, so the error
7136         will be flagged during the resolve process. 
7137
7138         * class.cs: Remove InheritablePropertySignatureCompare from the
7139         class, as we no longer depend on the property signature to compute
7140         whether it is possible to implement a method or not.
7141
7142         The reason is that calling PropertyInfo.GetGetMethod will return
7143         null (in .NET, in Mono it works, and we should change this), in
7144         cases where the Get Method does not exist in that particular
7145         class.
7146
7147         So this code:
7148
7149         class X { public virtual int A { get { return 1; } } }
7150         class Y : X { }
7151         class Z : Y { public override int A { get { return 2; } } }
7152
7153         Would fail in Z because the parent (Y) would not have the property
7154         defined.  So we avoid this completely now (because the alternative
7155         fix was ugly and slow), and we now depend exclusively on the
7156         method names.
7157
7158         (PropertyBase.CheckBase): Use a method-base mechanism to find our
7159         reference method, instead of using the property.
7160
7161         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
7162         routines are gone now.
7163
7164         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
7165         names, they were incorrectly named.
7166
7167         * cs-tokenizer.cs: Return are more gentle token on failure. 
7168
7169         * pending.cs (PendingImplementation.InterfaceMethod): This routine
7170         had an out-of-sync index variable, which caused it to remove from
7171         the list of pending methods the wrong method sometimes.
7172
7173 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
7174
7175         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
7176         CanWrite, because those refer to this particular instance of the
7177         property, and do not take into account the fact that we can
7178         override single members of a property.
7179
7180         Constructor requires an EmitContext.  The resolution process does
7181         not happen here, but we need to compute the accessors before,
7182         because the resolution does not always happen for properties.
7183
7184         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
7185         subclass, before we did not update this flag, but we did update
7186         bindingflags. 
7187
7188         (GetAccessors): Drop this routine, as it did not work in the
7189         presence of partially overwritten set/get methods. 
7190
7191         Notice that this broke the cs1540 detection, but that will require
7192         more thinking. 
7193
7194 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7195
7196         * class.cs:
7197         * codegen.cs:
7198         * driver.cs: issue a warning instead of an error if we don't support
7199         debugging for the platform. Also ignore a couple of errors that may
7200         arise when trying to write the symbols. Undo my previous patch.
7201
7202 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7203
7204         * driver.cs: ignore /debug switch except for Unix platforms.
7205
7206 2002-10-23  Nick Drochak  <ndrochak@gol.com>
7207
7208         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
7209
7210 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
7211
7212         * driver.cs: Do not make mcs-debug conditional, so we do not break
7213         builds that use it.
7214
7215         * statement.cs (UsageVector.MergeChildren): I would like Martin to
7216         review this patch.  But basically after all the children variables
7217         have been merged, the value of "Breaks" was not being set to
7218         new_breaks for Switch blocks.  I think that it should be set after
7219         it has executed.  Currently I set this to the value of new_breaks,
7220         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
7221         conservative, but I do not understand this code very well.
7222
7223         I did not break anything in the build, so that is good ;-)
7224
7225         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
7226
7227 2002-10-20  Mark Crichton  <crichton@gimp.org>
7228
7229         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
7230
7231 2002-10-20  Nick Drochak  <ndrochak@gol.com>
7232
7233         * cfold.cs: Fixed compile blocker.
7234
7235 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
7236
7237         * driver.cs: I was chekcing the key, not the file.
7238
7239 2002-10-19  Ravi Pratap  <ravi@ximian.com>
7240
7241         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
7242         message that we were generating - we just need to silently return
7243         a null.
7244
7245 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
7246
7247         * class.cs (Event.Define): Change my previous commit, as this
7248         breaks the debugger.  This is a temporary hack, as it seems like
7249         the compiler is generating events incorrectly to begin with.
7250
7251         * expression.cs (Binary.ResolveOperator): Added support for 
7252         "U operator - (E x, E y)"
7253
7254         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
7255         y)".
7256
7257         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
7258         init-only variables, but this path did not take into account that
7259         there might be also instance readonly variables.  Correct this
7260         problem. 
7261
7262         This fixes bug 32253
7263
7264         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
7265         delegates as well.
7266
7267         * driver.cs: Change the extension for modules to `netmodule'
7268
7269         * cs-parser.jay: Improved slightly the location tracking for
7270         the debugger symbols.
7271
7272         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
7273         modifiers that were specified instead of the hardcoded value
7274         (FamAndAssem).  This was basically ignoring the static modifier,
7275         and others.  Fixes 32429.
7276
7277         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
7278         fixed a bug in the process (32476)
7279
7280         * expression.cs (ArrayAccess.EmitAssign): Patch from
7281         hwang_rob@yahoo.ca that fixes bug 31834.3
7282
7283 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
7284
7285         * driver.cs: Make the module extension .netmodule.
7286
7287 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
7288
7289         * driver.cs: Report an error if the resource file is not found
7290         instead of crashing.
7291
7292         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
7293         false, like Emit does.
7294
7295 2002-10-16  Nick Drochak  <ndrochak@gol.com>
7296
7297         * typemanager.cs: Remove unused private member.  Also reported mcs
7298         bug to report this as a warning like csc.
7299
7300 2002-10-15  Martin Baulig  <martin@gnome.org>
7301
7302         * statement.cs (Statement.Emit): Made this a virtual method; emits
7303         the line number info and calls DoEmit().
7304         (Statement.DoEmit): New protected abstract method, formerly knows
7305         as Statement.Emit().
7306
7307         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
7308
7309 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
7310
7311         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
7312         have fixed a remaining problem: not every AddXXXX was adding a
7313         fully qualified name.  
7314
7315         Now everyone registers a fully qualified name in the DeclSpace as
7316         being defined instead of the partial name.  
7317
7318         Downsides: we are slower than we need to be due to the excess
7319         copies and the names being registered this way.  
7320
7321         The reason for this is that we currently depend (on the corlib
7322         bootstrap for instance) that types are fully qualified, because
7323         we dump all the types in the namespace, and we should really have
7324         types inserted into the proper namespace, so we can only store the
7325         basenames in the defined_names array.
7326
7327 2002-10-10  Martin Baulig  <martin@gnome.org>
7328
7329         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
7330         from bug #31834, see the bug report for a testcase which is
7331         miscompiled.
7332
7333 2002-10-10  Martin Baulig  <martin@gnome.org>
7334
7335         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
7336         flow analysis code for this.
7337
7338         * statement.cs (Do, While, For): Tell the flow analysis code about
7339         infinite loops.
7340         (FlowBranching.UsageVector): Added support for infinite loops.
7341         (Block.Resolve): Moved the dead code elimination here and use flow
7342         analysis to do it.
7343
7344 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
7345
7346         * class.cs (Field.Define): Catch cycles on struct type
7347         definitions. 
7348
7349         * typemanager.cs (IsUnmanagedtype): Do not recursively check
7350         fields if the fields are static.  We only need to check instance
7351         fields. 
7352
7353         * expression.cs (As.DoResolve): Test for reference type.
7354
7355         * statement.cs (Using.ResolveExpression): Use
7356         ConvertImplicitRequired, not ConvertImplicit which reports an
7357         error on failture
7358         (Using.ResolveLocalVariableDecls): ditto.
7359
7360         * expression.cs (Binary.ResolveOperator): Report errors in a few
7361         places where we had to.
7362
7363         * typemanager.cs (IsUnmanagedtype): Finish implementation.
7364
7365 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
7366
7367         * expression.cs: Use StoreFromPtr instead of extracting the type
7368         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
7369
7370         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
7371         an enumeration value to a System.Enum, but System.Enum is not a
7372         value type, but an class type, so we need to box.
7373
7374         (Expression.ConvertExplicit): One codepath could return
7375         errors but not flag them.  Fix this.  Fixes #31853
7376
7377         * parameter.cs (Resolve): Do not allow void as a parameter type.
7378
7379 2002-10-06  Martin Baulig  <martin@gnome.org>
7380
7381         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
7382         if it's a class type and not a struct.  Fixes #31815.
7383
7384 2002-10-06  Martin Baulig  <martin@gnome.org>
7385
7386         * statement.cs: Reworked the flow analysis code a bit to make it
7387         usable for dead code elimination.
7388
7389 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7390
7391         * cs-parser.jay: allow empty source files. Fixes bug #31781.
7392
7393 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7394
7395         * expression.cs (ComposedCast.DoResolveType): A quick workaround
7396         to fix the test 165, will investigate deeper.
7397
7398 2002-10-04  Martin Baulig  <martin@gnome.org>
7399
7400         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
7401         finally blocks actually work.
7402         (Try.Resolve): We don't need to create a sibling for `finally' if
7403         there is no finally block.
7404
7405 2002-10-04  Martin Baulig  <martin@gnome.org>
7406
7407         * class.cs (Constructor.Define): The default accessibility for a
7408         non-default constructor is private, not public.
7409
7410 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7411
7412         * class.cs (Constructor): Make AllowedModifiers public, add
7413         EXTERN.
7414
7415         * cs-parser.jay: Perform the modifiers test here, as the
7416         constructor for the Constructor class usually receives a zero
7417         because of the way we create it (first we create, later we
7418         customize, and we were never checking the modifiers).
7419
7420         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
7421         is a version of LookupTypeReflection that includes the type-name
7422         cache.  This can be used as a fast path for functions that know
7423         the fully qualified name and are only calling into *.GetType() to
7424         obtain a composed type.
7425
7426         This is also used by TypeManager.LookupType during its type
7427         composition.
7428
7429         (LookupType): We now also track the real type name, as sometimes
7430         we can get a quey for the real type name from things like
7431         ComposedCast.  This fixes bug 31422.
7432
7433         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
7434         complete type fullname, it does not have to go through the type
7435         resolution system to obtain the composed version of the type (for
7436         obtaining arrays or pointers).
7437
7438         (Conditional.Emit): Use the EmitBoolExpression to
7439         generate nicer code, as requested by Paolo.
7440
7441         (ArrayCreation.CheckIndices): Use the patch from
7442         hwang_rob@yahoo.ca to validate the array initializers. 
7443
7444 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
7445
7446         * class.cs (ConstructorInitializer.Emit): simplify code by using
7447         Invocation.EmitCall, and at the same time, fix the bugs in calling
7448         parent constructors that took variable arguments. 
7449
7450         * ecore.cs (Expression.ConvertNumericExplicit,
7451         Expression.ImplicitNumericConversion): Remove the code that
7452         manually wrapped decimal (InternalTypeConstructor call is now gone
7453         as well).
7454
7455         * expression.cs (Cast.TryReduce): Also handle decimal types when
7456         trying to perform a constant fold on the type.
7457
7458         * typemanager.cs (IsUnmanagedtype): Partially implemented.
7459
7460         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
7461         that only turned off an error report, and did nothing else. 
7462
7463 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
7464
7465         * driver.cs: Handle and ignore /fullpaths
7466
7467 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
7468
7469         * expression.cs (Binary.ResolveOperator): Catch the case where
7470         DoNumericPromotions returns true, 
7471
7472         (Binary.DoNumericPromotions): Simplify the code, and the tests.
7473
7474 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
7475
7476         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
7477         report error 70.
7478
7479 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
7480
7481         * ecore.cs (ConvertNumericExplicit): It is not enough that the
7482         conversion exists, but it is also required that the conversion be
7483         performed.  This manifested in "(Type64Enum) 2".  
7484
7485         * class.cs (TypeManager.AddMethod): The fix is not to change
7486         AddEnum, because that one was using a fully qualified name (every
7487         DeclSpace derivative does), but to change the AddMethod routine
7488         that was using an un-namespaced name.  This now correctly reports
7489         the duplicated name.
7490
7491         Revert patch until I can properly fix it.  The issue
7492         is that we have a shared Type space across all namespaces
7493         currently, which is wrong.
7494
7495         Options include making the Namespace a DeclSpace, and merge
7496         current_namespace/current_container in the parser.
7497
7498 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
7499
7500         * cs-parser.jay: Improve error reporting when we get a different
7501         kind of expression in local_variable_type and
7502         local_variable_pointer_type. 
7503
7504         Propagate this to avoid missleading errors being reported.
7505
7506         * ecore.cs (ImplicitReferenceConversion): treat
7507         TypeManager.value_type as a target just like object_type.   As
7508         code like this:
7509
7510         ValueType v = 1;
7511
7512         Is valid, and needs to result in the int 1 being boxed before it
7513         is assigned to the value type v.
7514
7515         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
7516         to validate the enumeration name.
7517
7518         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
7519         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
7520         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
7521
7522         * ecore.cs (TryImplicitIntConversion): When doing an
7523         implicit-enumeration-conversion, check if the type is 64-bits and
7524         perform a conversion before passing to EnumConstant.
7525
7526 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
7527
7528         * decl.cs (Error_AmbiguousTypeReference); New routine used to
7529         report ambiguous type references.  Unlike the MS version, we
7530         report what the ambiguity is.   Innovation at work ;-)
7531
7532         (DeclSpace.FindType): Require a location argument to
7533         display when we display an ambiguous error.
7534
7535         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
7536
7537         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
7538
7539         * expression.cs (EmitDynamicInitializers): Apply patch from
7540         hwang_rob@yahoo.ca that fixes the order in which we emit our
7541         initializers. 
7542
7543 2002-09-21  Martin Baulig  <martin@gnome.org>
7544
7545         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
7546         delegate takes no arguments.
7547
7548 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
7549
7550         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
7551         from integers.
7552
7553         * expression.cs: Extract the underlying type.
7554
7555         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
7556
7557         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
7558
7559 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
7560
7561         * class.cs (TypeContainer.DefineType): We can not use the nice
7562         PackingSize with the size set to 1 DefineType method, because it
7563         will not allow us to define the interfaces that the struct
7564         implements.
7565
7566         This completes the fixing of bug 27287
7567
7568         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
7569         means also structs.  This fixes part of the problem. 
7570         (Expresion.ImplicitReferenceConversionExists): ditto.
7571
7572         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
7573         error if there were no errors reported during the type lookup
7574         process, to avoid duplicates or redundant errors.  Without this
7575         you would get an ambiguous errors plus a type not found.  We have
7576         beaten the user enough with the first error.  
7577
7578         (DeclSparce.FindType): Emit a warning if we have an ambiguous
7579         reference. 
7580
7581         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
7582         during the resolution process, stop the lookup, this avoids
7583         repeated error reports (same error twice).
7584
7585         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
7586
7587         * typemanager.cs (LookupType): Redo the type lookup code to match
7588         the needs of System.Reflection.  
7589
7590         The issue is that System.Reflection requires references to nested
7591         types to begin with a "+" sign instead of a dot.  So toplevel
7592         types look like: "NameSpace.TopLevelClass", and nested ones look
7593         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
7594         levels. 
7595
7596 2002-09-19  Martin Baulig  <martin@gnome.org>
7597
7598         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
7599         says that a method always returns or always throws an exception,
7600         don't report the CS0161.
7601
7602         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
7603         set `Returns = new_returns'.
7604
7605 2002-09-19  Martin Baulig  <martin@gnome.org>
7606
7607         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
7608         to an enum constant, check for a CS0176.
7609
7610 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
7611
7612         * class.cs (TypeContainer.CheckPairedOperators): Now we check
7613         for operators that must be in pairs and report errors.
7614
7615         * ecore.cs (SimpleName.DoResolveType): During the initial type
7616         resolution process, when we define types recursively, we must
7617         check first for types in our current scope before we perform
7618         lookups in the enclosing scopes.
7619
7620         * expression.cs (MakeByteBlob): Handle Decimal blobs.
7621
7622         (Invocation.VerifyArgumentsCompat): Call
7623         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
7624         I thought we were supposed to always call this, but there are a
7625         few places in the code where we dont do it.
7626
7627 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
7628
7629         * driver.cs: Add support in -linkres and -resource to specify the
7630         name of the identifier.
7631
7632 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7633
7634         * ecore.cs (StandardConversionExists): Sync with the conversion
7635         code: allow anything-* to void* conversions.
7636
7637         (FindMostSpecificSource): Use an Expression argument
7638         instead of a Type, because we might be handed over a Literal which
7639         gets a few more implicit conversions that plain types do not.  So
7640         this information was being lost.
7641
7642         Also, we drop the temporary type-holder expression when not
7643         required.
7644
7645 2002-09-17  Martin Baulig  <martin@gnome.org>
7646
7647         * class.cs (PropertyBase.CheckBase): Don't check the base class if
7648         this is an explicit interface implementation.
7649
7650 2002-09-17  Martin Baulig  <martin@gnome.org>
7651
7652         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
7653         different `IndexerName' attributes.
7654
7655         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
7656         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
7657         virtual CommonResolve().
7658
7659 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7660
7661         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
7662         and convert that to the UnderlyingType.
7663
7664         * statement.cs (Foreach.Resolve): Indexers are just like variables
7665         or PropertyAccesses.
7666
7667         * cs-tokenizer.cs (consume_string): Track line numbers and columns
7668         inside quoted strings, we were not doing this before.
7669
7670 2002-09-16  Martin Baulig  <martin@gnome.org>
7671
7672         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
7673         resolve it.  This is needed for the definite assignment check of the
7674         instance expression, fixes bug #29846.
7675         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
7676
7677 2002-09-16  Nick Drochak  <ndrochak@gol.com>
7678
7679         * parameter.cs: Fix compile error.  Cannot reference static member
7680         from an instance object.  Is this an mcs bug?
7681
7682 2002-09-14  Martin Baulig  <martin@gnome.org>
7683
7684         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
7685         multiple times.  Fixes bug #30295, added test-166.cs.
7686
7687 2002-09-14  Martin Baulig  <martin@gnome.org>
7688
7689         * statement.cs (Block.Emit): Don't emit unreachable code.
7690         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
7691         `break' statements.
7692         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
7693
7694 2002-09-14  Martin Baulig  <martin@gnome.org>
7695
7696         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
7697         is set.
7698
7699 2002-09-14  Martin Baulig  <martin@gnome.org>
7700
7701         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
7702         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
7703         be false on the ms runtime.
7704
7705 2002-09-13  Martin Baulig  <martin@gnome.org>
7706
7707         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
7708         the CS0038 error message.
7709
7710 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
7711
7712         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
7713         constant inside, return it.
7714
7715 2002-09-12  Martin Baulig  <martin@gnome.org>
7716
7717         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
7718         implicit conversion can be done between enum types.
7719
7720         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
7721         check whether an implicit conversion to the current enum's UnderlyingType
7722         exists and report an error if not.
7723
7724         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
7725         without debugging support.
7726
7727         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
7728         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
7729
7730 2002-09-12  Martin Baulig  <martin@gnome.org>
7731
7732         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
7733
7734         * ecore.cs (IMemberExpr.DeclaringType): New property.
7735         (SimpleName.SimpleNameResolve): Check whether we're accessing a
7736         nonstatic member of an outer type (CS0038).
7737
7738 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
7739
7740         * driver.cs: Activate the using-error detector at warning level
7741         4 (at least for MS-compatible APIs).
7742
7743         * namespace.cs (VerifyUsing): Small buglett fix.
7744
7745         * pending.cs (PendingImplementation): pass the container pointer. 
7746
7747         * interface.cs (GetMethods): Allow for recursive definition.  Long
7748         term, I would like to move every type to support recursive
7749         definitions, not the current ordering mechanism that we have right
7750         now.
7751
7752         The situation is this: Attributes are handled before interfaces,
7753         so we can apply attributes to interfaces.  But some attributes
7754         implement interfaces, we will now handle the simple cases
7755         (recursive definitions will just get an error).  
7756
7757         * parameter.cs: Only invalidate types at the end if we fail to
7758         lookup all types.  
7759
7760 2002-09-09  Martin Baulig  <martin@gnome.org>
7761
7762         * ecore.cs (PropertyExpr.Emit): Also check for
7763         TypeManager.system_int_array_get_length so this'll also work when
7764         compiling corlib.  Fixes #30003.
7765
7766 2002-09-09  Martin Baulig  <martin@gnome.org>
7767
7768         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
7769         and throw an exception if we can't get the type's size.  Fixed #30040,
7770         added test-165.cs.
7771
7772 2002-09-09  Martin Baulig  <martin@gnome.org>
7773
7774         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
7775
7776         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
7777         context.  Fixes bug #30027.
7778
7779         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
7780         virtual functions.  Fixes bug #30043, added test-164.cs.
7781
7782 2002-09-08  Ravi Pratap  <ravi@ximian.com>
7783
7784         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
7785
7786 2002-09-08  Nick Drochak  <ndrochak@gol.com>
7787
7788         * driver.cs: Use an object to get the windows codepage since it's not a
7789         static property.
7790
7791 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
7792
7793         * statement.cs (For.Emit): for infinite loops (test == null)
7794         return whether there is a break inside, not always "true".
7795
7796         * namespace.cs (UsingEntry): New struct to hold the name of the
7797         using definition, the location where it is defined, and whether it
7798         has been used in a successful type lookup.
7799
7800         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
7801         strings.
7802
7803         * decl.cs: ditto.
7804
7805 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7806
7807         * attribute.cs : Fix incorrect code which relied on catching
7808         a NullReferenceException to detect a null being passed in
7809         where an object was expected.
7810
7811 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
7812
7813         * statement.cs (Try): flag the catch variable as assigned
7814
7815         * expression.cs (Cast): Simplified by using ResolveType instead of
7816         manually resolving.
7817
7818         * statement.cs (Catch): Fix bug by using ResolveType.
7819
7820 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7821
7822         * expression.cs (BetterConversion): Special case for when we have
7823         a NullLiteral as the argument and we have to choose between string
7824         and object types - we choose string the way csc does.
7825
7826         * attribute.cs (Attribute.Resolve): Catch the
7827         NullReferenceException and report error #182 since the Mono
7828         runtime no more has the bug and having this exception raised means
7829         we tried to select a constructor which takes an object and is
7830         passed a null.
7831
7832 2002-09-05  Ravi Pratap  <ravi@ximian.com>
7833
7834         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
7835         message (1502, 1503) when we can't locate a method after overload
7836         resolution. This is much more informative and closes the bug
7837         Miguel reported.
7838
7839         * interface.cs (PopulateMethod): Return if there are no argument
7840         types. Fixes a NullReferenceException bug.
7841
7842         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
7843         expressions too. Previously we were checking only in one place for
7844         positional arguments leaving out named arguments.
7845
7846         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
7847         type to the enum type is not allowed. Remove code corresponding to
7848         that.
7849
7850         (ConvertNumericExplicit): Allow explicit conversions from
7851         the underlying type to enum type. This precisely follows the spec
7852         and closes a bug filed by Gonzalo.
7853
7854 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7855
7856         * compiler.csproj:
7857         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
7858
7859 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
7860
7861         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
7862         it was important that we stored the right value after the
7863         reduction in `converted'.
7864
7865 2002-09-04  Martin Baulig  <martin@gnome.org>
7866
7867         * location.cs (Location.SymbolDocument): Use full pathnames for the
7868         source files.
7869
7870 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
7871
7872         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
7873         of the expression resolve mechanism, because that will catch the
7874         SimpleName error failures.
7875
7876         (Conditional): If we can not resolve the
7877         expression, return, do not crash.
7878
7879 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7880
7881         * cs-tokenizer.cs:
7882         (location): display token name instead of its number.
7883
7884 2002-08-28  Martin Baulig  <martin@gnome.org>
7885
7886         * expression.cs (Binary.ResolveOperator): Don't silently return
7887         but return an error if an operator cannot be applied between two
7888         enum types.
7889
7890 2002-08-28  Martin Baulig  <martin@gnome.org>
7891
7892         * class.cs (Constructor.Define): Set the permission attributes
7893         correctly instead of making all constructors public.
7894
7895 2002-08-28  Martin Baulig  <martin@gnome.org>
7896
7897         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
7898         for private members before reporting a CS0103; if we find anything,
7899         it's a CS0122.
7900
7901 2002-08-28  Martin Baulig  <martin@gnome.org>
7902
7903         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
7904         to check whether `closure_start_type == closure_invocation_type',
7905         we also need to check whether `m.DeclaringType == closure_invocation_type'
7906         before bypassing the permission checks.  We might be accessing
7907         protected/private members from the base class.
7908         (TypeManager.RealMemberLookup): Only set private_ok if private
7909         members were requested via BindingFlags.NonPublic.
7910
7911         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
7912
7913         * expression.cs (MemberAccess.ResolveMemberAccess): Set
7914         MethodGroupExpr.IsExplicitImpl if appropriate.
7915         (Invocation.DoResolve): Don't report the CS0120 for explicit
7916         interface implementations.
7917
7918 2002-08-27  Martin Baulig  <martin@gnome.org>
7919
7920         * expression.cs (Invocation.DoResolve): If this is a static
7921         method and we don't have an InstanceExpression, we must report
7922         a CS0120.
7923
7924 2002-08-25  Martin Baulig  <martin@gnome.org>
7925
7926         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
7927         `==' between a valuetype and an object.
7928
7929 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
7930
7931         * ecore.cs (TypeExpr): Provide a ToString method.
7932
7933 2002-08-24  Martin Baulig  <martin@gnome.org>
7934
7935         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
7936         now called proggie.dbg and it's a binary file.
7937
7938 2002-08-23  Martin Baulig  <martin@gnome.org>
7939
7940         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
7941
7942 2002-08-23  Martin Baulig  <martin@gnome.org>
7943
7944         * struct.cs (MyStructInfo.ctor): Make this work with empty
7945         structs; it's not allowed to use foreach() on null.
7946
7947 2002-08-23  Martin Baulig  <martin@gnome.org>
7948
7949         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
7950         writer the full pathname of the generated assembly.
7951
7952 2002-08-23  Martin Baulig  <martin@gnome.org>
7953
7954         * statements.cs (FlowBranching.UsageVector.MergeChildren):
7955         A `finally' block never returns or breaks; improved handling of
7956         unreachable code.
7957
7958 2002-08-23  Martin Baulig  <martin@gnome.org>
7959
7960         * statement.cs (Throw.Resolve): Allow `throw null'.
7961
7962 2002-08-23  Martin Baulig  <martin@gnome.org>
7963
7964         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
7965         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
7966         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
7967         MemberLookup would return a wrong event if this is an explicit
7968         interface implementation and the class has an event with the same
7969         name.
7970
7971 2002-08-23  Martin Baulig  <martin@gnome.org>
7972
7973         * statement.cs (Block.AddChildVariableNames): New public method.
7974         (Block.AddChildVariableName): Likewise.
7975         (Block.IsVariableNameUsedInChildBlock): Likewise.
7976         (Block.AddVariable): Check whether a variable name has already
7977         been used in a child block.
7978
7979         * cs-parser.jay (declare_local_variables): Mark all variable names
7980         from the current block as being used in a child block in the
7981         implicit block.
7982
7983 2002-08-23  Martin Baulig  <martin@gnome.org>
7984
7985         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
7986         find the symbol writer.
7987
7988         * driver.cs: csc also allows the arguments to /define being
7989         separated by commas, not only by semicolons.
7990
7991 2002-08-23  Martin Baulig  <martin@gnome.org>
7992
7993         * interface.cs (Interface.GetMembers): Added static check for events.
7994
7995 2002-08-15  Martin Baulig  <martin@gnome.org>
7996
7997         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
7998         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
7999
8000         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8001         why the MethodData.EmitDestructor() change was necessary.
8002
8003 2002-08-20  Martin Baulig  <martin@gnome.org>
8004
8005         * class.cs (TypeContainer.FindMembers): Added static check for events.
8006
8007         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8008
8009         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8010         use Type.GetEvents(), not Type.FindMembers().
8011
8012 2002-08-20  Martin Baulig  <martin@gnome.org>
8013
8014         * decl.cs (MemberCache): Added a special method cache which will
8015         be used for method-only searched.  This ensures that a method
8016         search will return a MethodInfo with the correct ReflectedType for
8017         inherited methods.      
8018
8019 2002-08-20  Martin Baulig  <martin@gnome.org>
8020
8021         * decl.cs (DeclSpace.FindMembers): Made this public.
8022
8023 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8024
8025         * delegate.cs: fixed build on windows.
8026         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8027
8028 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8029
8030         * ecore.cs (StandardConversionExists): Return a false
8031         if we are trying to convert the void type to anything else
8032         since that is not allowed.
8033
8034         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8035         we flag error 70 in the event an event is trying to be accessed
8036         directly from outside the declaring type.
8037
8038 2002-08-20  Martin Baulig  <martin@gnome.org>
8039
8040         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8041         MemberCache from typemanager.cs to decl.cs.
8042
8043 2002-08-19  Martin Baulig  <martin@gnome.org>
8044
8045         * class.cs (TypeContainer): Implement IMemberContainer.
8046         (TypeContainer.DefineMembers): Create the MemberCache.
8047         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8048         return public members if BindingFlags.Public was given, check
8049         whether members are static.
8050
8051 2002-08-16  Martin Baulig  <martin@gnome.org>
8052
8053         * decl.cs (DeclSpace.Define): Splitted this in Define and
8054         DefineMembers.  DefineMembers is called first and initializes the
8055         MemberCache.
8056
8057         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8058         DefineMembers() on all our DeclSpaces.
8059
8060         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8061         but call DefineMembers() on all nested interfaces.  We call their
8062         Define() in our new Define() function.
8063
8064         * interface.cs (Interface): Implement IMemberContainer.
8065         (Interface.Define): Moved all code except the attribute stuf to
8066         DefineMembers().
8067         (Interface.DefineMembers): Initialize the member cache.
8068
8069         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8070         need this anymore since we can use MemberCache.FindMembers directly.
8071
8072 2002-08-19  Martin Baulig  <martin@gnome.org>
8073
8074         * typemanager.cs (MemberCache): When creating the cache for an
8075         interface type, add all inherited members.
8076         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8077         to `out bool used_cache' and documented it.
8078         (TypeManager.MemberLookup): If we already used the cache in the first
8079         iteration, we don't need to do the interfaces check.
8080
8081 2002-08-19  Martin Baulig  <martin@gnome.org>
8082
8083         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8084         here from IMemberFinder and don't implement this interface anymore.
8085         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8086
8087         * typemanager.cs (IMemberFinder): This interface is now only used by
8088         classes which actually support the member cache.
8089         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8090         since we only put DeclSpaces into this Hashtable.
8091         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8092         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8093
8094 2002-08-16  Martin Baulig  <martin@gnome.org>
8095
8096         * typemanager.cs (ICachingMemberFinder): Removed.
8097         (IMemberFinder.MemberCache): New property.
8098         (TypeManager.FindMembers): Merged this with RealFindMembers().
8099         This function will never be called from TypeManager.MemberLookup()
8100         so we can't use the cache here, just the IMemberFinder.
8101         (TypeManager.MemberLookup_FindMembers): Check whether the
8102         IMemberFinder has a MemberCache and call the cache's FindMembers
8103         function.
8104         (MemberCache): Rewrote larger parts of this yet another time and
8105         cleaned it up a bit.
8106
8107 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8108
8109         * driver.cs (LoadArgs): Support quoting.
8110
8111         (Usage): Show the CSC-like command line arguments.
8112
8113         Improved a few error messages.
8114
8115 2002-08-15  Martin Baulig  <martin@gnome.org>
8116
8117         * typemanager.cs (IMemberContainer.Type): New property.
8118         (IMemberContainer.IsInterface): New property.
8119
8120         The following changes are conditional to BROKEN_RUNTIME, which is
8121         defined at the top of the file.
8122
8123         * typemanager.cs (MemberCache.MemberCache): Don't add the base
8124         class'es members, but add all members from TypeHandle.ObjectType
8125         if we're an interface.
8126         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
8127         is the current type.
8128         (MemberCache.CacheEntry.Container): Removed this field.
8129         (TypeHandle.GetMembers): Include inherited members.
8130
8131 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8132
8133         * typemanager.cs: fixed compilation and added a comment on a field that
8134         is never used.
8135
8136 2002-08-15  Martin Baulig  <martin@gnome.org>
8137
8138         * class.cs (ConstructorInitializer.Resolve): In the
8139         Expression.MemberLookup call, use the queried_type as
8140         invocation_type.
8141
8142         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
8143         declared' attribute, it's always true.
8144         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
8145         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
8146         temporary wrapper for FindMembers which tells MemberLookup whether
8147         members from the base classes are included in the return value.
8148         This will go away soon.
8149         (TypeManager.MemberLookup): Use this temporary hack here; once the
8150         new MemberCache is completed, we don't need to do the DeclaredOnly
8151         looping here anymore since the MemberCache will take care of this.
8152         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
8153         (MemberCache): When creating the MemberCache for a class, get
8154         members from the current class and all its base classes.
8155         (MemberCache.CacheEntry.Container): New field.  This is a
8156         temporary hack until the Mono runtime is fixed to distinguish
8157         between ReflectedType and DeclaringType.  It allows us to use MCS
8158         with both the MS runtime and the unfixed Mono runtime without
8159         problems and without accecting performance.
8160         (MemberCache.SearchMembers): The DeclaredOnly looping from
8161         TypeManager.MemberLookup is now done here.      
8162
8163 2002-08-14  Martin Baulig  <martin@gnome.org>
8164
8165         * statement.cs (MyStructInfo.MyStructInfo): Don't call
8166         Type.GetFields on dynamic types but get the fields from the
8167         corresponding TypeContainer.
8168         (MyStructInfo.GetStructInfo): Added check for enum types.
8169
8170         * typemanager.cs (MemberList.IsSynchronized): Implemented.
8171         (MemberList.SyncRoot): Implemented.
8172         (TypeManager.FilterWithClosure): No need to check permissions if
8173         closure_start_type == closure_invocation_type, don't crash if
8174         closure_invocation_type is null.
8175
8176 2002-08-13  Martin Baulig  <martin@gnome.org>
8177
8178         Rewrote TypeContainer.FindMembers to use a member cache.  This
8179         gives us a speed increase of about 35% for the self-hosting MCS
8180         build and of about 15-20% for the class libs (both on GNU/Linux).
8181
8182         * report.cs (Timer): New class to get enhanced profiling.  This
8183         whole class is "TIMER" conditional since it remarkably slows down
8184         compilation speed.
8185
8186         * class.cs (MemberList): New class.  This is an IList wrapper
8187         which we're now using instead of passing MemberInfo[]'s around to
8188         avoid copying this array unnecessarily.
8189         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
8190         (ICachingMemberFinder, IMemberContainer): New interface.
8191         (TypeManager.FilterWithClosure): If `criteria' is null, the name
8192         has already been checked, otherwise use it for the name comparision.
8193         (TypeManager.FindMembers): Renamed to RealMemberFinder and
8194         provided wrapper which tries to use ICachingMemberFinder.FindMembers
8195         if possible.  Returns a MemberList, not a MemberInfo [].
8196         (TypeHandle): New class, implements IMemberContainer.  We create
8197         one instance of this class per type, it contains a MemberCache
8198         which is used to do the member lookups.
8199         (MemberCache): New class.  Each instance of this class contains
8200         all members of a type and a name-based hash table.
8201         (MemberCache.FindMembers): This is our new member lookup
8202         function.  First, it looks up all members of the requested name in
8203         the hash table.  Then, it walks this list and sorts out all
8204         applicable members and returns them.
8205
8206 2002-08-13  Martin Baulig  <martin@gnome.org>
8207
8208         In addition to a nice code cleanup, this gives us a performance
8209         increase of about 1.4% on GNU/Linux - not much, but it's already
8210         half a second for the self-hosting MCS compilation.
8211
8212         * typemanager.cs (IMemberFinder): New interface.  It is used by
8213         TypeManager.FindMembers to call FindMembers on a TypeContainer,
8214         Enum, Delegate or Interface.
8215         (TypeManager.finder_to_member_finder): New PtrHashtable.
8216         (TypeManager.finder_to_container): Removed.
8217         (TypeManager.finder_to_delegate): Removed.
8218         (TypeManager.finder_to_interface): Removed.
8219         (TypeManager.finder_to_enum): Removed.
8220
8221         * interface.cs (Interface): Implement IMemberFinder.
8222
8223         * delegate.cs (Delegate): Implement IMemberFinder.
8224
8225         * enum.cs (Enum): Implement IMemberFinder.
8226
8227         * class.cs (TypeContainer): Implement IMemberFinder.
8228
8229 2002-08-12  Martin Baulig  <martin@gnome.org>
8230
8231         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
8232
8233 2002-08-12  Martin Baulig  <martin@gnome.org>
8234
8235         * ecore.cs (ITypeExpression): New interface for expressions which
8236         resolve to a type.
8237         (TypeExpression): Renamed to TypeLookupExpression.
8238         (Expression.DoResolve): If we're doing a types-only lookup, the
8239         expression must implement the ITypeExpression interface and we
8240         call DoResolveType() on it.
8241         (SimpleName): Implement the new ITypeExpression interface.
8242         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
8243         hack, the situation that we're only looking up types can't happen
8244         anymore when this method is called.  Moved the type lookup code to
8245         DoResolveType() and call it.
8246         (SimpleName.DoResolveType): This ITypeExpression interface method
8247         is now doing the types-only lookup.
8248         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
8249         (ResolveFlags): Added MaskExprClass.
8250
8251         * expression.cs (MemberAccess): Implement the ITypeExpression
8252         interface.
8253         (MemberAccess.DoResolve): Added support for a types-only lookup
8254         when we're called via ITypeExpression.DoResolveType().
8255         (ComposedCast): Implement the ITypeExpression interface.
8256
8257         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
8258         Expression.Resolve() with ResolveFlags.Type instead.
8259
8260 2002-08-12  Martin Baulig  <martin@gnome.org>
8261
8262         * interface.cs (Interface.Define): Apply attributes.
8263
8264         * attribute.cs (Attribute.ApplyAttributes): Added support for
8265         interface attributes.
8266
8267 2002-08-11  Martin Baulig  <martin@gnome.org>
8268
8269         * statement.cs (Block.Emit): Only check the "this" variable if we
8270         do not always throw an exception.
8271
8272         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
8273         whether the property has a set accessor.
8274
8275 2002-08-11  Martin Baulig  <martin@gnome.org>
8276
8277         Added control flow analysis support for structs.
8278
8279         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
8280         with control flow analysis turned off.
8281         (IVariable): New interface.
8282         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
8283         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
8284         (FieldExpr.DoResolve): Resolve the instance expression with flow
8285         analysis turned off and do the definite assignment check after the
8286         resolving when we know what the expression will resolve to.
8287
8288         * expression.cs (LocalVariableReference, ParameterReference):
8289         Implement the new IVariable interface, only call the flow analysis
8290         code if ec.DoFlowAnalysis is true.
8291         (This): Added constructor which takes a Block argument.  Implement
8292         the new IVariable interface.
8293         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
8294         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
8295         This does the definite assignment checks for struct members.
8296
8297         * class.cs (Constructor.Emit): If this is a non-static `struct'
8298         constructor which doesn't have any initializer, call
8299         Block.AddThisVariable() to tell the flow analysis code that all
8300         struct elements must be initialized before control returns from
8301         the constructor.
8302
8303         * statement.cs (MyStructInfo): New public class.
8304         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
8305         argument to this indexer.  If non-zero, check an individual struct
8306         member, not the whole struct.
8307         (FlowBranching.CheckOutParameters): Check struct members.
8308         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
8309         overloaded versions of these methods which take an additional
8310         `int field_idx' argument to check struct members.
8311         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
8312         overloaded versions of these methods which take an additional
8313         `string field_name' argument to check struct member.s
8314         (VariableInfo): Implement the IVariable interface.
8315         (VariableInfo.StructInfo): New public property.  Returns the
8316         MyStructInfo instance of the variable if it's a struct or null.
8317         (Block.AddThisVariable): New public method.  This is called from
8318         Constructor.Emit() for non-static `struct' constructor which do
8319         not have any initializer.  It creates a special variable for the
8320         "this" instance variable which will be checked by the flow
8321         analysis code to ensure that all of the struct's fields are
8322         initialized before control returns from the constructor.
8323         (UsageVector): Added support for struct members.  If a
8324         variable/parameter is a struct with N members, we reserve a slot
8325         in the usage vector for each member.  A struct is considered fully
8326         initialized if either the struct itself (slot 0) or all its
8327         members are initialized.
8328
8329 2002-08-08  Martin Baulig  <martin@gnome.org>
8330
8331         * driver.cs (Driver.MainDriver): Only report an error CS5001
8332         if there were no compilation errors.
8333
8334         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
8335         `UnsafeContext' property to determine whether the parent is in
8336         unsafe context rather than checking the parent's ModFlags:
8337         classes nested in an unsafe class are unsafe as well.
8338
8339 2002-08-08  Martin Baulig  <martin@gnome.org>
8340
8341         * statement.cs (UsageVector.MergeChildren): Distinguish between
8342         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
8343         we return.  Added test17() and test18() to test-154.cs.
8344
8345 2002-08-08  Martin Baulig  <martin@gnome.org>
8346
8347         * typemanager.cs (TypeManager.FilterWithClosure): If we have
8348         Family access, make sure the invoking type isn't a subclass of the
8349         queried type (that'd be a CS1540).
8350
8351         * ecore.cs (Expression.MemberLookup): Added overloaded version of
8352         this method which takes an additional `Type invocation_type'.
8353
8354         * expression.cs (BaseAccess.DoResolve): Use the base type as
8355         invocation and query type.
8356         (MemberAccess.DoResolve): If the lookup failed and we're about to
8357         report a CS0122, try a lookup with the ec.ContainerType - if this
8358         succeeds, we must report a CS1540.
8359
8360 2002-08-08  Martin Baulig  <martin@gnome.org>
8361
8362         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
8363         (MethodGroupExpr): Implement the IMemberExpr interface.
8364
8365         * expression (MemberAccess.ResolveMemberAccess): No need to have
8366         any special code for MethodGroupExprs anymore, they're now
8367         IMemberExprs.   
8368
8369 2002-08-08  Martin Baulig  <martin@gnome.org>
8370
8371         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
8372         Family, FamANDAssem and FamORAssem permissions.
8373         (TypeManager.IsSubclassOrNestedChildOf): New public method.
8374
8375 2002-08-08  Martin Baulig  <martin@gnome.org>
8376
8377         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
8378         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
8379         or loop block.
8380
8381 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
8382
8383         * driver.cs: implemented /resource option to embed managed resources.
8384
8385 2002-08-07  Martin Baulig  <martin@gnome.org>
8386
8387         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
8388         (FieldBase.HasFieldInitializer): New public property.
8389         (FieldBase.GetInitializerExpression): New public method.  Resolves and
8390         returns the field initializer and makes sure it is only resolved once.
8391         (TypeContainer.EmitFieldInitializers): Call
8392         FieldBase.GetInitializerExpression to get the initializer, this ensures
8393         that it isn't resolved multiple times.
8394
8395         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
8396         the resolving process (SimpleName/MemberLookup) that we're currently
8397         emitting a field initializer (which must not access any instance members,
8398         this is an error CS0236).
8399
8400         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
8401         argument, if the `IsFieldInitializer' flag is set, we must report and
8402         error CS0236 and not an error CS0120.   
8403
8404 2002-08-07  Martin Baulig  <martin@gnome.org>
8405
8406         * ecore.cs (IMemberExpr): New public interface.
8407         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
8408         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
8409         if the expression is an IMemberExpr.
8410
8411         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
8412         to be null, implicitly default to `this' if we're non-static in
8413         this case.  Simplified the code a lot by using the new IMemberExpr
8414         interface.  Also fixed bug #28176 here.
8415
8416 2002-08-06  Martin Baulig  <martin@gnome.org>
8417
8418         * cs-parser.jay (SimpleLookup): Removed.  We need to create
8419         ParameterReferences during semantic analysis so that we can do a
8420         type-only search when resolving Cast, TypeOf and SizeOf.
8421         (block): Pass the `current_local_parameters' to the Block's
8422         constructor.
8423
8424         * class.cs (ConstructorInitializer): Added `Parameters parameters'
8425         argument to the constructor.
8426         (ConstructorInitializer.Resolve): Create a temporary implicit
8427         block with the parameters.
8428
8429         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
8430         references here if we aren't doing a type-only search.
8431
8432         * statement.cs (Block): Added constructor which takes a
8433         `Parameters parameters' argument.
8434         (Block.Parameters): New public property.
8435
8436         * support.cs (InternalParameters.Parameters): Renamed `parameters'
8437         to `Parameters' and made it public readonly.
8438
8439 2002-08-06  Martin Baulig  <martin@gnome.org>
8440
8441         * ecore.cs (Expression.Warning): Made this public as well.
8442
8443         * report.cs (Report.Debug): Print the contents of collections.
8444
8445 2002-08-06  Martin Baulig  <martin@gnome.org>
8446
8447         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
8448         used to tell Resolve() which kinds of expressions it may return.
8449         (Expression.Resolve): Added overloaded version of this method which
8450         takes a `ResolveFlags flags' argument.  This can be used to tell
8451         Resolve() which kinds of expressions it may return.  Reports a
8452         CS0118 on error.
8453         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
8454         ResolveFlags.SimpleName.
8455         (Expression.Error118): Added overloaded version of this method which
8456         takes a `ResolveFlags flags' argument.  It uses the flags to determine
8457         which kinds of expressions are allowed.
8458
8459         * expression.cs (Argument.ResolveMethodGroup): New public method.
8460         Resolves an argument, but allows a MethodGroup to be returned.
8461         This is used when invoking a delegate.
8462
8463         * TODO: Updated a bit.
8464
8465 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8466
8467         Fixed compilation with csc.
8468
8469         * ecore.cs: Expression.Error made public. Is this correct? Should
8470         Warning be made public too?
8471
8472         * expression.cs: use ea.Location instead of ea.loc.
8473         [FIXME:  Filed as bug #28607: MCS must report these errors.]
8474
8475 2002-08-06  Martin Baulig  <martin@gnome.org>
8476
8477         * ecore.cs (Expression.loc): Moved the location here instead of
8478         duplicating it in all derived classes.
8479         (Expression.Location): New public property.
8480         (Expression.Error, Expression.Warning): Made them non-static and
8481         removed the location argument.
8482         (Expression.Warning): Added overloaded version which takes an
8483         `int level' argument.
8484         (Expression.Error118): Make this non-static and removed the
8485         expression and location arguments.
8486         (TypeExpr): Added location argument to the constructor.
8487
8488         * expression.cs (StaticCallExpr): Added location argument to
8489         the constructor.
8490         (Indirection, PointerArithmetic): Likewise.
8491         (CheckedExpr, UnCheckedExpr): Likewise.
8492         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
8493         (StringPtr): Likewise.
8494
8495
8496 2002-08-05  Martin Baulig  <martin@gnome.org>
8497
8498         * expression.cs (BaseAccess.DoResolve): Actually report errors.
8499
8500         * assign.cs (Assign.DoResolve): Check whether the source
8501         expression is a value or variable.
8502
8503         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
8504         while resolving the corresponding blocks.
8505
8506         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
8507         an error, don't silently return null.
8508
8509         * statement.cs (Block.AddVariable): Do the error reporting here
8510         and distinguish between CS0128 and CS0136.
8511         (Block.DoResolve): Report all unused labels (warning CS0164).
8512         (LabeledStatement): Pass the location to the constructor.
8513         (LabeledStatement.HasBeenReferenced): New property.
8514         (LabeledStatement.Resolve): Set it to true here.
8515
8516         * statement.cs (Return.Emit): Return success even after reporting
8517         a type mismatch error (CS0126 or CS0127), this is what csc does and
8518         it avoids confusing the users with any consecutive errors.
8519
8520 2002-08-05  Martin Baulig  <martin@gnome.org>
8521
8522         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
8523
8524         * const.cs (Const.LookupConstantValue): Catch circular definitions.
8525
8526         * expression.cs (MemberAccess.DoResolve): Silently return if an
8527         error has already been reported.
8528
8529         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
8530         error has already been reported.
8531
8532 2002-08-05  Martin Baulig  <martin@gnome.org>
8533
8534         * statement.cs (UsageVector): Only initialize the `parameters'
8535         vector if we actually have any "out" parameters.
8536
8537 2002-08-05  Martin Baulig  <martin@gnome.org>
8538
8539         * expression.cs (Binary.ResolveOperator): When combining delegates,
8540         they must have the same type.
8541
8542 2002-08-05  Martin Baulig  <martin@gnome.org>
8543
8544         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
8545         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
8546         work with the ms runtime and we also don't need it: if we're a
8547         PropertyBuilder and not in the `indexer_arguments' hash, then we
8548         are a property and not an indexer.
8549
8550         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
8551         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
8552         since the latter one doesn't work with the ms runtime.
8553
8554 2002-08-03  Martin Baulig  <martin@gnome.org>
8555
8556         Fixed bugs #27998 and #22735.
8557
8558         * class.cs (Method.IsOperator): New public field.
8559         (Method.CheckBase): Report CS0111 if there's already a method
8560         with the same parameters in the current class.  Report CS0508 when
8561         attempting to change the return type of an inherited method.
8562         (MethodData.Emit): Report CS0179 if a method doesn't have a body
8563         and it's not marked abstract or extern.
8564         (PropertyBase): New abstract base class for Property and Indexer.
8565         (PropertyBase.CheckBase): Moved here from Property and made it work
8566         for indexers.
8567         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
8568         the same so we can reuse it there.
8569         (Property, Indexer): Derive from PropertyBase.
8570         (MethodSignature.inheritable_property_signature_filter): New delegate
8571         to find properties and indexers.
8572
8573         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
8574         argument and improved error reporting.
8575
8576         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
8577         EmptyReadOnlyParameters and made it a property.
8578
8579         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
8580         version of this method which takes a `PropertyInfo indexer'.
8581         (TypeManager.RegisterIndexer): New method.
8582
8583         * class.cs: Added myself as author of this file :-)
8584
8585 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8586
8587         * class.cs: fixed compilation on windoze.
8588
8589 2002-08-03  Martin Baulig  <martin@gnome.org>
8590
8591         * interface.cs (Interface.GetInterfaceBases): Check whether all
8592         base interfaces are at least as accessible than the current one.
8593
8594         * class.cs (TypeContainer.GetClassBases): Check whether base types
8595         are at least as accessible than the current type.
8596         (TypeContainer.AsAccessible): Implemented and made non-static.
8597         (MemberBase.CheckParameters): Report errors if the accessibility
8598         checks fail.
8599
8600         * delegate.cs (Delegate.Delegate): The default visibility is
8601         internal for top-level types and private for nested types.
8602         (Delegate.Define): Report errors if the accessibility checks fail.
8603
8604         * enum.cs (Enum.Enum): The default visibility is internal for
8605         top-level types and private for nested types.
8606         (Enum.DefineType): Compute the correct visibility.
8607
8608         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
8609         function which takes a `bool is_toplevel' instead of a TypeContainer.
8610
8611         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
8612         builtin type.
8613
8614 2002-08-02  Martin Baulig  <martin@gnome.org>
8615
8616         * expression.cs (LocalVariableReferenc): Added constructor which
8617         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
8618         (LocalVariableReference.IsReadOnly): New property.
8619         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
8620         variable is readonly, use our own readonly flag to do this; you can
8621         use the new constructor to get a writable reference to a read-only
8622         variable.
8623
8624         * cs-parser.jay (foreach_statement, using_statement): Get a writable
8625         reference to the local variable.
8626
8627 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
8628
8629         * rootcontext.cs (ResolveCore): Also include System.Exception
8630
8631         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
8632         we reach an EmptyStatement.
8633
8634         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
8635         is also fine.
8636
8637         * expression.cs (Binary.ResolveOperator): Check error result in
8638         two places.
8639
8640         use brtrue/brfalse directly and avoid compares to null.
8641
8642 2002-08-02  Martin Baulig  <martin@gnome.org>
8643
8644         * class.cs (TypeContainer.Define): Define all nested interfaces here.
8645         Fixes bug #28407, added test-155.cs.
8646
8647 2002-08-01  Martin Baulig  <martin@gnome.org>
8648
8649         * class.cs (Event.EmitDefaultMethod): Make this work with static
8650         events.  Fixes #28311, added verify-3.cs.
8651
8652 2002-08-01  Martin Baulig  <martin@gnome.org>
8653
8654         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
8655         `is_disposable' fields.
8656         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
8657         `hm.is_disposable' if we're using the collection pattern.
8658         (Foreach.EmitCollectionForeach): Use the correct type for the
8659         enumerator's local variable, only emit the try/finally block if
8660         necessary (fixes #27713).
8661
8662 2002-08-01  Martin Baulig  <martin@gnome.org>
8663
8664         * ecore.cs (Expression.report118): Renamed to Error118 and made
8665         it public static.
8666
8667         * statement.cs (Throw.Resolve): Check whether the expression is of
8668         the correct type (CS0118) and whether the type derives from
8669         System.Exception (CS0155).
8670         (Catch.Resolve): New method.  Do the type lookup here and check
8671         whether it derives from System.Exception (CS0155).
8672         (Catch.CatchType, Catch.IsGeneral): New public properties.
8673
8674         * typemanager.cs (TypeManager.exception_type): Added.
8675
8676 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
8677
8678         * driver.cs: Updated About function.
8679
8680 2002-07-31  Martin Baulig  <martin@gnome.org>
8681
8682         Implemented Control Flow Analysis.
8683
8684         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
8685         (EmitContext.CurrentBranching): Added.
8686         (EmitContext.StartFlowBranching): Added.
8687         (EmitContext.EndFlowBranching): Added.
8688         (EmitContext.KillFlowBranching): Added.
8689         (EmitContext.IsVariableAssigned): Added.
8690         (EmitContext.SetVariableAssigned): Added.
8691         (EmitContext.IsParameterAssigned): Added.
8692         (EmitContext.SetParameterAssigned): Added.
8693         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
8694         Added control flow analysis stuff here.
8695
8696         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
8697         resolve the expression as lvalue.
8698         (LocalVariableReference.DoResolve): Check whether the variable has
8699         already been assigned.
8700         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
8701         the parameter as assigned here.
8702         (ParameterReference.DoResolve): Check whether the parameter has already
8703         been assigned.
8704         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
8705         expression as lvalue.
8706
8707         * statement.cs (FlowBranching): New class for the flow analysis code.
8708         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
8709         (LabeledStatement.IsDefined): New public property.
8710         (LabeledStatement.AddUsageVector): New public method to tell flow
8711         analyis that the label may be reached via a forward jump.
8712         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
8713         flow analysis.
8714         (VariableInfo.Number): New public field.  This is used by flow analysis
8715         to number all locals of a block.
8716         (Block.CountVariables): New public property.  This is the number of
8717         local variables in this block (including the locals from all parent
8718         blocks).
8719         (Block.EmitMeta): Number all the variables.
8720
8721         * statement.cs: Added flow analysis support to all classes.
8722
8723 2002-07-31  Martin Baulig  <martin@gnome.org>
8724
8725         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
8726         To get debugging messages, compile mcs with /define:MCS_DEBUG and
8727         then use this argument.
8728
8729         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
8730
8731         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
8732         use this to specify /define options.
8733
8734 2002-07-29  Martin Baulig  <martin@gnome.org>
8735
8736         * statement.cs (Fixed): Moved all code that does variable lookups
8737         and resolvings from Emit to Resolve.
8738
8739         * statement.cs (For): Moved all code that does variable lookups
8740         and resolvings from Emit to Resolve.
8741
8742         * statement.cs (Using): Moved all code that does variable lookups
8743         and resolvings from Emit to Resolve.
8744
8745 2002-07-29  Martin Baulig  <martin@gnome.org>
8746
8747         * attribute.cs (Attribute.Resolve): Explicitly catch a
8748         System.NullReferenceException when creating the
8749         CustromAttributeBuilder and report a different warning message.
8750
8751 2002-07-29  Martin Baulig  <martin@gnome.org>
8752
8753         * support.cs (ParameterData.ParameterName): Added method to
8754         get the name of a parameter.
8755
8756         * typemanager.cs (TypeManager.IsValueType): New public method.
8757
8758 2002-07-29  Martin Baulig  <martin@gnome.org>
8759
8760         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
8761         is a flag which specifies that it's either ref or out.
8762         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
8763         the out parameter to `out Parameter.Modifier mod', also set the
8764         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
8765
8766         * support.cs (InternalParameters.ParameterModifier): Distinguish
8767         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8768         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8769
8770         * expression.cs (Argument.GetParameterModifier): Distinguish
8771         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8772         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8773
8774 2002-07-29  Martin Baulig  <martin@gnome.org>
8775
8776         * expression.cs (ParameterReference.ParameterReference): Added
8777         `Location loc' argument to the constructor.
8778
8779         * cs-parser.jay: Pass location to ParameterReference.
8780
8781 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
8782
8783         * statement.cs (Try): Initialize the location.
8784
8785         * cs-parser.jay: pass location to Try.
8786
8787         * expression.cs (Unary.Reduce): Change the prototype to return
8788         whether a constant fold could be performed or not.  The result is
8789         returned in an out parameters.  In the case of Indirection and
8790         AddressOf, we want to perform the full tests.
8791
8792 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
8793
8794         * statement.cs (Statement.Emit): Flag dead code.
8795
8796 2002-07-27  Andrew Birkett  <andy@nobugs.org>
8797
8798         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
8799
8800 2002-07-27  Martin Baulig  <martin@gnome.org>
8801
8802         * class.cs (MethodData.Define): Put back call to
8803         TypeManager.AddMethod(), accidentally commented this out.
8804
8805         * report.cs (Debug): New public method to print debugging information,
8806         this is `[Conditional ("DEBUG")]'.
8807
8808 2002-07-26  Martin Baulig  <martin@gnome.org>
8809
8810         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
8811         (switch_statement): Push the current_block to the switch_stack and
8812         pop it again when we're done with the switch.
8813         (switch_section): The new block is a child of the current_block.
8814         Fixes bug #24007, added test-152.cs.
8815
8816 2002-07-27  Martin Baulig  <martin@gnome.org>
8817
8818         * expression.cs (Invocation.EmitArguments): When calling a varargs
8819         function with only its fixed arguments, we need to pass an empty
8820         array.
8821
8822 2002-07-27  Martin Baulig  <martin@gnome.org>
8823
8824         Mono 0.13 has been released.
8825
8826 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
8827
8828         * driver.cs: Rename --resource to --linkres, because that is what
8829         we do currently, we dont support --resource yet.
8830
8831         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
8832
8833 2002-07-25  Martin Baulig  <martin@gnome.org>
8834
8835         * class.cs (MethodData): New public class.  This is a `method builder'
8836         class for a method or one accessor of a Property/Indexer/Event.
8837         (MethodData.GetMethodFlags): Moved here from MemberBase.
8838         (MethodData.ApplyAttributes): Likewise.
8839         (MethodData.ApplyObsoleteAttribute): Likewise.
8840         (MethodData.ApplyConditionalAttribute): Likewise.
8841         (MethodData.ApplyDllImportAttribute): Likewise.
8842         (MethodData.CheckAbstractAndExternal): Likewise.
8843         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
8844         (MethodData.Emit): Formerly known as Method.Emit().
8845         (MemberBase): Moved everything which was specific to a single
8846         accessor/method to MethodData.
8847         (Method): Create a new MethodData and call Define() and Emit() on it.
8848         (Property, Indexer, Event): Create a new MethodData objects for each
8849         accessor and call Define() and Emit() on them.
8850
8851 2002-07-25  Martin Baulig  <martin@gnome.org>
8852
8853         Made MethodCore derive from MemberBase to reuse the code from there.
8854         MemberBase now also checks for attributes.
8855
8856         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
8857         (MemberBase.GetMethodFlags): Moved here from class Method and marked
8858         as virtual.
8859         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
8860         `CallingConventions cc' and `Attributes opt_attrs' arguments.
8861         (MemberBase.ApplyAttributes): New virtual method; applies the
8862         attributes to a method or accessor.
8863         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
8864         (MemberBase.ApplyConditionalAttribute): Likewise.
8865         (MemberBase.ApplyDllImportAttribute): Likewise.
8866         (MemberBase.CheckAbstractAndExternal): Likewise.
8867         (MethodCore.ParameterTypes): This is now a property instead of a
8868         method, it's initialized from DoDefineParameters().
8869         (MethodCore.ParameterInfo): Removed the set accessor.
8870         (MethodCore.DoDefineParameters): New protected virtual method to
8871         initialize ParameterTypes and ParameterInfo.
8872         (Method.GetReturnType): We can now simply return the MemberType.
8873         (Method.GetMethodFlags): Override the MemberBase version and add
8874         the conditional flags.
8875         (Method.CheckBase): Moved some code from Define() here, call
8876         DoDefineParameters() here.
8877         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
8878         here to avoid some larger code duplication.
8879         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
8880         ensure that abstract and external accessors don't declare a body.
8881
8882         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
8883         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
8884         lookup in the attribute's parent classes, so we need to abort as soon
8885         as we found the first match.
8886         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
8887         the attribute has no arguments.
8888
8889         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
8890         of a Method.
8891
8892 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8893
8894         * cs-parser.jay: reverted previous patch.
8895
8896 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8897
8898         * cs-parser.jay: fixed bug #22119.
8899
8900 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8901
8902         * attribute.cs: fixed compilation. The error was:
8903         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
8904         be assigned to before control leaves the current method."
8905         [FIXME:  Filed as bug #28186: MCS must report this error.]
8906
8907 2002-07-25  Martin Baulig  <martin@gnome.org>
8908
8909         * attribute.cs (Attribute.Conditional_GetConditionName): New static
8910         method to pull the condition name ouf of a Conditional attribute.
8911         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
8912         the obsolete message and error flag out of an Obsolete attribute.
8913
8914         * class.cs (Method.GetMethodFlags): New public method to get the
8915         TypeManager.MethodFlags for this method.
8916         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
8917         private methods.
8918         (Method.Define): Get and apply the Obsolete and Conditional attributes;
8919         if we're overriding a virtual function, set the new private variable
8920         `parent_method'; call the new TypeManager.AddMethod().
8921
8922         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
8923         the MethodBuilder and the Method in a PtrHashtable.
8924         (TypeManager.builder_to_method): Added for this purpose.
8925         (TypeManager.MethodFlags): Added IsObsoleteError.
8926         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
8927         Obsolete and Conditional arguments in MethodBuilders.  If we discover
8928         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
8929         the message from the attribute.
8930
8931 2002-07-24  Martin Baulig  <martin@gnome.org>
8932
8933         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
8934         preprocessor directives, ensure that the argument to #define/#undef is
8935         exactly one identifier and that it's actually an identifier.
8936
8937         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
8938         did not work ....
8939
8940 2002-07-24  Martin Baulig  <martin@gnome.org>
8941
8942         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
8943         initialize it to TypeManager.object_type in the constructor.
8944         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
8945         of the `hm.get_current' method if we're using the collection pattern.
8946         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
8947         for the explicit conversion to make it work when we're using the collection
8948         pattern and the `Current' property has a different return type than `object'.
8949         Fixes #27713.
8950
8951 2002-07-24  Martin Baulig  <martin@gnome.org>
8952
8953         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
8954         does not match, but don't report any errors.  This method is called in
8955         order for all methods in a MethodGroupExpr until a matching method is
8956         found, so we don't want to bail out if the first method doesn't match.
8957         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
8958         matches, report the 123.  Fixes #28070.
8959
8960 2002-07-24  Martin Baulig  <martin@gnome.org>
8961
8962         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
8963         TypeManager.TypeToCoreType() to the top of the method so the
8964         following equality checks will work.  Fixes #28107.
8965
8966 2002-07-24  Martin Baulig  <martin@gnome.org>
8967
8968         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
8969         operand is of type uint, and the other operand is of type sbyte,
8970         short or int, the operands are converted to type long." -
8971         Actually do what this comment already told us.  Fixes bug #28106,
8972         added test-150.cs.
8973
8974 2002-07-24  Martin Baulig  <martin@gnome.org>
8975
8976         * class.cs (MethodBase): New abstract class.  This is now a base
8977         class for Property, Indexer and Event to avoid some code duplication
8978         in their Define() and DefineMethods() methods.
8979         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
8980         generic methods for Define() and DefineMethods().
8981         (FieldBase): Derive from MemberBase, not MemberCore.
8982         (Property): Derive from MemberBase, not MemberCore.
8983         (Property.DefineMethod): Moved all the code from this method to the
8984         new MethodBase.DefineAccessor(), just call it with appropriate
8985         argumetnts.
8986         (Property.Define): Call the new Property.DoDefine(), this does some
8987         sanity checks and we don't need to duplicate the code everywhere.
8988         (Event): Derive from MemberBase, not MemberCore.
8989         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
8990         accessors, this will also make them work with interface events.
8991         (Indexer): Derive from MemberBase, not MemberCore.
8992         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
8993         (Indexer.Define): Use the new MethodBase functions.
8994
8995         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
8996         argument to the constructor.
8997         (Interface.FindMembers): Added support for interface events.
8998         (Interface.PopluateEvent): Implemented.
8999
9000         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9001
9002 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9003
9004         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9005         but this is required to check for a method name being the same as
9006         the containing class.  
9007
9008         Handle this now.
9009
9010 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9011
9012         * interface.cs: initialize variable.
9013
9014 2002-07-23  Martin Baulig  <martin@gnome.org>
9015
9016         Implemented the IndexerName attribute in interfaces.
9017
9018         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9019         name if this is an explicit interface implementation.
9020         (Indexer.InterfaceIndexerName): New public variable.  If we're
9021         implementing an interface indexer, this is the IndexerName in that
9022         interface.  Otherwise, it's the IndexerName.
9023         (Indexer.DefineMethod): If we're implementing interface indexer,
9024         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9025         and Pending.ImplementIndexer methods.
9026         (Indexer.Define): Also define the PropertyBuilder if we're
9027         implementing an interface indexer and this is neither an explicit
9028         interface implementation nor do the IndexerName match the one in
9029         the interface.
9030
9031         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9032         If a method is defined here, then we always need to create a proxy
9033         for it.  This is used when implementing interface indexers.
9034         (Pending.IsInterfaceIndexer): New public method.
9035         (Pending.ImplementIndexer): New public method.
9036         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9037         This is used when implementing interface indexers to define a proxy
9038         if necessary.
9039         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9040         define a proxy if necessary.
9041
9042         * interface.cs (Interface.IndexerName): New public variable.
9043         (Interface.PopulateIndexer): Set the IndexerName.
9044         (Interface.DefineIndexers): New private method.  Populate all the
9045         indexers and make sure their IndexerNames match.
9046
9047         * typemanager.cs (IndexerPropertyName): Added support for interface
9048         indexers.
9049
9050 2002-07-22  Martin Baulig  <martin@gnome.org>
9051
9052         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9053         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9054         ret if HasReturnLabel.
9055         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9056         variables.
9057
9058         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9059         and set the ec.LoopBeginTryCatchLevel.
9060         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9061         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9062         the current ec.TryCatchLevel, the branch goes out of an exception
9063         block.  In this case, we need to use Leave and not Br.
9064
9065 2002-07-22  Martin Baulig  <martin@gnome.org>
9066
9067         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9068         block unless the block does not always return or it is contained in
9069         another try { ... } catch { ... } block.  Fixes bug #26506.
9070         Added verify-1.cs to the test suite.
9071
9072 2002-07-22  Martin Baulig  <martin@gnome.org>
9073
9074         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9075         then we do not always return.  Fixes bug #24985.
9076
9077 2002-07-22  Martin Baulig  <martin@gnome.org>
9078
9079         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9080         lookup on a per-class level; ie. walk up the class hierarchy until we
9081         found at least one applicable method, then choose the best among them.
9082         Fixes bug #24463 and test-29.cs.
9083
9084 2002-07-22  Martin Baulig  <martin@gnome.org>
9085
9086         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9087         return types of the methods.  The return type is not part of the
9088         signature and we must not check it to make the `new' modifier work.
9089         Fixes bug #27999, also added test-147.cs.
9090         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9091
9092         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9093         on the method's return type.
9094
9095 2002-07-21  Martin Baulig  <martin@gnome.org>
9096
9097         * assign.cs: Make this work if the rightmost source is a constant and
9098         we need to do an implicit type conversion.  Also adding a few more tests
9099         to test-38.cs which should have caught this.
9100
9101         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9102         target in the makefile for this.  The makefile.gnu is primarily intended
9103         for end-users who don't want to debug the compiler.
9104
9105 2002-07-21  Martin Baulig  <martin@gnome.org>
9106
9107         * assign.cs: Improved the Assign class so it can now handle embedded
9108         assignments (X = Y = Z = something).  As a side-effect this'll now also
9109         consume less local variables.  test-38.cs now passes with MCS, added
9110         a few new test cases to that test.
9111
9112 2002-07-20  Martin Baulig  <martin@gnome.org>
9113
9114         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
9115         instructions.  Fixes bug #27977, also added test-146.cs.
9116
9117 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9118
9119         * cs-tokenizer.cs: fixed getHex ().
9120
9121 2002-07-19  Martin Baulig  <martin@gnome.org>
9122
9123         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
9124         not Type.GetType() to lookup the array type.  This is needed when
9125         we're constructing an array of a user-defined type.
9126         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
9127         single-dimensional arrays, but also for single-dimensial arrays of
9128         type decimal.
9129
9130 2002-07-19  Martin Baulig  <martin@gnome.org>
9131
9132         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
9133         this function is called, it's not allowed to share LocalBuilders
9134         among ILGenerators.
9135
9136 2002-07-19  Martin Baulig  <martin@gnome.org>
9137
9138         * expression.cs (Argument.Resolve): Report an error 118 when trying
9139         to pass a type as argument.
9140
9141 2002-07-18  Martin Baulig  <martin@gnome.org>
9142
9143         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
9144         Conv_R_Un for the signed `long' type.
9145
9146 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
9147
9148         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
9149         `expr' for the temporary result, as that will fail if we do
9150         multiple resolves on the same expression.
9151
9152 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
9153
9154         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
9155         ec.TypeContainer for looking up aliases. 
9156
9157         * class.cs (TypeContainer): Remove LookupAlias from here.
9158
9159         * decl.cs (DeclSpace); Move here.
9160
9161 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
9162
9163         * class.cs (FindMembers): Only call filter if the constructor
9164         bulider is not null.
9165
9166         Also handle delegates in `NestedTypes' now.  Now we will perform
9167         type lookups using the standard resolution process.  This also
9168         fixes a bug.
9169
9170         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
9171         This uses Expressions (the limited kind that can be parsed by the
9172         tree) instead of strings.
9173
9174         * expression.cs (ComposedCast.ToString): Implement, used to flag
9175         errors since now we have to render expressions.
9176
9177         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
9178         FormArrayType. 
9179
9180         * ecore.cs (SimpleName.ToString): ditto.
9181
9182         * cs-parser.jay: Instead of using strings to assemble types, use
9183         Expressions to assemble the type (using SimpleName, ComposedCast,
9184         MemberAccess).  This should fix the type lookups in declarations,
9185         because we were using a different code path for this.
9186
9187         * statement.cs (Block.Resolve): Continue processing statements
9188         even when there is an error.
9189
9190 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
9191
9192         * class.cs (Event.Define): Also remove the `remove' method from
9193         the list of pending items.
9194
9195         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
9196         generate more compact code. 
9197
9198 2002-07-17  Martin Baulig  <martin@gnome.org>
9199
9200         * const.cs (Const.LookupConstantValue): Add support for constant
9201         `unchecked' and `checked' expressions.
9202         Also adding test case test-140.cs for this.
9203
9204 2002-07-17  Martin Baulig  <martin@gnome.org>
9205
9206         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
9207         check whether mi.ReturnType implements the IEnumerator interface; the
9208         `==' and the IsAssignableFrom() will fail in this situation.
9209
9210 2002-07-16  Ravi Pratap  <ravi@ximian.com>
9211
9212         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
9213         here too.
9214
9215 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9216
9217         * expression.cs: fixed bug #27811.
9218
9219 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
9220
9221         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
9222         Molaro: when we are a ref, the value already contains a pointer
9223         value, do not take the address of it.
9224
9225 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
9226         * removed mb-parser.jay and mb-tokenizer.cs
9227
9228 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9229
9230         * expression.cs: check against the building corlib void type.
9231
9232 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
9233
9234         * ecore.cs: fix for valuetype static readonly fields: when 
9235         initializing them, we need their address, not the address of a copy.
9236
9237 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
9238
9239         * typemanager.cs: register also enum_type in corlib.
9240
9241 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9242
9243         * class.cs: allow calling this (but not base) initializers in structs.
9244
9245 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
9246
9247         * ecore.cs: make sure we compare against the building base types
9248         in GetTypeSize ().
9249
9250 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
9251
9252         * typemanager.cs: fix TypeToCoreType() to handle void and object
9253         (corlib gets no more typerefs after this change).
9254
9255 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
9256
9257         * expression.cs (ArrayCreation.EmitArrayArguments): use
9258         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
9259
9260         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
9261         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
9262         array indexes, the runtime actually forbids them.
9263
9264         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
9265         for array arguments here.
9266
9267         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
9268         instead of the default for ValueTypes.
9269
9270         (New.DoEmit): Use IsValueType instead of
9271         IsSubclassOf (value_type)
9272         (New.DoResolve): ditto.
9273         (Invocation.EmitCall): ditto.
9274
9275         * assign.cs (Assign): ditto.
9276
9277         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
9278         Statements *are* currently doing part of their resolution during
9279         Emit.  
9280
9281         Expressions do always resolve during resolve, but statements are
9282         only required to propagate resolution to their children.
9283
9284 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
9285
9286         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
9287
9288         (LoadAssembly): Do not add the dll if it is already specified
9289
9290         (MainDriver): Add the System directory to the link path at the end,
9291         after all the other -L arguments. 
9292
9293         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
9294         wrong opcode for loading bytes and bools (ldelem.i1 instead of
9295         ldelem.u1) and using the opposite for sbytes.
9296
9297         This fixes Digger, and we can finally run it.
9298
9299         * driver.cs (UnixParseOption): Move the option parsing here.  
9300         (CSCParseOption): Implement CSC-like parsing of options.
9301
9302         We now support both modes of operation, the old Unix way, and the
9303         new CSC-like way.  This should help those who wanted to make cross
9304         platform makefiles.
9305
9306         The only thing broken is that /r:, /reference: and /lib: are not
9307         implemented, because I want to make those have the same semantics
9308         as the CSC compiler has, and kill once and for all the confussion
9309         around this.   Will be doing this tomorrow.
9310
9311         * statement.cs (Unsafe.Resolve): The state is checked during
9312         resolve, not emit, so we have to set the flags for IsUnsfe here.
9313
9314 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9315
9316         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
9317         not catch the Error_ObjectRefRequired in SimpleName (as it is
9318         possible to have a class/instance variable name that later gets
9319         deambiguated), we have to check this here.      
9320
9321 2002-07-10  Ravi Pratap  <ravi@ximian.com>
9322
9323         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
9324         make static and put into Expression.
9325
9326         (Event.Define): Register the private field of the event with the 
9327         TypeManager so that GetFieldFromEvent can get at it.
9328
9329         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
9330         keep track of the private field associated with an event which
9331         has no accessors.
9332
9333         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
9334         private field.
9335
9336         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
9337
9338 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9339
9340         * expression.cs (Binary.EmitBranchable): this routine emits the
9341         Binary expression in a branchable context.  This basically means:
9342         we need to branch somewhere, not just get the value on the stack.
9343
9344         This works together with Statement.EmitBoolExpression.
9345
9346         * statement.cs (Statement.EmitBoolExpression): Use
9347         EmitBranchable. 
9348
9349 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
9350
9351         * statement.cs (For): Reduce the number of jumps in loops.
9352
9353         (For): Implement loop inversion for the For statement.
9354
9355         (Break): We can be breaking out of a Try/Catch controlled section
9356         (foreach might have an implicit try/catch clause), so we need to
9357         use Leave instead of Br.
9358
9359         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
9360         now).  If the instace expression supports IMemoryLocation, we use
9361         the AddressOf method from the IMemoryLocation to extract the
9362         address instead of emitting the instance.
9363
9364         This showed up with `This', as we were emitting the instance
9365         always (Emit) instead of the Address of This.  Particularly
9366         interesting when This is a value type, as we dont want the Emit
9367         effect (which was to load the object).
9368
9369 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
9370
9371         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
9372
9373         * statement.cs (Checked): Set the CheckedState during the resolve
9374         process too, as the ConvCast operations track the checked state on
9375         the resolve process, and not emit.
9376
9377         * cs-parser.jay (namespace_member_declaration): Flag that we have
9378         found a declaration when we do.  This is used to flag error 1529
9379
9380         * driver.cs: Report ok when we display the help only.
9381
9382 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
9383
9384         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
9385
9386 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
9387
9388         * cs-tokenizer.cs (define): We also have to track locally the
9389         defines.  AllDefines is just used for the Conditional Attribute,
9390         but we also need the local defines for the current source code. 
9391
9392 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
9393
9394         * statement.cs (While, For, Do): These loops can exit through a
9395         Break statement, use this information to tell whether the
9396         statement is the last piece of code.
9397
9398         (Break): Flag that we break.
9399
9400         * codegen.cs (EmitContexts): New `Breaks' state variable.
9401
9402 2002-07-03  Martin Baulig  <martin@gnome.org>
9403
9404         * class.cs (TypeContainer.MethodModifiersValid): Allow override
9405         modifiers in method declarations in structs.  Otherwise, you won't
9406         be able to override things like Object.Equals().
9407
9408 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9409
9410         * class.cs (Method, Property, Indexer): Do not allow the public
9411         modifier to be used in explicit interface implementations.
9412
9413         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
9414         override modifiers in method declarations in structs
9415
9416 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
9417
9418         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
9419         integer or real overflow, report an error
9420
9421 2002-07-02  Martin Baulig  <martin@gnome.org>
9422
9423         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
9424         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
9425         to tell the runtime about our newly created System.Object and
9426         System.ValueType types.
9427
9428 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9429
9430         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
9431         struct instead of Ldarg/Starg.
9432
9433 2002-07-02  Martin Baulig  <martin@gnome.org>
9434
9435         * expression.cs (Indirection.Indirection): Call
9436         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
9437
9438 2002-07-02  Martin Baulig  <martin@gnome.org>
9439
9440         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
9441         ValueType, call TypeManager.TypeToCoreType() on it.
9442         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
9443         the OpCodes.Newarr argument.
9444
9445 2002-07-02  Martin Baulig  <martin@gnome.org>
9446
9447         * expression.cs (Invocation.EmitCall): When compiling corlib,
9448         replace all calls to the system's System.Array type to calls to
9449         the newly created one.
9450
9451         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
9452         System.Array methods.
9453         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
9454         from the system's System.Array type which must be replaced.
9455
9456 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
9457
9458         * typemanager.cs: load unverifiable_code_ctor so we can build
9459         corlib using the correct type. Avoid using GetTypeCode() with
9460         TypeBuilders.
9461         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
9462         TypeManager.object_type to allow building corlib.
9463
9464 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
9465
9466         * ecore.cs: handle System.Enum separately in LoadFromPtr().
9467
9468 2002-07-01  Martin Baulig  <martin@gnome.org>
9469
9470         * class.cs: Make the last change actually work, we need to check
9471         whether `ifaces != null' to avoid a crash.
9472
9473 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9474
9475         * class.cs: when we build structs without fields that implement
9476         interfaces, we need to add the interfaces separately, since there is
9477         no API to both set the size and add the interfaces at type creation
9478         time.
9479
9480 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9481
9482         * expression.cs: the dimension arguments to the array constructors
9483         need to be converted if they are a long.
9484
9485 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
9486
9487         * class.cs: don't emit ldarg.0 if there is no parent constructor
9488         (fixes showstopper for corlib).
9489
9490 2002-06-29  Martin Baulig  <martin@gnome.org>
9491
9492         MCS now compiles corlib on GNU/Linux :-)
9493
9494         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
9495         ie. check for MethodImplOptions.InternalCall.
9496
9497         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
9498         and TypeManager.attribute_type are null, so we must explicitly check
9499         whether parent is not null to find out whether it's an attribute type.
9500         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
9501         and SetBuilder, not only if the property is neither abstract nor external.
9502         This is necessary to set the MethodImplOptions on the accessor methods.
9503         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
9504         SetBuilder, see Property.Emit().
9505
9506         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
9507         populate "System.Object", "System.ValueType" and "System.Attribute" since
9508         they've already been populated from BootCorlib_PopulateCoreTypes().
9509
9510 2002-06-29  Martin Baulig  <martin@gnome.org>
9511
9512         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
9513         is the NullLiteral, we also need to make sure that target_type is not
9514         an enum type.   
9515
9516 2002-06-29  Martin Baulig  <martin@gnome.org>
9517
9518         * rootcontext.cs (RootContext.ResolveCore): We must initialize
9519         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
9520         before calling BootstrapCorlib_ResolveDelegate ().
9521
9522 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9523
9524         * statement.cs: fixed build-breaker. All tests passed ok.
9525
9526 2002-06-27  Martin Baulig  <martin@gnome.org>
9527
9528         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
9529         for System.Decimal when compiling corlib.
9530
9531 2002-06-27  Martin Baulig  <martin@gnome.org>
9532
9533         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
9534         switch blocks which contain nothing but a default clause.
9535
9536 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
9537
9538        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
9539
9540 2002-06-27  Martin Baulig  <martin@gnome.org>
9541
9542         * ecore.cs (PropertyExpr.PropertyExpr): Call
9543         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
9544
9545         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
9546         is already a TypeBuilder.
9547
9548 2002-06-27  Martin Baulig  <martin@gnome.org>
9549
9550         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
9551         `target_type == TypeManager.array_type', not IsAssignableFrom() in
9552         the "from an array-type to System.Array" case.  This makes it work
9553         when compiling corlib.
9554
9555 2002-06-27  Martin Baulig  <martin@gnome.org>
9556
9557         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
9558         non-static PropertyExpr, set its InstanceExpression.  This makes
9559         the `ICollection.Count' property work in System/Array.cs.
9560
9561 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
9562
9563         * driver.cs: Made error handling more consistent.  Errors now
9564         tracked by Report class, so many methods which used to return int
9565         now return void.  Main() now prints success/failure and 
9566         errors/warnings message.
9567
9568         Renamed '--probe' compiler argument to '--expect-error'.  Removed
9569         the magic number return values (123 and 124).  Now, if the
9570         expected error occurs, the compiler exits with success (exit value
9571         0).  If the compilation completes without seeing that particular
9572         error, the compiler exits with failure (exit value 1).  The
9573         makefile in mcs/errors has been changed to handle the new behaviour.
9574
9575         * report.cs: Made 'expected error' number a property and renamed
9576         it from 'Probe' to 'ExpectedError'.
9577
9578         * genericparser.cs: Removed error handling support, since it is
9579         now all done by Report class.
9580
9581         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
9582         class, so parse() no longer returns an int.
9583
9584         * namespace.cs: Use Report.Error instead of GenericParser.error
9585
9586 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
9587
9588         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
9589         TypeContainer.AddOperator): At the front of the list put the
9590         explicit implementations, so they get resolved/defined first. 
9591
9592 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
9593
9594         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
9595         interface type is implemented by this TypeContainer.  Used during
9596         explicit interface implementation.
9597
9598         (Property.Define, Indexer.Define, Method.Define): Validate that
9599         the given interface in the explicit implementation is one of the
9600         base classes for the containing type.
9601
9602         Also if we are explicitly implementing an interface, but there is
9603         no match in the pending implementation table, report an error.
9604
9605         (Property.Define): Only define the property if we are
9606         not explicitly implementing a property from an interface.  Use the
9607         correct name also for those properties (the same CSC uses,
9608         although that is really not needed).
9609
9610         (Property.Emit): Do not emit attributes for explicitly implemented
9611         properties, as there is no TypeBuilder.
9612
9613         (Indexer.Emit): ditto.
9614
9615         Hiding then means that we do not really *implement* a pending
9616         implementation, which makes code fail.
9617
9618 2002-06-22  Martin Baulig  <martin@gnome.org>
9619
9620         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
9621         the return value of Object.GetType().  [FIXME: we need to do this whenever
9622         we get a type back from the reflection library].
9623
9624 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
9625
9626         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
9627
9628 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
9629
9630         * attribute.cs: Return null if we can not look up the type.
9631
9632         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
9633         the interface types found.
9634
9635         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
9636         interface types found.
9637
9638         * typemanager.cs (GetInterfaces): Make this routine returns alll
9639         the interfaces and work around the lame differences between
9640         System.Type and System.Reflection.Emit.TypeBuilder in the results
9641         result for GetInterfaces.
9642
9643         (ExpandInterfaces): Given an array of interface types, expand and
9644         eliminate repeated ocurrences of an interface.  This expands in
9645         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
9646         be IA, IB, IC.
9647
9648 2002-06-21  Martin Baulig  <martin@gnome.org>
9649
9650         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
9651         on System.Enum.
9652
9653 2002-06-21  Martin Baulig  <martin@gnome.org>
9654
9655         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
9656         and called with one of the core types, return the corresponding typebuilder for
9657         that type.
9658
9659         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
9660         element type.
9661
9662 2002-06-21  Martin Baulig  <martin@gnome.org>
9663
9664         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
9665         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
9666         (Expression.ConvertReferenceExplicit): Likewise.
9667
9668         * expression.cs (ElementAccess.DoResolve): Likewise.
9669         (ElementAccess.DoResolveLValue): Likewise.
9670
9671 2002-06-10  Martin Baulig  <martin@gnome.org>
9672
9673         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
9674         add the "value" parameter to the parameter list.
9675
9676         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
9677         to our caller.
9678
9679 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
9680
9681         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
9682         the argument to an int, uint, long or ulong, per the spec.  Also
9683         catch negative constants in array creation.
9684
9685 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
9686
9687         * class.cs: do not allow the same interface to appear twice in
9688         the definition list.
9689
9690 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
9691
9692         * ecore.cs: don't use ldlen with System.Array.
9693
9694 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
9695
9696         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
9697
9698 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
9699
9700         * modifiers.cs: produce correct field attributes for protected
9701         internal. Easy fix so miguel can work on ther harder stuff:-)
9702
9703 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
9704
9705         * pending.cs: New file.  Move the code from class.cs here.
9706         Support clearning the pending flag for all methods (when not doing
9707         explicit interface implementation).
9708
9709 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
9710
9711         * rootcontext.cs: added a couple more types needed to bootstrap.
9712
9713 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
9714
9715         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
9716         constructor in the type, instead of any constructor in the type
9717         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
9718         a bug in the Mono runtime when applying the params attribute). 
9719
9720 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
9721         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
9722
9723 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
9724
9725         * expression.cs (Unary.ResolveOperator): Use TypeManager
9726         to resolve the type.
9727
9728 2002-06-13  Ravi Pratap  <ravi@ximian.com>
9729
9730         * cs-parser.jay (enum_member_declaration): Pass in the attributes
9731         attached.
9732
9733         * enum.cs (AddEnumMember): Add support to store the attributes associated 
9734         with each member too.
9735
9736         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
9737         field builders too - this takes care of the enum member case.
9738
9739 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
9740
9741         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
9742         address-of operator on both value types and pointers.
9743
9744 2002-06-10  Martin Baulig  <martin@gnome.org>
9745
9746         * interface.cs (Interface.PopulateIndexer): Add the indexer's
9747         PropertyBuilder to the `property_builders' list.
9748
9749         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
9750         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
9751         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
9752         find any indexers which are inherited from an interface.
9753
9754 2002-06-09  Martin Baulig  <martin@gnome.org>
9755
9756         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
9757         the same type as the constant if necessary.  There's also a test-130.cs
9758         for this.
9759
9760         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
9761
9762         * typemanager.cs (TypeManager.ChangeType): Previously known as
9763         Enum.ChangeEnumType().
9764
9765 2002-06-09  Martin Baulig  <martin@gnome.org>
9766
9767         * expression.cs (Cast.TryReduce): Added support for consts.
9768
9769 2002-06-08  Ravi Pratap  <ravi@ximian.com>
9770
9771         * class.cs (Accessor): Hold attributes information so we can pass
9772         it along.
9773
9774         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
9775         Modify to pass in attributes attached to the methods.
9776
9777         (add_accessor_declaration, remove_accessor_declaration): Ditto.
9778
9779         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
9780         to handle the Accessor kind :-)
9781
9782         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
9783
9784 2002-06-08  Martin Baulig  <martin@gnome.org>
9785
9786         * expression.cs (Unary.TryReduceNegative): Added support for
9787         ULongConstants.
9788
9789 2002-06-08  Martin Baulig  <martin@gnome.org>
9790
9791         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
9792         name can't be found in the `defined_names' - the caller will do a
9793         MemberLookup in this case and thus find methods in System.Enum
9794         such as Enum.IsDefined().
9795
9796 2002-06-08  Martin Baulig  <martin@gnome.org>
9797
9798         * enum.cs (Enum.ChangeEnumType): This is a custom version of
9799         Convert.ChangeType() which works with TypeBuilder created types.
9800         (Enum.LookupEnumValue, Enum.Define): Use it here.
9801
9802         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
9803         `TypeBuilder.BaseType != null' check.
9804         (TypeContainer.FindMembers): Only lookup parent members if we
9805         actually have a parent.
9806         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
9807         (ConstructorInitializer.Resolve): Likewise.
9808
9809         * interface.cs (Interface.FindMembers): Added
9810         `TypeBuilder.BaseType != null' check.
9811
9812         * rootcontext.cs (RootContext.ResolveCore): Added
9813         "System.Runtime.CompilerServices.IndexerNameAttribute" to
9814         classes_second_stage.
9815
9816         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
9817         debug_type and trace_type when compiling with --nostdlib.       
9818
9819 2002-06-07  Martin Baulig  <martin@gnome.org>
9820
9821         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
9822         (AddField): Set it to true when adding a non-static field.
9823         (DefineType): Use `have_nonstatic_fields' to find out whether we
9824         have non-static fields, not `Fields != null'.
9825
9826 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
9827
9828         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
9829         dereferencing a null on the static-field code path)
9830
9831 2002-05-30  Martin Baulig  <martin@gnome.org>
9832
9833         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
9834         to take command line arguments.  Use reflection to call the new
9835         custom `Initialize' function on the symbol writer and pass it the
9836         command line arguments.
9837
9838         * driver.cs (--debug-args): New command line argument to pass command
9839         line arguments to the symbol writer.
9840
9841 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
9842
9843         * assign.cs (DoResolve): Forgot to do the implicit conversion to
9844         the target type for indexers and properties.  Thanks to Joe for
9845         catching this.
9846
9847 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
9848
9849         * typemanager.cs (MethodFlags): returns the method flags
9850         (Obsolete/ShouldIgnore) that control warning emission and whether
9851         the invocation should be made, or ignored. 
9852
9853         * expression.cs (Invocation.Emit): Remove previous hack, we should
9854         not do this on matching a base type, we should do this based on an attribute
9855
9856         Only emit calls to System.Diagnostics.Debug and
9857         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
9858         on the command line.
9859
9860         * rootcontext.cs: Global settings for tracing and debugging.
9861
9862         * cs-tokenizer.cs (define): New utility function to track
9863         defines.   Set the global settings for TRACE and DEBUG if found.
9864
9865 2002-05-25  Ravi Pratap  <ravi@ximian.com>
9866
9867         * interface.cs (Populate*): Pass in the TypeContainer as well as
9868         the DeclSpace as parameters so that we can create EmitContexts and
9869         then use that to apply attributes etc.
9870
9871         (PopulateMethod, PopulateEvent, PopulateProperty)
9872         (PopulateIndexer): Apply attributes everywhere.
9873
9874         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
9875         etc.
9876
9877         (ApplyAttributes): Update accordingly.
9878
9879         We now apply interface attributes for all members too.
9880
9881 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
9882
9883         * class.cs (Indexer.Define); Correctly check if we are explicit
9884         implementation (instead of checking the Name for a ".", we
9885         directly look up if the InterfaceType was specified).
9886
9887         Delay the creation of the PropertyBuilder.
9888
9889         Only create the PropertyBuilder if we are not an explicit
9890         interface implementation.   This means that explicit interface
9891         implementation members do not participate in regular function
9892         lookups, and hence fixes another major ambiguity problem in
9893         overload resolution (that was the visible effect).
9894
9895         (DefineMethod): Return whether we are doing an interface
9896         implementation. 
9897
9898         * typemanager.cs: Temporary hack until we get attributes in
9899         interfaces (Ravi is working on that) and we get IndexerName
9900         support in interfaces.
9901
9902         * interface.cs: Register the indexers as properties.
9903
9904         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
9905         warning, I have verified that this is a bug in the .NET runtime
9906         (JavaScript suffers of the same problem).
9907
9908         * typemanager.cs (MemberLookup): When looking up members for
9909         interfaces, the parent of an interface is the implicit
9910         System.Object (so we succeed in searches of Object methods in an
9911         interface method invocation.  Example:  IEnumerable x;  x.ToString
9912         ()) 
9913
9914 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
9915
9916         * class.cs (Event): Events should also register if they do
9917         implement the methods that an interface requires.
9918
9919         * typemanager.cs (MemberLookup); use the new GetInterfaces
9920         method. 
9921
9922         (GetInterfaces): The code used to lookup interfaces for a type is
9923         used in more than one place, factor it here. 
9924
9925         * driver.cs: Track the errors at the bottom of the file, we kept
9926         on going.
9927
9928         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
9929         instance if the method we are calling is static!
9930
9931 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
9932
9933         * attribute.cs (ApplyAttributes): Make this function filter out
9934         the IndexerName attribute (as that attribute in reality is never
9935         applied) and return the string constant for the IndexerName
9936         attribute. 
9937
9938         * class.cs (TypeContainer.Emit): Validate that all the indexers
9939         have the same IndexerName attribute, and if so, set the
9940         DefaultName attribute on the class. 
9941
9942         * typemanager.cs: The return value might contain other stuff (not
9943         only methods).  For instance, consider a method with an "Item"
9944         property and an Item method.
9945
9946         * class.cs: If there is a problem with the parameter types,
9947         return. 
9948
9949 2002-05-24  Ravi Pratap  <ravi@ximian.com>
9950
9951         * ecore.cs (ImplicitConversionExists): Wrapper function which also
9952         looks at user defined conversion after making a call to 
9953         StandardConversionExists - we need this for overload resolution.
9954
9955         * expression.cs : Update accordingly the various method calls.
9956
9957         This fixes 2 bugs filed against implicit user defined conversions 
9958
9959 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
9960
9961         * statement.cs: Track the result of the assignment.
9962
9963 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
9964
9965         * expression.cs (MemberAccess): Improved error reporting for
9966         inaccessible members.
9967
9968 2002-05-22  Martin Baulig  <martin@gnome.org>
9969
9970         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
9971         itself with debugging support.
9972
9973 2002-05-22  Martin Baulig  <martin@gnome.org>
9974
9975         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
9976         Removed, this isn't needed anymore.
9977
9978 2002-05-20  Martin Baulig  <martin@gnome.org>
9979
9980         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
9981         be underlying type for an enum.
9982
9983 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
9984
9985         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
9986         that splits out the loading of just the core types.
9987
9988         * rootcontext.cs (ResolveCore): Split the struct resolution in
9989         two, so we can load the enumeration underlying types before any
9990         enums are used.
9991
9992         * expression.cs (Is): Bandaid until we fix properly Switch (see
9993         bug #24985 for details).
9994
9995         * typemanager.cs (ImplementsInterface): The hashtable will contain
9996         a null if there are no interfaces implemented.
9997
9998 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
9999
10000         * cs-parser.jay (indexer_declarator): It is fine to have array
10001         parameters
10002
10003 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10004
10005         * typemanager.cs: (RegisterBuilder): New function used to register
10006         TypeBuilders that implement interfaces.  Since
10007         TypeBuilder.GetInterfaces (as usual) does not work with lame
10008         Reflection.Emit. 
10009         (AddUserType): register interfaces.
10010
10011         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10012         dealing with TypeBuilder.  Also, arrays are showing up as
10013         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10014         methods can not be invoked on them!
10015
10016         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10017         (ImplicitReferenceConversionExists): Split out from
10018         StandardConversionExists. 
10019
10020         * expression.cs (As): We were only implementing one of the three
10021         cases for the as operator.  We now implement them all.
10022         (Is): Implement the various other cases for Is as well.
10023
10024         * typemanager.cs (CACHE): New define used to control if we want or
10025         not the FindMembers cache.  Seems to have a negative impact on
10026         performance currently
10027
10028         (MemberLookup): Nested types have full acess to
10029         enclosing type members
10030
10031         Remove code that coped with instance/static returns for events, we
10032         now catch this in RealFindMembers.
10033
10034         (RealFindMembers): only perform static lookup if the instance
10035         lookup did not return a type or an event.  
10036
10037 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10038
10039         * assign.cs (CompoundAssign): We pass more semantic information
10040         now to Compound Assignments than we did before: now we have all
10041         the information at hand, and now we resolve the target *before* we
10042         do the expression expansion, which allows the "CacheValue" method
10043         to have the effect we intended (before, a [x] += 1 would generate
10044         two differen ArrayAccess expressions from the ElementAccess,
10045         during the resolution process).
10046
10047         (CompoundAssign.DoResolve): Resolve target and original_source here.
10048
10049 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10050
10051         * expression.cs (ArrayAccess): dropped debugging information. 
10052
10053         * typemanager.cs: Small bug fix: I was always returning i_members,
10054         instead of one of i_members or s_members (depending on which had
10055         the content).
10056
10057         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10058         method is invoked before any code generation takes place, and it
10059         is a mechanism to inform that the expression will be invoked more
10060         than once, and that the method should use temporary values to
10061         avoid having side effects
10062
10063         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10064
10065         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10066         implementation.
10067
10068         * expression.cs (Indirection, ArrayAccess): Add support for
10069         CacheTemporaries in these two bad boys. 
10070
10071         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10072         ldobj or ldind_ref.  
10073         (StoreFromPtr): Handle stobj as well.
10074
10075         * expression.cs (UnaryMutator): Share more code.
10076
10077         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10078         down: I was not tracking the Filter function as well, which
10079         was affecting the results of the cache.
10080
10081 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10082
10083         * attribute.cs: Remove the hack to handle the CharSet property on
10084         StructLayouts. 
10085
10086 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10087
10088         * attribute.cs (DoResolve): More uglyness, we now only try to
10089         resolve the attribute partially, to extract the CharSet
10090         information (only if we are a StructLayout attribute).  Otherwise 
10091
10092         (GetExtraTypeInfo): Add some code to conditionally kill in the
10093         future this.   I am more and more convinced that the .NET
10094         framework has special code to handle the attribute setting on
10095         certain elements.
10096
10097         * expression.cs (IsParamsMethodApplicable): Revert my previous
10098         foreach change here, it was wrong.
10099
10100 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10101
10102         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10103         (pp_expr): do not abort on unknown input, just return.
10104         (eval): abort if there are pending chars.
10105
10106         * attribute.cs (Attribute.Resolve): Positional parameters are
10107         optional.  Deal with that case.
10108
10109         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10110         the Ansi/Unicode/Auto information for the type.
10111
10112         (TypeContainer.DefineType): instantiate the EmitContext here, as
10113         we will be using it during the type definition (to resolve
10114         attributes) and during the emit phase.
10115
10116         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
10117         to pull type information out of the attributes
10118
10119         (Attribute.Resolve): track the constructor builder, and allow for
10120         multiple invocations (structs and classes will use this).
10121
10122         * ecore.cs (MemberLookupFinal): new version with all the
10123         parameters customizable.
10124
10125         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
10126         constructors.  Return if the result value is null (as the error
10127         would have been flagged already by MemberLookupFinal)
10128
10129         Do not allow instances of abstract classes or interfaces to be
10130         created.
10131
10132         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
10133         We have to compare the assembly property here when dealing with
10134         FamANDAssem and Assembly access modifiers, because we might be
10135         creating an assembly from *modules* (that means that we are not
10136         getting TypeBuilders for types defined in other modules that are
10137         part of this assembly).
10138
10139         (Method.Emit): If the method is marked abstract and has a body,
10140         emit an error. 
10141
10142         (TypeContainer.DefineMembers): If both the defined member and the
10143         parent name match are methods, then do not emit any warnings: let
10144         the Method.Define routine take care of flagging warnings.  But if
10145         there is a mismatch (method overrides something else, or method is
10146         overriwritten by something, then emit warning).
10147
10148         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
10149         set to null, this means `do not check for the return type on the
10150         signature'. 
10151
10152         (Method.Define): set the return type for the method signature to
10153         null, so that we get methods with the same name and parameters and
10154         different return types.  This is used to flag warning 114 (you are
10155         hiding a method, and you probably want to use the new/override
10156         keywords instead).
10157
10158         * typemanager.cs (MemberLookup): Implemented proper access
10159         control, closing a long standing set of bug reports.  The problem
10160         was that the Framework only has two bits: Public and NonPublic,
10161         and NonPublic includes private and protected methods, but we need
10162         to enforce the FamANDAssem, FamOrAssem and Family. 
10163
10164 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
10165
10166         * statement.cs (GotoCase): Return true: Ammounts to giving up
10167         knowledge on whether we return or not, and letting the other case
10168         be responsible for it.
10169
10170 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
10171
10172         * driver.cs: Do not load directories for each file processed, only
10173         do it if there is a pattern.
10174
10175         * ecore.cs: Report readonly assigns here as well, as we might have
10176         been resolved only by MemberAccess.
10177
10178         (SimpleName.SimpleNameResolve): Also be useful for LValue
10179         resolution.   We need this to propagate assign to local readonly variables
10180
10181         * typemanager.cs: Use a ptrhashtable for the criteria, because we
10182         do not want to reuse potential criteria memory.
10183
10184         * class.cs (MyEventBuilder): Set reflected_type;
10185
10186         * ecore.cs (Constantify): Added support for constifying bools.
10187
10188         (RootContext.LookupType): Added a cache for values looked up in
10189         the declaration space.
10190
10191         * typemanager.cs (FindMembers): Now is a front-end to
10192         RealFindMembers, and provides a two-level hashtable-based cache to
10193         the request.  
10194
10195         15% performance improvement: from 22.5 to 19.2 seconds.
10196
10197         * expression.cs (IsParamsMethodApplicable): use foreach.
10198         (Invocation.DoResolve): ditto.
10199         (New.DoResolve): ditto.
10200         (ArrayCreation.DoResolve): ditto.
10201
10202         * ecore.cs (FindMostEncompassingType): use foreach.
10203
10204         * delegate.cs (NewDelegate.DoResolve): Use foreach
10205
10206         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
10207         (RemoveMethods): use foreach.
10208
10209         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
10210         nested foreach statements instead of for, and also break out of
10211         the inner loop once a match is found.
10212
10213         (Invocation.OverloadResolve): Use foreach, simplify the code. 
10214
10215 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
10216
10217         * cfold.cs (BinaryFold): During an enumeration evaluation context,
10218         we actually unwrap the expression to allow for extra information
10219         to be extracted. 
10220
10221         * expression.cs: Use Shr_Un on unsigned operations. 
10222
10223 2002-05-08  Ravi Pratap  <ravi@ximian.com>
10224
10225         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
10226         applicable operators was not being considered correctly. This closes
10227         the bug Miguel reported.
10228
10229 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
10230
10231         * attribute.cs: check that the type derives from System.Attribute
10232         and report the correct error in that case (moved the duplicate code to
10233         its own method, too).
10234
10235 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
10236
10237         * attribute.cs: lookup attribute type name as the spec says: first the
10238         bare attribute name and then name + "Attribute" (nant compiles with
10239         mcs after this fix).
10240
10241 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
10242
10243         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
10244         Because of the way we parse things, we should try to see if a
10245         UIntConstant can fit in an integer.
10246
10247 2002-05-07  Ravi Pratap  <ravi@ximian.com>
10248
10249         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
10250         when we are in an explicit context.
10251
10252         (ConvertReferenceExplicit): When converting from Iface type S to Class
10253         T make sure the rules are implemented as an OR.
10254
10255         * parameter.cs (ParameterType): Make it a property for now although the
10256         purpose really isn't anything immediate.
10257
10258         * expression.cs (Is*Applicable): Do better checking on the parameter type
10259         of a ref/out parameter. The ones from the system assemblies are already 
10260         marked with the correct type so we don't need to do any correction.
10261
10262         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
10263         the object type is standard too so include that.
10264
10265 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10266
10267         * ecore.cs (StandardConversionExists): Augment with missing code:
10268         deal with IntConstant, LongConstants and Enumerations.
10269
10270         * assign.cs: Report the error, instead of failing silently
10271
10272         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
10273         typecontainer that they are declared, because the
10274         typecontainer/namespace will have the list of using clauses that
10275         need to be applied.
10276
10277         Assembly Attributes were escaping the normal registration
10278         mechanism. 
10279
10280         (EmitCode): Apply attributes within an EmitContext that represents
10281         the container they were declared on.
10282
10283         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
10284
10285 2002-05-06  Ravi Pratap  <ravi@ximian.com>
10286
10287         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
10288         Revamp completely - make much cleaner as we now operate only
10289         on a set of Types.
10290
10291         (FindMostSpecificSource, FindMostSpecificTarget): New methods
10292         to implement the logic detailed in the spec more correctly.
10293
10294         (UserDefinedConversion): Update accordingly.
10295
10296 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10297
10298         * statement.cs: Return flow analysis information up.
10299
10300         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
10301         and the default.
10302
10303         (token): Do not consume an extra character before calling
10304         decimal_digits.
10305
10306 2002-05-06  Piers Haken <piersh@friskit.com>
10307
10308         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
10309
10310 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10311
10312         * class.cs (Constructor.Emit): Set the IsStatic flag in the
10313         EmitContext during the instance constructor initializer
10314         resolution, to stop access to instance variables.
10315
10316         This is mandated by the spec, last paragraph of the `constructor
10317         initializers' section. 
10318
10319 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
10320
10321         * cs-parser.jay, class.cs (Accessor): new class used to represent
10322         an accessor (get or set).  In the past we used `null' to represent
10323         a missing accessor.  But this is ambiguous because there was no
10324         way to tell in abstract indexers/properties if one of them was
10325         specified.
10326
10327         Now there is a way of addressing that.
10328
10329         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
10330         instead of FindMembers.
10331
10332         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
10333         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
10334
10335         * attribute.cs: Treat indexers and properties as the same in terms
10336         of applying attributes
10337
10338         * ecore.cs (FindMostEncompassedType): Use statically initialized
10339         EmptyExpressions()s like we do elsewhere to avoid creating useless
10340         objects (and we take this out of the tight loop).
10341
10342         (GetConversionOperators): Move the code to extract the actual
10343         operators to a separate routine to clean things up.
10344
10345 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
10346
10347         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
10348         events are always registered FieldBuilders.
10349
10350         * class.cs (FieldBase): New class shared by Fields 
10351
10352         * delegate.cs: If we are a toplevel delegate, use our full name.
10353         If we are a nested delegate, then only use our tail name.
10354
10355 2002-05-02  Ravi Pratap  <ravi@ximian.com>
10356
10357         * expression.cs (IsApplicable): Ensure that we add the "&" to
10358         ref/out types before comparing it with the type of the argument.
10359
10360         (IsParamsMethodApplicable): Ditto.
10361
10362         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
10363         silly me ;-)
10364
10365         * delegate.cs : Handle the case when we have more than one applicable
10366         method. Flag an error only when we finish checking all.
10367
10368 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
10369
10370         * expression.cs: Add support for boolean static initializers.
10371
10372 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
10373
10374         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
10375
10376         * parameter.cs (ComputeParameterTypes,
10377         ComputeAndDefineParameterTypes): Better error handling: now we
10378         clear the `types' cache if we fail during any of the type lookups.
10379         We also return the status code correctly to our caller
10380
10381         * delegate.cs: If we fail to define a delegate, abort the extra
10382         steps. 
10383
10384         * expression.cs (Binary.ResolveOperator): for
10385         operator==(object,object) and operator !=(object, object) we also
10386         have to verify that there is an implicit conversion from one to
10387         the other.
10388
10389         (ArrayAccess.DoResolve): Array Access can operate on
10390         non-variables. 
10391
10392 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
10393
10394         * assign.cs (CompoundAssign): A new class used as a "flag" that
10395         the assignment actually is happening as part of a compound
10396         assignment operator.
10397
10398         During compound assignment, a few new rules exist to enable things
10399         like:
10400
10401         byte b |= 1 + 2
10402
10403         From the spec:
10404
10405         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
10406         to the type of x) if y is implicitly convertible to the type of x,
10407         and the operator is a builtin operator and the return type of the
10408         operator is explicitly convertible to the type of x. 
10409
10410         * rootcontext.cs: Reset warning level to 2.  4 catches various
10411         "interesting" features in mcs, we must clean this up at some
10412         point, but currently am trying to kill other bugs ;-)
10413
10414         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
10415         in container classes as well.  
10416
10417         * expression.cs (Binary.ResolveOperator): Handle string case
10418         before anything else (as operator overloading does emit an error
10419         before doing anything else).
10420
10421         This code could go away when we move to a table driven model, but
10422         i could not come up with a good plan last night.
10423
10424 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
10425
10426         * typemanager.cs (CSharpName): reimplementation using regex.
10427         * class.cs: added null check for fields in Emit
10428         * rootcontext.cs: set warninglevel to 4
10429
10430 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
10431
10432         * typemanager.cs (CSharpName): reimplemented with Lupus
10433         suggestion.
10434
10435 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
10436
10437         * statement.cs (If): correclty implement Resolve, because we were
10438         not catching sem errors in there.  The same process is needed
10439         everywhere else. 
10440         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
10441
10442
10443         (Statement.Warning_DeadCodeFound): Factorize code.
10444         (While): Report dead code here too.
10445
10446         (Statement): Added Resolve virtual method to allow
10447         for resolution split from the emit code.
10448
10449 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10450
10451         * statement.cs (EmitBoolExpression): No longer try to resolve the
10452         expression here.    
10453         (MakeBoolean): New utility function that resolve, implicitly
10454         converts to boolean and tags the expression. 
10455
10456
10457         (If, Do): Implement dead code elimination.
10458         (While): Implement loop inversion
10459
10460         (Do, While, For, If): Resolve the expression prior to calling our
10461         code generation.
10462
10463 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
10464
10465         * class.cs:
10466           - added method Report28 (warning: program has more than one entry point)
10467           - added method IsEntryPoint, implements paragraph 10.1 of the spec
10468           - modified method Method.Define, the part at the end of the method
10469
10470         * rootcontext.cs: added static public Location EntryPointLocation;
10471           
10472         * ../errors/cs0028.cs : Add test case for the above warning.              
10473
10474         * typemanager.cs:
10475           - modified method CSharpName to allow arrays of primitive type to
10476             be printed nicely (e.g. instead of System.Int32[][] it now prints
10477             int[][])
10478           - added method CSharpSignature: returns the signature of a method
10479             in string format to be used in reporting errors, warnings, etc.
10480
10481         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
10482         with String.Empty.
10483
10484 2002-04-26  Ravi Pratap  <ravi@ximian.com>
10485
10486         * delegate.cs (Define): Fix extremely silly bug where I was
10487         setting the type of the 'object' parameter of the BeginInvoke
10488         method to System.IAsyncResult instead of System.Object ;-)
10489
10490 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10491
10492         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
10493         here. 
10494
10495         (Constructor.Emit): return if we fail to initialize the
10496         constructor.  Another door closed!  
10497
10498         * expression.cs (New.DoResolve): Improve error message (from -6 to
10499         1501).  Use DeclaredOnly lookup to find the exact constructor.
10500
10501         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
10502         loop.  This is useful.
10503
10504         * cs-parser.jay: Adjust the default parameters so that destructors
10505         have the proper signature.
10506
10507 2002-04-26  Martin Baulig  <martin@gnome.org>
10508
10509         * driver.cs (LoadAssembly): If `assembly' contains any characters
10510         which are only valid in path names and not in assembly names
10511         (currently slash, backslash and point), use Assembly.LoadFrom ()
10512         instead of Assembly.Load () on the `assembly' (before iteration
10513         over the link_paths).
10514
10515 2002-04-26  Martin Baulig  <martin@gnome.org>
10516
10517         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
10518
10519 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
10520
10521         * class.cs (Property): use the new typemanager.MemberLookup
10522
10523         (TypeContainer.MemberLookup): Implement using the
10524         TypeManager.MemberLookup now. 
10525
10526         * typemanager.cs: Make MemberLookup a function of the TypeManager,
10527         and return MemberInfos, so that these can be used without an
10528         EmitContext (what we had before).
10529
10530 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
10531
10532         * expression.cs: Fix the case where the argument to params if the
10533         type of the params.  I omitted handling this before.   Fixed
10534
10535 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10536
10537         * driver.cs: Call BootCorlib_PopulateCoreType
10538
10539         * class.cs (Property.CheckBase): Check for properties only, not
10540         for all members. 
10541
10542         * interface.cs: Temporary hack: try/catch around the
10543         CustomAttributeBuilder, because I am getting an exception that I
10544         do not understand.
10545
10546         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
10547         types whose definitions are required to be there (attributes are
10548         defined before standard types).
10549
10550         Compute definitions as we boot the various types, as they are used
10551         immediately (value_type class will need object_type, but if we do
10552         not initialize object_type, we will pass a null, which will let
10553         the runtime pick the System.Object from the existing corlib, which
10554         is not what we want).
10555
10556 2002-04-22  Patrik Torstensson <totte@labs2.com>
10557
10558         * cs-tokenizer.cs: fixed a number of trim() issues.
10559
10560 2002-04-22  Ravi Pratap  <ravi@ximian.com>
10561
10562         * expression.cs (Argument.Type): Ensure that we return the correct
10563         type when we have out or ref parameters [in which case we 
10564         append a "&"].
10565
10566 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10567
10568         * class.cs (Property, Indexer): Allow extern modifier in there. 
10569
10570         * typemanager.cs (InitBaseTypes): Initializes object_type and
10571         value_type, since those will be used early on during the bootstrap
10572         process to compile corlib.
10573
10574         (InitCoreTypes): Move code from here to InitBaseTypes.
10575
10576 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
10577
10578         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
10579         single-dimension arrays as using the ldlen opcode.  
10580
10581         Daniel Lewis discovered this optimization.  
10582
10583         * typemanager.cs: Add signature for System.Array::get_Length
10584
10585 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10586
10587         * statement.cs: report the error when the foreach does not apply to an
10588         array nor a collection.
10589
10590 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
10591
10592         * expression.cs: Add implicit conversions to the operator ~.
10593
10594         * constant.cs (DecimalConstant.Emit): Emit decimal value.
10595
10596         * typemanager.cs: Locate the decimal constructor.
10597
10598 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10599
10600         * attribute.cs: use the new property of TypeOf.
10601         * expression.cs: added 'get' property around typearg.
10602
10603         These changes fix a build breaker reported by NickD. Is this the
10604         correct way to fix?  If not, please, revert my changes and make it
10605         work :-).
10606
10607 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
10608
10609         * attribute.cs: Add support for typeof in attribute invocations.
10610         I am not sure that this is right though.
10611
10612 2002-04-14  Duncan Mak  <duncan@ximian.com>
10613
10614         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
10615         Binary.Operator.Division case.
10616
10617 2002-04-13  Ravi Pratap  <ravi@ximian.com>
10618
10619         * class.cs (DefineType): Ensure that we do a proper check on
10620         attribute types and also register it with the TypeManager.
10621
10622         (TypeContainer.Targets): The default for attribute types is
10623         AttributeTargets.All.
10624
10625         * attribute.cs (ApplyAttributes): Registering the attribute type
10626         is done elsewhere, not when we discover we have a Usage attribute.
10627
10628 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10629
10630         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
10631         and get rid of is_delegate parameter.
10632
10633         * everywhere : update.
10634
10635 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10636
10637         * cs-parser.jay (compilation_unit): Revamp completely to use
10638         some new ideas that I got from Rhys' grammar to solve the problems
10639         with assembly level attributes.
10640
10641         (outer_declaration): New grammar production.
10642
10643         (attribute_sections): Add.
10644
10645         (opt_attributes): Base on attribute_sections
10646
10647         (namespace_declaration): Allow opt_attributes to tackle the case
10648         when we have assembly level attributes - we are clever in this
10649         regard now ;-)
10650
10651         * attribute.cs (ApplyAttributes): Do not worry about assembly 
10652         attributes in the non-global context.
10653
10654         * rootcontext.cs (AddGlobalAttributes): Go back to using this
10655         instead of SetGlobalAttributes.
10656
10657         * class.cs, rootcontext.cs : Ensure we define and generate 
10658         attribute types before anything else.
10659
10660         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
10661         and flag the new error -20 for the case when the attribute type
10662         does not have valid targets specified. csc does not catch this.
10663
10664         * ../errors/errors.txt : update for error # -20
10665
10666 2002-04-11  Ravi Pratap  <ravi@ximian.com>
10667
10668         * support.cs (InternalParameters.ParameterModifier): Do some null
10669         checking and return sane values.
10670
10671         * class.cs (Method.Define): If we are a PInvoke method, ensure
10672         that we are static and extern. Report error # 601
10673
10674         * ../errors/cs0601.cs : Add test case for the above error.
10675
10676 2002-04-07  Ravi Pratap  <ravi@ximian.com>
10677
10678         * rootcontext.cs (attribute_types): We need to keep type of
10679         all attribute types separately and emit code for them first.
10680
10681         (RegisterAttribute) : Implement.
10682
10683         * class.cs (DefineType): Check if the current Type is a custom
10684         attribute type and register it accordingly.
10685
10686         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
10687         adding the first attribute twice and rename to
10688
10689         (SetGlobalAttributes): this.
10690
10691         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
10692         lookups.
10693
10694         * attribute.cs (ApplyAttributes): Take an additional argument telling us
10695         if we are processing global arguments. Hmm, I am unsure of this.
10696
10697 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10698
10699         * expression.cs: added static array of strings to avoid calling
10700         Enum.ToString () for Operator in Binary. Significant recover of
10701         performance.
10702
10703 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
10704
10705         * class.cs (FindMembers): Allow the Builders of the various
10706         members to be null.  If they are skip them.  This only happens
10707         during the PInvoke declaration.
10708
10709 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
10710
10711         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
10712         failure, so we do not keep going afterwards.
10713
10714         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
10715         wanted to pass `false' as the `is_delegate' argument.  If this is
10716         the case, why not use delegate_type == null to mean `is_delegate =
10717         false' and anything else as is_delegate = true.
10718
10719 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
10720
10721         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
10722         code for the section, not the beginning of the tests.
10723
10724 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
10725
10726         * cfold.cs: Handle operator + (Enum x, Underlying x) 
10727
10728         * expression.cs (Binary): same.  Warn about errors where we have
10729         Enum/Enum in operator + as well.
10730
10731 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
10732
10733         * statement.cs:
10734                 - added support for switch(bool)
10735                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
10736                 - add TableSwitchEmit() to handle table-based switch statements
10737
10738 2002-04-05  Ravi Pratap  <ravi@ximian.com>
10739
10740         * expression.cs (Invocation.OverloadResolve): Factor out code which
10741         does parameter compatibility checking with arguments so that we can 
10742         re-use the code even from Delegate.VerifyApplicability
10743
10744         (VerifyArgumentsCompat): Move above code here.
10745
10746         * delegate.cs (VerifyApplicability): Get rid of duplicate code
10747         and instead make a call to the above method.
10748
10749 2002-03-31  Ravi Pratap  <ravi@ximian.com>
10750
10751         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
10752         We use it to keep track of classes which are attribute types.
10753
10754 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
10755
10756         * delegate.cs (Delegate.Define): Correctly define the types in the
10757         presence of fixed and array parameters.
10758
10759         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
10760         doing FindMembers.
10761
10762         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
10763         include NonPublic after the first iteration.
10764
10765         * class.cs (Indexer.CheckBase): Only check if both parents are
10766         non-null. 
10767
10768         * cs-parser.jay (accessor_body): If empty, set to null.
10769
10770         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
10771         same code path here to resolve constants names that we did have in
10772         MemberAccess.DoResolve.  There is too much code duplicated here.
10773
10774 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
10775
10776         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
10777
10778         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
10779         to MakeUnionSet.
10780
10781         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
10782         tokens, numbers and strings.
10783
10784         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
10785         parenthesis.
10786
10787         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
10788         asyncronous parameters and the regular parameters.  
10789
10790         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
10791         specify the target directory.
10792
10793         * expression.cs: (This.DoResolve): Simplify
10794         (As.Emit): Optimize, do not generate IsInst if the expression is
10795         always of the given type.
10796
10797         (Is.DoResolve): Bug fix, we were reporting both always/never for
10798         the is expression.
10799
10800         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
10801         creating too many unnecessary arrays.
10802
10803 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
10804
10805         * class.cs (EmitFieldInitializer): Use Assign expression to assign
10806         fields instead of rolling our own initializer.   Takes care of all
10807         implicit conversions, and drops unnecessary static checks/argument.
10808
10809 2002-03-31  Dick Porter  <dick@ximian.com>
10810
10811         * driver.cs: use the GetDirectories() return values properly, and
10812         use "/" as path separator.
10813
10814 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
10815
10816         * expression.cs (Unary): Optimize - - expr into expr.
10817         (Binary): Optimize a + (-b) into a -b.
10818
10819         * codegen.cs (CodeGen): Made all methods static.
10820
10821 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
10822
10823         * rootcontext.cs: 
10824
10825         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
10826         TypeBuilder property.
10827
10828         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
10829         instead. 
10830
10831         * tree.cs: Removed the various RecordXXXX, and replaced with a
10832         single RecordDecl.  Removed all the accessor methods, and just
10833         left a single access point Type 
10834
10835         * enum.cs: Rename DefineEnum to DefineType.
10836
10837         * decl.cs: New abstract method `DefineType' used to unify the
10838         Defines for Enumerations, Interfaces, TypeContainers and
10839         Delegates.
10840
10841         (FindType): Moved LookupInterfaceOrClass here.  Moved the
10842         LookupBaseClasses method that used to live in class.cs and
10843         interface.cs here, and renamed to FindType.
10844
10845         * delegate.cs: Implement DefineType.  Take advantage of the
10846         refactored pattern for locating the parent builder without taking
10847         the parent_builder argument (which we know does not work if we are
10848         nested, and triggering a toplevel definition).
10849
10850 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10851
10852         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
10853         accessibility of a member has changed during override and report
10854         an error if so.
10855
10856         * class.cs (Method.Define, Property.Define): Only complain on
10857         overrides if the method is private, any other accessibility is
10858         fine (and since we just checked the permission is the same, we are
10859         good to go).
10860
10861         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
10862         and elif are processed always.  The other pre-processing
10863         directives are only processed if we are "taking" the path
10864
10865 2002-03-29  Martin Baulig  <martin@gnome.org>
10866
10867         * class.cs (Method.Emit): Only emit symbolic debugging info if the
10868         current location is not Null.
10869
10870         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
10871         a separate method so we can profile it.
10872
10873         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
10874         `span.Seconds' are just seconds, but no minutes or hours.
10875         (MainDriver): Profile the CodeGen.SaveSymbols calls.
10876
10877 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10878
10879         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
10880         Remove the gratuitous set of Final:
10881
10882                                 // If an interface implementation, then we can set Final.
10883                                 if (((flags & MethodAttributes.Abstract) == 0) &&
10884                                     implementing.DeclaringType.IsInterface)
10885                                         flags |= MethodAttributes.Final;
10886
10887         I do not know what I was smoking when I used that.
10888
10889
10890         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
10891         step into fixing the name resolution issues for delegates and
10892         unifying the toplevel name resolution.
10893
10894 2002-03-28  Martin Baulig  <martin@gnome.org>
10895
10896         * class.cs (Method.Emit): If we have a symbol writer, call its
10897         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
10898         tell it about the current method.
10899
10900         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
10901         writer that we're going to emit the first byte of IL code for a new
10902         statement (a new source line).
10903         (EmitContext.EmitTopBlock): If we have a symbol writer, call
10904         EmitContext.Mark() before emitting any code.
10905
10906         * location.cs (SymbolDocument): Return null when we're Null.
10907
10908         * statement.cs (Statement): Moved the `Location loc' variable here.
10909         (Statement.EmitBoolExpression): If we have a symbol writer, call
10910         ec.Mark() before emitting any code to tell it that we're at the
10911         beginning of a new statement.
10912         (StatementExpression): Added `Location' argument to the constructor.
10913         (Block): Added public readonly variable `StartLocation' and public
10914         variable `EndLocation'.  The latter is to be set using SetEndLocation().
10915         (Block): Added constructor which takes a start and end location.
10916         (Block.SetEndLocation): New method. This sets the end location.
10917         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
10918         local variables we create.
10919         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
10920         each statement and do also mark the begin and end of the block.
10921
10922         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
10923         tell it the current lexer.Location, use Location.Null for the end of the
10924         block.
10925         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
10926         current block, set its end location using SetEndLocation().
10927         (statement_expression): StatementExpression constructor now takes the
10928         lexer.Location as additional argument.
10929         (for_statement, declare_local_variables): Likewise.
10930         (declare_local_variables): When creating a new implicit block, use the
10931         new Block constructor and pass it the lexer.Location.
10932
10933 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10934
10935         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
10936         members also on the parent interfaces recursively.
10937
10938 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
10939
10940         * report.cs: Use new formats, since Gonzalo finished the missing
10941         bits. 
10942
10943         * expression.cs (Binary.ResolveOperator): added missing operator|
10944         operator& and operator^ for bool/bool.
10945
10946         * cs-parser.jay: CheckDef now takes a Location argument that is
10947         used to report errors more precisly (instead of reporting the end
10948         of a definition, we try to track something which is a lot closer
10949         to the source of the problem).
10950
10951         * cs-tokenizer.cs: Track global token use, so we can properly flag
10952         the use of #define/#undef after the first token has been seen.
10953
10954         Also, rename the reportXXXX to Error_DescriptiveName
10955
10956         * decl.cs (DeclSpace.IsTopLevel): Move property here from
10957         TypeContainer, so that Enum and Interface can use this too.
10958
10959         * class.cs (TypeContainer.LookupInterfaceOrClass,
10960         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
10961         `builder' argument.  Typically this was used to pass the parent
10962         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
10963         the definition).  
10964
10965         The problem is that a nested class could trigger the definition of
10966         a toplevel class, and the builder would be obviously wrong in that
10967         case. 
10968
10969         So we drop this argument, and we compute dynamically the
10970         TypeBuilder/ModuleBuilder (the correct information was available
10971         to us anyways from DeclSpace.Parent)
10972
10973         * interface.cs (Interface.DefineInterface): Drop builder
10974         parameter cleanup like class.cs
10975
10976         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
10977         like class.cs
10978
10979         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
10980         values. 
10981
10982         (Try.Emit): Propagate the returns value from the statement.
10983
10984         (Return.Emit): Even if we are leavning 
10985
10986         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
10987
10988         * modifiers.cs: Fix the computation of MethodAttributes flags.
10989
10990 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
10991
10992         * driver.cs: allow compilation of files that start with '/'.
10993         Add a default case when checking the argument of --target.
10994
10995 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
10996
10997         * interface.cs: Implement the same search algorithm for types in
10998         the interface code.
10999
11000         * delegate.cs: Do not allow multiple definition.
11001
11002         * Recovered ChangeLog that got accidentally amputated
11003
11004         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11005
11006         * rootcontext.cs: Load manually enum to allow core classes to
11007         contain enumerations.
11008
11009         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11010         Update to new static methods in TypeManager.
11011
11012         * typemanager.cs (GetMethod, GetConstructor): Use our
11013         implementation of FindMembers to find the members, since during
11014         corlib compilation, the types are TypeBuilders and GetMethod and
11015         GetConstructor do not work.
11016
11017         Make all methods in TypeManager static.
11018
11019         (InitCodeHelpers): Split the functionality from
11020         the InitCodeTypes function.
11021
11022         * driver.cs: Call InitCodeHelpers after we have populated the
11023         types. 
11024
11025         * cs-parser.jay (delegate_declaration): we did not used to compute
11026         the delegate name correctly for void delegates.
11027
11028 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11029
11030         * rootcontext.cs (RootContext): Init the interface_resolve_order
11031         and type_container_resolve_order always.
11032
11033         (ResolveCore, BootstrapCorlib_ResolveClass,
11034         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11035         compiler when compiling with --nostdlib
11036
11037         * class.cs (TypeContainer.DefineType): Check that our parent is
11038         not null.  This test is most important when we are bootstraping
11039         the core types.
11040
11041         * codegen.cs: Split out the symbol writing code.
11042
11043 2002-03-25  Martin Baulig  <martin@gnome.org>
11044
11045         * driver.cs (-g): Made -g an alias for --debug.
11046
11047 2002-03-24  Martin Baulig  <martin@gnome.org>
11048
11049         * codegen.cs (SymbolWriter): New public variable. Returns the
11050         current symbol writer.
11051         (CodeGen): Added `bool want_debugging_support' argument to the
11052          constructor. If true, tell the ModuleBuild that we want debugging
11053         support and ask it for the ISymbolWriter.
11054         (Save): If we have a symbol writer, call it's Close() method after
11055         saving the assembly.
11056
11057         * driver.c (--debug): New command line argument to create a
11058         debugger information file.
11059
11060         * location.cs (SymbolDocument): New public property. Returns an
11061         ISymbolDocumentWriter object for the current source file or null
11062         if we don't have a symbol writer.
11063
11064 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11065
11066         * driver.cs (LoadAssembly): Correctly return when all the paths
11067         have been tried and not before.
11068
11069         * statement.cs (Switch.Emit): return the actual coverage for this
11070         statement (returns/not-returns)
11071
11072         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11073         switch of the statement if we are the last switch section.  That
11074         kills two problems: try/catch problems (we used to emit an empty
11075         nop at the end) and switch statements where all branches would
11076         return. 
11077
11078 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11079
11080         * driver.cs: Add default assemblies (the equivalent to the
11081         Microsoft CSC.RSP file)
11082
11083         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11084         also update tokens_seen and set it to false.
11085
11086         * driver.cs: Implement --recurse for Mike.
11087
11088         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11089         correctly splitting out the paths.
11090
11091 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11092
11093         * interface.cs (Interface.PopulateProperty): Instead of using
11094         `parent' as the declaration space for the set parameters, use
11095         `this' 
11096
11097         * support.cs (InternalParameters): InternalParameters constructor
11098         takes a DeclSpace instead of a TypeContainer.
11099
11100         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11101         types are being initialized, load the address of it before calling
11102         the function.  
11103
11104         (New): Provide a mechanism to disable the generation of local
11105         value type temporaries when the caller will be providing us with
11106         an address to store it.
11107
11108         (ArrayCreation.EmitDynamicInitializers): Use it.
11109
11110 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11111
11112         * expression.cs (Invocation.EmitArguments): Only probe for array
11113         property if there is more than one argument.  Sorry about that.
11114
11115         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
11116         empty param arrays.
11117
11118         * class.cs (Method.LabelParameters): Fix incorrect code path that
11119         prevented the `ParamArrayAttribute' from being applied to the
11120         params attribute.
11121
11122 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
11123
11124         * support.cs (ReflectionParameters): Correctly compute whether the
11125         last argument is a params array.  Fixes the problem with
11126         string.Split ('a')
11127
11128         * typemanager.cs: Make the assemblies array always be non-null
11129         (empty, but non-null)
11130
11131         * tree.cs (RecordDecl): New function that abstracts the recording
11132         of names.  This reports error 101, and provides a pointer to the
11133         previous declaration.  Fixes a crash in the compiler.
11134
11135         * cs-parser.jay (constructor_declaration): Update to new grammar,
11136         and provide a constructor_body that can be empty.
11137
11138 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
11139
11140         * driver.cs: Add support for --resources.
11141
11142         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
11143         Make all types for the various array helper methods be integer.
11144
11145         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
11146         CheckState to ConvCast.
11147
11148         (ConvCast): Now it takes a `checked' state argument, to avoid
11149         depending on the emit context for the conversion, and just using
11150         the resolve time setting.
11151
11152         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
11153         instead of Invocation.EmitArguments.  We do not emit the original
11154         arguments, instead we emit those which have been converted to
11155         unsigned int expressions.
11156
11157         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
11158
11159         * codegen.cs: ditto.
11160
11161         * expression.cs (LocalVariableReference): Drop the use of the
11162         Store function that depended on the variable index.
11163
11164         * statement.cs (VariableInfo): Drop the `Idx' property from this
11165         class, as this is not taking into account the indexes for
11166         temporaries tat we generate during the execution, getting the
11167         indexes wrong.
11168
11169         * class.cs: First emit class initializers, then call the parent
11170         constructor. 
11171
11172         * expression.cs (Binary): Fix opcode emision.
11173         (UnaryMutator.EmitCode): Support checked code generation
11174
11175         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
11176         matches for events for both the Static and Instance scans,
11177         pointing to the same element.   Fix that.
11178
11179 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
11180
11181         * rootcontext.cs (ResolveTree): Always set the
11182         interface_resolve_order, because nested interfaces will be calling
11183         into us.
11184
11185         * class.cs (GetInterfaceOrClass): Track the same resolution
11186         process used by TypeManager.LookupType.  This fixes the nested
11187         type lookups in class declarations (separate path from
11188         LookupType). 
11189
11190         (TypeContainer.DefineType): Also define nested interfaces.
11191         (TypeContainer.RegisterOrder): New public function used to
11192         register the order in which child interfaces need to be closed.
11193
11194         Nested interfaces need to be closed after their parents have been
11195         created. 
11196
11197         * interface.cs (InterfaceAttr): Put all the logic for computing
11198         the interface attribute here. 
11199
11200         (DefineInterface): Register our interface order with the
11201         RootContext or with the TypeContainer depending on the case.
11202
11203 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11204
11205         * cs-parser.jay: rework foreach statement to work with the new
11206         changes to the policy on SimpleNames.
11207
11208         * report.cs: support Stacktrace on warnings as well.
11209
11210         * makefile: drop --unsafe and /unsafe from the compile.
11211
11212 2002-03-13  Ravi Pratap  <ravi@ximian.com>
11213
11214         * ecore.cs (StandardConversionExists): Modify to take an Expression
11215         as the first parameter. Ensure we do null -> reference type conversion
11216         checking.
11217
11218         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
11219         temporary Expression objects.
11220
11221 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
11222
11223         * interface.cs: workaround bug in method overloading resolution
11224         (there is already a bugzilla bug for it).
11225
11226 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11227
11228         We could also solve this problem by having a separate path for
11229         performing type lookups, instead of DoResolve, we could have a
11230         ResolveType entry point, and only participating pieces of the
11231         production (simplename, deref, array) would implement this. 
11232
11233         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
11234         signal SimpleName to only resolve type names and not attempt to
11235         resolve anything else.
11236
11237         * expression.cs (Cast): Set the flag.
11238
11239         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
11240
11241         * class.cs: Only report 108 if there is no `new' modifier.
11242
11243         * cs-parser.jay: rework foreach statement to work with the new
11244         changes to the policy on SimpleNames.
11245
11246         * report.cs: support Stacktrace on warnings as well.
11247
11248         * makefile: drop --unsafe and /unsafe from the compile.
11249
11250 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
11251
11252         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11253         lookups here, instead of doing that at parse time.  This means
11254         that our grammar will not introduce `LocalVariableReferences' as
11255         expressions at this point.  That solves the problem of code like
11256         this:
11257
11258         class X {
11259            static void Main ()
11260            { int X = 1;
11261             { X x = null }}}
11262
11263         This is only half the fix.  The full fix requires parameters to
11264         also be handled in this way.
11265
11266         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
11267         makes the use more obvious of the DeclSpace.  The
11268         ec.TypeContainer.TypeBuilder is now only used to pull the
11269         TypeBuilder for it.
11270
11271         My theory is that I can get rid of the TypeBuilder completely from
11272         the EmitContext, and have typecasts where it is used (from
11273         DeclSpace to where it matters).  
11274
11275         The only pending problem is that the code that implements Aliases
11276         is on TypeContainer, and probably should go in DeclSpace.
11277
11278         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11279         lookups here, instead of doing that at parse time.  This means
11280         that our grammar will not introduce `LocalVariableReferences' as
11281         expressions at this point.  That solves the problem of code like
11282         this:
11283
11284         class X {
11285            static void Main ()
11286            { int X = 1;
11287             { X x = null }}}
11288
11289         This is only half the fix.  The full fix requires parameters to
11290         also be handled in this way.
11291
11292         * class.cs (Property.DefineMethod): When implementing an interface
11293         method, set newslot, when implementing an abstract method, do not
11294         set the flag (before we tried never setting it, or always setting
11295         it, which is the difference).
11296         (Indexer.DefineMethod): same.
11297         (Method.DefineMethod): same.
11298
11299         * ecore.cs: Only set the status used flag if we get back a Field.
11300
11301         * attribute.cs: Temporary hack, so Paolo can keep working.
11302
11303 2002-03-08  Ravi Pratap  <ravi@ximian.com>
11304
11305         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
11306         the unmanaged type in the case we have a MarshalAs attribute.
11307
11308         (Resolve): Handle the case when we are parsing the special MarshalAs
11309         attribute [we need to store the unmanaged type to use later]
11310
11311         * typemanager.cs (marshal_as_attr_type): Built in type for the 
11312         MarshalAs Attribute.
11313
11314         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
11315         on parameters and accordingly set the marshalling info.
11316
11317 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
11318
11319         * class.cs: Optimizing slightly by removing redundant code after
11320         we switched to the `NoTypes' return value.
11321         (Property.DefineMethod): use NoTypes here too.
11322
11323         This fixes the bug I introduced in my last batch of changes.
11324
11325 2002-03-05  Ravi Pratap  <ravi@ximian.com>
11326
11327         * tree.cs (RecordEnum): Add. We now keep track of enums too.
11328
11329         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
11330         Enums since those are types too. 
11331
11332         * cs-parser.jay (enum_declaration): Record enums as we parse them.
11333
11334         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
11335         thanks to a call during the lookup process.
11336
11337 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
11338
11339         * statement.cs (Foreach): Lots of work to accomodate a particular
11340         kind of foreach statement that I had not kept in mind.  It is
11341         possible to have foreachs on classes that provide a GetEnumerator
11342         method that return objects that implement the "pattern" for using
11343         a foreach, there is no need to support GetEnumerator
11344         specifically. 
11345
11346         This is needed to compile nant.
11347
11348         * decl.cs: Only report 114 if the member is not `Finalize' and if
11349         the warning level is at least 2.
11350
11351         * class.cs: Moved the compare function from Method to
11352         MethodSignature. 
11353
11354         (MethodSignature.InheritableMemberSignatureCompare): Add new
11355         filter function that is used to extract inheritable methods from a
11356         class. 
11357
11358         (Method.Define): Use the new `inheritable_method_signature_filter'
11359         delegate
11360
11361         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
11362         command. 
11363
11364 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
11365
11366         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
11367
11368         * cs-parser.jay: Add opt_semicolon to the interface declaration.
11369
11370         * expression.cs: Pass location information to
11371         ConvertImplicitStandard. 
11372
11373         * class.cs: Added debugging code to track return values from
11374         interfaces. 
11375
11376 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
11377
11378         * expression.cs (Is.DoResolve): If either side of the `is' is an
11379         interface, do not flag the warning.
11380
11381         * ecore.cs (ImplicitReferenceConversion): We need a separate test
11382         for interfaces
11383
11384         * report.cs: Allow for --fatal to be used with --probe.
11385
11386         * typemanager.cs (NoTypes): Move the definition for the empty Type
11387         array here. 
11388
11389         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
11390         properties. 
11391         (TypeContainer.DefineProxy): New function used to proxy to parent
11392         implementations when implementing interfaces.
11393         (TypeContainer.ParentImplements): used to lookup if our parent
11394         implements a public function that is required by an interface.
11395         (TypeContainer.VerifyPendingMethods): Hook this up.
11396
11397         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
11398         `modules' and `assemblies' arraylists into arrays.  We only grow
11399         these are the very early start up of the program, so this improves
11400         the speedof LookupType (nicely measured).
11401
11402         * expression.cs (MakeByteBlob): Replaced unsafe code with
11403         BitConverter, as suggested by Paolo.
11404
11405         * cfold.cs (ConstantFold.Binary): Special case: perform constant
11406         folding of string concatenation, but if either side is a string,
11407         and the other is not, then return null, and let the runtime use
11408         the concatenation on the string plus the object (using
11409         `Object.ToString'). 
11410
11411 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
11412
11413         Constant Folding has been implemented now.
11414
11415         * expression.cs (Unary.Reduce): Do not throw an exception, catch
11416         the error instead on types that are not supported in one's
11417         complement. 
11418
11419         * constant.cs (Constant and all children): New set of functions to
11420         perform implict and explicit conversions.
11421
11422         * ecore.cs (EnumConstant): Implement the new functions to perform
11423         conversion by proxying to the child expression.
11424
11425         * codegen.cs: (ConstantCheckState): Constant evaluation has its
11426         own separate setting that can not be turned off from the command
11427         line using --unchecked or --checked and is only controlled using
11428         the checked/unchecked statements and expressions.  This setting is
11429         used by the constant folder to flag errors.
11430
11431         * expression.cs (CheckedExpr, UncheckedExpr): Set the
11432         ConstantCheckState as well.   
11433
11434         During Resolve, they also have to flag the state, because the
11435         constant folder runs completely in the Resolve phase.
11436
11437         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
11438         well.
11439
11440 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11441
11442         * cfold.cs: New file, this file contains the constant folder.
11443
11444         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
11445         argument to track whether we are using the resulting address to
11446         load or store a value and provide better error messages. 
11447
11448         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
11449         new AddressOf arguments.
11450
11451         * statement.cs (Foreach.EmitCollectionForeach): Update
11452
11453         * expression.cs (Argument.Emit): Call AddressOf with proper
11454         arguments to track usage.
11455
11456         (New.DoEmit): Call AddressOf with new arguments.
11457
11458         (Unary.Emit): Adjust AddressOf call.
11459
11460 2002-03-01  Ravi Pratap  <ravi@ximian.com>
11461
11462         * cs-parser.jay (member_access): Change the case for pre-defined types
11463         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
11464         this suggestion.
11465
11466         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
11467         a method body.
11468
11469         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
11470         essentially like methods and apply attributes like MethodImplOptions to them too.
11471
11472         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
11473         not being null.
11474
11475         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
11476         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
11477         is the DeclSpace.
11478
11479         * Update code everywhere accordingly.
11480
11481         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
11482
11483         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
11484
11485 2002-02-28  Ravi Pratap  <ravi@ximian.com>
11486
11487         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
11488         try performing lookups against those instead of jumping straight into using
11489         the 'using' clauses.
11490
11491         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
11492
11493         (LookupType): Perform lookups in implicit parents too.
11494
11495         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
11496         sequence as RootContext.LookupType. 
11497
11498         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
11499         the various cases of namespace lookups into this method.
11500
11501 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11502
11503         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
11504         in positional arguments)
11505
11506         * class.cs (Operator): Update the AllowedModifiers to contain
11507         extern. 
11508
11509         * cs-parser.jay: Update operator declaration to allow for the
11510         operator body to be empty.
11511
11512         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
11513         values. 
11514
11515 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
11516
11517         * class.cs (Method.Emit): Label parameters.
11518
11519         * driver.cs: Return 1 or 0 as the program exit code.
11520
11521 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
11522
11523         * expression.cs: Special case the `null' object when trying to
11524         auto-compute the type, as anything can be explicitly converted to
11525         that. 
11526
11527         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
11528         spotting this Paolo.
11529
11530         (Expression.ImplicitNumericConversion): Perform comparissions of
11531         the type using the underlying type in the case of an enumeration
11532         rather than using the enumeration type for the compare.
11533
11534         Cope with the underlying == type case, which is not possible to
11535         catch before. 
11536
11537         (Expression.ConvertNumericExplicit): Perform comparissions of
11538         the type using the underlying type in the case of an enumeration
11539         rather than using the enumeration type for the compare.
11540
11541         * driver.cs: If the user does not supply an extension, assume .exe
11542
11543         * cs-parser.jay (if_statement): Rewrote so that we can track the
11544         location for the if statement.
11545
11546         * expression.cs (Binary.ConstantFold): Only concat strings when
11547         the operation is "+", not everything ;-)
11548
11549         * statement.cs (Statement.EmitBoolExpression): Take a location
11550         argument. 
11551         (If, While, Do): Track location.
11552
11553         * expression.cs (Binary.ResolveOperator): In the object + string
11554         case, I was missing a call to ConvertImplicit
11555
11556 2002-02-25  Ravi Pratap  <ravi@ximian.com>
11557
11558         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
11559         Location arguments. Ensure we use RootContext.LookupType to do our work
11560         and not try to do a direct Type.GetType and ModuleBuilder.GetType
11561
11562         * interface.cs (PopulateMethod): Handle the type of the parameter being
11563         null gracefully.
11564
11565         * expression.cs (Invocation.BetterFunction): Handle the case when we 
11566         have a params method with no fixed arguments and a call is made with no
11567         arguments.
11568
11569 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
11570
11571         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
11572         the verbatim-string-literal
11573
11574         * support.cs (InternalParameters.ParameterModifier): handle null
11575         fixed parameters.
11576         (InternalParameters.ParameterType): ditto.
11577
11578         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
11579         duplicating the name of the variable parameter.
11580         (GetParameterByName): Fix bug where we were not looking up array
11581         paramters if they were the only present (thanks Paolo!).
11582         (GetParameterInfo): We only have an empty set of types if both
11583         fixed and array are set to null.
11584         (GetParameterInfo-idx): Handle FixedParameter == null
11585
11586         * cs-parser.jay: Handle the case where there is no catch
11587         statements (missing null test).
11588
11589 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
11590
11591         * driver.cs (MainDriver): Be conservative on our command line
11592         handling.
11593
11594         Catch DirectoryNotFoundException when calling GetFiles.
11595
11596         (SplitPathAndPattern): Used to split the input specification into
11597         a path and a pattern that we can feed to Directory.GetFiles.
11598
11599 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
11600
11601         * statement.cs (Fixed): Implement the last case of the Fixed
11602         statement (string handling).
11603
11604         * expression.cs (StringPtr): New class used to return a char * to
11605         a string;  Used by the Fixed statement.
11606
11607         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
11608
11609         * expression.cs (Binary.ResolveOperator): Remove redundant
11610         MemberLookup pn parent type.
11611         Optimize union call, we do not need a union if the types are the same.
11612         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
11613         type.
11614
11615         Specialize the use of MemberLookup everywhere, instead of using
11616         the default settings. 
11617
11618         (StackAlloc): Implement stackalloc keyword.
11619
11620         * cs-parser.jay: Add rule to parse stackalloc.
11621
11622         * driver.cs: Handle /h, /help, /?
11623
11624         * expression.cs (MakeByteBlob): Removed the hacks we had in place
11625         before we supported unsafe code.
11626
11627         * makefile: add --unsafe to the self compilation of mcs.
11628
11629 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
11630
11631         * expression.cs (PointerArithmetic): New class that is used to
11632         perform pointer arithmetic.
11633         (Binary.Resolve): Handle pointer arithmetic
11634         Handle pointer comparission.
11635         (ArrayPtr): Utility expression class that is used to take the
11636         address of an array.
11637
11638         (ElementAccess): Implement array access for pointers
11639
11640         * statement.cs (Fixed): Implement fixed statement for arrays, we
11641         are missing one more case before we are done.
11642
11643         * expression.cs (Indirection): Implement EmitAssign and set the
11644         ExprClass to Variable.  This allows pointer dereferences to be
11645         treated as variables, and to have values assigned to them.
11646
11647         * ecore.cs (Expression.StoreFromPtr): New utility function to
11648         store values dereferencing.
11649
11650 2002-02-20  Ravi Pratap  <ravi@ximian.com>
11651
11652         * expression.cs (Binary.ResolveOperator): Ensure that we are
11653         not trying to operate on a void type - this fixes the reported
11654         bug.
11655
11656         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
11657         the parent implementation is sealed.
11658
11659         * ../errors/cs0239.cs : Add.
11660
11661         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
11662
11663         * typemanager.cs (unverifiable_code_type): Corresponds to 
11664         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
11665         which have unsafe code in them.
11666
11667         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
11668         unsafe context.
11669
11670 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
11671
11672         * cs-tokenizer.cs: Add support for @"litreal strings"
11673
11674         Make tokenizer accept pre-processor directives
11675         on any column (remove the old C-like limitation). 
11676
11677         * rootcontext.cs (EmitCode): Emit any global attributes.
11678         (AddGlobalAttributes): Used to keep track of assembly attributes. 
11679
11680         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
11681
11682         * cs-parser.jay: Add support for global attributes.  
11683
11684 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
11685
11686         * expression.cs (Indirection): New helper class.  Unary will
11687         create Indirection classes to be able to implement the
11688         IMemoryLocation interface on it.
11689
11690 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
11691
11692         * cs-parser.jay (fixed_statement): reference the right statement.
11693
11694         * statement.cs (Fixed.Emit): Finish implementing the fixed
11695         statement for the &x case.
11696
11697 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
11698
11699         * class.cs (Property.Define, Method.Define): Remove newslot when
11700         `implementing'.  
11701
11702         * modifiers.cs: My use of NewSlot when `Abstract' was set was
11703         wrong.  NewSlot should only be used if the `new' keyword is present.
11704
11705         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
11706         locating our system dir.  Sorry about this.
11707
11708 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11709
11710         * driver.cs (GetSystemDir): Compute correctly the location of our
11711         system assemblies.  I was using the compiler directory instead of
11712         the library directory.
11713
11714 2002-02-13  Ravi Pratap  <ravi@ximian.com>
11715
11716         * expression.cs (BetterFunction): Put back in what Miguel commented out
11717         since it is the correct fix. The problem is elsewhere ;-)
11718
11719         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
11720         parameters of the parms method are themselves compatible or not !
11721
11722         (StandardConversionExists): Fix very dangerous bug where we were forgetting
11723         to check that a class implements an interface before saying that an implicit
11724         conversion was allowed. Use ImplementsInterface to do the checking.
11725
11726 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11727
11728         * class.cs (Method.Define): Track whether we are an explicit
11729         implementation or not.  And only call DefineMethodOverride if we
11730         are an explicit implementation.
11731
11732         (Property.DefineMethod): Ditto.
11733
11734 2002-02-11  Ravi Pratap  <ravi@ximian.com>
11735
11736         * expression.cs (BetterFunction): Catch hideous bug which was
11737          preventing us from detecting ambiguous calls due to implicit casts i.e
11738         cs0121.
11739
11740 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
11741
11742         * support.cs (Pair): Remove un-needed method.  I figured why I was
11743         getting the error in cs-parser.jay, the variable in a foreach loop
11744         is readonly, and the compiler does not really treat this as a variable.
11745
11746         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
11747         instead of EQUALS in grammar.  
11748
11749         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
11750
11751         * expression.cs (Unary.DoResolve): Check whether the argument is
11752         managed or not.
11753
11754 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
11755
11756         * support.cs: Api for Pair to set a value.  Despite the fact that
11757         the variables are public the MS C# compiler refuses to compile
11758         code that accesses the field if the variable is part of a foreach
11759         statement. 
11760
11761         * statement.cs (Fixed): Begin implementation of the fixed
11762         statement.
11763
11764         (Block.AddVariable): Return the VariableInfo on success and null
11765         on failure instead of true/false. 
11766
11767         * cs-parser.jay (foreach): Catch errors on variables already
11768         defined (we were ignoring this value before) and properly unwind
11769         the block hierarchy
11770
11771         (fixed_statement): grammar for the fixed statement.
11772
11773 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
11774
11775         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
11776         pointer types to be incretemented.
11777
11778         (SizeOf): Implement.
11779
11780         * cs-parser.jay (pointer_member_access): Implement
11781         expr->IDENTIFIER production.
11782
11783         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
11784         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
11785         on safe contexts.
11786
11787         (Unary): Implement indirection.
11788
11789         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
11790         use in non-unsafe context).
11791
11792         (SimpleName.DoResolve): Check for pointers in field access on safe
11793         contexts. 
11794
11795         (Expression.LoadFromPtr): Factor the load-indirect code in this
11796         function.  This was duplicated in UnboxCast and ParameterReference
11797
11798 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
11799
11800         * expression.cs (ComposedCast): report an error if a pointer cast
11801         is used in a safe region.
11802
11803         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
11804         pointer type casts in unsafe context.
11805
11806         * codegen.cs (EmitContext): Set up IsUnsafe.
11807
11808         * cs-parser.jay (non_expression_type): Add productions for pointer
11809         casts. 
11810
11811         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
11812         code.  We should not use force into static mode if the method is
11813         not virtual.  Fixes bug in MIS
11814
11815         * statement.cs (Do.Emit, While.Emit, For.Emit,
11816         Statement.EmitBoolExpression): Add support to Do and While to
11817         propagate infinite loop as `I do return' semantics.
11818
11819         Improve the For case to also test for boolean constants.
11820
11821         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
11822         to the list of attributes we can add.
11823
11824         Remove `EmitContext' argument.
11825
11826         * class.cs (Method.Define): Apply parameter attributes.
11827         (Constructor.Define): Apply parameter attributes.
11828         (MethodCore.LabelParameters): Move here the core of labeling
11829         parameters. 
11830
11831         * support.cs (ReflectionParameters.ParameterModifier,
11832         InternalParameters.ParameterModifier): Use IsByRef on the type and
11833         only return the OUT bit for these parameters instead of in/out/ref
11834         flags.
11835
11836         This is because I miss-understood things.  The ParameterInfo.IsIn
11837         and IsOut represent whether the parameter has the [In] and [Out]
11838         attributes set.  
11839
11840 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
11841
11842         * ecore.cs (FieldExpr.Emit): Release temporaries.
11843
11844         * assign.cs (LocalTemporary.Release): new function.
11845
11846         * codegen.cs (EmitContext.GetTemporaryStorage,
11847         EmitContext.FreeTemporaryStorage): Rework the way we deal with
11848         temporary storage.  Now we can "put back" localbuilders when we
11849         are done with them
11850
11851 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
11852
11853         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
11854         need to make a copy of the variable to generate verifiable code.
11855
11856 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
11857
11858         * driver.cs: Compute dynamically the system directory.
11859
11860         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
11861         Slower, but more generally useful.  Used by the abstract
11862         registering implementation. 
11863
11864         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
11865         the rules for the special rule on Type/instances.  First check if
11866         we have the same name, and if so, try that special static path
11867         rather than the instance path.
11868
11869 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
11870
11871         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
11872         for, while and if.
11873
11874         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
11875         Enum, ValueType, Delegate or Array for non-corlib compiles.
11876
11877         * cs-tokenizer.cs: Catch long identifiers (645)
11878
11879         * typemanager.cs (IndexerPropetyName): Ravi never tested this
11880         piece of code.
11881
11882         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
11883         fix, we were returning too early, so we were not registering
11884         pending methods from abstract classes.
11885
11886         Do not register pending methods if the class is abstract.
11887
11888         * expression.cs (Conditional.DoResolve): Report circular implicit
11889         conversions when we neecd to compute it for conditional
11890         expressions. 
11891
11892         (Is.DoResolve): If the expression is always of the provided type,
11893         flag warning 183.  If the expression can not ever be of the
11894         provided type flag warning 184.
11895
11896         * class.cs: Catch 169 as well.
11897
11898         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
11899         read. 
11900
11901 2002-01-18  Nick Drochak  <ndrochak@gol.com>
11902
11903         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
11904
11905 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
11906
11907         * interface.cs: (PopulateMethod): Check for pointers being defined
11908         only if the unsafe context is active.
11909         (PopulateProperty): ditto.
11910         (PopulateIndexer): ditto.
11911
11912         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
11913         specified.  If pointers are present, make sure that they are
11914         present in an unsafe context.
11915         (Constructor, Constructor.Define): ditto.
11916         (Field, Field.Define): ditto.
11917         (Property, Property.Define): ditto.
11918         (Event, Event.Define): ditto.
11919
11920         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
11921         hashtable if there are classes or structs defined.
11922
11923         * expression.cs (LocalVariableReference.DoResolve): Simplify this
11924         code, as the constant resolution moved.
11925
11926         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
11927         the metadata, so we can flag error 133. 
11928
11929         * decl.cs (MemberCore.UnsafeOK): New function to test that a
11930         pointer is being declared in an unsafe context.
11931
11932 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
11933
11934         * modifiers.cs (Modifiers.Check): Require a Location argument.
11935         Report error 227 for Unsafe use.
11936
11937         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
11938
11939         * statement.cs (For.Emit): If the test is null, then report that
11940         we do `return', as we wont reach anything afterwards.
11941
11942         (Switch.SwitchGoverningType): Track the expression that matched
11943         the conversion.
11944
11945         * driver.cs: Allow negative numbers as an error code to flag.
11946
11947         * cs-parser.jay: Handle 1551.
11948
11949         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
11950
11951 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11952
11953         * cs-parser.jay: Report 1518 (type declaration can only contain
11954         class, struct, interface, enum or delegate)
11955
11956         (switch_label): Report 1523 (keywords `case' or `default' must
11957         preced code)
11958
11959         (opt_switch_sections): Report 1522 (empty switch)
11960
11961         * driver.cs: Report 1515 (response file specified multiple times)
11962         Report 1516 (Source file specified multiple times).
11963
11964         * expression.cs (Argument.Resolve): Signal 1510
11965
11966         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
11967         access not allowed in static code)
11968
11969 2002-01-11  Ravi Pratap  <ravi@ximian.com>
11970
11971         * typemanager.cs (IsPointerType): Utility method which we are going
11972         to need a lot.
11973
11974         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
11975         the object type, so we take care of that.
11976
11977         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
11978
11979         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
11980         added to non-params parameters :-)
11981
11982         * typemanager.cs (CSharpName): Include 'void' type too. 
11983
11984         (void_ptr_type): Include in the set of core types.
11985
11986         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
11987         duplicating code.
11988
11989         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
11990         an unsafe context.
11991
11992         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
11993         completely forgotten about it.
11994
11995 2002-01-10  Ravi Pratap  <ravi@ximian.com>
11996
11997         * cs-parser.jay (pointer_type): Add. This begins our implementation
11998         of parsing rules for unsafe code.
11999
12000         (unsafe_statement): Implement.
12001
12002         (embedded_statement): Modify to include the above.
12003
12004         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12005
12006         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12007         if the current context is an unsafe one.
12008
12009         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12010         are handled differently, we need separate rules for them.
12011
12012         (local_variable_declaration): Update to use local_variable_pointer_type
12013         to allow variable declarations of unmanaged pointer types.
12014
12015         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12016         in unsafe contexts.
12017
12018         * ../errors/cs0214.cs : Add.
12019
12020 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12021
12022         * makefile: remove 'response' file when cleaning.
12023
12024 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12025
12026         * cs-parser.jay: Report 1524.
12027
12028 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12029
12030         * typemanager.cs (RegisterMethod): drop checking if we have
12031         registered this from here
12032
12033 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12034
12035         * class.cs (Method.EmitDestructor): Implement calling our base
12036         destructor. 
12037
12038         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12039         value of InFinally.
12040
12041         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12042         this routine and will wrap the call in a try/catch block.  Deal
12043         with the case.
12044
12045 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12046
12047         * ecore.cs (Expression.MemberLookup): instead of taking a
12048         parameter `same_type' that was used to tell whether we could
12049         access private members we compute our containing type from the
12050         EmitContext.
12051
12052         (FieldExpr): Added partial support for volatile fields.  This does
12053         not work for volatile fields exposed from assemblies, as I can not
12054         figure out how to extract the modreq from it.
12055
12056         Updated all the source files to use this.
12057
12058         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12059         because it is referenced by MemberLookup very often. 
12060
12061 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12062
12063         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12064         TypeBuilder.GetCustomAttributes to retrieve what we need.
12065
12066         Get rid of redundant default_member_attr_type as this is the same as
12067         default_member_type which already exists.
12068
12069         * interface.cs, attribute.cs : Update accordingly.
12070
12071 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12072
12073         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12074         work for TYpeBuilders though.  Ravi, can you please fix this?
12075
12076         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12077
12078         * expression.cs (Argument.Emit): Handle the case of ref objects
12079         being passed to ref functions;  
12080
12081         (ParameterReference.EmitLoad): Loads the content of the pointer
12082         without dereferencing.
12083
12084 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12085
12086         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12087
12088 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12089
12090         * class.cs (Indexer.DefineMethod): Incorporate the interface
12091         type in the name of the method if we are doing explicit interface
12092         implementation.
12093
12094         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12095
12096         (BetterConversion): Fix extremely trivial bug where we were referring to
12097         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12098         again !
12099
12100         * ../errors/bug16.cs : Add although we have fixed it.
12101
12102 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12103
12104         * expression.cs (BaseIndexer): Begin implementation.
12105
12106         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12107
12108         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12109         production directly to remove a shift/reduce, and implement
12110         explicit interface implementation.
12111
12112         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
12113         after a floating point suffix.
12114
12115         * expression.cs (DoNumericPromotions): Improved the conversion for
12116         uint/uint.  If we have a constant, we avoid doing a typecast to a
12117         larger type.
12118
12119         * class.cs (Indexer): Implement explicit interface implementation
12120         for indexers.
12121
12122 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
12123
12124         * class.cs: make the default instance constructor public and hidebysig.
12125
12126 2001-01-03  Ravi Pratap  <ravi@ximian.com>
12127
12128         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
12129         so we can call it from elsewhere.
12130
12131         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
12132         we emit it internally if the class has a defined indexer; otherwise the user
12133         emits it by decorating the class definition with the DefaultMemberAttribute.
12134
12135         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
12136         attribute is not used on a type which defines an indexer.
12137
12138         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
12139         character when we skip whitespace.
12140
12141         * ../errors/cs0646.cs : Add.
12142
12143 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
12144
12145         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
12146         again. 
12147
12148         * makefile: Add practical target `mcs3.exe' which builds the third
12149         generation compiler. 
12150
12151         * expression.cs (New): Fix structures constructor calling.
12152
12153         * class.cs (Property, Method, Indexer): Emit Final flag on the
12154         method if we are an interface implementation and we are not
12155         abstract. 
12156
12157         * ecore.cs (PropertyExpr): New public field `IsBase', tells
12158         whether this property is referencing a `base' method.
12159
12160         * expression.cs (Invocation.EmitCall): take an extra argument:
12161         is_base, this is used to determine whether the `call' or
12162         `callvirt' opcode should be used.
12163
12164
12165         * delegate.cs: update EmitCall.
12166
12167         * class.cs (Method.Define): Set NewSlot for the cases where we are
12168         not implementing an interface method.
12169
12170         (Property.Define): ditto.
12171
12172 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
12173
12174         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
12175         'r'.  Allows mcs to parse itself fully.
12176
12177 2002-01-02  Ravi Pratap  <ravi@ximian.com>
12178
12179         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
12180         of the number of initializers that require the InitializeArray method.
12181
12182         (CheckIndices): Store the Expression in all cases - not the plain value. Also
12183         update the above field where necessary.
12184
12185         (MakeByteBlob): Update accordingly.
12186
12187         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
12188         greater than 2.
12189
12190         (EmitDynamicInitializers): Update in accordance with the new optimization.
12191
12192         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
12193         same OpCode applies.
12194
12195         * cs-parser.jay : Fix some glaring errors I introduced.
12196
12197 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
12198
12199         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
12200         so that we can check for name clashes there too.
12201
12202         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
12203         for interface indexers.
12204
12205         * interfaces.cs (Define): Emit the default member attribute.
12206
12207         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
12208         variable was being referred to while setting the value ;-)
12209
12210 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
12211
12212         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
12213         byte-by-byte information when we know the data is zero.
12214
12215         Make the block always a multiple of 4, because
12216         DefineInitializedData has a bug.
12217
12218         * assign.cs: Fix, we should assign from the temporary, not from
12219         the source. 
12220
12221         * expression.cs (MakeByteBlob): Fix my incorrect code.
12222
12223 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
12224
12225         * typemanager.cs (EnumToUnderlying): This function is used to get
12226         the underlying type from an enumeration, because it does not
12227         always work. 
12228
12229         * constant.cs: Use the I4_S form for values between -128 and 127.
12230
12231         * statement.cs (Block.LookupLabel): Looks up a label.
12232         (Block): Drop support for labeled blocks.
12233
12234         (LabeledStatement): New kind of statement that represents a label
12235         only.
12236
12237         (Goto): Finally implement this bad boy.
12238
12239         * cs-parser.jay: Update to reflect new mechanism to implement
12240         labels.
12241
12242 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
12243
12244         * codegen.cs (EmitContext.This): a codegen property that keeps the
12245         a single instance of this instead of creating many different this
12246         instances. 
12247
12248         * delegate.cs (Delegate.DoResolve): Update to use the property;
12249
12250         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
12251
12252         * expression.cs (BaseAccess.DoResolve): Ditto.
12253
12254 2001-12-29  Ravi Pratap  <ravi@ximian.com>
12255
12256         * typemanager.cs (methodimpl_attr_type): Add to hold the type
12257         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
12258
12259         (InitCoreTypes): Update accordingly.
12260
12261         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
12262         so we can quickly store the state.
12263
12264         (ApplyAttributes): Set the correct implementation flags
12265         for InternalCall methods.
12266
12267 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
12268
12269         * expression.cs (EmitCall): if a method is not virtual, then do
12270         not use callvirt on it.
12271
12272         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
12273         user defined stuff) requires the use of stobj, which takes an
12274         address on the stack instead of an array and an index.  So emit
12275         the Ldelema operation for it.
12276
12277         (EmitStoreOpcode): Use stobj for valuetypes.
12278
12279         (UnaryMutator.EmitCode): Use the right 1 value depending on
12280         whether we are dealing with int64/uint64, float or doubles.
12281
12282         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
12283         constructors that I implemented last night.
12284
12285         (Constructor.IsDefault): Fix to work properly for static
12286         constructors.
12287
12288         * cs-parser.jay (CheckDef): report method signature errors.
12289         Update error number 103 to be 132.
12290
12291         * decl.cs: New AdditionResult enumeration value: MethodExists.
12292         Although we do this check for methods later on in the semantic
12293         analysis, catching repeated default constructors is so easy that
12294         we catch these here. 
12295
12296         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
12297         promotions code.
12298
12299         (ParameterReference.EmitAssign, Emit): handle
12300         bools as bytes.
12301
12302         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
12303         (ArrayAccess.EmitStoreOpcode): ditto.
12304
12305         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
12306
12307         * expression.cs (MakeByteBlob): Complete all the missing types
12308         (uint, short, ushort, byte, sbyte)
12309
12310         * class.cs: Only init instance field initializers on instance
12311         constructors. 
12312
12313         Rename `constructors' to instance_constructors. 
12314
12315         (TypeContainer.AddConstructor): Only add constructors to the list
12316         if it is not static.
12317
12318         Make sure that we handle default_static_constructor independently
12319         everywhere where we handle instance_constructors
12320
12321 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
12322
12323         * class.cs: Do not lookup or create a base initializer for a
12324         static constructor.
12325
12326         (ConstructorInitializer.Resolve): use the proper type to lookup
12327         for constructors.
12328
12329         * cs-parser.jay: Report error 1585 (modifiers between type and name).
12330
12331         * enum.cs, interface.cs: Remove CloseType, this is taken care by
12332         in DeclSpace. 
12333
12334         * decl.cs: CloseType is now an virtual method, the default
12335         implementation just closes this type.
12336
12337 2001-12-28  Ravi Pratap  <ravi@ximian.com>
12338
12339         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
12340         to PreserveSig by default. Also emit HideBySig on such methods.
12341
12342         Basically, set the defaults to standard values.
12343
12344         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
12345         argument, if candidate is better, it can't be worse than the best !
12346
12347         (Invocation): Re-write bits to differentiate between methods being
12348         applicable in their expanded form and their normal form - for params
12349         methods of course.
12350
12351         Get rid of use_standard everywhere as only standard conversions are allowed
12352         in overload resolution. 
12353
12354         More spec conformance.
12355
12356 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12357
12358         * driver.cs: Add --timestamp, to see where the compiler spends
12359         most of its time.
12360
12361         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
12362         `this' in static code.
12363
12364         (SimpleName.DoResolve): Implement in terms of a helper function
12365         that allows static-references to be passed upstream to
12366         MemberAccess.
12367
12368         (Expression.ResolveWithSimpleName): Resolve specially simple
12369         names when called by MemberAccess to implement the special
12370         semantics. 
12371
12372         (Expression.ImplicitReferenceConversion): Handle conversions from
12373         Null to reference types before others, as Null's type is
12374         System.Object. 
12375
12376         * expression.cs (Invocation.EmitCall): Handle the special case of
12377         calling methods declared on a reference type from a ValueType
12378         (Base classes System.Object and System.Enum)
12379
12380         (MemberAccess.Resolve): Only perform lookups on Enumerations if
12381         the left hand side is a TypeExpr, not on every enumeration. 
12382
12383         (Binary.Resolve): If types are reference types, then do a cast to
12384         object on operators != and == of both arguments.
12385
12386         * typemanager.cs (FindMembers): Extract instance and static
12387         members if requested.
12388
12389         * interface.cs (PopulateProperty): Use void_type instead of null
12390         as the return type for the setter method.
12391
12392         (PopulateIndexer): ditto.
12393
12394 2001-12-27  Ravi Pratap  <ravi@ximian.com>
12395
12396         * support.cs (ReflectionParameters): Fix minor bug where we
12397         were examining the wrong parameter for the ParamArray attribute.
12398
12399         Cope with requests for the type of the parameter at position
12400         greater than the params parameter's. We now return the element
12401         type of the params array as that makes more sense.
12402
12403         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
12404         accordingly as we no longer have to extract the element type
12405         ourselves.
12406
12407         (Invocation.OverloadResolve): Update.
12408
12409 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12410
12411         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
12412         against IEnumerator, test whether the return value is a descendant
12413         of the IEnumerator interface.
12414
12415         * class.cs (Indexer.Define): Use an auxiliary method to implement
12416         the other bits of the method definition.  Begin support for
12417         explicit interface implementation.
12418
12419         (Property.DefineMethod): Use TypeManager.void_type instead of null
12420         for an empty return value.
12421
12422 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
12423
12424         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
12425         dealing with a FieldExpr which is composed of a FieldBuilder, in
12426         the code path we did extract the constant, but we should have
12427         obtained the underlying value to be able to cast it (otherwise we
12428         end up in an infinite loop, this is what Ravi was running into).
12429
12430         (ArrayCreation.UpdateIndices): Arrays might be empty.
12431
12432         (MemberAccess.ResolveMemberAccess): Add support for section
12433         14.5.4.1 that deals with the special case of E.I when E is a type
12434         and something else, that I can be a reference to a static member.
12435
12436         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
12437         handle a particular array type to create byte blobs, it is just
12438         something we dont generate byteblobs for.
12439
12440         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
12441         arguments. 
12442
12443         * location.cs (Push): remove the key from the hashtable that we
12444         are about to add.   This happens for empty files.
12445
12446         * driver.cs: Dispose files after we have parsed them.
12447
12448         (tokenize): new function that only runs the tokenizer on its
12449         input, for speed testing.
12450
12451 2001-12-26  Ravi Pratap  <ravi@ximian.com>
12452
12453         * class.cs (Event.Define): Define the private field only if there
12454         are no accessors defined.
12455
12456         * expression.cs (ResolveMemberAccess): If there is no associated
12457         field with the event, that means we have an event defined with its
12458         own accessors and we should flag error cs0070 since transforming
12459         ourselves into a field is not valid in that case.
12460
12461         * ecore.cs (SimpleName.DoResolve): Same as above.
12462
12463         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
12464         and charset to sane values.
12465
12466 2001-12-25  Ravi Pratap  <ravi@ximian.com>
12467
12468         * assign.cs (DoResolve): Perform check on events only if they 
12469         are being accessed outside the declaring type.
12470
12471         * cs-parser.jay (event_declarations): Update rules to correctly
12472         set the type of the implicit parameter etc.
12473
12474         (add_accessor, remove_accessor): Set current local parameters.
12475
12476         * expression.cs (Binary): For delegate addition and subtraction,
12477         cast the return value from the method into the appropriate delegate
12478         type.
12479
12480 2001-12-24  Ravi Pratap  <ravi@ximian.com>
12481
12482         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
12483         of these as the workaround is unnecessary.
12484
12485         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
12486         delegate data - none of that is needed at all.
12487
12488         Re-write bits to extract the instance expression and the delegate method
12489         correctly.
12490
12491         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
12492         on delegates too.
12493
12494         * attribute.cs (ApplyAttributes): New method to take care of common tasks
12495         of attaching attributes instead of duplicating code everywhere.
12496
12497         * everywhere : Update code to do attribute emission using the above method.
12498
12499 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12500
12501         * expression.cs (IsParamsMethodApplicable): if there are not
12502         parameters, return immediately.
12503
12504         * ecore.cs: The 0 literal can be implicity converted to an enum
12505         type. 
12506
12507         (SimpleName.DoResolve): First lookup the type, then lookup the
12508         members. 
12509
12510         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
12511         want to get its address.  If the InstanceExpression is not
12512         addressable, store the result in a temporary variable, then get
12513         the address of it.
12514
12515         * codegen.cs: Only display 219 errors on warning level or above. 
12516
12517         * expression.cs (ArrayAccess): Make it implement the
12518         IMemoryLocation interface.
12519
12520         (Binary.DoResolve): handle the operator == (object a, object b)
12521         and operator != (object a, object b) without incurring into a
12522         BoxedCast (because 5 != o should never be performed).
12523
12524         Handle binary enumerator operators.
12525
12526         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
12527         value type, otherwise use Ldelem_ref.
12528
12529         Use precomputed names;
12530
12531         (AddressOf): Implement address of
12532
12533         * cs-parser.jay (labeled_statement): Fix recursive block
12534         addition by reworking the production.
12535
12536         * expression.cs (New.DoEmit): New has a special case:
12537                 
12538                  If we are dealing with a ValueType, we have a few
12539                  situations to deal with:
12540                 
12541                     * The target of New is a ValueType variable, that is
12542                       easy, we just pass this as the variable reference
12543                 
12544                     * The target of New is being passed as an argument,
12545                       to a boxing operation or a function that takes a
12546                       ValueType.
12547                 
12548                       In this case, we need to create a temporary variable
12549                       that is the argument of New.
12550
12551
12552 2001-12-23  Ravi Pratap  <ravi@ximian.com>
12553
12554         * rootcontext.cs (LookupType): Check that current_type is not null before
12555         going about looking at nested types.
12556
12557         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
12558         not implement the IAssignMethod interface any more.
12559
12560         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
12561         where we tranform them into FieldExprs if they are being resolved from within
12562         the declaring type.
12563
12564         * ecore.cs (SimpleName.DoResolve): Do the same here.
12565
12566         * assign.cs (DoResolve, Emit): Clean up code considerably. 
12567
12568         * ../errors/bug10.cs : Add.
12569
12570         * ../errors/cs0070.cs : Add.
12571
12572         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
12573
12574         * assign.cs : Get rid of EventIsLocal everywhere.
12575
12576 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12577
12578         * ecore.cs (ConvertIntLiteral): finished the implementation.
12579
12580         * statement.cs (SwitchLabel): Convert the value we are using as a
12581         key before looking up the table.
12582
12583 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12584
12585         * codegen.cs (EmitTopBlock): Require a Location argument now.
12586
12587         * cs-parser.jay (constructor_declarator): We need to setup
12588         current_local_parameters before we parse the
12589         opt_constructor_initializer, to allow the variables to be bound
12590         to the constructor arguments.
12591
12592         * rootcontext.cs (LookupType): First lookup nested classes in our
12593         class and our parents before we go looking outside our class.
12594
12595         * expression.cs (ConstantFold): Extract/debox the values at the
12596         beginnning. 
12597
12598         * rootcontext.cs (EmitCode): Resolve the constants first before we
12599         resolve the types.  This is not really needed, but it helps debugging.
12600
12601         * statement.cs: report location.
12602
12603         * cs-parser.jay: pass location to throw statement.
12604
12605         * driver.cs: Small bug fix.
12606
12607         * report.cs: Updated format to be 4-zero filled digits.
12608
12609 2001-12-22  Ravi Pratap  <ravi@ximian.com>
12610
12611         * expression.cs (CheckIndices): Fix minor bug where the wrong
12612         variable was being referred to ;-)
12613
12614         (DoEmit): Do not call EmitStaticInitializers when the 
12615         underlying type is System.Object.
12616
12617 2001-12-21  Ravi Pratap  <ravi@ximian.com>
12618
12619         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
12620         and do the usual workaround for SRE.
12621
12622         * class.cs (MyEventBuilder.EventType): New member to get at the type
12623         of the event, quickly.
12624
12625         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
12626
12627         * assign.cs (Assign.DoResolve): Handle the case when the target
12628         is an EventExpr and perform the necessary checks.
12629
12630         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
12631         interface.
12632
12633         (SimpleName.MemberStaticCheck): Include check for EventExpr.
12634
12635         (EventExpr): Set the type in the constructor itself since we 
12636         are meant to be born fully resolved.
12637
12638         (EventExpr.Define): Revert code I wrote earlier.
12639                 
12640         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
12641         instance expression is null. The instance expression is a This in that case
12642         or a null, depending on whether it is a static method or not.
12643
12644         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
12645         refers to more than one method.
12646
12647         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
12648         and accordingly flag errors.
12649
12650 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12651
12652         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
12653
12654 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12655
12656         * location.cs (ToString): Provide useful rutine.
12657
12658 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12659
12660         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
12661         objects, return the actual integral boxed.
12662
12663         * statement.cs (SwitchLabel): define an ILLabel for each
12664         SwitchLabel. 
12665
12666         (Switch.CheckSwitch): If the value is a Literal, extract
12667         the underlying literal.
12668
12669         Also in the unused hashtable we had, add the SwitchLabel so we can
12670         quickly look this value up.
12671
12672         * constant.cs: Implement a bunch of new constants.  Rewrite
12673         Literal based on this.  Made changes everywhere to adapt to this.
12674
12675         * expression.cs (Expression.MakeByteBlob): Optimize routine by
12676         dereferencing array only once, and also copes with enumrations.
12677
12678         bytes are two bytes wide, not one.
12679
12680         (Cast): Perform constant conversions.
12681
12682         * ecore.cs (TryImplicitIntConversion): Return literals instead of
12683         wrappers to the literals here.
12684
12685         * expression.cs (DoNumericPromotions): long literals can converted
12686         to ulong implicity (this is taken care of elsewhere, but I was
12687         missing this spot).
12688
12689         * ecore.cs (Expression.Literalize): Make the return type Literal,
12690         to improve type checking.
12691
12692         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
12693
12694 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12695
12696         * literal.cs: Revert code from ravi that checked the bounds.  The
12697         bounds are sane by the definition of the type itself. 
12698
12699         * typemanager.cs: Fix implementation of ImplementsInterface.  We
12700         need to actually look up in our parent hierarchy for interfaces
12701         implemented. 
12702
12703         * const.cs: Use the underlying type for enumerations
12704
12705         * delegate.cs: Compute the basename for the delegate creation,
12706         that should fix the delegate test case, and restore the correct
12707         Type Lookup semantics in rootcontext
12708
12709         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
12710         referencing a nested type with the Reflection API is using the "+"
12711         sign. 
12712
12713         * cs-parser.jay: Do not require EOF token at the end.
12714
12715 2001-12-20  Ravi Pratap  <ravi@ximian.com>
12716
12717         * rootcontext.cs (LookupType): Concatenate type names with
12718         a '.' instead of a '+' The test suite passes again.
12719
12720         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
12721         field of the enumeration.
12722
12723         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
12724         the case when the member is an EventExpr.
12725
12726         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
12727         static has an associated instance expression.
12728
12729         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
12730
12731         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
12732
12733         * class.cs (Event.Define): Register event and perform appropriate checks
12734         for error #111.
12735
12736         We define the Add and Remove methods even if the use provides none because
12737         in that case, we provide default implementations ourselves.
12738
12739         Define a private field of the type of the event. This is done by the CSC compiler
12740         and we should be doing it too ;-)
12741
12742         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
12743         More methods we use in code we generate.
12744
12745         (multicast_delegate_type, delegate_type): Two separate types since the distinction
12746         is important.
12747
12748         (InitCoreTypes): Update accordingly for the above.
12749
12750         * class.cs (Event.Emit): Generate code for default accessors that we provide
12751
12752         (EmitDefaultMethod): Do the job in the above.
12753
12754         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
12755         appropriate place.
12756
12757 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12758
12759         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
12760         builders even if we were missing one.
12761
12762         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
12763         pass the Basename as our class name instead of the Name.  The
12764         basename will be correctly composed for us.
12765
12766         * parameter.cs (Paramters): Now takes a Location argument.
12767
12768         * decl.cs (DeclSpace.LookupType): Removed convenience function and
12769         make all the code call directly LookupType in RootContext and take
12770         this chance to pass the Location information everywhere.
12771
12772         * Everywhere: pass Location information.
12773
12774 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
12775
12776         * class.cs (Constructor.Define): Updated way of detecting the
12777         length of the parameters.
12778
12779         (TypeContainer.DefineType): Use basename as the type name for
12780         nested types.
12781
12782         (TypeContainer.Define): Do not recursively define types here, as
12783         definition is taken care in order by the RootContext.
12784
12785         * tree.cs: Keep track of namespaces in a per-file basis.
12786
12787         * parameter.cs (Parameter.ComputeSignature): Update to use
12788         DeclSpace. 
12789
12790         (Parameters.GetSignature): ditto.
12791
12792         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
12793         instead of a TypeContainer.
12794
12795         (Interface.SemanticAnalysis): Use `this' instead of our parent to
12796         resolve names.  Because we need to be resolve in our context, not
12797         our parents.
12798
12799         * driver.cs: Implement response files.
12800
12801         * class.cs (TypeContainer.DefineType): If we are defined, do not
12802         redefine ourselves.
12803
12804         (Event.Emit): Emit the code for add/remove handlers.
12805         (Event.Define): Save the MethodBuilders for add/remove.
12806
12807         * typemanager.cs: Use pair here too.
12808
12809         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
12810         DictionaryEntry requires the first argument to be non-null.  
12811
12812         (enum_declaration): Compute full name for registering the
12813         enumeration.
12814
12815         (delegate_declaration): Instead of using
12816         formal_parameter_list, use opt_formal_parameter_list as the list
12817         can be empty.
12818
12819         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
12820         (EventParsing): New property that controls whether `add' and
12821         `remove' are returned as tokens or identifiers (for events);
12822
12823 2001-12-19  Ravi Pratap  <ravi@ximian.com>
12824
12825         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
12826         use MyEventBuilder only and let it wrap the real builder for us.
12827
12828         (MyEventBuilder): Revamp constructor etc.
12829
12830         Implement all operations that we perform on EventBuilder in precisely the same
12831         way here too.
12832
12833         (FindMembers): Update to use the EventBuilder member.
12834
12835         (Event.Emit): Update accordingly.
12836
12837 2001-12-18  Ravi Pratap  <ravi@ximian.com>
12838
12839         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
12840         by calling the appropriate methods.
12841
12842         (GetCustomAttributes): Make stubs as they cannot possibly do anything
12843         useful.
12844
12845         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
12846
12847 2001-12-17  Ravi Pratap  <ravi@ximian.com>
12848
12849         * delegate.cs (Delegate.Populate): Check that the return type
12850         and various parameters types are indeed accessible.
12851
12852         * class.cs (Constructor.Define): Same here.
12853
12854         (Field.Define): Ditto.
12855
12856         (Event.Define): Ditto.
12857
12858         (Operator.Define): Check that the underlying Method defined itself
12859         correctly - so it's MethodBuilder should not be null.
12860
12861         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
12862         expression happens to be null.
12863
12864         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
12865         members but as of now we don't seem to be able to do anything really useful with it.
12866
12867         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
12868         not the EventBuilder.
12869
12870 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
12871
12872         * cs-tokenizer.cs: Add support for defines.
12873         Add support for #if, #elif, #else, #endif
12874
12875         (eval_var): evaluates a variable.
12876         (eval): stubbed for evaluating functions.
12877
12878         * cs-parser.jay: Pass the defines information
12879
12880         * driver.cs: Add --define command line option.
12881
12882         * decl.cs: Move MemberCore here.
12883
12884         Make it the base class for DeclSpace.  This allows us to catch and
12885         report 108 and 109 for everything now.
12886
12887         * class.cs (TypeContainer.Define): Extract all the members
12888         before populating and emit the warning 108 (new keyword required
12889         to override) instead of having each member implement this.
12890
12891         (MemberCore.Define): New abstract method, we will be using this in
12892         the warning reporting engine in Populate.
12893
12894         (Operator.Define): Adjust to new MemberCore protocol. 
12895
12896         * const.cs (Const): This does not derive from Expression, it is a
12897         temporary object we use to create fields, it is a MemberCore. 
12898
12899         * class.cs (Method.Define): Allow the entry point to be in a
12900         specific class.
12901
12902         * driver.cs: Rewrite the argument handler to clean it up a bit.
12903
12904         * rootcontext.cs: Made it just an auxiliary namespace feature by
12905         making everything static.
12906
12907         * driver.cs: Adapt code to use RootContext type name instead of
12908         instance variable.
12909
12910         * delegate.cs: Remove RootContext argument.
12911
12912         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
12913         argument. 
12914
12915         * class.cs (Event.Define): The lookup can fail.
12916
12917         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
12918
12919         * expression.cs: Resolve the this instance before invoking the code.
12920
12921 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
12922
12923         * cs-parser.jay: Add a production in element_access that allows
12924         the thing to become a "type" reference.  This way we can parse
12925         things like "(string [])" as a type.
12926
12927         Note that this still does not handle the more complex rules of
12928         casts. 
12929
12930
12931         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
12932
12933         * ecore.cs: (CopyNewMethods): new utility function used to
12934         assemble the list of methods from running FindMembers.
12935
12936         (MemberLookup): Rework FindMembers so that 
12937
12938 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
12939
12940         * class.cs (TypeContainer): Remove Delegates who fail to be
12941         defined.
12942
12943         * delegate.cs (Populate): Verify that we dont get null return
12944         values.   TODO: Check for AsAccessible.
12945
12946         * cs-parser.jay: Use basename to emit error 574 (destructor should
12947         have the same name as container class), not the full name.
12948
12949         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
12950         possible representation.  
12951
12952         Also implements integer type suffixes U and L.
12953
12954 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
12955
12956         * expression.cs (ArrayCreation.DoResolve): We need to do the
12957         argument resolution *always*.
12958
12959         * decl.cs: Make this hold the namespace.  Hold the root context as
12960         well.
12961         (LookupType): Move here.
12962
12963         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
12964
12965         * location.cs (Row, Name): Fixed the code, it was always returning
12966         references to the first file.
12967
12968         * interface.cs: Register properties defined through interfaces.
12969
12970         * driver.cs: Add support for globbing on the command line
12971
12972         * class.cs (Field): Make it derive from MemberCore as well.
12973         (Event): ditto.
12974
12975 2001-12-15  Ravi Pratap  <ravi@ximian.com>
12976
12977         * class.cs (Event::Define): Check that the type of the event is a delegate
12978         type else flag error #66.
12979
12980         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
12981         same.
12982
12983         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
12984         values of EntryPoint, CharSet etc etc.
12985
12986         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
12987
12988         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
12989         be null and we should ignore this. I am not sure if this is really clean. Apparently,
12990         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
12991         which needs this to do its work.
12992
12993         * ../errors/cs0066.cs : Add.
12994
12995 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
12996
12997         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
12998         helper functions.
12999
13000         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13001         clears out the parameters field.
13002         (MemberSignatureCompare): Cleanup
13003
13004         (MemberCore): New base class used to share code between MethodCore
13005         and Property.
13006
13007         (RegisterRequiredImplementations) BindingFlags.Public requires
13008         either BindingFlags.Instace or Static.  Use instance here.
13009
13010         (Property): Refactored code to cope better with the full spec.
13011
13012         * parameter.cs (GetParameterInfo): Return an empty array instead
13013         of null on error.
13014
13015         * class.cs (Property): Abstract or extern properties have no bodies.
13016
13017         * parameter.cs (GetParameterInfo): return a zero-sized array.
13018
13019         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13020         method modifier validation to the typecontainer so we can reuse
13021         this on properties.
13022
13023         (MethodCore.ParameterTypes): return an empty sized array of types.
13024
13025         (Property.Define): Test property modifier validity.
13026
13027         Add tests for sealed/override too.
13028
13029         (Method.Emit): abstract or extern methods have no bodies.
13030
13031 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13032
13033         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13034         thing.
13035
13036         (Method::Define, ::Emit): Modify accordingly.
13037
13038         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13039
13040         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13041
13042         * makefile: Pass in /unsafe.
13043
13044 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13045
13046         * class.cs (MakeKey): Kill routine.
13047
13048         * class.cs (TypeContainer.Define): Correctly define explicit
13049         method implementations (they require the full interface name plus
13050         the method name).
13051
13052         * typemanager.cs: Deply the PtrHashtable here and stop using the
13053         lame keys.  Things work so much better.
13054
13055         This of course broke everyone who depended on `RegisterMethod' to
13056         do the `test for existance' test.  This has to be done elsewhere.
13057
13058         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13059         the object stupid Equals method (because, that like fails all over
13060         the place).  We still do not use it.
13061
13062         * class.cs (TypeContainer.SetRequiredInterface,
13063         TypeContainer.RequireMethods): Killed these two routines and moved
13064         all the functionality to RegisterRequiredImplementations.
13065
13066         (TypeContainer.RegisterRequiredImplementations): This routine now
13067         registers all the implementations required in an array for the
13068         interfaces and abstract methods.  We use an array of structures
13069         which can be computed ahead of time to reduce memory usage and we
13070         also assume that lookups are cheap as most classes will not
13071         implement too many interfaces.
13072
13073         We also avoid creating too many MethodSignatures.
13074
13075         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13076         clear the "pending" bit if we find that there are problems with
13077         the declaration.
13078
13079         (TypeContainer.VerifyPendingMethods): Update to report errors of
13080         methods that look like implementations but are not.
13081
13082         (TypeContainer.Define): Add support for explicit interface method
13083         implementation. 
13084
13085 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13086
13087         * typemanager.cs: Keep track of the parameters here instead of
13088         being a feature of the TypeContainer.
13089
13090         * class.cs: Drop the registration of parameters here, as
13091         InterfaceMethods are also interface declarations.
13092
13093         * delegate.cs: Register methods with the TypeManager not only with
13094         the TypeContainer.  This code was buggy.
13095
13096         * interface.cs: Full registation here.
13097
13098 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13099
13100         * expression.cs: Remove reducer for binary expressions, it can not
13101         be done this way.
13102
13103         * const.cs: Put here the code that used to go into constant.cs
13104
13105         * constant.cs: Put here the code for constants, this is a new base
13106         class for Literals.
13107
13108         * literal.cs: Make Literal derive from Constant.
13109
13110 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13111
13112         * statement.cs (Return.Emit): Report error 157 if the user
13113         attempts to return from a finally block.
13114
13115         (Return.Emit): Instead of emitting a return, jump to the end of
13116         the function.
13117
13118         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
13119         LocalBuilder to store the result of the function.  ReturnLabel is
13120         the target where we jump.
13121
13122
13123 2001-12-09  Radek Doulik  <rodo@ximian.com>
13124
13125         * cs-parser.jay: remember alias in current namespace
13126
13127         * ecore.cs (SimpleName::DoResolve): use aliases for types or
13128         namespaces
13129
13130         * class.cs (LookupAlias): lookup alias in my_namespace
13131
13132         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
13133         aliases hashtable
13134         (LookupAlias): lookup alias in this and if needed in parent
13135         namespaces
13136
13137 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
13138
13139         * support.cs: 
13140
13141         * rootcontext.cs: (ModuleBuilder) Made static, first step into
13142         making things static.  I need this to avoid passing the
13143         TypeContainer when calling ParameterType.
13144
13145         * support.cs (InternalParameters.ParameterType): Remove ugly hack
13146         that did string manipulation to compute the type and then call
13147         GetType.  Use Parameter.ParameterType instead.
13148
13149         * cs-tokenizer.cs: Consume the suffix for floating values.
13150
13151         * expression.cs (ParameterReference): figure out whether this is a
13152         reference parameter or not.  Kill an extra variable by computing
13153         the arg_idx during emission.
13154
13155         * parameter.cs (Parameters.GetParameterInfo): New overloaded
13156         function that returns whether a parameter is an out/ref value or not.
13157
13158         (Parameter.ParameterType): The type of the parameter (base,
13159         without ref/out applied).
13160
13161         (Parameter.Resolve): Perform resolution here.
13162         (Parameter.ExternalType): The full type (with ref/out applied).
13163
13164         * statement.cs (Using.Emit, Using.EmitExpression): Implement
13165         support for expressions on the using statement.
13166
13167 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
13168
13169         * statement.cs (Using.EmitLocalVariableDecls): Split the
13170         localvariable handling of the using statement.
13171
13172         (Block.EmitMeta): Keep track of variable count across blocks.  We
13173         were reusing slots on separate branches of blocks.
13174
13175         (Try.Emit): Emit the general code block, we were not emitting it. 
13176
13177         Check the type of the declaration to be an IDisposable or
13178         something that can be implicity converted to it. 
13179
13180         Emit conversions if required.
13181
13182         * ecore.cs (EmptyExpression): New utility class.
13183         (Expression.ImplicitConversionExists): New utility function.
13184
13185 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
13186
13187         * statement.cs (Using): Implement.
13188
13189         * expression.cs (LocalVariableReference): Support read only variables.
13190
13191         * statement.cs: Remove the explicit emit for the Leave opcode.
13192         (VariableInfo): Add a readonly field.
13193
13194 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
13195
13196         * ecore.cs (ConvCast): new class used to encapsulate the various
13197         explicit integer conversions that works in both checked and
13198         unchecked contexts.
13199
13200         (Expression.ConvertNumericExplicit): Use new ConvCast class to
13201         properly generate the overflow opcodes.
13202
13203 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13204
13205         * statement.cs: The correct type for the EmptyExpression is the
13206         element_type, not the variable type.  Ravi pointed this out.
13207
13208 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13209
13210         * class.cs (Method::Define): Handle PInvoke methods specially
13211         by using DefinePInvokeMethod instead of the usual one.
13212
13213         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
13214         above to do the task of extracting information and defining the method.
13215
13216 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13217
13218         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
13219         of the condition for string type.
13220
13221         (Emit): Move that here. 
13222
13223         (ArrayCreation::CheckIndices): Keep string literals in their expression
13224         form.
13225
13226         (EmitDynamicInitializers): Handle strings appropriately.
13227
13228 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13229
13230         * codegen.cs (EmitContext): Replace multiple variables with a
13231         single pointer to the current Switch statement.
13232
13233         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
13234         EmitContext.
13235
13236 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13237
13238         * statement.cs 
13239
13240         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
13241         default'.
13242
13243         (Foreach.Emit): Foreach on arrays was not setting
13244         up the loop variables (for break/continue).
13245
13246         (GotoCase): Semi-implented.
13247
13248 2001-12-03  Ravi Pratap  <ravi@ximian.com>
13249
13250         * attribute.cs (CheckAttribute): Handle system attributes by using
13251         Attribute.GetAttributes to examine information we need.
13252
13253         (GetValidPlaces): Same here.
13254
13255         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
13256
13257         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
13258
13259         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
13260
13261         (Method::Define): Set appropriate flags if we have a DllImport attribute.
13262
13263         (Method::Emit): Handle the case when we are a PInvoke method.
13264
13265 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13266
13267         * expression.cs: Use ResolveWithSimpleName on compound names.
13268
13269 2001-12-02  Ravi Pratap  <ravi@ximian.com>
13270
13271         * constant.cs (EmitConstant): Make sure we resolve the associated expression
13272         before trying to reduce it.
13273
13274         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
13275
13276         * constant.cs (LookupConstantValue): Implement.
13277
13278         (EmitConstant): Use the above in emitting the constant.
13279
13280         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
13281         that are user-defined by doing a LookupConstantValue on them.
13282
13283         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
13284         too, like above.
13285
13286 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
13287
13288         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
13289
13290         (BaseAccess.DoResolve): Implement.
13291
13292         (MemberAccess.DoResolve): Split this routine into a
13293         ResolveMemberAccess routine that can be used independently
13294
13295 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
13296
13297         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
13298         As that share bits of the implementation.  Is returns a boolean,
13299         while As returns the Type that is being probed.
13300
13301 2001-12-01  Ravi Pratap  <ravi@ximian.com>
13302
13303         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
13304         instead of a Literal - much easier.
13305
13306         (EnumInTransit): Remove - utterly useless :-)
13307
13308         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
13309
13310         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
13311
13312         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
13313         chain when we have no associated expression.
13314
13315 2001-11-30  Ravi Pratap  <ravi@ximian.com>
13316
13317         * constant.cs (Define): Use Location while reporting the errror.
13318
13319         Also emit a warning when 'new' is used and there is no inherited
13320         member to hide.
13321
13322         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
13323         populated.
13324
13325         (LookupEnumValue): Implement to lookup an enum member's value and define it
13326         if necessary.
13327
13328         (Populate): Re-write accordingly to use the above routine.
13329
13330 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
13331
13332         * expression.cs (This): Fix prototype for DoResolveLValue to
13333         override the base class DoResolveLValue.
13334
13335         * cs-parser.cs: Report errors cs574 and cs575 (destructor
13336         declarations) 
13337
13338         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
13339         (we need to load the address of the field here).  This fixes
13340         test-22. 
13341
13342         (FieldExpr.DoResolveLValue): Call the DoResolve
13343         function to initialize the Instance expression.
13344
13345         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
13346         correctly the GetEnumerator operation on a value type.
13347
13348         * cs-parser.jay: Add more simple parsing error catches.
13349
13350         * statement.cs (Switch): Add support for string switches.
13351         Handle null specially.
13352
13353         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
13354
13355 2001-11-28  Ravi Pratap  <ravi@ximian.com>
13356
13357         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
13358
13359         (declare_local_constant): New helper function.
13360
13361         * statement.cs (AddConstant): Keep a separate record of constants
13362
13363         (IsConstant): Implement to determine if a variable is a constant.
13364
13365         (GetConstantExpression): Implement.
13366
13367         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
13368
13369         * statement.cs (IsVariableDefined): Re-write.
13370
13371 2001-11-27  Ravi Pratap  <ravi@ximian.com>
13372
13373         * class.cs (TypeContainer::FindMembers): Look for constants
13374         in the case when we are looking for MemberTypes.Field
13375
13376         * expression.cs (MemberAccess::DoResolve): Check that in the
13377         case we are a FieldExpr and a Literal, we are not being accessed
13378         by an instance reference.
13379
13380         * cs-parser.jay (local_constant_declaration): Implement.
13381
13382         (declaration_statement): Implement for constant declarations.
13383
13384 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
13385
13386         * statement.cs (Switch): Catch double defaults.
13387
13388         (Switch): More work on the switch() statement
13389         implementation.  It works for integral values now, need to finish
13390         string support.
13391
13392
13393 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13394
13395         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
13396         integer literals into other integer literals.  To be used by
13397         switch. 
13398
13399 2001-11-24  Ravi Pratap  <ravi@ximian.com>
13400
13401         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
13402         some memory.
13403
13404         (EmitDynamicInitializers): Cope with the above since we extract data
13405         directly from ArrayData now.
13406
13407         (ExpectInitializers): Keep track of whether initializers are mandatory
13408         or not.
13409
13410         (Bounds): Make it a hashtable to prevent the same dimension being 
13411         recorded for every element in that dimension.
13412
13413         (EmitDynamicInitializers): Fix bug which prevented the Set array method
13414         from being found.
13415
13416         Also fix bug which was causing the indices to be emitted in the reverse
13417         order.
13418
13419 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13420
13421         * expression.cs (ArrayCreation): Implement the bits that Ravi left
13422         unfinished.  They do not work, because the underlying code is
13423         sloppy.
13424
13425 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13426
13427         * cs-parser.jay: Remove bogus fixme.
13428
13429         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
13430         on Switch statement.
13431
13432 2001-11-23  Ravi Pratap  <ravi@ximian.com>
13433
13434         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
13435         the same. 
13436
13437         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
13438         parameter. Apparently, any expression is allowed. 
13439
13440         (ValidateInitializers): Update accordingly.
13441
13442         (CheckIndices): Fix some tricky bugs thanks to recursion.
13443
13444         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
13445         I was being completely brain-dead.
13446
13447         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
13448         and re-write acordingly.
13449
13450         (DelegateInvocation): Re-write accordingly.
13451
13452         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
13453
13454         (MakeByteBlob): Handle types more correctly.
13455
13456         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
13457         initialization from expressions but it is incomplete because I am a complete
13458         Dodo :-|
13459
13460 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13461
13462         * statement.cs (If.Emit): Fix a bug that generated incorrect code
13463         on If.  Basically, we have to return `true' (ie, we do return to
13464         our caller) only if both branches of the if return.
13465
13466         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
13467         short-circuit operators, handle them as short circuit operators. 
13468
13469         (Cast.DoResolve): Resolve type.
13470         (Cast.Cast): Take an expression as the target type.
13471
13472         * cs-parser.jay (cast_expression): Remove old hack that only
13473         allowed a limited set of types to be handled.  Now we take a
13474         unary_expression and we resolve to a type during semantic
13475         analysis.
13476
13477         Use the grammar productions from Rhys to handle casts (this is
13478         not complete like Rhys syntax yet, we fail to handle that corner
13479         case that C# has regarding (-x), but we will get there.
13480
13481 2001-11-22  Ravi Pratap  <ravi@ximian.com>
13482
13483         * class.cs (EmitFieldInitializer): Take care of the case when we have a
13484         field which is an array type.
13485
13486         * cs-parser.jay (declare_local_variables): Support array initialization too.
13487
13488         * typemanager.cs (MakeKey): Implement.
13489
13490         (everywhere): Use the above appropriately.
13491
13492         * cs-parser.jay (for_statement): Update for array initialization while
13493         declaring variables.
13494
13495         * ecore.cs : The error message was correct, it's the variable's names that
13496         were misleading ;-) Make the code more readable.
13497
13498         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
13499         the correct type etc.
13500
13501         (ConvertExplicit): Handle Enum types by examining the underlying type.
13502
13503 2001-11-21  Ravi Pratap  <ravi@ximian.com>
13504
13505         * parameter.cs (GetCallingConvention): Always return
13506         CallingConventions.Standard for now.
13507
13508 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13509
13510         * expression.cs (Binary.ResolveOperator): Update the values of `l'
13511         and `r' after calling DoNumericPromotions.
13512
13513         * ecore.cs: Fix error message (the types were in the wrong order).
13514
13515         * statement.cs (Foreach.ProbeCollectionType): Need to pass
13516         BindingFlags.Instance as well 
13517
13518         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
13519         implicit int literal conversion in an empty cast so that we
13520         propagate the right type upstream.
13521
13522         (UnboxCast): new class used to unbox value types.
13523         (Expression.ConvertExplicit): Add explicit type conversions done
13524         by unboxing.
13525
13526         (Expression.ImplicitNumericConversion): Oops, forgot to test for
13527         the target type before applying the implicit LongLiterals to ULong
13528         literal cast.
13529
13530 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
13531
13532         * cs-parser.jay (for_statement): Reworked the way For works: now
13533         we declare manually any variables that are introduced in
13534         for_initializer to solve the problem of having out-of-band code
13535         emition (that is what got for broken).
13536
13537         (declaration_statement): Perform the actual variable declaration
13538         that used to be done in local_variable_declaration here.
13539
13540         (local_variable_declaration): Do not declare anything, just pass
13541         the information on a DictionaryEntry
13542
13543 2001-11-20  Ravi Pratap  <ravi@ximian.com>
13544
13545         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
13546         re-write of the logic to now make it recursive.
13547
13548         (UpdateIndices): Re-write accordingly.
13549
13550         Store element data in a separate ArrayData list in the above methods.
13551
13552         (MakeByteBlob): Implement to dump the array data into a byte array.
13553
13554 2001-11-19  Ravi Pratap  <ravi@ximian.com>
13555
13556         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
13557         into CheckIndices.
13558
13559         * constant.cs (Define): Implement.
13560
13561         (EmitConstant): Re-write fully.
13562
13563         Pass in location info.
13564
13565         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
13566         respectively.
13567
13568         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
13569         DictionaryEntry since we need location info too.
13570
13571         (constant_declaration): Update accordingly.
13572
13573         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
13574         code into another method : UpdateIndices.
13575
13576 2001-11-18  Ravi Pratap  <ravi@ximian.com>
13577
13578         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
13579         some type checking etc.
13580
13581 2001-11-17  Ravi Pratap  <ravi@ximian.com>
13582
13583         * expression.cs (ArrayCreation::ValidateInitializers): Implement
13584         bits to provide dimension info if the user skips doing that.
13585
13586         Update second constructor to store the rank correctly.
13587
13588 2001-11-16  Ravi Pratap  <ravi@ximian.com>
13589
13590         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
13591         and try to implement.
13592
13593         * ../errors/cs0150.cs : Add.
13594
13595         * ../errors/cs0178.cs : Add.
13596
13597 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
13598
13599         * statement.cs: Implement foreach on multi-dimensional arrays. 
13600
13601         * parameter.cs (Parameters.GetParameterByName): Also lookup the
13602         name of the params argument.
13603
13604         * expression.cs: Use EmitStoreOpcode to get the right opcode while
13605         initializing the array.
13606
13607         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
13608         we can use this elsewhere.
13609
13610         * statement.cs: Finish implementation of foreach for single
13611         dimension arrays.
13612
13613         * cs-parser.jay: Use an out-of-band stack to pass information
13614         around, I wonder why I need this.
13615
13616         foreach_block: Make the new foreach_block the current_block.
13617
13618         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
13619         function used to return a static Parameters structure.  Used for
13620         empty parameters, as those are created very frequently.
13621
13622         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
13623
13624 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13625
13626         * interface.cs : Default modifier is private, not public. The
13627         make verify test passes again.
13628
13629 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13630
13631         * support.cs (ReflectionParameters): Fix logic to determine
13632         whether the last parameter is a params one. Test 9 passes again.
13633
13634         * delegate.cs (Populate): Register the builders we define with
13635         RegisterParameterForBuilder. Test 19 passes again.
13636
13637         * cs-parser.jay (property_declaration): Reference $6 instead
13638         of $$ to get at the location.
13639
13640         (indexer_declaration): Similar stuff.
13641
13642         (attribute): Ditto.
13643
13644         * class.cs (Property): Register parameters for the Get and Set methods
13645         if they exist. Test 23 passes again.
13646
13647         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
13648         call to EmitArguments as we are sure there aren't any params arguments. 
13649         Test 32 passes again.
13650
13651         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
13652         IndexOutOfRangeException. 
13653
13654         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
13655         Test 33 now passes again.
13656
13657 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
13658
13659         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
13660         broke a bunch of things.  Will have to come up with a better way
13661         of tracking locations.
13662
13663         * statement.cs: Implemented foreach for single dimension arrays.
13664
13665 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13666
13667         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
13668         an error.  This removes the lookup from the critical path.
13669
13670         * cs-parser.jay: Removed use of temporary_loc, which is completely
13671         broken. 
13672
13673 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
13674
13675         * support.cs (ReflectionParameters.ParameterModifier): Report
13676         whether the argument is a PARAMS argument or not.
13677
13678         * class.cs: Set the attribute `ParamArrayAttribute' on the
13679         parameter argument.
13680
13681         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
13682         and cons_param_array_attribute (ConstructorInfo for
13683         ParamArrayAttribute)., 
13684
13685         * codegen.cs: Emit the return using the `Return' statement, that
13686         way we can report the error correctly for missing return values. 
13687
13688         * class.cs (Method.Emit): Clean up.
13689
13690         * expression.cs (Argument.Resolve): Take another argument: the
13691         location where this argument is used.  Notice that this is not
13692         part of the "Argument" class as to reduce the size of the
13693         structure (we know the approximate location anyways).
13694
13695         Test if the argument is a variable-reference, if not, then
13696         complain with a 206.
13697
13698         (Argument.Emit): Emit addresses of variables.
13699
13700         (Argument.FullDesc): Simplify.
13701
13702         (Invocation.DoResolve): Update for Argument.Resolve.
13703
13704         (ElementAccess.DoResolve): ditto.
13705
13706         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
13707         method should be virtual, as this method is always virtual.
13708
13709         (NewDelegate.DoResolve): Update for Argument.Resolve.
13710
13711         * class.cs (ConstructorInitializer.DoResolve): ditto.
13712
13713         * attribute.cs (Attribute.Resolve): ditto.
13714
13715 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
13716
13717         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
13718
13719         * expression.cs (ParameterReference): Drop IStackStorage and implement
13720         IAssignMethod instead. 
13721
13722         (LocalVariableReference): ditto.
13723
13724         * ecore.cs (FieldExpr): Drop IStackStorage and implement
13725         IAssignMethod instead. 
13726
13727 2001-11-13  Miguel de Icaza <miguel@ximian.com>
13728
13729         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
13730         enumerations that are used in heavily used structures derive from
13731         byte in a laughable and pathetic attempt to reduce memory usage.
13732         This is the kind of pre-optimzations that you should not do at
13733         home without adult supervision.
13734
13735         * expression.cs (UnaryMutator): New class, used to handle ++ and
13736         -- separatedly from the other unary operators.  Cleans up the
13737         code, and kills the ExpressionStatement dependency in Unary.
13738
13739         (Unary): Removed `method' and `Arguments' from this class, making
13740         it smaller, and moving it all to SimpleCall, so I can reuse this
13741         code in other locations and avoid creating a lot of transient data
13742         strucutres when not required.
13743
13744         * cs-parser.jay: Adjust for new changes.
13745
13746 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
13747
13748         * enum.cs (Enum.Populate): If there is a failure during
13749         definition, return
13750
13751         * cs-parser.jay (opt_enum_base): we used to catch type errors
13752         here, but this is really incorrect.  The type error should be
13753         catched during semantic analysis.
13754
13755 2001-12-11  Ravi Pratap  <ravi@ximian.com>
13756
13757         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
13758         current_local_parameters as expected since I, in my stupidity, had forgotten
13759         to do this :-)
13760
13761         * attribute.cs (GetValidPlaces): Fix stupid bug.
13762
13763         * class.cs (Method::Emit): Perform check on applicability of attributes.
13764
13765         (Constructor::Emit): Ditto.
13766
13767         (Field::Emit): Ditto.
13768
13769         (Field.Location): Store location information.
13770
13771         (Property, Event, Indexer, Operator): Ditto.
13772
13773         * cs-parser.jay (field_declaration): Pass in location for each field.
13774
13775         * ../errors/cs0592.cs : Add.
13776
13777 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13778
13779         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
13780
13781         (InitCoreTypes): Update accordingly.
13782
13783         (RegisterAttrType, LookupAttr): Implement.
13784
13785         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
13786         info about the same.
13787
13788         (Resolve): Update to populate the above as necessary.
13789
13790         (Error592): Helper.
13791
13792         (GetValidPlaces): Helper to the above.
13793
13794         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
13795
13796         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
13797
13798 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13799
13800         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
13801
13802         * ../errors/cs0617.cs : Add.
13803
13804 2001-11-11  Ravi Pratap  <ravi@ximian.com>
13805
13806         * enum.cs (Emit): Rename to Populate to be more consistent with what
13807         we expect it to do and when exactly it is called.
13808
13809         * class.cs, rootcontext.cs : Update accordingly.
13810
13811         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
13812         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
13813
13814         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
13815
13816         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
13817         of a fieldinfo using the above, when dealing with a FieldBuilder.
13818
13819 2001-11-10  Ravi Pratap  <ravi@ximian.com>
13820
13821         * ../errors/cs0031.cs : Add.
13822
13823         * ../errors/cs1008.cs : Add.
13824
13825         * ../errrors/cs0543.cs : Add.
13826
13827         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
13828         enum type.
13829
13830         (FindMembers): Implement.
13831
13832         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
13833         enums and delegates too.
13834
13835         (enum_types): Rename to builder_to_enum.
13836
13837         (delegate_types): Rename to builder_to_delegate.
13838
13839         * delegate.cs (FindMembers): Implement.
13840
13841 2001-11-09  Ravi Pratap  <ravi@ximian.com>
13842
13843         * typemanager.cs (IsEnumType): Implement.
13844
13845         * enum.cs (Emit): Re-write parts to account for the underlying type
13846         better and perform checking etc.
13847
13848         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
13849         of the underlying type.
13850
13851         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
13852         value
13853
13854         * enum.cs (error31): Helper to report error #31.
13855
13856         * cs-parser.jay (enum_declaration): Store location of each member too.
13857
13858         * enum.cs (member_to_location): New hashtable. 
13859
13860         (AddEnumMember): Update location hashtable.
13861
13862         (Emit): Use the location of each member while reporting errors.
13863
13864 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13865
13866         * cs-parser.jay: A for_initializer if is a
13867         local_variable_declaration really ammount to have an implicit
13868         block with the variable declaration and no initializer for for.
13869
13870         * statement.cs (For.Emit): Cope with null initializers.
13871
13872         This fixes the infinite loop on for initializers.
13873
13874 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
13875
13876         * enum.cs: More cleanup.
13877
13878         * ecore.cs: Remove dead code.
13879
13880         * class.cs (Property.Emit): More simplification.
13881         (Event.Emit): ditto.
13882
13883         Reworked to have less levels of indentation.
13884
13885 2001-11-08  Ravi Pratap  <ravi@ximian.com>
13886
13887         * class.cs (Property): Emit attributes.
13888
13889         (Field): Ditto.
13890
13891         (Event): Ditto.
13892
13893         (Indexer): Ditto.
13894
13895         (Operator): Ditto.
13896
13897         * enum.cs (Emit): Ditto.
13898
13899         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
13900         Enums too.
13901
13902         * class.cs (Field, Event, etc.): Move attribute generation into the
13903         Emit method everywhere.
13904
13905         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
13906         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
13907         as we had no way of defining nested enums !
13908
13909         * rootcontext.cs : Adjust code accordingly.
13910
13911         * typemanager.cs (AddEnumType): To keep track of enum types separately.
13912
13913 2001-11-07  Ravi Pratap  <ravi@ximian.com>
13914
13915         * expression.cs (EvalConstantExpression): Move into ecore.cs
13916
13917         * enum.cs (Enum): Rename some members and make them public and readonly
13918         according to our convention.
13919
13920         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
13921         nothing else.
13922
13923         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
13924
13925         (Enum::Emit): Write a simple version for now which doesn't try to compute
13926         expressions. I shall modify this to be more robust in just a while.
13927
13928         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
13929
13930         (TypeContainer::CloseType): Create the Enum types too.
13931
13932         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
13933
13934         * expression.cs (EvalConstantExpression): Get rid of completely.
13935
13936         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
13937         user-defined values and other cases.
13938
13939         (IsValidEnumLiteral): Helper function.
13940
13941         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
13942         out there in the case we had a literal FieldExpr.
13943
13944         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
13945
13946         (Literalize): Revamp a bit to take two arguments.
13947
13948         (EnumLiteral): New class which derives from Literal to wrap enum literals.
13949
13950 2001-11-06  Ravi Pratap  <ravi@ximian.com>
13951
13952         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
13953
13954         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
13955
13956         (Resolve): Use the above to ensure we have proper initializers.
13957
13958 2001-11-05  Ravi Pratap  <ravi@ximian.com>
13959
13960         * expression.cs (Expression::EvalConstantExpression): New method to 
13961         evaluate constant expressions.
13962
13963         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
13964
13965 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
13966
13967         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
13968         in an array.
13969
13970         (Binary.ResolveOperator): Handle operator != (object a, object b)
13971         and operator == (object a, object b);
13972
13973         (Binary.DoNumericPromotions): Indicate whether the numeric
13974         promotion was possible.
13975
13976         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
13977         Implement.  
13978
13979         Made the ArrayAccess implement interface IAssignMethod instead of
13980         IStackStore as the order in which arguments are passed reflects
13981         this.
13982
13983         * assign.cs: Instead of using expr.ExprClass to select the way of
13984         assinging, probe for the IStackStore/IAssignMethod interfaces.
13985
13986         * typemanager.cs: Load InitializeArray definition.
13987
13988         * rootcontext.cs (RootContext.MakeStaticData): Used to define
13989         static data that can be used to initialize arrays. 
13990
13991 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
13992
13993         * expression.cs: Handle operator== and operator!= for booleans.
13994
13995         (Conditioal.Reduce): Implement reducer for the ?: operator.
13996
13997         (Conditional.Resolve): Implement dead code elimination.
13998
13999         (Binary.Resolve): Catch string literals and return a new
14000         concatenated string.
14001
14002         (Unary.Reduce): Implement reduction of unary expressions.
14003
14004         * ecore.cs: Split out the expression core handling here.
14005
14006         (Expression.Reduce): New method used to perform constant folding
14007         and CSE.  This is needed to support constant-expressions. 
14008
14009         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14010         targets, and optimize for !x.
14011
14012 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14013
14014         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14015         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14016         set custom atttributes.
14017
14018         * literal.cs (Literal::GetValue): New abstract method to return the actual
14019         value of the literal, cast as an object.
14020
14021         (*Literal): Implement GetValue method.
14022
14023         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14024         expressions to the arraylist but objects of type Argument.
14025
14026         * class.cs (TypeContainer::Emit): Emit our attributes too.
14027
14028         (Method::Emit, Constructor::Emit): Ditto.
14029
14030         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14031         to be ignoring earlier.
14032
14033 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14034
14035         * attribute.cs (AttributeSection::Define): Implement to do the business
14036         of constructing a CustomAttributeBuilder.
14037
14038         (Attribute): New trivial class. Increases readability of code.  
14039
14040         * cs-parser.jay : Update accordingly.
14041
14042         (positional_argument_list, named_argument_list, named_argument): New rules
14043
14044         (attribute_arguments): Use the above so that we are more correct.
14045
14046 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14047
14048         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14049         to perform all checks for a method with a params parameter.
14050
14051         (Invocation::OverloadResolve): Update to use the above method and therefore
14052         cope correctly with params method invocations.
14053
14054         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14055         params too.
14056
14057         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14058         constructors in our parent too because we can't afford to miss out on 
14059         protected ones ;-)
14060
14061         * attribute.cs (AttributeSection): New name for the class Attribute
14062
14063         Other trivial changes to improve readability.
14064
14065         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14066         use the new class names.
14067
14068 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14069
14070         * class.cs (Method::Define): Complete definition for params types too
14071
14072         (Indexer::Define): Ditto.
14073
14074         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14075         Cope everywhere with a request for info about the array parameter.
14076
14077 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14078
14079         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14080
14081         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14082         local_variable_type to extract the string corresponding to the type.
14083
14084         (local_variable_type): Fixup the action to use the new helper method.
14085
14086         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14087         go.
14088
14089         * expression.cs : Clean out code which uses the above.
14090
14091 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14092
14093         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14094         and bale out if necessary by returning a false.
14095
14096         (RegisterProperty): Ditto.
14097
14098         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14099         and print out appropriate error messages.
14100
14101         * interface.cs (everywhere): Ditto.
14102
14103         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14104         location to constructor.
14105
14106         * class.cs (Property, Event, Indexer): Update accordingly.
14107
14108         * ../errors/cs111.cs : Added.
14109
14110         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14111         of a method, as laid down by the spec.
14112
14113         (Invocation::OverloadResolve): Use the above method.
14114
14115 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14116
14117         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
14118         now take a TypeContainer and a Parameters object.
14119
14120         (ParameterData): Modify return type of ParameterModifier method to be 
14121         Parameter.Modifier and not a string.
14122
14123         (ReflectionParameters, InternalParameters): Update accordingly.
14124
14125         * expression.cs (Argument::GetParameterModifier): Same here.
14126
14127         * support.cs (InternalParameters::ParameterType): Find a better way of determining
14128         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
14129         symbol in it at all so maybe this is only for now.
14130
14131 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14132
14133         * support.cs (InternalParameters): Constructor now takes an extra argument 
14134         which is the actual Parameters class.
14135
14136         (ParameterDesc): Update to provide info on ref/out modifiers.
14137
14138         * class.cs (everywhere): Update call to InternalParameters to pass in
14139         the second argument too.
14140
14141         * support.cs (ParameterData): Add ParameterModifier, which is a method 
14142         to return the modifier info [ref/out etc]
14143
14144         (InternalParameters, ReflectionParameters): Implement the above.
14145
14146         * expression.cs (Argument::ParameterModifier): Similar function to return
14147         info about the argument's modifiers.
14148
14149         (Invocation::OverloadResolve): Update to take into account matching modifiers 
14150         too.
14151
14152         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
14153         a new SetFormalParameters object which we pass to InternalParameters.
14154
14155 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14156
14157         * expression.cs (NewArray): Merge into the ArrayCreation class.
14158
14159 2001-10-29  Ravi Pratap  <ravi@ximian.com>
14160
14161         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
14162         NewUserdefinedArray into one as there wasn't much of a use in having
14163         two separate ones.
14164
14165         * expression.cs (Argument): Change field's name to ArgType from Type.
14166
14167         (Type): New readonly property which returns the proper type, taking into 
14168         account ref/out modifiers.
14169
14170         (everywhere): Adjust code accordingly for the above.
14171
14172         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
14173         whether we are emitting for a ref or out parameter.
14174
14175         * expression.cs (Argument::Emit): Use the above field to set the state.
14176
14177         (LocalVariableReference::Emit): Update to honour the flag and emit the
14178         right stuff.
14179
14180         * parameter.cs (Attributes): Set the correct flags for ref parameters.
14181
14182         * expression.cs (Argument::FullDesc): New function to provide a full desc.
14183
14184         * support.cs (ParameterData): Add method ParameterDesc to the interface.
14185
14186         (ReflectionParameters, InternalParameters): Implement the above method.
14187
14188         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
14189         reporting errors.
14190
14191         (Invocation::FullMethodDesc): Ditto. 
14192
14193 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
14194
14195         * cs-parser.jay: Add extra production for the second form of array
14196         creation. 
14197
14198         * expression.cs (ArrayCreation): Update to reflect the above
14199         change. 
14200
14201         * Small changes to prepare for Array initialization.
14202
14203 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
14204
14205         * typemanager.cs (ImplementsInterface): interface might be null;
14206         Deal with this problem;
14207
14208         Also, we do store negative hits on the cache (null values), so use
14209         this instead of calling t.GetInterfaces on the type everytime.
14210
14211 2001-10-28  Ravi Pratap  <ravi@ximian.com>
14212
14213         * typemanager.cs (IsBuiltinType): New method to help determine the same.
14214
14215         * expression.cs (New::DoResolve): Get rid of array creation code and instead
14216         split functionality out into different classes.
14217
14218         (New::FormArrayType): Move into NewBuiltinArray.
14219
14220         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
14221         quite useless.
14222
14223         (NewBuiltinArray): New class to handle creation of built-in arrays.
14224
14225         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
14226         account creation of one-dimensional arrays.
14227
14228         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
14229
14230         (NewUserdefinedArray::DoResolve): Implement.
14231
14232         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
14233
14234         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
14235         we maintain inside the TypeManager. This is necessary to perform lookups on the
14236         module builder.
14237
14238         (LookupType): Update to perform GetType on the module builders too.     
14239
14240         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
14241
14242         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
14243
14244 2001-10-23  Ravi Pratap  <ravi@ximian.com>
14245
14246         * expression.cs (New::DoResolve): Implement guts of array creation.
14247
14248         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
14249
14250 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
14251
14252         * expression.cs: Fix bug I introduced lsat night that broke
14253         Delegates. 
14254
14255         (Expression.Resolve): Report a 246 error (can not resolve name)
14256         if we find a SimpleName in the stream.
14257
14258         (Expression.ResolveLValue): Ditto.
14259
14260         (Expression.ResolveWithSimpleName): This function is a variant of
14261         ResolveName, this one allows SimpleNames to be returned without a
14262         warning.  The only consumer of SimpleNames is MemberAccess
14263
14264 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
14265
14266         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
14267         might arrive here.  I have my doubts that this is correct.
14268
14269         * statement.cs (Lock): Implement lock statement.
14270
14271         * cs-parser.jay: Small fixes to support `lock' and `using'
14272
14273         * cs-tokenizer.cs: Remove extra space
14274
14275         * driver.cs: New flag --checked, allows to turn on integer math
14276         checking. 
14277
14278         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
14279         Threading.Monitor.Exit 
14280
14281 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
14282
14283         * expression.cs (IndexerAccess::DoResolveLValue): Set the
14284         Expression Class to be IndexerAccess.
14285
14286         Notice that Indexer::DoResolve sets the eclass to Value.
14287
14288 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
14289
14290         * class.cs (TypeContainer::Emit): Emit code for indexers.
14291
14292         * assign.cs (IAssignMethod): New interface implemented by Indexers
14293         and Properties for handling assignment.
14294
14295         (Assign::Emit): Simplify and reuse code. 
14296
14297         * expression.cs (IndexerAccess, PropertyExpr): Implement
14298         IAssignMethod, clean up old code. 
14299
14300 2001-10-22  Ravi Pratap  <ravi@ximian.com>
14301
14302         * typemanager.cs (ImplementsInterface): New method to determine if a type
14303         implements a given interface. Provides a nice cache too.
14304
14305         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
14306         method.
14307
14308         (ConvertReferenceExplicit): Ditto.
14309
14310         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
14311         various methods, with correct names etc.
14312
14313         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
14314         Operator.UnaryNegation.
14315
14316         * cs-parser.jay (operator_declarator): Be a little clever in the case where
14317         we have a unary plus or minus operator.
14318
14319         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
14320         UnaryMinus.
14321
14322         * everywhere : update accordingly.
14323
14324         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
14325         respectively.
14326
14327         * class.cs (Method::Define): For the case where we are implementing a method
14328         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
14329         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
14330
14331 2001-10-21  Ravi Pratap  <ravi@ximian.com>
14332
14333         * interface.cs (FindMembers): Implement to work around S.R.E
14334         lameness.
14335
14336         * typemanager.cs (IsInterfaceType): Implement.
14337
14338         (FindMembers): Update to handle interface types too.
14339
14340         * expression.cs (ImplicitReferenceConversion): Re-write bits which
14341         use IsAssignableFrom as that is not correct - it doesn't work.
14342
14343         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
14344         and accordingly override EmitStatement.
14345
14346         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
14347         using the correct logic :-)
14348
14349 2001-10-19  Ravi Pratap  <ravi@ximian.com>
14350
14351         * ../errors/cs-11.cs : Add to demonstrate error -11 
14352
14353 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
14354
14355         * assign.cs (Assign::Resolve): Resolve right hand side first, and
14356         then pass this as a hint to ResolveLValue.
14357
14358         * expression.cs (FieldExpr): Add Location information
14359
14360         (FieldExpr::LValueResolve): Report assignment to readonly
14361         variable. 
14362
14363         (Expression::ExprClassFromMemberInfo): Pass location information.
14364
14365         (Expression::ResolveLValue): Add new method that resolves an
14366         LValue. 
14367
14368         (Expression::DoResolveLValue): Default invocation calls
14369         DoResolve. 
14370
14371         (Indexers): New class used to keep track of indexers in a given
14372         Type. 
14373
14374         (IStackStore): Renamed from LValue, as it did not really describe
14375         what this did.  Also ResolveLValue is gone from this interface and
14376         now is part of Expression.
14377
14378         (ElementAccess): Depending on the element access type
14379
14380         * typemanager.cs: Add `indexer_name_type' as a Core type
14381         (System.Runtime.CompilerServices.IndexerNameAttribute)
14382
14383         * statement.cs (Goto): Take a location.
14384
14385 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14386
14387         * delegate.cs (Delegate::VerifyDelegate): New method to verify
14388         if two delegates are compatible.
14389
14390         (NewDelegate::DoResolve): Update to take care of the case when
14391         we instantiate a delegate from another delegate.
14392
14393         * typemanager.cs (FindMembers): Don't even try to look up members
14394         of Delegate types for now.
14395
14396 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14397
14398         * delegate.cs (NewDelegate): New class to take care of delegate
14399         instantiation.
14400
14401         * expression.cs (New): Split the delegate related code out into 
14402         the NewDelegate class.
14403
14404         * delegate.cs (DelegateInvocation): New class to handle delegate 
14405         invocation.
14406
14407         * expression.cs (Invocation): Split out delegate related code into
14408         the DelegateInvocation class.
14409
14410 2001-10-17  Ravi Pratap  <ravi@ximian.com>
14411
14412         * expression.cs (New::DoResolve): Implement delegate creation fully
14413         and according to the spec.
14414
14415         (New::DoEmit): Update to handle delegates differently.
14416
14417         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
14418         because of which we were printing out arguments in reverse order !
14419
14420         * delegate.cs (VerifyMethod): Implement to check if the given method
14421         matches the delegate.
14422
14423         (FullDelegateDesc): Implement.
14424
14425         (VerifyApplicability): Implement.
14426
14427         * expression.cs (Invocation::DoResolve): Update to accordingly handle
14428         delegate invocations too.
14429
14430         (Invocation::Emit): Ditto.
14431
14432         * ../errors/cs1593.cs : Added.
14433
14434         * ../errors/cs1594.cs : Added.
14435
14436         * delegate.cs (InstanceExpression, TargetMethod): New properties.
14437
14438 2001-10-16  Ravi Pratap  <ravi@ximian.com>
14439
14440         * typemanager.cs (intptr_type): Core type for System.IntPtr
14441
14442         (InitCoreTypes): Update for the same.
14443
14444         (iasyncresult_type, asynccallback_type): Ditto.
14445
14446         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
14447         correct.
14448
14449         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
14450         too.
14451
14452         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
14453         the builders for the 4 members of a delegate type :-)
14454
14455         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
14456         type.
14457
14458         * expression.cs (New::DoResolve): Implement guts for delegate creation.
14459
14460         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
14461
14462 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
14463
14464         * statement.cs (Break::Emit): Implement.   
14465         (Continue::Emit): Implement.
14466
14467         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14468         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14469         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14470         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
14471         end loop
14472
14473         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
14474         properties that track the label for the current loop (begin of the
14475         loop and end of the loop).
14476
14477 2001-10-15  Ravi Pratap  <ravi@ximian.com>
14478
14479         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
14480         use of emitting anything at all.
14481
14482         * class.cs, rootcontext.cs : Get rid of calls to the same.
14483
14484         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
14485
14486         (Populate): Define the constructor correctly and set the implementation
14487         attributes.
14488
14489         * typemanager.cs (delegate_types): New hashtable to hold delegates that
14490         have been defined.
14491
14492         (AddDelegateType): Implement.
14493
14494         (IsDelegateType): Implement helper method.
14495
14496         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
14497
14498         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
14499         and accordingly handle it.
14500
14501         * delegate.cs (Populate): Take TypeContainer argument.
14502         Implement bits to define the Invoke method. However, I still haven't figured out
14503         how to take care of the native int bit :-(
14504
14505         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
14506         Qualify the name of the delegate, not its return type !
14507
14508         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
14509         conversion.
14510
14511         (StandardConversionExists): Checking for array types turns out to be recursive.
14512
14513         (ConvertReferenceExplicit): Implement array conversion.
14514
14515         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
14516
14517 2001-10-12  Ravi Pratap  <ravi@ximian.com>
14518
14519         * cs-parser.jay (delegate_declaration): Store the fully qualified
14520         name as it is a type declaration.
14521
14522         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
14523         readonly.
14524
14525         (DefineDelegate): Renamed from Define. Does the same thing essentially,
14526         as TypeContainer::DefineType.
14527
14528         (Populate): Method in which all the definition of the various methods (Invoke)
14529         etc is done.
14530
14531         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
14532         see.
14533
14534         (CloseDelegate): Finally creates the delegate.
14535
14536         * class.cs (TypeContainer::DefineType): Update to define delegates.
14537         (Populate, Emit and CloseType): Do the same thing here too.
14538
14539         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
14540         delegates in all these operations.
14541
14542 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
14543
14544         * expression.cs: LocalTemporary: a new expression used to
14545         reference a temporary that has been created.
14546
14547         * assign.cs: Handle PropertyAccess back here, so that we can
14548         provide the proper semantic access to properties.
14549
14550         * expression.cs (Expression::ConvertReferenceExplicit): Implement
14551         a few more explicit conversions. 
14552
14553         * modifiers.cs: `NEW' modifier maps to HideBySig.
14554
14555         * expression.cs (PropertyExpr): Make this into an
14556         ExpressionStatement, and support the EmitStatement code path. 
14557
14558         Perform get/set error checking, clean up the interface.
14559
14560         * assign.cs: recognize PropertyExprs as targets, and if so, turn
14561         them into toplevel access objects.
14562
14563 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
14564
14565         * expression.cs: PropertyExpr::PropertyExpr: use work around the
14566         SRE.
14567
14568         * typemanager.cs: Keep track here of our PropertyBuilders again to
14569         work around lameness in SRE.
14570
14571 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
14572
14573         * expression.cs (LValue::LValueResolve): New method in the
14574         interface, used to perform a second resolution pass for LValues. 
14575
14576         (This::DoResolve): Catch the use of this in static methods.
14577
14578         (This::LValueResolve): Implement.
14579
14580         (This::Store): Remove warning, assigning to `this' in structures
14581         is 
14582
14583         (Invocation::Emit): Deal with invocation of
14584         methods on value types.  We need to pass the address to structure
14585         methods rather than the object itself.  (The equivalent code to
14586         emit "this" for structures leaves the entire structure on the
14587         stack instead of a pointer to it). 
14588
14589         (ParameterReference::DoResolve): Compute the real index for the
14590         argument based on whether the method takes or not a `this' pointer
14591         (ie, the method is static).
14592
14593         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
14594         value types returned from functions when we need to invoke a
14595         method on the sturcture.
14596
14597
14598 2001-10-11  Ravi Pratap  <ravi@ximian.com>
14599
14600         * class.cs (TypeContainer::DefineType): Method to actually do the business of
14601         defining the type in the Modulebuilder or Typebuilder. This is to take
14602         care of nested types which need to be defined on the TypeBuilder using
14603         DefineNestedMethod.
14604
14605         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
14606         methods in RootContext, only ported to be part of TypeContainer.
14607
14608         (TypeContainer::GetInterfaceOrClass): Ditto.
14609
14610         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
14611
14612         * interface.cs (Interface::DefineInterface): New method. Does exactly
14613         what RootContext.CreateInterface did earlier, only it takes care of nested types 
14614         too.
14615
14616         (Interface::GetInterfaces): Move from RootContext here and port.
14617
14618         (Interface::GetInterfaceByName): Same here.
14619
14620         * rootcontext.cs (ResolveTree): Re-write.
14621
14622         (PopulateTypes): Re-write.
14623
14624         * class.cs (TypeContainer::Populate): Populate nested types too.
14625         (TypeContainer::Emit): Emit nested members too.
14626
14627         * typemanager.cs (AddUserType): Do not make use of the FullName property,
14628         instead just use the name argument passed in as it is already fully
14629         qualified.
14630
14631         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
14632         to TypeContainer mapping to see if a type is user-defined.
14633
14634         * class.cs (TypeContainer::CloseType): Implement. 
14635
14636         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
14637         the default constructor.
14638
14639         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
14640         twice.
14641
14642         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
14643
14644         * interface.cs (CloseType): Create the type here.
14645
14646         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
14647         the hierarchy.
14648
14649         Remove all the methods which are now in TypeContainer.
14650
14651 2001-10-10  Ravi Pratap  <ravi@ximian.com>
14652
14653         * delegate.cs (Define): Re-write bits to define the delegate
14654         correctly.
14655
14656 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
14657
14658         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
14659
14660         * expression.cs (ImplicitReferenceConversion): handle null as well
14661         as a source to convert to any reference type.
14662
14663         * statement.cs (Return): Perform any implicit conversions to
14664         expected return type.  
14665
14666         Validate use of return statement.  
14667
14668         * codegen.cs (EmitContext): Pass the expected return type here.
14669
14670         * class.cs (Method, Constructor, Property): Pass expected return
14671         type to EmitContext.
14672
14673 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
14674
14675         * expression.cs: Make DoResolve take an EmitContext instead of a
14676         TypeContainer.
14677
14678         Replaced `l' and `location' for `loc', for consistency.
14679
14680         (Error, Warning): Remove unneeded Tc argument.
14681
14682         * assign.cs, literal.cs, constant.cs: Update to new calling
14683         convention. 
14684
14685         * codegen.cs: EmitContext now contains a flag indicating whether
14686         code is being generated in a static method or not.
14687
14688         * cs-parser.jay: DecomposeQI, new function that replaces the old
14689         QualifiedIdentifier.  Now we always decompose the assembled
14690         strings from qualified_identifier productions into a group of
14691         memberaccesses.
14692
14693 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
14694
14695         * rootcontext.cs: Deal with field-less struct types correctly now
14696         by passing the size option to Define Type.
14697
14698         * class.cs: Removed hack that created one static field. 
14699
14700 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14701
14702         * statement.cs: Moved most of the code generation here. 
14703
14704 2001-10-09  Ravi Pratap  <ravi@ximian.com>
14705
14706         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
14707         seem very right.
14708
14709         (ElementAccess): Remove useless bits for now - keep checks as the spec
14710         says.
14711
14712 2001-10-08  Ravi Pratap  <ravi@ximian.com>
14713
14714         * expression.cs (ElementAccess::DoResolve): Remove my crap code
14715         and start performing checks according to the spec.
14716
14717 2001-10-07  Ravi Pratap  <ravi@ximian.com>
14718
14719         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
14720         rank_specifiers instead.
14721
14722         (rank_specifiers): Change the order in which the rank specifiers are stored
14723
14724         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
14725
14726         * expression.cs (ElementAccess): Implement the LValue interface too.
14727
14728 2001-10-06  Ravi Pratap  <ravi@ximian.com>
14729
14730         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
14731         except that user defined conversions are not included.
14732
14733         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
14734         perform the conversion of the return type, if necessary.
14735
14736         (New::DoResolve): Check whether we are creating an array or an object
14737         and accordingly do the needful.
14738
14739         (New::Emit): Same here.
14740
14741         (New::DoResolve): Implement guts of array creation.
14742
14743         (New::FormLookupType): Helper function.
14744
14745 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14746
14747         * codegen.cs: Removed most of the code generation here, and move the
14748         corresponding code generation bits to the statement classes. 
14749
14750         Added support for try/catch/finalize and throw.
14751
14752         * cs-parser.jay: Added support for try/catch/finalize.
14753
14754         * class.cs: Catch static methods having the flags override,
14755         virtual or abstract.
14756
14757         * expression.cs (UserCast): This user cast was not really doing
14758         what it was supposed to do.  Which is to be born in fully resolved
14759         state.  Parts of the resolution were being performed at Emit time! 
14760
14761         Fixed this code.
14762
14763 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14764
14765         * expression.cs: Implicity convert the result from UserCast.
14766
14767 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14768
14769         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
14770         prevented it from working correctly. 
14771
14772         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
14773         merely ConvertImplicit.
14774
14775 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14776
14777         * typemanager.cs: Make the LookupTypeContainer function static,
14778         and not per-instance.  
14779
14780         * class.cs: Make static FindMembers (the one that takes a Type
14781         argument). 
14782
14783         * codegen.cs: Add EmitForeach here.
14784
14785         * cs-parser.jay: Make foreach a toplevel object instead of the
14786         inline expansion, as we need to perform semantic analysis on it. 
14787
14788 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14789
14790         * expression.cs (Expression::ImplicitUserConversion): Rename to
14791         UserDefinedConversion.
14792
14793         (Expression::UserDefinedConversion): Take an extra argument specifying 
14794         whether we look for explicit user conversions too.
14795
14796         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
14797
14798         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
14799
14800         (ExplicitUserConversion): Make it a call to UserDefinedConversion
14801         with the appropriate arguments.
14802
14803         * cs-parser.jay (cast_expression): Record location too.
14804
14805         * expression.cs (Cast): Record location info.
14806
14807         (Expression::ConvertExplicit): Take location argument.
14808
14809         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
14810         to determine if we are doing explicit conversions.
14811
14812         (UserCast::Emit): Update accordingly.
14813
14814         (Expression::ConvertExplicit): Report an error if everything fails.
14815
14816         * ../errors/cs0030.cs : Add.
14817
14818 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
14819
14820         * modifiers.cs: If the ABSTRACT keyword is present, also set the
14821         virtual and newslot bits. 
14822
14823         * class.cs (TypeContainer::RegisterRequiredImplementations):
14824         Record methods we need.
14825
14826         (TypeContainer::MakeKey): Helper function to make keys for
14827         MethodBases, since the Methodbase key is useless.
14828
14829         (TypeContainer::Populate): Call RegisterRequiredImplementations
14830         before defining the methods.   
14831
14832         Create a mapping for method_builders_to_methods ahead of time
14833         instead of inside a tight loop.
14834
14835         (::RequireMethods):  Accept an object as the data to set into the
14836         hashtable so we can report interface vs abstract method mismatch.
14837
14838 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14839
14840         * report.cs: Make all of it static.
14841
14842         * rootcontext.cs: Drop object_type and value_type computations, as
14843         we have those in the TypeManager anyways.
14844
14845         Drop report instance variable too, now it is a global.
14846
14847         * driver.cs: Use try/catch on command line handling.
14848
14849         Add --probe option to debug the error reporting system with a test
14850         suite. 
14851
14852         * report.cs: Add support for exiting program when a probe
14853         condition is reached.
14854
14855 2001-10-03  Ravi Pratap  <ravi@ximian.com>
14856
14857         * expression.cs (Binary::DoNumericPromotions): Fix the case when
14858         we do a forcible conversion regardless of type, to check if 
14859         ForceConversion returns a null.
14860
14861         (Binary::error19): Use location to report error.
14862
14863         (Unary::error23): Use location here too.
14864
14865         * ../errors/cs0019.cs : Check in.
14866
14867         * ../errors/cs0023.cs : Check in.
14868
14869         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
14870         case of a non-null MethodInfo object with a length of 0 !
14871
14872         (Binary::ResolveOperator): Flag error if overload resolution fails to find
14873         an applicable member - according to the spec :-)
14874         Also fix logic to find members in base types.
14875
14876         (Unary::ResolveOperator): Same here.
14877
14878         (Unary::report23): Change name to error23 and make first argument a TypeContainer
14879         as I was getting thoroughly confused between this and error19 :-)
14880
14881         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
14882         (::FindMostEncompassedType): Implement.
14883         (::FindMostEncompassingType): Implement.
14884         (::StandardConversionExists): Implement.
14885
14886         (UserImplicitCast): Re-vamp. We now need info about most specific
14887         source and target types so that we can do the necessary conversions.
14888
14889         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
14890         mathematical union with no duplicates.
14891
14892 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14893
14894         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
14895         in order from base classes to child classes, so that we can in
14896         child classes look up in our parent for method names and
14897         attributes (required for handling abstract, virtual, new, override
14898         constructs: we need to instrospect our base class, and if we dont
14899         populate the classes in order, the introspection might be
14900         incorrect.  For example, a method could query its parent before
14901         the parent has any methods and would determine that the parent has
14902         no abstract methods (while it could have had them)).
14903
14904         (RootContext::CreateType): Record the order in which we define the
14905         classes.
14906
14907 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
14908
14909         * class.cs (TypeContainer::Populate): Also method definitions can
14910         fail now, keep track of this.
14911
14912         (TypeContainer::FindMembers): Implement support for
14913         DeclaredOnly/noDeclaredOnly flag.
14914
14915         (Constructor::Emit) Return the ConstructorBuilder.
14916
14917         (Method::Emit) Return the MethodBuilder. 
14918         Check for abstract or virtual methods to be public.
14919
14920         * rootcontext.cs (RootContext::CreateType): Register all the
14921         abstract methods required for the class to be complete and the
14922         interface methods that must be implemented. 
14923
14924         * cs-parser.jay: Report error 501 (method requires body if it is
14925         not marked abstract or extern).
14926
14927         * expression.cs (TypeOf::Emit): Implement.
14928
14929         * typemanager.cs: runtime_handle_type, new global type.
14930
14931         * class.cs (Property::Emit): Generate code for properties.
14932
14933 2001-10-02  Ravi Pratap  <ravi@ximian.com>
14934
14935         * expression.cs (Unary::ResolveOperator): Find operators on base type
14936         too - we now conform exactly to the spec.
14937
14938         (Binary::ResolveOperator): Same here.
14939
14940         * class.cs (Operator::Define): Fix minor quirk in the tests.
14941
14942         * ../errors/cs0215.cs : Added.
14943
14944         * ../errors/cs0556.cs : Added.
14945
14946         * ../errors/cs0555.cs : Added.
14947
14948 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14949
14950         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
14951         single integer which is really efficient
14952
14953 2001-10-01  Ravi Pratap  <ravi@ximian.com>
14954
14955         *  expression.cs (Expression::ImplicitUserConversion): Use location
14956         even in the case when we are examining True operators.
14957  
14958         * class.cs (Operator::Define): Perform extensive checks to conform
14959         with the rules for operator overloading in the spec.
14960
14961         * expression.cs (Expression::ImplicitReferenceConversion): Implement
14962         some of the other conversions mentioned in the spec.
14963
14964         * typemanager.cs (array_type): New static member for the System.Array built-in
14965         type.
14966
14967         (cloneable_interface): For System.ICloneable interface.
14968
14969         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
14970         we start resolving the tree and populating types.
14971
14972         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
14973  
14974 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14975
14976         * expression.cs (Expression::ExprClassFromMemberInfo,
14977         Expression::Literalize): Create literal expressions from
14978         FieldInfos which are literals.
14979
14980         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
14981         type casts, because they were wrong.  The test suite in tests
14982         caught these ones.
14983
14984         (ImplicitNumericConversion): ushort to ulong requires a widening
14985         cast. 
14986
14987         Int32 constant to long requires widening cast as well.
14988
14989         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
14990         for integers because the type on the stack is not i4.
14991
14992 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
14993
14994         * expression.cs (report118): require location argument. 
14995
14996         * parameter.cs: Do not dereference potential null value.
14997
14998         * class.cs: Catch methods that lack the `new' keyword when
14999         overriding a name.  Report warnings when `new' is used without
15000         anything being there to override.
15001
15002         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15003
15004         * class.cs: Only add constructor to hashtable if it is non-null
15005         (as now constructors can fail on define).
15006
15007         (TypeManager, Class, Struct): Take location arguments.
15008
15009         Catch field instance initialization in structs as errors.
15010
15011         accepting_filter: a new filter for FindMembers that is static so
15012         that we dont create an instance per invocation.
15013
15014         (Constructor::Define): Catch errors where a struct constructor is
15015         parameterless 
15016
15017         * cs-parser.jay: Pass location information for various new
15018         constructs. 
15019
15020         * delegate.cs (Delegate): take a location argument.
15021
15022         * driver.cs: Do not call EmitCode if there were problesm in the
15023         Definition of the types, as many Builders wont be there. 
15024
15025         * decl.cs (Decl::Decl): Require a location argument.
15026
15027         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15028         into integers, and find the most appropiate integer for it.
15029
15030         * literal.cs: Implement ULongLiteral.
15031
15032         * rootcontext.cs: Provide better information about the location of
15033         failure when CreateType fails.
15034
15035 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15036
15037         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15038         as well.
15039
15040         * expression.cs (Binary::CheckShiftArguments): Add missing type
15041         computation.
15042         (Binary::ResolveOperator): Add type to the logical and and logical
15043         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15044         before.
15045
15046         (Binary::DoNumericPromotions): In the case where either argument
15047         is ulong (and most signed types combined with ulong cause an
15048         error) perform implicit integer constant conversions as well.
15049
15050 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15051
15052         * expression.cs (UserImplicitCast): Method should always be
15053         non-null. 
15054         (Invocation::BetterConversion): Simplified test for IntLiteral.
15055
15056         (Expression::ImplicitNumericConversion): Split this routine out.
15057         Put the code that performs implicit constant integer conversions
15058         here. 
15059
15060         (Expression::Resolve): Become a wrapper around DoResolve so we can
15061         check eclass and type being set after resolve.
15062
15063         (Invocation::Badness): Remove this dead function
15064
15065         (Binary::ResolveOperator): Do not compute the expensive argumnets
15066         unless we have a union for it.
15067
15068         (Probe::Emit): Is needs to do an isinst and then
15069         compare against null.
15070
15071         (::CanConvert): Added Location argument.  If the Location argument
15072         is null (Location.Null), then we do not report errors.  This is
15073         used by the `probe' mechanism of the Explicit conversion.  We do
15074         not want to generate an error for something that the user
15075         explicitly requested to be casted.  But the pipeline for an
15076         explicit cast first tests for potential implicit casts.
15077
15078         So for now, if the Location is null, it means `Probe only' to
15079         avoid adding another argument.   Might have to revise this
15080         strategy later.
15081
15082         (ClassCast): New class used to type cast objects into arbitrary
15083         classes (used in Explicit Reference Conversions).
15084
15085         Implement `as' as well.
15086
15087         Reverted all the patches from Ravi below: they were broken:
15088
15089                 * The use of `level' as a mechanism to stop recursive
15090                   invocations is wrong.  That was there just to catch the
15091                   bug with a strack trace but not as a way of addressing
15092                   the problem.
15093
15094                   To fix the problem we have to *understand* what is going
15095                   on and the interactions and come up with a plan, not
15096                   just get things going.
15097
15098                 * The use of the type conversion cache that I proposed
15099                   last night had an open topic: How does this work across
15100                   protection domains.  A user defined conversion might not
15101                   be public in the location where we are applying the
15102                   conversion, a different conversion might be selected
15103                   (ie, private A->B (better) but public B->A (worse),
15104                   inside A, A->B applies, but outside it, B->A will
15105                   apply).
15106
15107                 * On top of that (ie, even if the above is solved),
15108                   conversions in a cache need to be abstract.  Ie, `To
15109                   convert from an Int to a Short use an OpcodeCast', not
15110                   `To convert from an Int to a Short use the OpcodeCast on
15111                   the variable 5' (which is what this patch was doing).
15112
15113 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15114
15115         * expression.cs (Invocation::ConversionExists): Re-write to use
15116         the conversion cache
15117
15118         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
15119         cache all conversions done, not just user-defined ones.
15120
15121         (Invocation::BetterConversion): The real culprit. Use ConversionExists
15122         to determine if a conversion exists instead of acutually trying to 
15123         perform the conversion. It's faster too.
15124
15125         (Expression::ConvertExplicit): Modify to use ConversionExists to check
15126         and only then attempt the implicit conversion.
15127
15128 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15129
15130         * expression.cs (ConvertImplicit): Use a cache for conversions
15131         already found. Check level of recursion and bail out if necessary.
15132
15133 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15134
15135         * typemanager.cs (string_concat_string_string, string_concat_object_object):
15136         Export standard methods that we expect for string operations.
15137
15138         * statement.cs (Block::UsageWarning): Track usage of variables and
15139         report the errors for not used variables.
15140
15141         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
15142         operator. 
15143
15144 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15145
15146         * codegen.cs: remove unnneded code 
15147
15148         * expression.cs: Removed BuiltinTypeAccess class
15149
15150         Fix the order in which implicit conversions are
15151         done.  
15152
15153         The previous fixed dropped support for boxed conversions (adding a
15154         test to the test suite now)
15155
15156         (UserImplicitCast::CanConvert): Remove test for source being null,
15157         that code is broken.  We should not feed a null to begin with, if
15158         we do, then we should track the bug where the problem originates
15159         and not try to cover it up here.
15160
15161         Return a resolved expression of type UserImplicitCast on success
15162         rather than true/false.  Ravi: this is what I was talking about,
15163         the pattern is to use a static method as a "constructor" for
15164         objects. 
15165
15166         Also, do not create arguments until the very last minute,
15167         otherwise we always create the arguments even for lookups that
15168         will never be performed. 
15169
15170         (UserImplicitCast::Resolve): Eliminate, objects of type
15171         UserImplicitCast are born in a fully resolved state. 
15172
15173         * typemanager.cs (InitCoreTypes): Init also value_type
15174         (System.ValueType). 
15175
15176         * expression.cs (Cast::Resolve): First resolve the child expression.
15177
15178         (LValue): Add new method AddressOf to be used by
15179         the `&' operator.  
15180
15181         Change the argument of Store to take an EmitContext instead of an
15182         ILGenerator, because things like FieldExpr need to be able to call
15183         their children expression to generate the instance code. 
15184
15185         (Expression::Error, Expression::Warning): Sugar functions for
15186         reporting errors.
15187
15188         (Expression::MemberLookup): Accept a TypeContainer instead of a
15189         Report as the first argument.
15190
15191         (Expression::ResolvePrimary): Killed.  I still want to improve
15192         this as currently the code is just not right.
15193
15194         (Expression::ResolveMemberAccess): Simplify, but it is still
15195         wrong. 
15196
15197         (Unary::Resolve): Catch errors in AddressOf operators.
15198
15199         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
15200         index to a byte for the short-version, or the compiler will choose
15201         the wrong Emit call, which generates the wrong data.
15202
15203         (ParameterReference::Emit, ::Store): same.
15204
15205         (FieldExpr::AddressOf): Implement.
15206
15207         * typemanager.cs: TypeManager: made public variable instead of
15208         property.
15209
15210         * driver.cs: document --fatal.
15211
15212         * report.cs (ErrorMessage, WarningMessage): new names for the old
15213         Error and Warning classes.
15214
15215         * cs-parser.jay (member_access): Turn built-in access to types
15216         into a normal simplename
15217
15218 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15219
15220         * expression.cs (Invocation::BetterConversion): Fix to cope
15221         with q being null, since this was introducing a bug.
15222
15223         * expression.cs (ConvertImplicit): Do built-in conversions first.
15224
15225 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15226
15227         * expression.cs (UserImplicitCast::Resolve): Fix bug.
15228
15229 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15230
15231         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
15232         I had introduced long ago (what's new ?).
15233
15234         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
15235         the work of all the checking. 
15236         (ConvertImplicit): Call CanConvert and only then create object if necessary.
15237         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
15238
15239         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
15240         that is the right way. 
15241
15242         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
15243         overloading resolution. Use everywhere instead of cutting and pasting code.
15244
15245         (Binary::ResolveOperator): Use MakeUnionSet.
15246
15247         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
15248         we have to convert to bool types. Not complete yet.
15249
15250 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15251
15252         * typemanager.cs (TypeManager::CSharpName): support ushort.
15253
15254         * expression.cs (Expression::TryImplicitIntConversion): Attempts
15255         to provide an expression that performsn an implicit constant int
15256         conversion (section 6.1.6).
15257         (Expression::ConvertImplicitRequired): Reworked to include
15258         implicit constant expression conversions.
15259
15260         (Expression::ConvertNumericExplicit): Finished.
15261
15262         (Invocation::Emit): If InstanceExpression is null, then it means
15263         that we perform a call on this.
15264
15265 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15266
15267         * expression.cs (Unary::Emit): Remove some dead code.
15268         (Probe): Implement Resolve and Emit for `is'.
15269         (Expression::ConvertImplicitRequired): Attempt to do constant
15270         expression conversions here.  Maybe should be moved to
15271         ConvertImplicit, but I am not sure.
15272         (Expression::ImplicitLongConstantConversionPossible,
15273         Expression::ImplicitIntConstantConversionPossible): New functions
15274         that tell whether is it possible to apply an implicit constant
15275         expression conversion.
15276
15277         (ConvertNumericExplicit): Started work on explicit numeric
15278         conversions.
15279
15280         * cs-parser.jay: Update operator constants.
15281
15282         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
15283         (Parameters::GetSignature): Hook up VerifyArgs here.
15284         (Parameters::VerifyArgs): Verifies that no two arguments have the
15285         same name. 
15286
15287         * class.cs (Operator): Update the operator names to reflect the
15288         ones that the spec expects (as we are just stringizing the
15289         operator names).
15290
15291         * expression.cs (Unary::ResolveOperator): Fix bug: Use
15292         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
15293         previous usage did only work for our methods.
15294         (Expression::ConvertImplicit): Handle decimal implicit numeric
15295         conversions as well.
15296         (Expression::InternalTypeConstructor): Used to invoke constructors
15297         on internal types for default promotions.
15298
15299         (Unary::Emit): Implement special handling for the pre/post
15300         increment/decrement for overloaded operators, as they need to have
15301         the same semantics as the other operators.
15302
15303         (Binary::ResolveOperator): ditto.
15304         (Invocation::ConversionExists): ditto.
15305         (UserImplicitCast::Resolve): ditto.
15306
15307 2001-09-26  Ravi Pratap  <ravi@ximian.com>
15308
15309         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
15310         operator, return after emitting body. Regression tests pass again !
15311
15312         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
15313         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
15314         (Invocation::OverloadResolve): Ditto.
15315         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
15316
15317         * everywhere : update calls to the above methods accordingly.
15318
15319 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15320
15321         * assign.cs (Assign): Make it inherit from ExpressionStatement.
15322
15323         * expression.cs (ExpressionStatement): New base class used for
15324         expressions that can appear in statements, so that we can provide
15325         an alternate path to generate expression that do not leave a value
15326         on the stack.
15327
15328         (Expression::Emit, and all the derivatives): We no longer return
15329         whether a value is left on the stack or not.  Every expression
15330         after being emitted leaves a single value on the stack.
15331
15332         * codegen.cs (EmitContext::EmitStatementExpression): Use the
15333         facilties of ExpressionStatement if possible.
15334
15335         * cs-parser.jay: Update statement_expression.
15336
15337 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
15338
15339         * driver.cs: Change the wording of message
15340
15341 2001-09-25  Ravi Pratap  <ravi@ximian.com>
15342
15343         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
15344         the type of the expression to the return type of the method if
15345         we have an overloaded operator match ! The regression tests pass again !
15346         (Unary::ResolveOperator): Ditto.
15347
15348         * expression.cs (Invocation::ConversionExists): Correct the member lookup
15349         to find "op_Implicit", not "implicit" ;-)
15350         (UserImplicitCast): New class to take care of user-defined implicit conversions.
15351         (ConvertImplicit, ForceConversion): Take TypeContainer argument
15352
15353         * everywhere : Correct calls to the above accordingly.
15354
15355         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
15356         (ConvertImplicit): Do user-defined conversion if it exists.
15357
15358 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
15359
15360         * assign.cs: track location.
15361         (Resolve): Use implicit conversions on assignment.
15362
15363         * literal.cs: Oops.  Not good, Emit of short access values should
15364         pass (Bytes) or the wrong argument will be selected.
15365
15366         * expression.cs (Unary::Emit): Emit code for -expr.
15367
15368         (Unary::ResolveOperator): Handle `Substract' for non-constants
15369         (substract from zero from the non-constants).
15370         Deal with Doubles as well. 
15371
15372         (Expression::ConvertImplicitRequired): New routine that reports an
15373         error if no implicit conversion exists. 
15374
15375         (Invocation::OverloadResolve): Store the converted implicit
15376         expressions if we make them
15377
15378 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15379
15380         * class.cs (ConstructorInitializer): Take a Location argument.
15381         (ConstructorBaseInitializer): Same here.
15382         (ConstructorThisInitializer): Same here.
15383
15384         * cs-parser.jay : Update all calls accordingly.
15385
15386         * expression.cs (Unary, Binary, New): Take location argument.
15387         Update accordingly everywhere.
15388
15389         * cs-parser.jay : Update all calls to the above to take a location
15390         argument.
15391
15392         * class.cs : Ditto.
15393
15394 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15395
15396         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
15397         (Invocation::BetterConversion): Same here
15398         (Invocation::ConversionExists): Ditto.
15399
15400         (Invocation::ConversionExists): Implement.
15401
15402 2001-09-22  Ravi Pratap  <ravi@ximian.com>
15403
15404         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
15405         Also take an additional TypeContainer argument.
15406
15407         * All over : Pass in TypeContainer as argument to OverloadResolve.
15408
15409         * typemanager.cs (CSharpName): Update to check for the string type and return
15410         that too.
15411
15412         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
15413         a given method.
15414
15415 2001-09-21  Ravi Pratap  <ravi@ximian.com>
15416
15417         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
15418         (Invocation::BetterFunction): Implement.
15419         (Invocation::BetterConversion): Implement.
15420         (Invocation::ConversionExists): Skeleton, no implementation yet.
15421
15422         Okay, things work fine !
15423
15424 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
15425
15426         * typemanager.cs: declare and load enum_type, delegate_type and
15427         void_type. 
15428
15429         * expression.cs (Expression::Emit): Now emit returns a value that
15430         tells whether a value is left on the stack or not.  This strategy
15431         might be reveted tomorrow with a mechanism that would address
15432         multiple assignments.
15433         (Expression::report118): Utility routine to report mismatches on
15434         the ExprClass.
15435
15436         (Unary::Report23): Report impossible type/operator combination
15437         utility function.
15438
15439         (Unary::IsIncrementableNumber): Whether the type can be
15440         incremented or decremented with add.
15441         (Unary::ResolveOperator): Also allow enumerations to be bitwise
15442         complemented. 
15443         (Unary::ResolveOperator): Implement ++, !, ~,
15444
15445         (Invocation::Emit): Deal with new Emit convetion.
15446
15447         * All Expression derivatives: Updated their Emit method to return
15448         whether they leave values on the stack or not.
15449
15450         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
15451         stack for expressions that are statements. 
15452
15453 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15454
15455         * expression.cs (LValue): New interface.  Must be implemented by
15456         LValue objects.
15457         (LocalVariableReference, ParameterReference, FieldExpr): Implement
15458         LValue interface.
15459
15460         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
15461         interface for generating code, simplifies the code.
15462
15463 2001-09-20  Ravi Pratap  <ravi@ximian.com>
15464
15465         * expression.cs (everywhere): Comment out return statements in ::Resolve
15466         methods to avoid the warnings.
15467
15468 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15469
15470         * driver.cs (parse): Report error 2001 if we can not open the
15471         source file.
15472
15473         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
15474         not resolve it.
15475
15476         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
15477         object. 
15478
15479         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
15480         otherwise nested blocks end up with the same index.
15481
15482         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
15483
15484         * expression.cs:  Instead of having FIXMEs in the Resolve
15485         functions, throw exceptions so it is obvious that we are facing a
15486         bug. 
15487
15488         * cs-parser.jay (invocation_expression): Pass Location information.
15489
15490         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
15491         Use a basename for those routines because .NET does not like paths
15492         on them. 
15493
15494         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
15495         already defined.
15496
15497 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
15498
15499         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
15500         are loading the correct data types (throws an exception if not).
15501         (TypeManager::InitCoreTypes): Use CoreLookupType
15502
15503         * expression.cs (Unary::ResolveOperator): return the child
15504         expression for expressions which are just +expr.
15505         (Unary::ResolveOperator): Return negative literals for -LITERAL
15506         expressions (otherwise they are Unary {Literal}).
15507         (Invocation::Badness): Take into account `Implicit constant
15508         expression conversions'.
15509
15510         * literal.cs (LongLiteral): Implement long literal class.
15511         (IntLiteral): export the `Value' of the intliteral. 
15512
15513 2001-09-19  Ravi Pratap  <ravi@ximian.com>
15514
15515         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
15516
15517         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
15518         instead of 'Operator'
15519
15520         * expression.cs (Binary::ResolveOperator): Update accordingly.
15521         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
15522         and 'Minus'
15523
15524         * cs-parser.jay (unary_expression): Update to use the new names.
15525
15526         * gen-treedump.cs (GetUnary): Same here.
15527
15528         * expression.cs (Unary::Resolve): Implement.
15529         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
15530         operators are found instead of making noise ;-)
15531         (Unary::ResolveOperator): New method to do precisely the same thing which
15532         Binary::ResolveOperator does for Binary expressions.
15533         (Unary.method, .Arguments): Add.
15534         (Unary::OperName): Implement.   
15535         (Unary::ForceConversion): Copy and Paste !
15536
15537         * class.cs (Operator::Define): Fix a small bug for the case when we have 
15538         a unary operator.
15539
15540         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
15541         for the inbuilt operators. Only overloading works for now ;-)
15542
15543 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
15544
15545         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
15546         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
15547
15548         * expression.cs (This::Emit): Implement. 
15549         (This::Resolve): Implement.
15550         (TypeOf:Resolve): Implement.
15551         (Expression::ResolveSimpleName): Add an implicit this to instance
15552         field references. 
15553         (MemberAccess::Resolve): Deal with Parameters and Fields. 
15554         Bind instance variable to Field expressions.
15555         (FieldExpr::Instance): New field used to track the expression that
15556         represents the object instance.
15557         (FieldExpr::Resolve): Track potential errors from MemberLookup not
15558         binding 
15559         (FieldExpr::Emit): Implement.
15560
15561         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
15562         the last instruction contains a return opcode to avoid generating
15563         the last `ret' instruction (this generates correct code, and it is
15564         nice to pass the peverify output).
15565
15566         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
15567         initializer for static and instance variables.
15568         (Constructor::Emit): Allow initializer to be null in the case of
15569         static constructors.  Only emit initializer for instance
15570         constructors. 
15571
15572         (TypeContainer::FindMembers): Return a null array if there are no
15573         matches.
15574
15575         Also fix the code for the MemberTypes.Method branch, as it was not
15576         scanning that for operators (or tried to access null variables before).
15577
15578         * assign.cs (Assign::Emit): Handle instance and static fields. 
15579
15580         * TODO: Updated.
15581
15582         * driver.cs: Stop compilation if there are parse errors.
15583
15584         * cs-parser.jay (constructor_declaration): Provide default base
15585         initializer for non-static constructors.
15586         (constructor_declarator): Do not provide a default base
15587         initializers if none was specified.
15588         Catch the fact that constructors should not have parameters.
15589
15590         * class.cs: Do not emit parent class initializers for static
15591         constructors, that should be flagged as an error.
15592
15593 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15594
15595         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
15596         Move back code into TypeContainer::Populate.
15597
15598 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15599
15600         * class.cs (TypeContainer::AddConstructor): Fix the check to
15601         compare against Name, not Basename. 
15602         (Operator::OpType): Change Plus and Minus to Add and Subtract.
15603
15604         * cs-parser.jay : Update accordingly.
15605
15606         * class.cs (TypeContainer::FindMembers): For the case where we are searching
15607         for methods, don't forget to look into the operators too.
15608         (RegisterMethodBuilder): Helper method to take care of this for
15609         methods, constructors and operators.
15610         (Operator::Define): Completely revamp.
15611         (Operator.OperatorMethod, MethodName): New fields.
15612         (TypeContainer::Populate): Move the registering of builders into
15613         RegisterMethodBuilder.
15614         (Operator::Emit): Re-write.
15615
15616         * expression.cs (Binary::Emit): Comment out code path to emit method
15617         invocation stuff for the case when we have a user defined operator. I am
15618         just not able to get it right !
15619
15620 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15621
15622         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
15623         argument. 
15624
15625         (Expression::MemberLookup): Provide a version that allows to
15626         specify the MemberTypes and BindingFlags. 
15627
15628         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
15629         so it was not fetching variable information from outer blocks.
15630
15631         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
15632         Beforefieldinit as it was buggy.
15633
15634         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
15635         that Ravi put here.  
15636
15637         * class.cs (Constructor::Emit): Only emit if block is not null.
15638         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
15639         deal with this by semantically definining it as if the user had
15640         done it.
15641
15642         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
15643         constructors as we now "emit" them at a higher level.
15644
15645         (TypeContainer::DefineDefaultConstructor): Used to define the
15646         default constructors if none was provided.
15647
15648         (ConstructorInitializer): Add methods Resolve and Emit. 
15649
15650         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
15651
15652 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15653
15654         * class.cs (TypeContainer::EmitDefaultConstructor): Register
15655         the default constructor builder with our hashtable for methodbuilders
15656         to methodcores.
15657
15658         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
15659         and argument_count is 0 in which case we have a match.
15660         (Binary::ResolveOperator): More null checking and miscellaneous coding
15661         style cleanup.
15662
15663 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15664
15665         * rootcontext.cs (IsNameSpace): Compare against null.
15666
15667         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
15668
15669         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
15670         and Unary::Operator.
15671
15672         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
15673         accordingly.
15674
15675         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
15676         we have overloaded operators.
15677         (Binary::ResolveOperator): Implement the part which does the operator overload
15678         resolution.
15679
15680         * class.cs (Operator::Emit): Implement.
15681         (TypeContainer::Emit): Emit the operators we have too.
15682
15683         * expression.cs (Binary::Emit): Update to emit the appropriate code for
15684         the case when we have a user-defined operator.
15685
15686 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15687
15688         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
15689
15690 2001-09-16  Ravi Pratap  <ravi@ximian.com>
15691
15692         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
15693         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
15694         (Constructor::Emit): Implement.
15695         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
15696         if we have no work to do. 
15697         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
15698         Emit method.
15699
15700         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
15701         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
15702
15703         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
15704         of parent.parent.
15705
15706 2001-09-15  Ravi Pratap  <ravi@ximian.com>
15707
15708         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
15709         in the source.
15710         (Tree::RecordNamespace): Method to do what the name says ;-)
15711         (Tree::Namespaces): Property to get at the namespaces hashtable.
15712
15713         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
15714         keep track.
15715
15716         * rootcontext.cs (IsNamespace): Fixed it :-)
15717
15718 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15719
15720         * class.cs (TypeContainer::FindMembers): Add support for
15721         constructors. 
15722         (MethodCore): New class that encapsulates both the shared aspects
15723         of a Constructor and a Method.  
15724         (Method, Constructor): Factored pieces into MethodCore.
15725
15726         * driver.cs: Added --fatal which makes errors throw exceptions.
15727         Load System assembly as well as part of the standard library.
15728
15729         * report.cs: Allow throwing exceptions on errors for debugging.
15730
15731         * modifiers.cs: Do not use `parent', instead use the real type
15732         container to evaluate permission settings.
15733
15734         * class.cs: Put Ravi's patch back in.  He is right, and we will
15735         have to cope with the
15736
15737 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15738
15739         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
15740         FamORAssem, not FamANDAssem.
15741
15742 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15743
15744         * driver.cs: Added --parse option that only parses its input files
15745         and terminates.
15746
15747         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
15748         incorrect.  IsTopLevel is not used to tell whether an object is
15749         root_types or not (that can be achieved by testing this ==
15750         root_types).  But to see if this is a top-level *class* (not
15751         necessarly our "toplevel" container). 
15752
15753 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15754
15755         * enum.cs (Enum::Define): Modify to call the Lookup method on the
15756         parent instead of a direct call to GetType.
15757
15758 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15759
15760         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
15761         Modifiers.TypeAttr. This should just be a call to that method.
15762
15763         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
15764         object so that we can determine if we are top-level or not.
15765
15766         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
15767         TypeContainer too.
15768
15769         * enum.cs (Enum::Define): Ditto.
15770
15771         * modifiers.cs (FieldAttr): Re-write.
15772
15773         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
15774         (TypeContainer::HaveStaticConstructor): New property to provide access
15775         to precisely that info.
15776
15777         * modifiers.cs (MethodAttr): Re-write.
15778         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
15779
15780         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
15781         of top-level types as claimed.
15782
15783 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15784
15785         * expression.cs (MemberLookup): Fruitless attempt to lookup
15786         constructors.  Maybe I need to emit default constructors?  That
15787         might be it (currently .NET emits this for me automatically).
15788         (Invocation::OverloadResolve): Cope with Arguments == null.
15789         (Invocation::EmitArguments): new function, shared by the new
15790         constructor and us.
15791         (Invocation::Emit): Handle static and instance methods.  Emit
15792         proper call instruction for virtual or non-virtual invocations.
15793         (New::Emit): Implement.
15794         (New::Resolve): Implement.
15795         (MemberAccess:Resolve): Implement.
15796         (MethodGroupExpr::InstanceExpression): used conforming to the spec
15797         to track instances.
15798         (FieldExpr::Resolve): Set type.
15799
15800         * support.cs: Handle empty arguments.
15801                 
15802         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
15803         SimpleLookup): Auxiliary routines to help parse a qualifier
15804         identifier.  
15805
15806         Update qualifier_identifier rule.
15807
15808         * codegen.cs: Removed debugging messages.
15809
15810         * class.cs: Make this a global thing, this acts just as a "key" to
15811         objects that we might have around.
15812
15813         (Populate): Only initialize method_builders_to_methods once.
15814
15815         * expression.cs (PropertyExpr): Initialize type from the
15816         PropertyType. 
15817
15818         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
15819         Resolve pattern.  Attempt to implicitly convert value to boolean.
15820         Emit code.
15821
15822         * expression.cs: Set the type for the int32/int32 argument case.
15823         (Binary::ResolveOperator): Set the return type to boolean for
15824         comparission operators
15825
15826         * typemanager.cs: Remove debugging print code.
15827
15828         (Invocation::Resolve): resolve type.
15829
15830         * class.cs: Allocate a MemberInfo of the correct size, as the code
15831         elsewhere depends on the test to reflect the correct contents.
15832
15833         (Method::) Keep track of parameters, due to System.Reflection holes
15834
15835         (TypeContainer::Populate): Keep track of MethodBuilders to Method
15836         mapping here.
15837
15838         (TypeContainer::FindMembers): Use ArrayList and then copy an array
15839         of the exact size and return that.
15840
15841         (Class::LookupMethodByBuilder): New function that maps
15842         MethodBuilders to its methods.  Required to locate the information
15843         on methods because System.Reflection bit us again.
15844
15845         * support.cs: New file, contains an interface ParameterData and
15846         two implementations: ReflectionParameters and InternalParameters
15847         used to access Parameter information.  We will need to grow this
15848         as required.
15849
15850         * expression.cs (Invocation::GetParameterData): implement a cache
15851         and a wrapper around the ParameterData creation for methods. 
15852         (Invocation::OverloadResolve): Use new code.
15853
15854 2001-09-13  Ravi Pratap  <ravi@ximian.com>
15855
15856         * class.cs (TypeContainer::EmitField): Remove and move into 
15857         (Field::Define): here and modify accordingly.
15858         (Field.FieldBuilder): New member.
15859         (TypeContainer::Populate): Update accordingly.
15860         (TypeContainer::FindMembers): Implement.
15861
15862 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15863
15864         * statement.cs: (VariableInfo::VariableType): New field to be
15865         initialized with the full type once it is resolved. 
15866
15867 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
15868
15869         * parameter.cs (GetParameterInfo): Use a type cache to compute
15870         things only once, and to reuse this information
15871
15872         * expression.cs (LocalVariableReference::Emit): Implement.
15873         (OpcodeCast::Emit): fix.
15874
15875         (ParameterReference::Resolve): Implement.
15876         (ParameterReference::Emit): Implement.
15877
15878         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
15879         that are expressions need to stay as Expressions.
15880
15881         * typemanager.cs (CSharpName): Returns the C# name of a type if
15882         possible. 
15883
15884         * expression.cs (Expression::ConvertImplicit): New function that
15885         implements implicit type conversions.
15886
15887         (Expression::ImplicitReferenceConversion): Implements implicit
15888         reference conversions.
15889
15890         (EmptyCast): New type for transparent casts.
15891
15892         (OpcodeCast): New type for casts of types that are performed with
15893         a sequence of bytecodes.
15894
15895         (BoxedCast): New type used for casting value types into reference
15896         types.  Emits a box opcode.
15897
15898         (Binary::DoNumericPromotions): Implements numeric promotions of
15899         and computation of the Binary::Type.
15900
15901         (Binary::EmitBranchable): Optimization.
15902
15903         (Binary::Emit): Implement code emission for expressions.
15904
15905         * typemanager.cs (TypeManager): Added two new core types: sbyte
15906         and byte.
15907
15908 2001-09-12  Ravi Pratap  <ravi@ximian.com>
15909
15910         * class.cs (TypeContainer::FindMembers): Method which does exactly
15911         what Type.FindMembers does, only we don't have to use reflection. No
15912         implementation yet.
15913
15914         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
15915         typecontainer objects as we need to get at them.
15916         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
15917
15918         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
15919         typecontainer object.
15920
15921         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
15922         of just a Report object.
15923
15924 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15925
15926         * class.cs (Event::Define): Go back to using the prefixes "add_" and
15927         "remove_"
15928         (TypeContainer::Populate): Now define the delegates of the type too.
15929         (TypeContainer.Delegates): Property to access the list of delegates defined
15930         in the type.
15931
15932         * delegates.cs (Delegate::Define): Implement partially.
15933
15934         * modifiers.cs (TypeAttr): Handle more flags.
15935
15936 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15937
15938         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
15939         and not <=
15940         (Operator::Define): Re-write logic to get types by using the LookupType method
15941         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
15942         (Indexer::Define): Ditto.
15943         (Event::Define): Ditto.
15944         (Property::Define): Ditto.
15945
15946 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15947
15948         * class.cs (TypeContainer::Populate): Now define operators too. 
15949         (TypeContainer.Operators): New property to access the list of operators
15950         in a type.
15951         (Operator.OperatorMethodBuilder): New member to hold the method builder
15952         for the operator we are defining.
15953         (Operator::Define): Implement.
15954
15955 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15956
15957         * class.cs (Event::Define): Make the prefixes of the accessor methods
15958         addOn_ and removeOn_ 
15959
15960         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
15961         of the location being passed in too. Ideally, this should go later since all
15962         error reporting should be done through the Report object.
15963
15964         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
15965         (Populate): Iterate thru the indexers we have and define them too.
15966         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
15967         for the get and set accessors.
15968         (Indexer::Define): Implement.
15969
15970 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
15971
15972         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
15973         my previous implementation, did not work.
15974
15975         * typemanager.cs: Add a couple of missing types (the longs).
15976
15977         * literal.cs: Use TypeManager.bool_type instead of getting it.
15978
15979         * expression.cs (EventExpr): New kind of expressions.
15980         (Expressio::ExprClassFromMemberInfo): finish
15981
15982 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
15983
15984         * assign.cs: Emit stores to static fields differently.
15985
15986 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15987
15988         * Merge in changes and adjust code to tackle conflicts. Backed out my
15989         code in Assign::Resolve ;-) 
15990
15991 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15992
15993         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
15994         instead Report.Error and also pass in the location.
15995         (CSharpParser::Lexer): New readonly property to return the reference
15996         to the Tokenizer object.
15997         (declare_local_variables): Use Report.Error with location instead of plain 
15998         old error.
15999         (CheckDef): Ditto.
16000
16001         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16002         (Operator.CheckBinaryOperator): Ditto.
16003
16004         * cs-parser.jay (operator_declarator): Update accordingly.
16005
16006         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16007         (CheckBinaryOperator): Same here.
16008
16009         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16010         on the name without any prefixes of namespace names etc. This is because we
16011         already might have something already fully qualified like 
16012         'System.Console.WriteLine'
16013
16014         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16015
16016 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16017
16018         * cs-tokenizer.cs (location): Return a string which also contains
16019         the file name.
16020
16021         * expression.cs (ElementAccess): New class for expressions of the
16022         type 'element access.'
16023         (BaseAccess): New class for expressions of the type 'base access.'
16024         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16025         respectively.
16026
16027         * cs-parser.jay (element_access): Implement action.
16028         (base_access): Implement actions.
16029         (checked_expression, unchecked_expression): Implement.
16030
16031         * cs-parser.jay (local_variable_type): Correct and implement.
16032         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16033
16034         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16035
16036         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16037         name and the specifiers.
16038
16039         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16040
16041         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16042         making them all public ;-)
16043
16044         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16045         class anyways.
16046
16047 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16048
16049         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16050         PropertyExprs.
16051         (FieldExpr, PropertyExprs): New resolved expressions.
16052         (SimpleName::MemberStaticCheck): Perform static checks for access
16053         to non-static fields on static methods. Maybe this should be
16054         generalized for MemberAccesses. 
16055         (SimpleName::ResolveSimpleName): More work on simple name
16056         resolution. 
16057
16058         * cs-parser.jay (primary_expression/qualified_identifier): track
16059         the parameter index.
16060
16061         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16062         (EmitContext::EmitBoolExpression): Chain to expression generation
16063         instead of temporary hack.
16064         (::EmitStatementExpression): Put generic expression code generation.
16065
16066         * assign.cs (Assign::Emit): Implement variable assignments to
16067         local variables, parameters and fields.
16068
16069 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16070
16071         * statement.cs (Block::GetVariableInfo): New method, returns the
16072         VariableInfo for a variable name in a block.
16073         (Block::GetVariableType): Implement in terms of GetVariableInfo
16074
16075         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16076         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16077
16078 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16079
16080         * cs-parser.jay (operator_declaration): Continue on my quest : update
16081         to take attributes argument.
16082         (event_declaration): Ditto.
16083         (enum_declaration): Ditto.
16084         (indexer_declaration): Ditto.
16085
16086         * class.cs (Operator::Operator): Update constructor accordingly.
16087         (Event::Event): Ditto.
16088
16089         * delegate.cs (Delegate::Delegate): Same here.
16090
16091         * enum.cs (Enum::Enum): Same here.
16092
16093 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16094
16095         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16096
16097         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16098
16099         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16100         being passed around as an arraylist.
16101         (Attributes::AddAttribute): Method to add attribute sections.
16102
16103         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16104         (struct_declaration): Update accordingly.
16105         (constant_declaration): Update.
16106         (field_declaration): Update.
16107         (method_header): Update.
16108         (fixed_parameter): Update.
16109         (parameter_array): Ditto.
16110         (property_declaration): Ditto.
16111         (destructor_declaration): Ditto.
16112
16113         * class.cs (Struct::Struct): Update constructors accordingly.
16114         (Class::Class): Ditto.
16115         (Field::Field): Ditto.
16116         (Method::Method): Ditto.
16117         (Property::Property): Ditto.
16118         (TypeContainer::OptAttribute): update property's return type.
16119
16120         * interface.cs (Interface.opt_attributes): New member.
16121         (Interface::Interface): Update to take the extra Attributes argument.
16122
16123         * parameter.cs (Parameter::Parameter): Ditto.
16124
16125         * constant.cs (Constant::Constant): Ditto.
16126
16127         * interface.cs (InterfaceMemberBase): New OptAttributes field.
16128         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
16129         the attributes as a parameter.
16130         (InterfaceProperty): Update constructor call.
16131         (InterfaceEvent): Ditto.
16132         (InterfaceMethod): Ditto.
16133         (InterfaceIndexer): Ditto.
16134
16135         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
16136         pass the attributes too.
16137         (interface_event_declaration): Ditto.
16138         (interface_property_declaration): Ditto.
16139         (interface_method_declaration): Ditto.
16140         (interface_declaration): Ditto.
16141
16142 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
16143
16144         * class.cs (Method::Define): Track the "static Main" definition to
16145         create an entry point. 
16146
16147         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
16148         EntryPoint if we find it. 
16149
16150         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
16151         (EmitContext::ig): Make this variable public.
16152
16153         * driver.cs: Make the default output file be the first file name
16154         with the .exe extension.  
16155
16156         Detect empty compilations
16157
16158         Handle various kinds of output targets.  Handle --target and
16159         rename -t to --dumper.
16160
16161         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
16162         methods inherited from Expression return now an Expression.  This
16163         will is used during the tree rewriting as we resolve them during
16164         semantic analysis.
16165
16166         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
16167         the spec.  Missing entirely is the information about
16168         accessability of elements of it.
16169
16170         (Expression::ExprClassFromMemberInfo): New constructor for
16171         Expressions that creates a fully initialized Expression based on
16172         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
16173         a Type.
16174
16175         (Invocation::Resolve): Begin implementing resolution of invocations.
16176
16177         * literal.cs (StringLiteral):  Implement Emit.
16178
16179 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16180
16181         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
16182         member.
16183
16184 2001-09-04  Ravi Pratap  <ravi@ximian.com>
16185
16186         * cs-parser.jay (attribute_arguments): Implement actions.
16187         (attribute): Fix bug in production. Implement action.
16188         (attribute_list): Implement.
16189         (attribute_target): Implement.
16190         (attribute_target_specifier, opt_target_specifier): Implement
16191         (CheckAttributeTarget): New method to check if the attribute target
16192         is valid.
16193         (attribute_section): Implement.
16194         (opt_attributes): Implement.
16195
16196         * attribute.cs : New file to handle attributes.
16197         (Attribute): Class to hold attribute info.
16198
16199         * cs-parser.jay (opt_attribute_target_specifier): Remove production
16200         (attribute_section): Modify production to use 2 different rules to 
16201         achieve the same thing. 1 s/r conflict down !
16202         Clean out commented, useless, non-reducing dimension_separator rules.
16203
16204         * class.cs (TypeContainer.attributes): New member to hold list
16205         of attributes for a type.
16206         (Struct::Struct): Modify to take one more argument, the attribute list.
16207         (Class::Class): Ditto.
16208         (Field::Field): Ditto.
16209         (Method::Method): Ditto.
16210         (Property::Property): Ditto.
16211
16212         * cs-parser.jay (struct_declaration): Update constructor call to
16213         pass in the attributes too.
16214         (class_declaration): Ditto.
16215         (constant_declaration): Ditto.
16216         (field_declaration): Ditto.
16217         (method_header): Ditto.
16218         (fixed_parameter): Ditto.
16219         (parameter_array): Ditto.
16220         (property_declaration): Ditto.
16221
16222         * constant.cs (Constant::Constant): Update constructor similarly.
16223         Use System.Collections.
16224
16225         * parameter.cs (Parameter::Parameter): Update as above.
16226
16227 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16228
16229         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
16230         (TypeContainer.delegates): New member to hold list of delegates.
16231
16232         * cs-parser.jay (delegate_declaration): Implement the action correctly 
16233         this time as I seem to be on crack ;-)
16234
16235 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
16236
16237         * rootcontext.cs (RootContext::IsNamespace): new function, used to
16238         tell whether an identifier represents a namespace.
16239
16240         * expression.cs (NamespaceExpr): A namespace expression, used only
16241         temporarly during expression resolution.
16242         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
16243         utility functions to resolve names on expressions.
16244
16245 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
16246
16247         * codegen.cs: Add hook for StatementExpressions. 
16248
16249         * class.cs: Fix inverted test for static flag in methods.
16250
16251 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16252
16253         * class.cs (Operator::CheckUnaryOperator): Correct error number used
16254         to make it coincide with MS' number.
16255         (Operator::CheckBinaryOperator): Ditto.
16256
16257         * ../errors/errors.txt : Remove error numbers added earlier.
16258
16259         * ../errors/cs1019.cs : Test case for error # 1019
16260
16261         * ../errros/cs1020.cs : Test case for error # 1020
16262
16263         * cs-parser.jay : Clean out commented cruft.
16264         (dimension_separators, dimension_separator): Comment out. Ostensibly not
16265         used anywhere - non-reducing rule.
16266         (namespace_declarations): Non-reducing rule - comment out.
16267
16268         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
16269         with TypeContainer::AddEnum.
16270
16271         * delegate.cs : New file for delegate handling classes.
16272         (Delegate): Class for declaring delegates.
16273
16274         * makefile : Update.
16275
16276         * cs-parser.jay (delegate_declaration): Implement.
16277
16278 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
16279
16280         * class.cs (Event::Define): Implement.
16281         (Event.EventBuilder): New member.
16282
16283         * class.cs (TypeContainer::Populate): Update to define all enums and events
16284         we have.
16285         (Events): New property for the events arraylist we hold. Shouldn't we move to using
16286         readonly fields for all these cases ?
16287
16288 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16289
16290         * class.cs (Property): Revamp to use the convention of making fields readonly.
16291         Accordingly modify code elsewhere.
16292
16293         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
16294         the Define method of the Property class.
16295
16296         * class.cs : Clean up applied patch and update references to variables etc. Fix 
16297         trivial bug.
16298         (TypeContainer::Populate): Update to define all the properties we have. Also
16299         define all enumerations.
16300
16301         * enum.cs (Define): Implement.
16302
16303 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16304
16305         * cs-parser.jay (overloadable_operator): The semantic value is an
16306         enum of the Operator class.
16307         (operator_declarator): Implement actions.
16308         (operator_declaration): Implement.
16309
16310         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
16311         validity of definitions.
16312         (Operator::CheckBinaryOperator): Static method to check for binary operators
16313         (TypeContainer::AddOperator): New method to add an operator to a type.
16314
16315         * cs-parser.jay (indexer_declaration): Added line to actually call the
16316         AddIndexer method so it gets added ;-)
16317
16318         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
16319         already taken care of by the MS compiler ?  
16320
16321 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16322
16323         * class.cs (Operator): New class for operator declarations.
16324         (Operator::OpType): Enum for the various operators.
16325
16326 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16327
16328         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
16329         ostensibly handle this in semantic analysis.
16330
16331         * cs-parser.jay (general_catch_clause): Comment out
16332         (specific_catch_clauses, specific_catch_clause): Ditto.
16333         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
16334         (catch_args, opt_catch_args): New productions.
16335         (catch_clause): Rewrite to use the new productions above
16336         (catch_clauses): Modify accordingly.
16337         (opt_catch_clauses): New production to use in try_statement
16338         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
16339         and re-write the code in the actions to extract the specific and
16340         general catch clauses by being a little smart ;-)
16341
16342         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
16343         Hooray, try and catch statements parse fine !
16344
16345 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16346
16347         * statement.cs (Block::GetVariableType): Fix logic to extract the type
16348         string from the hashtable of variables.
16349
16350         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
16351         I end up making that mistake ;-)
16352         (catch_clauses): Fixed gross error which made Key and Value of the 
16353         DictionaryEntry the same : $1 !!
16354
16355 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16356
16357         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
16358
16359         * cs-parser.jay (event_declaration): Correct to remove the semicolon
16360         when the add and remove accessors are specified. 
16361
16362 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16363
16364         * cs-parser.jay (IndexerDeclaration): New helper class to hold
16365         information about indexer_declarator.
16366         (indexer_declarator): Implement actions.
16367         (parsing_indexer): New local boolean used to keep track of whether
16368         we are parsing indexers or properties. This is necessary because 
16369         implicit_parameters come into picture even for the get accessor in the 
16370         case of an indexer.
16371         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
16372
16373         * class.cs (Indexer): New class for indexer declarations.
16374         (TypeContainer::AddIndexer): New method to add an indexer to a type.
16375         (TypeContainer::indexers): New member to hold list of indexers for the
16376         type.
16377
16378 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16379
16380         * cs-parser.jay (add_accessor_declaration): Implement action.
16381         (remove_accessor_declaration): Implement action.
16382         (event_accessors_declaration): Implement
16383         (variable_declarators): swap statements for first rule - trivial.
16384
16385         * class.cs (Event): New class to hold information about event
16386         declarations.
16387         (TypeContainer::AddEvent): New method to add an event to a type
16388         (TypeContainer::events): New member to hold list of events.
16389
16390         * cs-parser.jay (event_declaration): Implement actions.
16391
16392 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16393
16394         * cs-parser.jay (dim_separators): Implement. Make it a string
16395         concatenating all the commas together, just as they appear.
16396         (opt_dim_separators): Modify accordingly
16397         (rank_specifiers): Update accordingly. Basically do the same
16398         thing - instead, collect the brackets here.
16399         (opt_rank_sepcifiers): Modify accordingly.
16400         (array_type): Modify to actually return the complete type string
16401         instead of ignoring the rank_specifiers.
16402         (expression_list): Implement to collect the expressions
16403         (variable_initializer): Implement. We make it a list of expressions
16404         essentially so that we can handle the array_initializer case neatly too.
16405         (variable_initializer_list): Implement.
16406         (array_initializer): Make it a list of variable_initializers
16407         (opt_array_initializer): Modify accordingly.
16408
16409         * expression.cs (New::NType): Add enumeration to help us
16410         keep track of whether we have an object/delegate creation
16411         or an array creation.
16412         (New:NewType, New::Rank, New::Indices, New::Initializers): New
16413         members to hold data about array creation.
16414         (New:New): Modify to update NewType
16415         (New:New): New Overloaded contructor for the array creation
16416         case.
16417
16418         * cs-parser.jay (array_creation_expression): Implement to call
16419         the overloaded New constructor.
16420
16421 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
16422
16423         * class.cs (TypeContainer::Constructors): Return member
16424         constructors instead of returning null.
16425
16426 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
16427
16428         * typemanager.cs (InitCoreTypes): Initialize the various core
16429         types after we have populated the type manager with the user
16430         defined types (this distinction will be important later while
16431         compiling corlib.dll)
16432
16433         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
16434         on Expression Classification.  Now all expressions have a method
16435         `Resolve' and a method `Emit'.
16436
16437         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
16438         generation from working.     Also add some temporary debugging
16439         code. 
16440
16441 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
16442
16443         * codegen.cs: Lots of code generation pieces.  This is only the
16444         beginning, will continue tomorrow with more touches of polish.  We
16445         handle the fundamentals of if, while, do, for, return.  Others are
16446         trickier and I need to start working on invocations soon.
16447
16448         * gen-treedump.cs: Bug fix, use s.Increment here instead of
16449         s.InitStatement. 
16450
16451         * codegen.cs (EmitContext): New struct, used during code
16452         emission to keep a context.   Most of the code generation will be
16453         here. 
16454
16455         * cs-parser.jay: Add embedded blocks to the list of statements of
16456         this block.  So code generation proceeds in a top down fashion.
16457
16458 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
16459
16460         * statement.cs: Add support for multiple child blocks.
16461
16462 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
16463
16464         * codegen.cs (EmitCode): New function, will emit the code for a
16465         Block of code given a TypeContainer and its ILGenerator. 
16466
16467         * statement.cs (Block): Standard public readonly optimization.
16468         (Block::Block constructors): Link children. 
16469         (Block::Child): Child Linker.
16470         (Block::EmitVariables): Emits IL variable declarations.
16471
16472         * class.cs: Drop support for MethodGroups here, delay until
16473         Semantic Analysis.
16474         (Method::): Applied the same simplification that I did before, and
16475         move from Properties to public readonly fields.
16476         (Method::ParameterTypes): Returns the parameter types for the
16477         function, and implements a cache that will be useful later when I
16478         do error checking and the semantic analysis on the methods is
16479         performed.
16480         (Constructor::GetCallingConvention): Renamed from CallingConvetion
16481         and made a method, optional argument tells whether this is a class
16482         or a structure to apply the `has-this' bit.
16483         (Method::GetCallingConvention): Implement, returns the calling
16484         convention. 
16485         (Method::Define): Defines the type, a second pass is performed
16486         later to populate the methods.
16487
16488         (Constructor::ParameterTypes): implement a cache similar to the
16489         one on Method::ParameterTypes, useful later when we do semantic
16490         analysis. 
16491
16492         (TypeContainer::EmitMethod):  New method.  Emits methods.
16493
16494         * expression.cs: Removed MethodGroup class from here.
16495
16496         * parameter.cs (Parameters::GetCallingConvention): new method.
16497
16498 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
16499
16500         * class.cs (TypeContainer::Populate): Drop RootContext from the
16501         argument. 
16502
16503         (Constructor::CallingConvention): Returns the calling convention.
16504         (Constructor::ParameterTypes): Returns the constructor parameter
16505         types. 
16506
16507         (TypeContainer::AddConstructor): Keep track of default constructor
16508         and the default static constructor.
16509
16510         (Constructor::) Another class that starts using `public readonly'
16511         instead of properties. 
16512
16513         (Constructor::IsDefault): Whether this is a default constructor. 
16514
16515         (Field::) use readonly public fields instead of properties also.
16516
16517         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
16518         track of static constructors;  If none is used, turn on
16519         BeforeFieldInit in the TypeAttributes. 
16520
16521         * cs-parser.jay (opt_argument_list): now the return can be null
16522         for the cases where there are no arguments. 
16523
16524         (constructor_declarator): If there is no implicit `base' or
16525         `this', then invoke the default parent constructor. 
16526
16527         * modifiers.cs (MethodAttr): New static function maps a set of
16528         modifiers flags into a MethodAttributes enum
16529         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
16530         MethodAttr, TypeAttr to represent the various mappings where the
16531         modifiers are used.
16532         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
16533
16534 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
16535
16536         * parameter.cs (GetParameterInfo): Fix bug where there would be no
16537         method arguments.
16538
16539         * interface.cs (PopulateIndexer): Implemented the code generator
16540         for interface indexers.
16541
16542 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
16543
16544         * interface.cs (InterfaceMemberBase): Now we track the new status
16545         here.  
16546
16547         (PopulateProperty): Implement property population.  Woohoo!  Got
16548         Methods and Properties going today. 
16549
16550         Removed all the properties for interfaces, and replaced them with
16551         `public readonly' fields. 
16552
16553 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
16554
16555         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
16556         initialize their hashtables/arraylists only when they are needed
16557         instead of doing this always.
16558
16559         * parameter.cs: Handle refs and out parameters.
16560
16561         * cs-parser.jay: Use an ArrayList to construct the arguments
16562         instead of the ParameterCollection, and then cast that to a
16563         Parameter[] array.
16564
16565         * parameter.cs: Drop the use of ParameterCollection and use
16566         instead arrays of Parameters.
16567
16568         (GetParameterInfo): Use the Type, not the Name when resolving
16569         types. 
16570
16571 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
16572
16573         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
16574         and instead use public readonly fields.
16575
16576         * class.cs: Put back walking code for type containers.
16577
16578 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
16579
16580         * class.cs (MakeConstant): Code to define constants.
16581
16582         * rootcontext.cs (LookupType): New function.  Used to locate types 
16583
16584
16585 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
16586
16587         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
16588         this System.Reflection code is.  Kudos to Microsoft
16589
16590         * typemanager.cs: Implement a type cache and avoid loading all
16591         types at boot time.  Wrap in LookupType the internals.  This made
16592         the compiler so much faster.  Wow.  I rule!
16593
16594         * driver.cs: Make sure we always load mscorlib first (for
16595         debugging purposes, nothing really important).
16596
16597         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
16598         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
16599
16600         * rootcontext.cs: Lookup types on their namespace;  Lookup types
16601         on namespaces that have been imported using the `using' keyword.
16602
16603         * class.cs (TypeContainer::TypeAttr): Virtualize.
16604         (Class::TypeAttr): Return attributes suitable for this bad boy.
16605         (Struct::TypeAttr): ditto.
16606         Handle nested classes.
16607         (TypeContainer::) Remove all the type visiting code, it is now
16608         replaced with the rootcontext.cs code
16609
16610         * rootcontext.cs (GetClassBases): Added support for structs. 
16611
16612 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
16613
16614         * interface.cs, statement.cs, class.cs, parameter.cs,
16615         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
16616         Drop use of TypeRefs, and use strings instead.
16617
16618 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
16619
16620         * rootcontext.cs: 
16621
16622         * class.cs (Struct::Struct): set the SEALED flags after
16623         checking the modifiers.
16624         (TypeContainer::TypeAttr): new property, returns the
16625         TypeAttributes for a class.  
16626
16627         * cs-parser.jay (type_list): Oops, list production was creating a
16628         new list of base types.
16629
16630         * rootcontext.cs (StdLib): New property.
16631         (GetInterfaceTypeByName): returns an interface by type name, and
16632         encapsulates error handling here.
16633         (GetInterfaces): simplified.
16634         (ResolveTree): Encapsulated all the tree resolution here.
16635         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
16636         types. 
16637
16638         * driver.cs: Add support for --nostdlib, to avoid loading the
16639         default assemblies.
16640         (Main): Do not put tree resolution here. 
16641
16642         * rootcontext.cs: Beginning of the class resolution.
16643
16644 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
16645
16646         * rootcontext.cs: Provide better error reporting. 
16647
16648         * cs-parser.jay (interface_base): set our $$ to be interfaces.
16649
16650         * rootcontext.cs (CreateInterface): Handle the case where there
16651         are no parent interfaces.
16652
16653         (CloseTypes): Routine to flush types at the end.
16654         (CreateInterface): Track types.
16655         (GetInterfaces): Returns an array of Types from the list of
16656         defined interfaces.
16657
16658         * typemanager.c (AddUserType): Mechanism to track user types (puts
16659         the type on the global type hash, and allows us to close it at the
16660         end). 
16661
16662 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
16663
16664         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
16665         RecordInterface instead.
16666
16667         * cs-parser.jay: Updated to reflect changes above.
16668
16669         * decl.cs (Definition): Keep track of the TypeBuilder type that
16670         represents this type here.  Not sure we will use it in the long
16671         run, but wont hurt for now.
16672
16673         * driver.cs: Smaller changes to accomodate the new code.
16674
16675         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
16676         when done. 
16677
16678         * rootcontext.cs (CreateInterface):  New method, used to create
16679         the System.TypeBuilder type for interfaces.
16680         (ResolveInterfaces): new entry point to resolve the interface
16681         hierarchy. 
16682         (CodeGen): Property, used to keep track of the code generator.
16683
16684 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
16685
16686         * cs-parser.jay: Add a second production for delegate_declaration
16687         with `VOID'.
16688
16689         (enum_body): Put an opt_comma here instead of putting it on
16690         enum_body or enum_member_declarations so we can handle trailing
16691         commas on enumeration members.  Gets rid of a shift/reduce.
16692
16693         (type_list): Need a COMMA in the middle.
16694
16695         (indexer_declaration): Tell tokenizer to recognize get/set
16696
16697         * Remove old targets.
16698
16699         * Re-add the parser target.
16700
16701 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16702
16703         * cs-parser.jay: Add precendence rules for a number of operators
16704         ot reduce the number of shift/reduce conflicts in the grammar.
16705
16706 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
16707
16708         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
16709         and put it here.
16710
16711         Get rid of old crufty code.
16712
16713         * rootcontext.cs: Use this to keep track of the parsed
16714         representation and the defined types available to the program. 
16715
16716         * gen-treedump.cs: adjust for new convention.
16717
16718         * type.cs: Split out the type manager, and the assembly builder
16719         from here. 
16720
16721         * typemanager.cs: the type manager will live here now.
16722
16723         * cil-codegen.cs: And the code generator here. 
16724
16725 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
16726
16727         * makefile: Fixed up for easy making.
16728
16729 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16730
16731         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
16732         the 
16733
16734         (unary_expression): Expand pre_increment_expression and
16735         post_decrement_expression to reduce a shift/reduce.
16736
16737 2001-07-11  Simon Cozens
16738
16739         * cs-tokenizer.cs: Hex numbers should begin with a 0.
16740
16741         Improve allow_keyword_as_indent name.
16742
16743 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
16744
16745         * Adjustments for Beta2. 
16746
16747 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
16748
16749         * decl.cs: Added `Define' abstract method.
16750         (InTransit): new property, used to catch recursive definitions. 
16751
16752         * interface.cs: Implement `Define'. 
16753
16754         * modifiers.cs: Map Modifiers.constants to
16755         System.Reflection.TypeAttribute flags.
16756
16757         * class.cs: Keep track of types and user-defined types.
16758         (BuilderInit): New method for creating an assembly
16759         (ResolveType): New function to launch the resolution process, only
16760         used by interfaces for now.
16761
16762         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
16763         that are inserted into the name space. 
16764
16765 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
16766
16767         * ARGH.  I have screwed up my tree so many times due to the use of
16768         rsync rather than using CVS.  Going to fix this at once. 
16769
16770         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
16771         load types.
16772
16773 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
16774
16775         * Experiment successful: Use System.Type rather that our own
16776         version of Type.  
16777
16778 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
16779
16780         * cs-parser.jay: Removed nsAliases from here.
16781
16782         Use new namespaces, handle `using XXX;' 
16783
16784         * namespace.cs: Reimplemented namespace handling, use a recursive
16785         definition of the class.  Now we can keep track of using clauses
16786         and catch invalid using clauses.
16787
16788 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
16789
16790         * gen-treedump.cs: Adapted for all the renaming.
16791
16792         * expression.cs (Expression): this class now has a Type property
16793         which returns an expression Type.
16794
16795         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
16796         `Type', as this has a different meaning now in the base
16797
16798 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
16799
16800         * interface.cs, class.cs: Removed from all the sources the
16801         references to signature computation, as we can not do method
16802         signature computation during the parsing time, as we are not
16803         trying to solve at that point distinguishing:
16804
16805         class X {
16806                 void a (Blah x) {}
16807                 void a (NS.Blah x) {}
16808         }
16809
16810         Which depending on the context might be valid or not, as we do not
16811         know if Blah is the same thing as NS.Blah at that point.
16812
16813         * Redid everything so the code uses TypeRefs now instead of
16814         Types.  TypeRefs are just temporary type placeholders, that need
16815         to be resolved.  They initially have a pointer to a string and the
16816         current scope in which they are used.  This is used later by the
16817         compiler to resolve the reference to an actual Type. 
16818
16819         * DeclSpace is no longer a CIR.Type, and neither are
16820         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
16821         are all DeclSpaces, but no Types. 
16822
16823         * type.cs (TypeRefManager): This implements the TypeRef manager,
16824         which keeps track of all the types that need to be resolved after
16825         the parsing has finished. 
16826
16827 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
16828
16829         * ARGH.  We are going to have to store `foreach' as a class rather
16830         than resolving it, as we need to verify error 1579 after name
16831         resolution.   *OR* we could keep a flag that says `This request to
16832         IEnumerator comes from a foreach statement' which we can then use
16833         to generate the error.
16834
16835 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
16836
16837         * class.cs (TypeContainer.AddMethod): we now add methods to the
16838         MethodGroup instead of the method hashtable.  
16839
16840         * expression.cs: Add MethodGroup abstraction, which gets us one
16841         step closer to the specification in the way we handle method
16842         declarations.  
16843
16844         * cs-parser.jay (primary_expression): qualified_identifier now
16845         tried to match up an identifier to a local variable reference or
16846         to a parameter reference.
16847
16848         current_local_parameters is now a parser global variable that
16849         points to the current parameters for the block, used during name
16850         lookup.
16851
16852         (property_declaration): Now creates an implicit `value' argument to
16853         the set accessor.
16854
16855 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
16856
16857         * parameter.cs: Do not use `param' arguments as part of the
16858         signature, per the spec.
16859
16860 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
16861
16862         * decl.cs: Base class for classes, structs and interfaces.  This
16863         is the "Declaration Space" 
16864
16865         * cs-parser.jay: Use CheckDef for checking declaration errors
16866         instead of having one on each function.
16867
16868         * class.cs: Factor out some code for handling error handling in
16869         accordance to the "Declarations" section in the "Basic Concepts"
16870         chapter in the ECMA C# spec.
16871
16872         * interface.cs: Make all interface member classes derive from
16873         InterfaceMemberBase.
16874
16875 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
16876
16877         * Many things: all interfaces are parsed and generated in
16878         gen-treedump.  Support for member variables, constructors,
16879         destructors, properties, constants is there.
16880
16881         Beginning of the IL backend, but very little done, just there for
16882         testing purposes. 
16883
16884 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
16885
16886         * cs-parser.jay: Fix labeled statement.
16887
16888         * cs-tokenizer.cs (escape): Escape " and ' always.
16889         ref_line, ref_name: keep track of the line/filename as instructed
16890         by #line by the compiler.
16891         Parse #line.
16892
16893 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
16894
16895         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
16896         to match the values in System.CodeDOM.
16897
16898         Divid renamed to Divide.
16899
16900         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
16901         statements. 
16902         (Statements.set): remove.
16903
16904         * System.CodeDOM/CodeCatchClause.cs: always have a valid
16905         statements. 
16906
16907         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
16908         falseStatements always have valid values. 
16909
16910         * cs-parser.jay: Use System.CodeDOM now.
16911