Update to changes.
[mono.git] / mcs / mcs / ChangeLog
1 2004-09-27  Raja R Harinath  <rharinath@novell.com>
2
3         * README: Update to changes.
4
5 2004-09-24  Marek Safar  <marek.safar@seznam.cz>
6
7         * cs-parser.jay: Reverted 642 warning fix.
8
9 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
10
11         Fix bug #66615
12         * decl.cs (FindMemberWithSameName): Indexer can have more than
13         1 argument.
14
15 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
16
17         * expression.cs (LocalVariableReference.DoResolveLValue):
18         Do not report warning 219 for out values.
19         (EmptyExpression.Null): New member to avoid extra allocations.
20
21 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
22
23         * cs-parser.jay: Fix wrong warning 642 report.
24
25         * cs-tokenizer.cs (CheckNextToken): New helper;
26         Inspect next character if is same as expected.
27
28 2004-09-23  Martin Baulig  <martin@ximian.com>
29
30         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
31         (Convert.ImplicitReferenceConversionExists): Likewise.
32
33 2004-09-23  Martin Baulig  <martin@ximian.com>
34
35         Merged latest changes into gmcs.  Please keep this comment in
36         here, it makes it easier for me to see what changed in MCS since
37         the last time I merged.
38
39 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
40
41         * class.cs (Operator.Define): Add error 448 and 559 report.
42
43 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
44
45         * class.cs (MemberBase.IsTypePermitted): New protected
46         method for checking error CS0610.
47
48 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
49
50         * class.cs (TypeContainer.HasExplicitLayout): New property
51         Returns whether container has StructLayout attribute set Explicit.
52         (FieldMember): New abstract class for consts and fields.
53         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
54         (Field): Reuse FieldMember.
55
56         * const.cs (Const): Reuse FieldMember.
57
58         * rootcontext.cs: EmitConstants call moved to class.
59
60 2004-09-22  Martin Baulig  <martin@ximian.com>
61
62         Thanks to Peter Sestoft for this bug report.
63
64         * expression.cs (Conditional): If both the `trueExpr' and the
65         `falseExpr' is a NullLiteral, return a NullLiteral.
66
67 2004-09-22  Martin Baulig  <martin@ximian.com>
68
69         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
70         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
71         for the "get_Current" call.
72
73 2004-09-22  Martin Baulig  <martin@ximian.com>
74
75         Marek and me just fixed one of our oldest bugs: #28562 :-)
76
77         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
78
79         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
80         we're an EnumConstant, just return that.
81         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
82         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
83         to get the value which'll actually be written into the attribute.
84         However, we have to use GetValue() to access the attribute's value
85         in the compiler.        
86
87 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
88
89         * constant.cs (Constant.IsNegative): New abstract property
90         IsNegative.
91
92         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
93         (StackAlloc.DoResolve): Reused IsNegative.
94
95 2004-09-21  Martin Baulig  <martin@ximian.com>
96
97         * codegen.cs (VariableStorage): Don't store the ILGenerator here;
98         if we're used in an iterator, we may be called from different
99         methods.
100
101         * statement.cs (Foreach.EmitFinally): Only emit an `Endfinally' if
102         we actually have an exception block.
103
104 2004-09-20  John Luke <jluke@cfl.rr.com>
105
106         * class.cs, cs-parser.jay: Improve the error report for 1520:
107         report the actual line where the error happens, not where the
108         class was declared.
109
110         * assign.cs, delegate.cs, ecore.cs, expression.cs, statement.cs:
111         Pass location information that was available elsewhere.
112
113 2004-09-19  Sebastien Pouliot  <sebastien@ximian.com>
114
115         * codegen.cs: Fix bug #56621. It is now possible to use MCS on the MS
116         runtime to delay sign assemblies.
117
118 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
119
120         * cs-parser.jay: Do not report the stack trace, this is barely
121         used nowadays.
122
123 2004-08-22  John Luke  <john.luke@gmail.com>
124  
125         * driver.cs : check that a resource id is not already used
126         before adding it, report CS1508 if it is, bug #63637
127
128 2004-09-19  Miguel de Icaza  <miguel@ximian.com>
129
130         * ecore.cs: Removed dead code.
131
132 2004-09-18  Marek Safar  <marek.safar@seznam.cz>
133
134         * class.cs: Do not report warning CS0067 on the interfaces.
135
136 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
137
138         * cs-parser.jay: Add error 504 report.
139
140 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
141
142         * rootcontext.cs: WarningLevel is 4 by default now.
143
144         * statement.cs (Fixed.Resolve): Do not null
145         VariableInfo.
146
147 2004-09-16  Marek Safar  <marek.safar@seznam.cz>
148
149         Fixed bug #55780
150         * ecore.cs (PropertyExpr.FindAccessors): Do not perform
151         deep search when property is not virtual.
152         (PropertyExpr.ResolveAccessors): Make one call for both
153         accessors.
154
155 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
156
157         Fixed bug #65766
158         * statement.cs: Error 152 report constains also location.
159
160 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
161
162         Fixed bug #65766
163         * const.cs: Explicitly set constant as static.
164
165 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
166
167         Fixed bug #64226
168         * cs-parser.jay: Add error 1017 report.
169
170 2004-09-15  Marek Safar  <marek.safar@seznam.cz>
171
172         Fixed bug #59980, #64224
173         * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
174
175         * typemanager.cs (IsSpecialMethod): Simplified
176
177 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
178
179         * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
180         condition with better params.
181
182 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
183
184         Fixed bug #65238
185         * attribute.cs (Resolve): Property has to have both
186         accessors.
187
188 2004-09-14  Martin Baulig  <martin@ximian.com>
189
190         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
191
192 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
193
194         Fixed bug #61902
195         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
196         called and is obsolete then this member suppress message
197         when call is inside next [Obsolete] method or type.
198
199         * expression.cs: Use TestObsoleteMethodUsage member.
200
201 2004-09-14  Martin Baulig  <martin@ximian.com>
202
203         * cs-parser.jay: Sync a bit with the GMCS version.
204
205 2004-09-14  Martin Baulig  <martin@ximian.com>
206
207         * cs-parser.jay (CSharpParser): Don't derive from GenericsParser.
208         (CSharpParser.yacc_verbose_flag): New public field.
209
210         * genericparser.cs: Removed.
211
212 2004-09-14  Raja R Harinath  <rharinath@novell.com>
213
214         * cs-parser.jay (event_declaration): Re-enable cs0071 error.
215
216 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
217
218         * class.cs (MethodCore.CheckBase): Fix bug #65757.
219
220 2004-09-10  Martin Baulig  <martin@ximian.com>
221
222         Backported my MemberName changes from GMCS into MCS.
223
224         - we are now using a special `MemberName' class instead of using
225         strings; in GMCS, the `MemberName' also contains the type
226         arguments.
227
228         - changed the grammar rules a bit:
229           * the old `member_name' is now a `namespace_or_type_name':
230             The rule is that we use `namespace_or_type_name' everywhere
231             where we expect either a "member name" (GetEnumerator) or a
232             "member name" with an explicit interface name
233             (IEnumerable.GetEnumerator).
234             In GMCS, the explicit interface name may include type arguments
235             (IEnumerable<T>.GetEnumerator).
236           * we use `member_name' instead of just `IDENTIFIER' for
237             "member names":
238             The rule is that we use `member_name' wherever a member may
239             have type parameters in GMCS.       
240
241         * decl.cs (MemberName): New public class.
242         (MemberCore.MemberName): New public readonly field.
243         (MemberCore.ctor): Take a `MemberName' argument, not a string.
244         (DeclSpace): Likewise.
245
246         * delegate.cs (Delegate.ctor): Take a MemberName, not a string.
247         * enum.cs (Enum.ctor): Likewise.
248
249         * namespace.cs (AliasEntry.Alias): Changed type from Expression to
250         MemberName.     
251         (AliasEntry.ctor): Take a MemberName, not an Expression.
252         (AliasEntry.UsingAlias): Likewise.
253
254         * class.cs (TypeContainer.ctor): Take a MemberName, not a string.
255         (IMethodData.MemberName): Changed type from string to MemberName.
256         (MemberBase.ExplicitInterfaceName): Likewise.
257         (AbstractPropertyEventMethod.SetupName): Make this private.
258         (AbstractPropertyEventMethod.ctor): Added `string prefix'
259         argument; compute the member name here.
260         (AbstractPropertyEventMethod.UpdateName): Recompute the name based
261         on the `member.MemberName' and the `prefix'.
262
263         * cs-parser.jay (attribute_name): Use `namespace_or_type_name',
264         not `type_name'.
265         (struct_declaration): Use `member_name' instead of `IDENTIFIER';
266         thus, we get a `MemberName' instead of a `string'.  These
267         declarations may have type parameters in GMCS.
268         (interface_method_declaration, delegate_declaration): Likewise.
269         (class_declaration, interface_declaration): Likewise.
270         (method_header): Use `namespace_or_type_name' instead of
271         `member_name'.  We may be an explicit interface implementation.
272         (property_declaration, event_declaration): Likewise.
273         (member_name): This is now just an `IDENTIFIER', not a
274         `namespace_or_type_name'.
275         (type_name, interface_type): Removed.
276         (namespace_or_type_name): Return a MemberName, not an Expression.
277         (primary_expression): Use `member_name' instead of `IDENTIFIER';
278         call GetTypeExpression() on the MemberName to get an expression.
279         (IndexerDeclaration.interface_type): Changed type from string to
280         MemberName.
281         (MakeName): Operate on MemberName's instead of string's.
282
283 2004-09-13  Raja R Harinath  <rharinath@novell.com>
284
285         Fix bug #55770.
286         * namespace.cs (AliasEntry.Resolve): Implement section 16.3.1.
287         (NamespaceEntry.Lookup): Add new argument to flag if we want the
288         lookup to avoid symbols introduced by 'using'.
289         * rootcontext.cs (NamespaceLookup): Update.
290
291 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
292
293         * class.cs (TypeContainer.DoDefineMembers): Do not call
294         DefineDefaultConstructor for static classes.
295
296 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
297
298         * attribute.cs (Attribute.Resolve): Add error 653 report.
299
300         * class.cs (Class.ApplyAttributeBuilder): Add error 641
301         report.
302         (Method.ApplyAttributeBuilder): Add error 685 report.
303         (Operator.Define): Add error 564 report.
304
305         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
306
307         * expression.cs (Invocation.DoResolve): Add error
308         245 and 250 report.
309
310         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
311         error 674 report.
312
313 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
314
315         * class.cs (ConstructorInitializer.Resolve):
316         Wrong error number (515->516).
317
318 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
319
320         * class.cs (Indexer.Define): Add error 631 report.
321
322 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
323
324         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
325
326 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
327
328         * expression.cs (Probe.DoResolve): Add error CS0241 report.
329
330 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
331
332         * cs-parser.jay: Added error CS0241 report.
333
334 2004-09-10  Raja R Harinath  <rharinath@novell.com>
335
336         * cs-parser.jay (fixed_statement): Introduce a scope for the
337         declaration in the 'fixed' statement.
338
339 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
340
341         * cs-parser.jay: Added CS0230 error report.
342
343 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
344
345         * cs-parser.jay: Added errors CS0231 and CS0257 report.
346
347 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
348
349         * expression.cs (Argument.Resolve): Added error CS0192 and
350         CS0199 report.
351
352 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
353
354         C# 2.0 #pragma warning feature
355
356         * cs-tokenizer.cs (PreProcessPragma): New method; 
357         Handles #pragma directive.
358
359         * report.cs (WarningRegions): New class; Support
360         class for #pragma warning directive. It tests whether
361         warning is enabled for a given line.
362
363 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
364
365         * const.cs: Add more descriptive error report, tahnks to
366         Sebastien. 
367
368 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
369
370         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
371
372 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
373
374         * expression.cs: Apply patch from Ben: Remove dead code from
375         ArrayCreation, and remove the TurnintoConstant call in const.cs,
376         as that code just threw an exception anwyays.
377
378         * const.cs: Remove the call to the turnintoconstant, for details
379         see bug: #63144
380         
381         * literal.cs: The type of the null-literal is the null type;  So
382         we use a placeholder type (literal.cs:System.Null, defined here)
383         for it.
384
385         * expression.cs (Conditional.DoResolve): Remove some old code that
386         is no longer needed, conversions have been fixed.
387
388         (ArrayCreationExpression.DoResolve): Return false if we fail to
389         resolve the inner expression.
390
391 2004-09-07  Raja R Harinath  <rharinath@novell.com>
392
393         Fix test-290.cs.
394         * cs-parser.jay (delegate_declaration): Record a delegate
395         declaration as a type declaration.
396         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
397
398 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
399
400         * parameter.cs: Do not crash if the type can not be resolved. 
401
402         * expression.cs: Report errors with unsafe pointers, fixes #64896
403
404 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
405
406         * expression.cs: Pointer arith always needs to do a conv.i
407         if the operand is a long. fix 65320
408
409 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
410
411         Fixed cs0619-37.cs, cs0619-38.cs
412
413         * enum.cs (GetObsoleteAttribute): Removed.
414
415         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
416         on Enum member is double staged. The first is tested member
417         and then enum.
418
419 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
420
421         Fixed #56986, #63631, #65231
422
423         * class.cs: (TypeContainer.AddToMemberContainer): New method,
424         adds member to name container.
425         (TypeContainer.AddToTypeContainer): New method, adds type to
426         name container.
427         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
428         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
429         AddOperator): Simplified by reusing AddToMemberContainer.
430         (TypeContainer.UserDefinedStaticConstructor): Changed to property
431         instead of field.
432         (Method.CheckForDuplications): Fixed implementation to test all
433         possibilities.
434         (MemberBase): Detection whether member is explicit interface
435         implementation is now in constructor.
436         (MemberBase.UpdateMemberName): Handles IndexerName.
437         (Accessor): Changed to keep also location information.
438         (AbstractPropertyEventMethod): Is derived from MemberCore.
439         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
440         will be emited or not.
441         (PropertyBase.AreAccessorsDuplicateImplementation):
442         Tests whether accessors are not in collision with some method.
443         (Operator): Is derived from MethodCore to simplify common
444         operations.
445
446         * decl.cs (Flags.TestMethodDuplication): Test for duplication
447         must be performed.
448         (DeclSpace.AddToContainer): Adds the member to defined_names
449         table. It tests for duplications and enclosing name conflicts.
450
451         * enum.cs (EnumMember): Clean up to reuse the base structures
452
453 2004-09-03  Martin Baulig  <martin@ximian.com>
454
455         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
456         into TypeContainer, to make partial classes work again.
457
458 2004-09-03  Martin Baulig  <martin@ximian.com>
459
460         * rootcontext.cs (RootContext.V2): Removed.
461
462 2004-03-23  Martin Baulig  <martin@ximian.com>
463
464         * expression.cs (Invocation.OverloadResolve): Added `bool
465         may_fail' argument and use it instead of the Location.IsNull() hack.
466
467 2004-09-03  Martin Baulig  <martin@ximian.com>
468
469         Merged latest changes into gmcs.  Please keep this comment in
470         here, it makes it easier for me to see what changed in MCS since
471         the last time I merged.
472
473 2004-09-03  Raja R Harinath  <rharinath@novell.com>
474
475         Fix #61128.
476         * expression.cs (BetterConversion): Don't allow either conversion 
477         to be null.  Remove redundant implicit conversion test when 'q ==
478         null' -- when this function is invoked, we already know that the
479         implicit conversion exists.
480         (BetterFunction): Assume that 'best' is non-null.  Remove
481         redundant reimplementation of IsApplicable when 'best' is null.
482         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
483         number of arguments.
484         (IsAncestralType): Extract from OverloadResolve.
485         (OverloadResolve): Make robust to the MethodGroupExpr being
486         unsorted.  Implement all the logic of Section 14.5.5.1, and
487         support overloading of methods from multiple applicable types.
488         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
489
490         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
491         (RealError, Warning): Append type of report to related symbol.
492
493 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
494
495         * enum.cs: Fixed CLS-Compliance checks for enum members.
496         Error tests cs3008-8.cs, cs3014-8.cs
497
498 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
499
500         Fixed bug #62342, #63102
501         * class.cs: ImplementIndexer uses member.IsExplicitImpl
502         like ImplementMethod.
503
504 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
505
506         * attribute.cs (Attribute.GetAttributeArgumentExpression):
507         Fixed bug #65170.
508
509 2004-09-02  Martin Baulig  <martin@ximian.com>
510
511         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
512         TypeManager.GetArgumentTypes() rather than calling GetParameters()
513         on the MethodBase.
514
515 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
516
517         C# 2.0 Static classes implemented
518
519         * class.cs (TypeContainer): instance_constructors,
520         initialized_fields, initialized_static_fields,
521         default_constructor, base_inteface_types are protected to be
522         accessible from StaticClass.
523         (TypeContainer.DefineDefaultConstructor): New virtual method
524         for custom default constructor generating
525         (StaticClass): New class to handle "Static classes" feature.
526
527         * cs-parser.jay: Handle static keyword on class like instance
528         of StaticClass.
529
530         * driver.cs: Added "/langversion" command line switch with two
531         options (iso-1, default).
532
533 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
534
535         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
536
537 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
538
539         * delegate.cs: Style.
540
541 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
542
543         * delegate.cs: Add seperate instance expr field for miguel.
544
545 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
546
547         * PointerArithmetic (Resolve): make sure we are not doing
548         pointer arith on void*. Also, make sure we are resolved
549         by not setting eclass until resolve.
550
551         All callers: Make sure that PointerArithmetic gets resolved.
552
553 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
554
555         * ArrayCreation (LookupType): If the type does not resolve 
556         to an array, give an error.
557
558 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
559
560         * statement.cs (Try.Resolve): Fixed bug #64222
561
562 2004-08-27  Martin Baulig  <martin@ximian.com>
563
564         * class.cs
565         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
566         crash here.     
567
568 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
569
570         * ecore.cs (Constantify): Get underlying type via
571         System.Enum.GetUnderlyingType to avoid StackOverflow on the
572         Windows in special cases.
573
574 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
575
576         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
577         for obtaining also private methods.
578         (GetRemoveMethod): Used GetRemoveMethod (true)
579         for obtaining also private methods.
580
581 2004-08-24  Martin Baulig  <martin@ximian.com>
582
583         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
584         MethodAttributes.HideBySig for operators.
585
586 2004-08-23  Martin Baulig  <martin@ximian.com>
587
588         Back to the old error reporting system :-)
589
590         * report.cs (Message): Removed.
591         (Report.MessageData, ErrorData, WarningData): Removed.
592         (Report.Error, Warning): Back to the old system.
593
594 2004-08-23  Martin Baulig  <martin@ximian.com>
595
596         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
597
598         * class.cs (TypeContainer.ParentContainer): New public virtual
599         method; replaces the explicit interface implementation.
600         (ClassPart.ParentContainer): Override.
601
602 2004-08-23  Martin Baulig  <martin@ximian.com>
603
604         * statement.cs (Switch): Added support for constant switches; see
605         #59428 or test-285.cs.
606
607 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
608
609         Fixed bug #62740.
610         * statement.cs (GetEnumeratorFilter): Removed useless
611         logic because C# specs is strict. GetEnumerator must be
612         public.
613
614 2004-08-22  Martin Baulig  <martin@ximian.com>
615
616         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
617         a switch and may break, reset the barrier.  Fixes #59867.
618
619 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
620
621         CLS-Compliance speed up (~5% for corlib)
622
623         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
624         New method. Tests container for CLS-Compliant names
625
626         * class.cs (TypeContainer.VerifyClsName): New method.
627         Checks whether container name is CLS Compliant.
628         (Constructor): Implements IMethodData.
629
630         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
631         low-case table for CLS Compliance test.
632         (MemberCache.VerifyClsParameterConflict): New method.
633         Checks method parameters for CS3006 error.
634
635         * enum.cs (EnumMember): Is derived from MemberCore.
636         (Enum.VerifyClsName): Optimized for better performance.
637
638 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
639
640         * report.cs: Renamed Error_T to Error and changed all
641         references.
642
643 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
644
645         * class.cs (TypeContainer.IndexerArrayList): New inner class
646         container for indexers.
647         (TypeContainer.DefaultIndexerName): New constant for default
648         indexer name. Replaced all "Item" with this constant.
649         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
650
651         * typemanager.cs (TypeManager.default_member_ctor): Cache here
652         DefaultMemberAttribute constructor.
653
654 2004-08-05  Martin Baulig  <martin@ximian.com>
655
656         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
657         Fix bug #59429.
658
659 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
660
661         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
662         multi platforms problem.
663
664         * compiler.csproj: Included shared files.
665
666 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
667
668         Fix bug 60333, 55971 in the more general way
669         * attribute.cs (Attribute.GetAttributeArgumentExpression):
670         Added arg_type argument for constant conversion.
671         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
672
673 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
674
675         Fix bug #59760
676         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
677         OperatorArrayList, MethodCoreArrayList for typecontainer
678         containers. Changed class member types to these new types.
679         (MethodArrayList.DefineMembers): Added test for CS0659.
680
681 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
682
683         * cfold.cs: Synchronize the folding with the code in expression.cs
684         Binary.DoNumericPromotions for uint operands.
685
686         * attribute.cs: Revert patch from Raja, it introduced a regression
687         while building Blam-1.2.1 (hard to isolate a test case).
688
689 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
690
691         Fix for #55382
692         * class.cs:
693         (TypeContainer.Define): Renamed to DefineContainerMembers because of
694         name collision.
695         (MethodCore.parent_method): New member. The method we're overriding
696         if this is an override method.
697         (MethodCore.CheckBase): Moved from Method class and made common.
698         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
699         private.
700         (MethodCore.CheckForDuplications): New abstract method. For custom
701         member duplication search in a container
702         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
703         method and its return type.
704         (Event.conflict_symbol): New member. Symbol with same name in the
705         parent class.
706
707         * decl.cs:
708         (MemberCache.FindMemberWithSameName): New method. The method
709         is looking for conflict with inherited symbols.
710
711 2004-08-04  Martin Baulig  <martin@ximian.com>
712
713         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
714
715         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
716
717 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
718
719         * report.cs (Message): New enum for better error, warning reference in
720         the code.
721         (MessageData): New inner abstract class. It generally handles printing of
722         error and warning messages.
723         Removed unused Error, Warning, Message methods.
724
725 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
726
727         Fix for cs0592-8.cs test
728         * attribute.cs
729         (Attributable.ValidAttributeTargets): Made public.
730         (Attribute.ExplicitTarget): New member for explicit target value.
731         (Attribute.CheckTargets): Now we translate explicit attribute
732         target to Target here.
733
734 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
735
736         * ecore.cs (MethodGroupExpr): new IsBase property.
737
738         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
739
740         * delegate.cs (DelegateCreation): store a MethodGroupExpr
741         rather than an instance expr.
742
743         (DelegateCreation.Emit): Use the method group rather than
744         the instance expression. Also, if you have base.Foo as the
745         method for a delegate, make sure to emit ldftn, not ldftnvirt.
746
747         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
748
749         (NewDelegate.DoResolve): Only check for the existance of Invoke
750         if the method is going to be needed. Use MethodGroupExpr.
751
752         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
753
754         * expression.cs: For pointer arith., make sure to use
755         the size of the type, not the size of the pointer to
756         the type.
757
758 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
759
760         Fix for #60722
761         * class.cs (Class): Added error CS0502 test.
762
763 2004-08-03  John Luke  <jluke@cfl.rr.com>
764             Raja R Harinath  <rharinath@novell.com>
765
766         Fix for #60997.
767         * attribute.cs (Attribute.complained_before): New flag.
768         (Attribute.ResolveType, Attribute.Resolve),
769         (Attribute.DefinePInvokeMethod): Set it.
770         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
771         
772 2004-08-03  Martin Baulig  <martin@ximian.com>
773
774         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
775         use a user-defined operator; we still need to do numeric
776         promotions in case one argument is a builtin type and the other
777         one has an implicit conversion to that type.  Fixes #62322.
778
779 2004-08-02  Martin Baulig  <martin@ximian.com>
780
781         * statement.cs (LocalInfo.Flags): Added `IsThis'.
782         (LocalInfo.IsThis): New public property.
783         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
784
785 2004-08-01  Martin Baulig  <martin@ximian.com>
786
787         * class.cs (TypeContainer.GetClassBases): Don't set the default
788         here since we may get called from GetPartialBases().
789         (TypeContainer.DefineType): If GetClassBases() didn't return a
790         parent, use the default one.
791
792 2004-07-30  Duncan Mak  <duncan@ximian.com>
793
794         * Makefile (mcs2.exe, mcs3.exe): add $(EXTRA_SOURCES).
795
796 2004-07-30  Martin Baulig  <martin@ximian.com>
797
798         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
799
800         * class.cs (SourceMethod): New public class, derive from the
801         symbol writer's ISourceMethod.
802         (Method): Use the new symbol writer API.
803
804         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
805         as argument and use the new symbol writer.
806
807         * location.cs
808         (SourceFile): Implement the symbol writer's ISourceFile.
809         (Location.SymbolDocument): Removed.
810         (Location.SourceFile): New public property.
811
812         * symbolwriter.cs: Use the new symbol writer API.
813
814 2004-07-30  Raja R Harinath  <rharinath@novell.com>
815
816         * Makefile (install-local): Remove.  Functionality moved to
817         executable.make.
818
819 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
820
821         * Makefile: Install mcs.exe.config file together with mcs.exe.
822         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
823         correct runtime version.
824         
825 2004-07-25  Martin Baulig  <martin@ximian.com>
826
827         * class.cs
828         (TypeContainer.RegisterOrder): Removed, this was unused.
829         (TypeContainer, interface_order): Removed.
830         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
831         TypeContainer as argument since we can also be called with a
832         `PartialContainer' for a partial class/struct/interface.
833         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
834         of checking whether we're an `Interface' - we could be a
835         `PartialContainer'.
836         (PartialContainer.Register): Override; call
837         AddClass()/AddStruct()/AddInterface() on our parent.
838
839         * cs-parser.jay (interface_member_declaration): Add things to the
840         `current_container', not the `current_class'.
841
842         * rootcontext.cs (RegisterOrder): The overloaded version which
843         takes an `Interface' was unused, removed.
844
845         * typemanager.cs (TypeManager.LookupInterface): Return a
846         `TypeContainer', not an `Interface'.
847         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
848         contain a `PartialContainer' for an interface, so check it's
849         `Kind' to figure out what it is.
850
851 2004-07-25  Martin Baulig  <martin@ximian.com>
852
853         * class.cs (Class.DefaultTypeAttributes): New public constant.
854         (Struct.DefaultTypeAttributes): Likewise.
855         (Interface.DefaultTypeAttributes): Likewise.
856         (PartialContainer.TypeAttr): Override this and add the
857         DefaultTypeAttributes.
858
859 2004-07-25  Martin Baulig  <martin@ximian.com>
860
861         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
862         we can just use the `Parent' field instead.
863
864 2004-07-25  Martin Baulig  <martin@ximian.com>
865
866         * class.cs (TypeContainer.Emit): Renamed to EmitType().
867
868 2004-07-25  Martin Baulig  <martin@ximian.com>
869
870         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
871         our parts before defining any methods.
872         (TypeContainer.VerifyImplements): Make this virtual.
873         (ClassPart.VerifyImplements): Override and call VerifyImplements()
874         on our PartialContainer.
875
876 2004-07-25  Martin Baulig  <martin@ximian.com>
877
878         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
879
880         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
881         argument, we can just use the `Parent' field instead.
882
883         * class.cs
884         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
885         (MemberBase.DoDefine): Likewise.
886
887 2004-07-24  Martin Baulig  <martin@ximian.com>
888
889         * decl.cs (MemberCore.Parent): New public field.
890         (DeclSpace.Parent): Moved to MemberCore.
891
892         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
893         (MemberBase.ctor): Added TypeContainer argument, pass it to our
894         parent's .ctor.
895         (FieldBase, Field, Operator): Likewise.
896         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
897         (EventField, Event): Likewise.
898
899 2004-07-23  Martin Baulig  <martin@ximian.com>
900
901         * class.cs (PartialContainer): New public class.
902         (ClassPart): New public class.
903         (TypeContainer): Added support for partial classes.
904         (TypeContainer.GetClassBases): Splitted some of the functionality
905         out into GetNormalBases() and GetPartialBases().
906
907         * cs-tokenizer.cs (Token.PARTIAL): New token.
908         (Tokenizer.consume_identifier): Added some hacks to recognize
909         `partial', but only if it's immediately followed by `class',
910         `struct' or `interface'.
911
912         * cs-parser.jay: Added support for partial clases.
913
914 2004-07-23  Martin Baulig  <martin@ximian.com>
915
916         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
917         a `DeclSpace' and also made it readonly.
918         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
919         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
920         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
921
922         * cs-parser.jay: Pass the `current_class', not the
923         `current_container' (at the moment, this is still the same thing)
924         to a new Method, Property, Event, Indexer or Constructor.
925
926 2004-07-23  Martin Baulig  <martin@ximian.com>
927
928         * cs-parser.jay (CSharpParser): Added a new `current_class' field
929         and removed the `current_interface' one.
930         (struct_declaration, class_declaration, interface_declaration):
931         Set `current_class' to the newly created class/struct/interface;
932         set their `Bases' and call Register() before parsing their body.
933
934 2004-07-23  Martin Baulig  <martin@ximian.com>
935
936         * class.cs (Kind): New public enum.
937         (TypeContainer): Made this class abstract.
938         (TypeContainer.Kind): New public readonly field.
939         (TypeContainer.CheckDef): New public method; moved here from
940         cs-parser.jay.
941         (TypeContainer.Register): New public abstract method.
942         (TypeContainer.GetPendingImplementations): New public abstract
943         method.
944         (TypeContainer.GetClassBases): Removed the `is_class' and
945         `is_iface' parameters.
946         (TypeContainer.DefineNestedTypes): Formerly known as
947         DoDefineType().
948         (ClassOrStruct): Made this class abstract.
949
950         * tree.cs (RootTypes): New public type. 
951
952 2004-07-20  Martin Baulig  <martin@ximian.com>
953
954         * tree.cs (Tree.RecordNamespace): Removed.
955         (Tree.Namespaces): Removed.
956
957         * rootcontext.cs (RootContext.IsNamespace): Removed.
958
959         * cs-parser.jay (namespace_declaration): Just create a new
960         NamespaceEntry here.
961
962 2004-07-20  Martin Baulig  <martin@ximian.com>
963
964         * statement.cs (ExceptionStatement): New abstract class.  This is
965         now used as a base class for everyone who's using `finally'.
966         (Using.ResolveLocalVariableDecls): Actually ResolveLValue() all
967         our local variables before using them.
968
969         * flowanalysis.cs (FlowBranching.StealFinallyClauses): New public
970         virtual method.  This is used by Yield.Resolve() to "steal" an
971         outer block's `finally' clauses.
972         (FlowBranchingException): The .ctor now takes an ExceptionStatement
973         argument.
974
975         * codegen.cs (EmitContext.StartFlowBranching): Added overloaded
976         version which takes an ExceptionStatement.  This version must be
977         used to create exception branchings.
978
979         * iterator.cs
980         (Yield.Resolve): "Steal" all `finally' clauses from containing blocks.
981         (Iterator.EmitMoveNext): Added exception support; protect the
982         block with a `fault' clause, properly handle 'finally' clauses.
983         (Iterator.EmitDispose): Run all the `finally' clauses here.
984
985 2004-07-20  Martin Baulig  <martin@ximian.com>
986
987         * iterator.cs: This is the first of a set of changes in the
988         iterator code.  Match the spec more closely: if we're an
989         IEnumerable, then GetEnumerator() must be called.  The first time
990         GetEnumerator() is called, it returns the current instance; all
991         subsequent invocations (if any) must create a copy.
992
993 2004-07-19  Miguel de Icaza  <miguel@ximian.com>
994
995         * expression.cs: Resolve the constant expression before returning
996         it. 
997
998 2004-07-19  Martin Baulig  <martin@ximian.com>
999
1000         * iterators.cs (Iterator.MapVariable): Don't define fields twice.
1001         (Iterator.MoveNextMethod.DoEmit): Use `TypeManager.int32_type' as
1002         the return type of the new EmitContext.
1003
1004 2004-07-18  Martin Baulig  <martin@ximian.com>
1005
1006         * class.cs (Property.Define): Fix iterators.
1007
1008         * iterators.cs (Iterator.Define): Moved the
1009         `container.AddInterator (this)' call here from the .ctor; only do
1010         it if we resolved successfully.
1011
1012 2004-07-17  Miguel de Icaza  <miguel@ximian.com>
1013
1014         * cs-tokenizer.cs (handle_preprocessing_directive): Do not return
1015         `true' for preprocessing directives that we parse.  The return
1016         value indicates whether we should return to regular tokenizing or
1017         not, not whether it was parsed successfully.
1018
1019         In the past if we were in: #if false ... #line #endif, we would
1020         resume parsing after `#line'.  See bug 61604.
1021
1022         * typemanager.cs: Removed an old hack from Gonzalo to get corlib
1023         building: IsEnumType should return true only for enums, not for
1024         enums or System.Enum itself.  This fixes #61593.
1025
1026         Likely what happened is that corlib was wrong: mcs depended on
1027         this bug in some places.  The bug got fixed, we had to add the
1028         hack, which caused bug 61593.
1029
1030         * expression.cs (ArrayAccess.GetStoreOpCode): Remove an old hack
1031         that was a workaround for the older conditions.
1032
1033 2004-07-16  Ben Maurer  <bmaurer@ximian.com>
1034
1035         * assign.cs: IAssignMethod has a new interface, as documented
1036         inline. All assignment code now uses this new api.
1037
1038         * ecore.cs, expression.cs: All classes which implement
1039         IAssignMethod now use the new interface.
1040
1041         * expression.cs (Invocation): add a hack to EmitCall so that
1042         IndexerAccess can be the target of a compound assignment without
1043         evaluating its arguments twice.
1044
1045         * statement.cs: Handle changes in Invocation api.
1046
1047 2004-07-16  Martin Baulig  <martin@ximian.com>
1048
1049         * iterators.cs: Rewrote this.  We're now using one single Proxy
1050         class for both the IEnumerable and the IEnumerator interface and
1051         `Iterator' derives from Class so we can use the high-level API.
1052
1053         * class.cs (TypeContainer.AddIterator): New method.
1054         (TypeContainer.DoDefineType): New protected virtual method, which
1055         is called from DefineType().
1056         (TypeContainer.DoDefineMembers): Call DefineType() and
1057         DefineMembers() on all our iterators.
1058         (TypeContainer.Emit): Call Emit() on all our iterators.
1059         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1060
1061         * codegen.cs (EmitContext.CurrentIterator): New public field.
1062
1063 2004-07-15  Martin Baulig  <martin@ximian.com>
1064
1065         * typemanager.cs
1066         (TypeManager.not_supported_exception_type): New type.   
1067
1068 2004-07-14  Martin Baulig  <martin@ximian.com>
1069
1070         * iterators.cs: Use real error numbers.
1071
1072 2004-07-14  Martin Baulig  <martin@ximian.com>
1073
1074         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1075         requires this to be a System.Collection.IEnumerable and not a
1076         class implementing that interface.
1077         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1078
1079 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1080
1081         * class.cs: Fixed previous fix, it broke some error tests.
1082
1083 2004-07-12  Martin Baulig  <martin@ximian.com>
1084
1085         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1086         Fixes #61293.
1087
1088 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1089
1090         * assign.cs (LocalTemporary): Add new argument: is_address,If
1091         `is_address' is true, then the value that we store is the address
1092         to the real value, and not the value itself.
1093         
1094         * ecore.cs (PropertyExpr): use the new local temporary
1095         stuff to allow us to handle X.Y += z (where X is a struct)
1096
1097 2004-07-08  Martin Baulig  <martin@ximian.com>
1098
1099         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1100         not always return, just like we're doing in Using.Resolve().
1101
1102 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1103
1104         * cs-parser.jay (fixed_statement): flag this as Pinned.
1105
1106 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1107
1108         * typemanager.cs (TypeManager): Removed MakePinned method, this
1109         mechanism is replaced with the .NET 2.x compatible mechanism of
1110         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1111
1112         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1113         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1114         `IsFixed' property which has a different meaning.
1115
1116 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1117
1118         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1119         visible from inside a nested class, not just the names of the
1120         immediately enclosing class.
1121         Fix for bug #60730.
1122
1123 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1124
1125         * expression.cs (BetterConversion): Remove buggy special-case
1126         handling of "implicit constant expression conversions".  At this
1127         point, we already know that the conversion is possible -- we're
1128         only checking to see which is better.
1129
1130 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1131
1132         * cs-parser.jay: Added error CS0210 test.
1133
1134 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1135
1136         * cs-parser.jay: Added error CS0134 test.
1137
1138 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1139
1140         Fix bug #52507
1141         * cs-parser.jay: Added error CS0145 test.
1142
1143 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1144
1145         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1146
1147 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1148         
1149         * expression.cs (StackAlloc.Resolve): The argument may not
1150         be a constant; deal with this case.
1151         
1152 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1153
1154         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1155         GetIndexerAttributeValue.
1156         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1157
1158         * class.cs (Indexer.Define): Added error tests for CS0415,
1159         CS0609.
1160
1161 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1162
1163         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1164         property code.
1165
1166 2004-06-23  Martin Baulig  <martin@ximian.com>
1167
1168         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1169         neither return nor throw, reset the barrier as well.  Fixes #60457.
1170
1171 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1172
1173         * class.cs : EventAttributes is now set to None by default.
1174           This fixes bug #60459.
1175
1176 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1177
1178         Fix bug #60219
1179         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1180         Don't throw exception but return null (it's sufficient now).
1181
1182 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1183
1184         * typemanager.cs (GetArgumentTypes): Faster implementation.
1185
1186 2004-06-18  Martin Baulig  <martin@ximian.com>
1187
1188         * attribute.cs (Attribute.Resolve): Check whether we're an
1189         EmptyCast which a Constant child.  Fixes #60333.
1190
1191 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1192
1193         * statement.cs (EmitCollectionForeach): Account for the fact that
1194         not all valuetypes are in areas which we can take the address of.
1195         For these variables, we store to a temporary variable. Also, make
1196         sure that we dont emit a `callvirt' on a valuetype method.
1197
1198 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1199
1200         * expression.cs (StackAlloc.DoReSolve): Added test for
1201         negative parameter (CS0247).
1202
1203 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1204
1205         Fix bug #59792
1206         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1207
1208 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1209
1210         Fix bug #59781
1211         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1212         ulong.
1213
1214 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1215
1216         Fix bug #58254 & cs1555.cs, cs1556.cs
1217         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1218
1219 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1220
1221         * cs-parser.jay: Added error CS1669 test for indexers.
1222
1223 2004-06-11  Martin Baulig  <martin@ximian.com>
1224
1225         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1226         call this twice: for params and varargs methods.
1227
1228 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1229
1230         * class.cs:
1231         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1232
1233 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1234
1235         * attribute.cs (Attribute.GetValidTargets): Made public.
1236
1237         * class.cs: 
1238         (AbstractPropertyEventMethod): New class for better code sharing.
1239         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1240         CS1667 report.
1241         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1242
1243 2004-06-11  Raja R Harinath  <rharinath@novell.com>
1244
1245         Fix bug #59477.
1246         * ecore.cs (ResolveFlags): Add new 'Intermediate' flag to tell
1247         that the call to Resolve is part of a MemberAccess.
1248         (Expression.Resolve): Use it for SimpleName resolution.
1249         (SimpleName.SimpleNameResolve, SimpleName.DoResolveAllowStatic):
1250         Add 'intermediate' boolean argument.
1251         (SimpleName.DoSimpleNameResolve): Likewise.  Use it to disable an
1252         error message when the SimpleName can be resolved ambiguously
1253         between an expression and a type.
1254         * expression.cs (MemberAccess.IdenticalNameAndTypeName): Make
1255         public.
1256         (MemberAccess.Resolve): Pass 'Intermediate' flag to the Resolve()
1257         call on the left-side.
1258
1259 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1260
1261         * class.cs:
1262         (MethodCore.VerifyClsCompliance): Added test for error CS3000.
1263
1264 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1265
1266         * attribute.cs (Attribute.Emit): Fixed error CS0579 reporting.
1267
1268 2004-06-11  Martin Baulig  <martin@ximian.com>
1269
1270         * expression.cs (Invocation.EmitCall): Use OpCodes.Callvirt for
1271         varargs methods if applicable.
1272
1273 2004-06-11  Martin Baulig  <martin@ximian.com>
1274
1275         * expression.cs (Invocation.EmitCall): Don't use
1276         `method.CallingConvention == CallingConventions.VarArgs' since the
1277         method could also have `CallingConventions.HasThis'.
1278
1279 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1280
1281         * class.cs (Event.GetSignatureForError): Implemented.
1282         Fixed crash in error test cs3010.cs
1283
1284 2004-06-10  Miguel de Icaza  <miguel@ximian.com>
1285
1286         * cs-tokenizer.cs: Change the way we track __arglist to be
1287         consistent with the other keywords.
1288
1289 2004-06-09  Miguel de Icaza  <miguel@ximian.com>
1290
1291         * codegen.cs: FAQ avoider: turn 1577 into a warning for now until
1292         tomorrow.
1293
1294 2004-06-09  Sebastien Pouliot  <sebastien@ximian.com>
1295
1296         * codegen.cs: Check that all referenced assemblies have a strongname
1297         before strongnaming the compiled assembly. If not report error CS1577.
1298         Fix bug #56563. Patch by Jackson Harper.
1299         * typemanager.cs: Added a method to return all referenced assemblies.
1300         Fix bug #56563. Patch by Jackson Harper.
1301
1302 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1303
1304         * class.cs:
1305         (Method.ApplyAttributeBuilder): Moved and added conditional
1306         attribute error tests (CS0577, CS0578, CS0243, CS0582, CS0629).
1307
1308         * delegate.cs:
1309         (DelegateCreation.ResolveMethodGroupExpr): Added error CS1618 test.
1310
1311 2004-06-08  Marek Safar  <marek.safar@seznam.cz>
1312
1313         Fixed #59640
1314         * class.cs: (EventField.attribute_targets): Changed default target.
1315
1316 2004-06-08  Martin Baulig  <martin@ximian.com>
1317
1318         * expression.cs (Invocation.EmitCall): Enable varargs methods.
1319
1320 2004-06-08  Martin Baulig  <martin@ximian.com>
1321
1322         * rootcontext.cs (ResolveCore): Added "System.RuntimeArgumentHandle".
1323
1324 2004-06-07  Martin Baulig  <martin@ximian.com>
1325
1326         Added support for varargs methods.
1327
1328         * cs-tokenizer.cs (Token.ARGLIST): New token for the `__arglist'
1329         keyword.
1330
1331         * cs-parser.jay: Added support for `__arglist'.
1332
1333         * decl.cs (MemberCache.AddMethods): Don't ignore varargs methods.
1334
1335         * expression.cs (Argument.AType): Added `ArgList'.
1336         (Invocation): Added support for varargs methods.
1337         (ArglistAccess): New public class.
1338         (Arglist): New public class.
1339
1340         * parameter.cs (Parameter.Modifier): Added `ARGLIST'.
1341
1342         * statement.cs (Block.Flags): Added `HasVarargs'.  We set this on
1343         a method's top-level block if the method has varargs.
1344
1345         * support.cs (ReflectionParameters, InternalParameters): Added
1346         support for varargs methods.    
1347
1348 2004-06-07  Miguel de Icaza  <miguel@ximian.com>
1349
1350         * class.cs: Provide location in indexer error report.
1351
1352         * driver.cs: Use standard names.
1353
1354         * namespace.cs: Catch the use of using after a namespace has been
1355         declared also on using aliases.
1356
1357 2004-06-03  Raja R Harinath  <rharinath@novell.com>
1358
1359         Bug #50820.
1360         * typemanager.cs (closure_private_ok, closure_invocation_type)
1361         (closure_qualifier_type, closure_invocation_assembly)
1362         (FilterWithClosure): Move to ...
1363         (Closure): New internal nested class.
1364         (Closure.CheckValidFamilyAccess): Split out from Closure.Filter.
1365         (MemberLookup, RealMemberLookup): Add new almost_match parameter.
1366         * ecore.cs (almostMatchedMembers): New variable to help report CS1540.
1367         (MemberLookup, MemberLookupFailed): Use it.
1368         * expression.cs (New.DoResolve): Treat the lookup for the
1369         constructor as being qualified by the 'new'ed type.
1370         (Indexers.GetIndexersForTypeOrInterface): Update.
1371
1372 2004-06-03  Marek Safar  <marek.safar@seznam.cz>
1373
1374         * attribute.cs
1375         (GetConditionalAttributeValue): New method. Returns
1376         condition of ConditionalAttribute.
1377         (SearchMulti): New method.  Returns all attributes of type 't'.
1378         Use it when attribute is AllowMultiple = true.
1379         (IsConditionalMethodExcluded): New method.
1380
1381         * class.cs
1382         (Method.IsExcluded): Implemented. Returns true if method has conditional
1383         attribute and the conditions is not defined (method is excluded).
1384         (IMethodData): Extended interface for ConditionalAttribute support.
1385         (PropertyMethod.IsExcluded): Implemented.
1386
1387         * decl.cs
1388         (MemberCore.Flags): Excluded_Undetected, Excluded new caching flags.
1389
1390         * expression.cs
1391         (Invocation.IsMethodExcluded): Checks the ConditionalAttribute
1392         on the method.
1393
1394 2004-06-02 Ben Maurer  <bmaurer@users.sourceforge.net>
1395
1396         * expression.cs (ArrayCreationExpression): Make this just an
1397         `expression'. It can't be a statement, so the code here was
1398         dead.
1399
1400 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1401
1402         Fixed #59072
1403         * typemanager.cs (GetFullNameSignature): New method for
1404         MethodBase types.
1405
1406 2004-06-02  Marek Safar  <marek.safar@seznam.cz>
1407
1408         Fixed #56452
1409         * class.cs (MemberBase.GetSignatureForError): New virtual method.
1410         Use this method when MethodBuilder is null.
1411         (MethodData.DefineMethodBuilder): Encapsulated code to the new method.
1412         Added test for error CS0626 (MONO reports error for this situation).
1413         (IMethodData.GetSignatureForError): Extended interface.
1414
1415 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1416
1417         * attribute.cs
1418         (AttributeTester.GetObsoleteAttribute): Returns instance of
1419         ObsoleteAttribute when type is obsolete.
1420
1421         * class.cs
1422         (TypeContainer.VerifyObsoleteAttribute): Override.
1423         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1424         (MethodCode.VerifyObsoleteAttribute): Override.
1425         (MemberBase.VerifyObsoleteAttribute): Override.
1426
1427         * decl.cs
1428         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1429         and report proper error.
1430
1431         *delegate.cs
1432         Delegate.VerifyObsoleteAttribute): Override.
1433
1434         * ecore.cs
1435         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1436         and report proper error.
1437         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1438
1439         * enum.cs
1440         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1441         and enum member.
1442
1443         * expression.cs
1444         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1445         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1446         Added test for ObsoleteAttribute.
1447
1448         * statement.cs
1449         (Catch): Derived from Statement.
1450
1451 2004-06-01  Marek Safar  <marek.safar@seznam.cz>
1452  
1453         Fixed bug #59071 & cs0160.cs
1454  
1455         * statement.cs (Try.Resolve): Check here whether order of catch
1456         clauses matches their dependencies.
1457
1458 2004-05-31  Miguel de Icaza  <miguel@ximian.com>
1459
1460         * Reverted patch to namespace.cs (Use lookuptypedirect).  This
1461         caused a regression: #59343.  Referencing nested classes from an
1462         assembly stopped working.
1463
1464 2004-05-31  Martin Baulig  <martin@ximian.com>
1465
1466         MCS is now frozen for beta 2.
1467
1468 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1469
1470         * convert.cs: add a trivial cache for overload operator resolution.
1471
1472 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1473
1474         * decl.cs: If possible, use lookuptypedirect here. We can only do
1475         this if there is no `.' after the namespace. Avoids using
1476         LookupType, which does lots of slow processing.
1477         (FindNestedType) New method, does what it says :-).
1478         * namespace.cs: use LookupTypeDirect.
1479         * rootcontext.cs: use membercache, if possible.
1480         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1481
1482 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1483
1484         * expression.cs:
1485         According to the spec, 
1486
1487         In a member access of the form E.I, if E is a single identifier,
1488         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1489         field, property, localvariable, or parameter with the same type as
1490         the meaning of E as a type-name (§3.8), then both possible
1491         meanings of E are permitted.
1492
1493         We did not check that E as a simple-name had the same type as E as
1494         a type name.
1495
1496         This trivial check gives us 5-7% on bootstrap time.
1497
1498 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1499
1500         * expression.cs (Invocation.OverloadResolve): Avoid the
1501         use of hashtables and boxing here by allocating on demand.
1502
1503 2004-05-30  Martin Baulig  <martin@ximian.com>
1504
1505         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1506         we're doing a silent lookup.  Don't try to lookup nested types in
1507         TypeManager.object_type (thanks to Ben Maurer).
1508
1509 2004-05-30  Martin Baulig  <martin@ximian.com>
1510
1511         Committing a patch from Ben Maurer.
1512
1513         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1514
1515 2004-05-29  Martin Baulig  <martin@ximian.com>
1516
1517         * class.cs (IMethodData.ShouldIgnore): New method.
1518
1519         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1520         `Location' argument, we don't need it anywhere.  Use
1521         `IMethodData.ShouldIgnore ()' instead of
1522         `MethodData.GetMethodFlags ()'.
1523         (TypeManager.AddMethod): Removed.
1524         (TypeManager.AddMethod2): Renamed to AddMethod.
1525
1526 2004-05-29  Martin Baulig  <martin@ximian.com>
1527
1528         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1529
1530         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1531         converting from a class type S to an interface type and we already
1532         have an object on the stack, don't box it again.  Fixes #52578.
1533
1534 2004-05-29  Martin Baulig  <martin@ximian.com>
1535
1536         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1537         Added support for `params' parameters.  Fixes #59267.
1538
1539 2004-05-29  Martin Baulig  <martin@ximian.com>
1540
1541         * literal.cs (NullPointer): Provide a private .ctor which sets
1542         `type' to TypeManager.object_type.  Fixes #59048.
1543
1544 2004-05-29  Martin Baulig  <martin@ximian.com>
1545
1546         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1547         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1548
1549         * ecore.cs (EventExpr.instance_expr): Make the field private.
1550
1551 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1552
1553         Fixed bug #50080 & cs0214-2.cs
1554         * expression.cs (Cast.DoResolve): Check unsafe context here.
1555         
1556         * statement.cs (Resolve.DoResolve): Likewise.
1557
1558 2004-05-26  Martin Baulig  <martin@ximian.com>
1559
1560         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1561
1562         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1563         (RootContext.LookupType): Pass down the `silent' flag.
1564
1565 2004-05-25  Martin Baulig  <martin@ximian.com>
1566
1567         * expression.cs
1568         (MethodGroupExpr.IdenticalTypeName): New public property.
1569         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1570         expression actually refers to a type.
1571
1572 2004-05-25  Martin Baulig  <martin@ximian.com>
1573
1574         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1575         for #56176 and made it actually work.
1576
1577 2004-05-25  Martin Baulig  <martin@ximian.com>
1578
1579         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1580         (FieldExpr, PropertyExpr): Override and implement
1581         CacheTemporaries.  Fixes #52279.
1582
1583 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1584
1585         * location.cs: In the new compiler listing a file twice is a
1586         warning, not an error.
1587
1588 2004-05-24  Martin Baulig  <martin@ximian.com>
1589
1590         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1591         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1592
1593 2004-05-24  Martin Baulig  <martin@ximian.com>
1594
1595         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1596         walking the `using' list.  Fixes #53921.
1597
1598 2004-05-24  Martin Baulig  <martin@ximian.com>
1599
1600         * const.cs (Const.LookupConstantValue): Added support for
1601         EmptyCast's; fixes #55251.
1602
1603 2004-05-24  Martin Baulig  <martin@ximian.com>
1604
1605         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1606         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1607         which does the CS0135 check.  The reason is that we first need to
1608         check whether the variable actually exists.
1609
1610 2004-05-24  Martin Baulig  <martin@ximian.com>
1611
1612         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1613         than RootContext.LookupType() to find the explicit interface
1614         type.  Fixes #58584.
1615
1616 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1617
1618         * Makefile: Simplify.  Use executable.make.
1619         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1620
1621 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1622
1623         * decl.cs:
1624         * enum.cs:
1625         Use the invariant culture when doing String.Compare for CLS case
1626         sensitivity.
1627         
1628 2004-05-23  Martin Baulig  <martin@ximian.com>
1629
1630         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1631         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1632
1633         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1634         
1635 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1636
1637         * class.cs (MemberBase.Define): Reuse MemberType member for 
1638         resolved type. Other methods can use it too.
1639
1640 2004-05-23  Martin Baulig  <martin@ximian.com>
1641
1642         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1643         the variable also exists in the current block (otherwise, we need
1644         to report a CS0103).  Fixes #58670.
1645
1646 2004-05-23  Martin Baulig  <martin@ximian.com>
1647
1648         * flowanalysis.cs (Reachability.Reachable): Compute this
1649         on-the-fly rather than storing it as a field.
1650
1651 2004-05-23  Martin Baulig  <martin@ximian.com>
1652
1653         * flowanalysis.cs (Reachability.And): Manually compute the
1654         resulting `barrier' from the reachability.      
1655        
1656 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1657
1658         Fix bug #57835
1659         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1660         instance of ObsoleteAttribute when symbol is obsolete.
1661
1662         * class.cs
1663         (IMethodData): Extended interface for ObsoleteAttribute support.
1664
1665 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1666
1667         * attribute.cs: Fix bug #55970
1668
1669 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1670
1671         Fix bug #52705
1672         * attribute.cs
1673         (GetObsoleteAttribute): New method. Creates the instance of
1674         ObsoleteAttribute.
1675         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1676         ObsoleteAttribute when member is obsolete.
1677         (AttributeTester.Report_ObsoleteMessage): Common method for
1678         Obsolete error/warning reporting.
1679
1680         * class.cs
1681         (TypeContainer.base_classs_type): New member for storing parent type.
1682
1683         * decl.cs
1684         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1685         for this MemberCore.
1686
1687 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1688
1689         * attribute.cs, const.cs: Fix bug #58590
1690
1691 2004-05-21  Martin Baulig  <martin@ximian.com>
1692
1693         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1694         out parameters if the end of the method is unreachable.  Fixes
1695         #58098. 
1696
1697 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1698
1699         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1700         Hari was right, why extra method.
1701
1702 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1703
1704         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1705
1706 2004-05-20  Martin Baulig  <martin@ximian.com>
1707
1708         Merged this back from gmcs to keep the differences to a minumum.
1709
1710         * attribute.cs (Attribute.CheckAttributeType): Take an EmitContext
1711         instead of a Declspace.
1712         (Attribute.ResolveType): Likewise.
1713         (Attributes.Search): Likewise.
1714         (Attributes.Contains): Likewise.
1715         (Attributes.GetClsCompliantAttribute): Likewise.
1716
1717         * class.cs (TypeContainer.VerifyMembers): Added EmitContext
1718         argument.
1719         (MethodData.ApplyAttributes): Take an EmitContext instead of a
1720         DeclSpace.
1721
1722 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1723
1724         Fix bug #58688 (MCS does not report error when the same attribute
1725         is assigned twice)
1726
1727         * attribute.cs (Attribute.Emit): Distinction between null and default.
1728
1729 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1730
1731         * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1732         of a top-level attribute without an attribute target.
1733         * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1734         Make non-static.
1735         (Attribute.Conditional_GetConditionName), 
1736         (Attribute.Obsolete_GetObsoleteMessage): Update.
1737         (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1738         part of ScanForIndexerName.
1739         (Attribute.CanIgnoreInvalidAttribute): New function.
1740         (Attribute.ScanForIndexerName): Move to ...
1741         (Attributes.ScanForIndexerName): ... here.
1742         (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1743         (Attributes.Search): New internal variant that can choose not to
1744         complain if types aren't resolved.  The original signature now
1745         complains.
1746         (Attributes.GetClsCompliantAttribute): Use internal variant, with
1747         complaints suppressed.
1748         (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1749         only if it not useful.
1750         (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1751         top-level for attributes that are shared between the assembly
1752         and a top-level class.
1753         * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1754         * class.cs: Update to reflect changes.
1755         (DefineIndexers): Fuse loops.
1756         * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1757         a couple more variants of attribute names.
1758
1759 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1760
1761         Fix bug #52585 (Implemented explicit attribute declaration)
1762
1763         * attribute.cs:
1764         (Attributable.ValidAttributeTargets): New abstract method. It gets
1765         list of valid attribute targets for explicit target declaration.
1766         (Attribute.Target): It holds target itself.
1767         (AttributeSection): Removed.
1768         (Attribute.CheckTargets): New method. It checks whether attribute
1769         target is valid for the current element.
1770
1771         * class.cs:
1772         (EventProperty): New class. For events that are declared like
1773         property (with add and remove accessors).
1774         (EventField): New class. For events that are declared like field.
1775         class.cs
1776
1777         * cs-parser.jay: Implemented explicit attribute target declaration.
1778
1779         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1780         Override ValidAttributeTargets.
1781
1782         * parameter.cs:
1783         (ReturnParameter): Class for applying custom attributes on 
1784         the return type.
1785         (ParameterAtribute): New class. Class for applying custom
1786         attributes on the parameter type.
1787
1788 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1789
1790         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1791         definitions. 
1792
1793         (Method): Allow UNSAFE here.
1794
1795         * modifiers.cs: Support unsafe reporting.
1796
1797 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1798
1799         * decl.cs: Fix bug #58478.
1800
1801 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1802
1803         * statement.cs: When checking for unreachable code on an EmptyStatement,
1804         set the location. Fixes bug #58488.
1805
1806 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1807
1808         * driver.cs: Add -pkg handling.
1809
1810         From Gonzalo: UseShelLExecute=false
1811
1812 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1813
1814         * attribute.cs:
1815         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1816         for attribute.
1817         (Attribute.IsClsCompliaceRequired): Moved to base for better
1818         accesibility.
1819         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1820         when attribute is AttributeUsageAttribute.
1821         (Attribute.GetValidTargets): Simplified.
1822         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1823         attribute for this type.
1824         (Attribute.ApplyAttributes): Method renamed to Emit and make
1825         non-static.
1826         (GlobalAttributeSection): New class for special handling of global
1827         attributes (assembly, module).
1828         (AttributeSection.Emit): New method.
1829
1830         * class.cs: Implemented Attributable abstract methods.
1831         (MethodCore.LabelParameters): Moved to Parameter class.
1832         (Accessor): Is back simple class.
1833         (PropertyMethod): Implemented Attributable abstract class.
1834         (DelegateMethod): Implemented Attributable abstract class.
1835         (Event): New constructor for disctintion between normal Event
1836         and Event with accessors.
1837
1838         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1839
1840         * codegen.cs, const.cs, decl.cs, delegate.cs:
1841         (CommonAssemblyModulClass): Implemented Attributable abstract class
1842         and simplified.
1843
1844         * enum.cs: Implement IAttributeSupport interface.
1845         (EnumMember): New class for emum members. Implemented Attributable
1846         abstract class
1847
1848         * parameter.cs:
1849         (ParameterBase): Is abstract.
1850         (ReturnParameter): New class for easier [return:] attribute handling.
1851
1852         * typemanager.cs: Removed builder_to_attr.
1853
1854 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1855
1856         Fix bug #57151.
1857         * attribute.cs (Attribute.GetPositionalValue): New function.
1858         * class.cs (TypeContainer.VerifyMembers): New function.
1859         (TypeContainer.Emit): Use it.
1860         (ClassOrStruct): New base class for Class and Struct.
1861         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1862         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1863         class.
1864         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1865         then each non-static field should have a FieldOffset attribute.
1866         Otherwise, none of the fields should have a FieldOffset attribute.
1867         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1868         and FieldOffset attributes.
1869         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1870         (TypeManager.field_offset_attribute_type): New core types.
1871         (TypeManager.InitCoreTypes): Initialize them.
1872
1873 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1874
1875         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1876         Return correct type.
1877         From bug #58270.
1878
1879 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1880
1881         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1882         be implicitly converted to ulong.
1883         
1884         * expression.cs: The logic for allowing operator &, | and ^ worked
1885         was wrong, it worked before because we did not report an error in
1886         an else branch.  Fixes 57895.
1887
1888         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1889         allow volatile fields to be reference types.
1890
1891 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1892
1893         * driver.cs: Add support for /debug-
1894
1895 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1896
1897         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1898         Add a 'complain' parameter to silence errors.
1899         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1900         silently overlooked type-resolutions.
1901         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1902         to reflect changes.
1903         (Attributes.Search): New function.
1904         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1905         (Attributes.GetAttributeFullName): Remove hack.
1906         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1907         Update to reflect changes.
1908         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1909         Use Attributes.Search instead of nested loops.
1910
1911 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1912
1913         * decl.cs:
1914         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1915         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1916         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1917
1918         * report.cs: (Report.Warning): Renamed to Warning_T because of
1919         parameter collision.
1920
1921 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1922
1923         * expression.cs (MemberAccess.ResolveMemberAccess):
1924         Exit with non-zero status after Report.Error.
1925         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1926         Likewise.
1927         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1928
1929 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1930
1931         * support.cs: Don't hang when the file is empty.
1932
1933 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1934
1935         * support.cs: In SeekableStreamReader, compute the preamble size of the
1936           underlying stream. Position changes should take into account that initial
1937           count of bytes.
1938
1939 2004-05-03  Todd Berman  <tberman@sevenl.net>
1940
1941         * driver.cs: remove unused GetSysVersion function.
1942
1943 2004-05-03  Todd Berman  <tberman@sevenl.net>
1944
1945         * driver.cs: Remove the hack from saturday, as well as the hack
1946         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1947         link_paths to get that bit proper.
1948
1949 2004-05-01  Todd Berman  <tberman@sevenl.net>
1950
1951         * driver.cs: Try a LoadFrom before a Load, this checks the current
1952         path. This is currently a bug in mono that is be fixed, however, this
1953         provides a workaround for now. This will be removed when the bug
1954         is fixed.
1955
1956 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1957
1958         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1959         incomplete key pairs (#57941).
1960
1961 2004-05-01  Todd Berman  <tberman@sevenl.net>
1962
1963         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1964         from the GAC
1965
1966 2004-04-30  Jackson Harper  <jackson@ximian.com>
1967
1968         * codegen.cs: Open keys readonly.
1969         
1970 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1971
1972         * typemanager.cs: don't report cyclic struct layout when a struct
1973         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1974         which has 2 Pango.Rectangle fields.
1975
1976 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1977
1978         * expression.cs: Handle IntPtr comparisons with IL code
1979         rather than a method call.
1980
1981 2004-04-29  Martin Baulig  <martin@ximian.com>
1982
1983         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1984         the list of PropertyInfo's in class hierarchy and find the
1985         accessor.  Fixes #56013.
1986
1987 2004-04-29  Martin Baulig  <martin@ximian.com>
1988
1989         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
1990
1991 2004-04-29  Martin Baulig  <martin@ximian.com>
1992
1993         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1994
1995         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
1996
1997 2004-04-29  Martin Baulig  <martin@ximian.com>
1998
1999         * class.cs (ConstructorInitializer.Resolve): Check whether the
2000         parent .ctor is accessible.  Fixes #52146.
2001
2002 2004-04-29  Martin Baulig  <martin@ximian.com>
2003
2004         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2005
2006         * statement.cs (Using.EmitLocalVariableDecls): Use
2007         TypeManager.idisposable_type, not typeof (IDisposable).
2008         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2009
2010 2004-04-29  Martin Baulig  <martin@ximian.com>
2011
2012         * class.cs (Event.Define): Don't emit the field and don't set
2013         RTSpecialName and SpecialName for events on interfaces.  Fixes
2014         #57703. 
2015
2016 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2017
2018         Refactor Attribute.ApplyAttributes.
2019         * attribute.cs (Attributable): New base class for objects that can
2020         have Attributes applied on them.
2021         (Attribute): Make AttributeUsage fields public.
2022         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2023         (Attribute.IsInternalCall): New property.
2024         (Attribute.UsageAttr): Convert to a public read-only property.
2025         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2026         (Attribute.ResolveType, Attribute.Resolve)
2027         (Attribute.ScanForIndexerName): Update to reflect changes.
2028         (Attribute.CheckAttributeTarget): Re-format.
2029         (Attribute.ApplyAttributes): Refactor, to various
2030         Attributable.ApplyAttributeBuilder methods.
2031         * decl.cs (MemberCore): Make Attributable.
2032         * class.cs (Accessor): Make Attributable.
2033         (MethodData.ApplyAttributes): Use proper attribute types, not
2034         attribute names.
2035         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2036         (TypeContainer.ApplyAttributeBuilder)
2037         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2038         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2039         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2040         (Operator.ApplyAttributeBuilder): New factored-out methods.
2041         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2042         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2043         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2044         * parameter.cs (ParameterBase): New Attributable base class
2045         that can also represent Return types.
2046         (Parameter): Update to the changes.
2047
2048 2004-04-29  Jackson Harper  <jackson@ximian.com>
2049
2050         * driver.cs: Prefer the corlib system version when looking for
2051         assemblies in the GAC. This is still a hack, but its a better hack
2052         now.
2053         
2054 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2055
2056         * decl.cs, enum.cs: Improved error 3005 reporting.
2057   
2058         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2059         (related_symbols): New private member for list of symbols
2060         related to reported error/warning.
2061         
2062         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2063
2064 2004-04-29  Martin Baulig  <martin@ximian.com>
2065
2066         * ecore.cs (Expression.Constantify): If we're an enum and
2067         TypeManager.TypeToCoreType() doesn't give us another type, use
2068         t.UnderlyingSystemType.  Fixes #56178.  
2069
2070 2004-04-29  Martin Baulig  <martin@ximian.com>
2071
2072         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2073         interfaces and for each interface, only add members directly
2074         declared in that interface.  Fixes #53255.
2075
2076 2004-04-28  Martin Baulig  <martin@ximian.com>
2077
2078         * expression.cs (ConditionalLogicalOperator): Use a temporary
2079         variable for `left' to avoid that we evaluate it more than once;
2080         bug #52588.
2081
2082 2004-04-28  Martin Baulig  <martin@ximian.com>
2083
2084         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2085         `void[]' (CS1547).
2086
2087 2004-04-28  Martin Baulig  <martin@ximian.com>
2088
2089         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2090         void (CS1547).
2091
2092         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2093         whether the type is not void (CS1547).
2094
2095 2004-04-28  Martin Baulig  <martin@ximian.com>
2096
2097         * expression.cs (Unary.DoResolveLValue): Override this and report
2098         CS0131 for anything but Operator.Indirection.
2099
2100 2004-04-28  Martin Baulig  <martin@ximian.com>
2101
2102         Committing a patch from Ben Maurer; see bug #50820.
2103
2104         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2105         check for classes.
2106
2107         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2108         classes.        
2109
2110 2004-04-28  Martin Baulig  <martin@ximian.com>
2111
2112         Committing a patch from Ben Maurer; see bug #50820.
2113
2114         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2115         check for classes.
2116
2117         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2118         classes.        
2119
2120 2004-04-28  Martin Baulig  <martin@ximian.com>
2121
2122         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2123         (Block.AddLabel): Call DoLookupLabel() to only search in the
2124         current block.
2125
2126 2004-04-28  Martin Baulig  <martin@ximian.com>
2127
2128         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2129         comparing StringConstants and NullLiterals in Equality and Inequality.
2130
2131 2004-04-28  Jackson Harper  <jackson@ximian.com>
2132
2133         * driver.cs: Attempt to load referenced assemblies from the
2134         GAC. This is the quick and dirty version of this method that
2135         doesnt take into account versions and just takes the first
2136         canidate found. Will be good enough for now as we will not have more
2137         then one version installed into the GAC until I update this method.
2138
2139 2004-04-28  Martin Baulig  <martin@ximian.com>
2140
2141         * typemanager.cs (TypeManager.CheckStructCycles): New public
2142         static method to check for cycles in the struct layout.
2143
2144         * rootcontext.cs (RootContext.PopulateTypes): Call
2145         TypeManager.CheckStructCycles() for each TypeContainer.
2146         [Note: We only need to visit each type once.]
2147
2148 2004-04-28  Martin Baulig  <martin@ximian.com>
2149
2150         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2151
2152         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2153         success and added `out object value'.  Use a `bool resolved' field
2154         to check whether we've already been called rather than
2155         `ConstantValue != null' since this breaks for NullLiterals.
2156
2157 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2158
2159         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2160         setting of this flag, since the 'set' method may be non-public.
2161
2162 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2163
2164         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2165         check on current_vector.Block.
2166
2167 2004-04-27  Martin Baulig  <martin@ximian.com>
2168
2169         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2170         a field initializer.  Fixes #56459.
2171
2172 2004-04-27  Martin Baulig  <martin@ximian.com>
2173
2174         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2175         we're not attempting to use an indexer.  Fixes #52154.
2176
2177 2004-04-27  Martin Baulig  <martin@ximian.com>
2178
2179         * statement.cs (Return): Don't create a return label if we don't
2180         need it; reverts my change from January 20th.  Thanks to Ben
2181         Maurer for this.
2182
2183 2004-04-27  Martin Baulig  <martin@ximian.com>
2184
2185         According to the spec, `goto' can only leave a nested scope, but
2186         never enter it.
2187
2188         * statement.cs (Block.LookupLabel): Only lookup in the current
2189         block, don't recurse into parent or child blocks.
2190         (Block.AddLabel): Check in parent and child blocks, report
2191         CS0140/CS0158 if we find a duplicate.
2192         (Block): Removed this indexer for label lookups.
2193         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2194         this already does the error reporting for us.
2195
2196         * flowanalysis.cs
2197         (FlowBranching.UsageVector.Block): New public variable; may be null.
2198         (FlowBranching.CreateSibling): Added `Block' argument.
2199         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2200         label for the target of a `goto' and check whether we're not
2201         leaving a `finally'.
2202
2203 2004-04-27  Martin Baulig  <martin@ximian.com>
2204
2205         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2206         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2207         just for returns).
2208
2209 2004-04-27  Martin Baulig  <martin@ximian.com>
2210
2211         * statement.cs (Block.AddLabel): Also check for implicit blocks
2212         and added a CS0158 check.
2213
2214 2004-04-27  Martin Baulig  <martin@ximian.com>
2215
2216         * flowanalysis.cs (FlowBranchingLoop): New class.
2217         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2218         UsageVector's instead of an ArrayList.
2219         (FlowBranching.Label): Likewise.
2220         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2221         (FlowBranching.AddBreakVector): New method.
2222
2223 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2224
2225         * attribute.cs: Small regression fix: only convert the type if we
2226         the type is different, fixes System.Drawing build.
2227
2228 2004-04-27  Martin Baulig  <martin@ximian.com>
2229
2230         * attribute.cs (Attribute.Resolve): If we have a constant value
2231         for a named field or property, implicity convert it to the correct
2232         type.
2233
2234 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2235
2236         * statement.cs (Block.Block): Implicit blocks share
2237         'child_variable_names' fields with parent blocks.
2238         (Block.AddChildVariableNames): Remove.
2239         (Block.AddVariable): Mark variable as "used by a child block" in
2240         every surrounding block.
2241         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2242         been used in a child block, complain about violation of "Invariant
2243         meaning in blocks" rule.
2244         * cs-parser.jay (declare_local_variables): Don't use
2245         AddChildVariableNames.
2246         (foreach_statement): Don't create an implicit block: 'foreach'
2247         introduces a scope.
2248
2249 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2250
2251         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2252         converting from 0L to ulong.  Fixes 57522.
2253
2254 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2255
2256         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2257         derived class hides via 'new' keyword field from base class (test-242.cs).
2258         TODO: Handle this in the more general way.
2259         
2260         * class.cs (CheckBase): Ditto.
2261
2262 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2263
2264         * decl.cs (caching_flags): New member for storing cached values
2265         as bit flags.
2266         (MemberCore.Flags): New enum where bit flags for caching_flags
2267         are defined.
2268         (MemberCore.cls_compliance): Moved to caching_flags.
2269         (DeclSpace.Created): Moved to caching_flags.
2270
2271         * class.cs: Use caching_flags instead of DeclSpace.Created
2272         
2273 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2274
2275         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2276         if we are only a derived class, not a nested class.
2277
2278         * typemanager.cs: Same as above, but do this at the MemberLookup
2279         level (used by field and methods, properties are handled in
2280         PropertyExpr).   Allow for the qualified access if we are a nested
2281         method. 
2282
2283 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2284
2285         * class.cs: Refactoring.
2286         (IMethodData): New inteface; Holds links to parent members
2287         to avoid member duplication (reduced memory allocation).
2288         (Method): Implemented IMethodData interface.
2289         (PropertyBase): New inner classes for get/set methods.
2290         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2291         (Event): New inner classes for add/remove methods.
2292         (Event.DelegateMethod): Implemented IMethodData interface.
2293
2294         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2295         EmitContext (related to class.cs refactoring).
2296
2297 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2298
2299         * delegate.cs (Delegate.VerifyApplicability): If the number of
2300         arguments are the same as the number of parameters, first try to
2301         verify applicability ignoring  any 'params' modifier on the last
2302         parameter.
2303         Fixes #56442.
2304
2305 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2306
2307         * class.cs (TypeContainer.AddIndexer): Use
2308         'ExplicitInterfaceName' to determine if interface name was
2309         explicitly specified.  'InterfaceType' is not initialized at this time.
2310         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2311         Indexers array is already in the required order.  Initialize
2312         'IndexerName' only if there are normal indexers.
2313         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2314         (TypeContainer.Emit): Emit DefaultMember attribute only if
2315         IndexerName is initialized.
2316         Fixes #56300.
2317
2318 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2319
2320         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2321         Fixes #57007
2322
2323 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2324
2325         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2326         attributes.
2327         Fix for #56456.
2328
2329         * attribute.cs (Attribute.Resolve): Check for duplicate named
2330         attributes.
2331         Fix for #56463.
2332
2333 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2334
2335         * iterators.cs (MarkYield): track whether we are in an exception,
2336         and generate code accordingly.  Use a temporary value to store the
2337         result for our state.
2338
2339         I had ignored a bit the interaction of try/catch with iterators
2340         since their behavior was not entirely obvious, but now it is
2341         possible to verify that our behavior is the same as MS .NET 2.0
2342
2343         Fixes 54814
2344
2345 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2346
2347         * iterators.cs: Avoid creating temporaries if there is no work to
2348         do. 
2349
2350         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2351         Enumerations, use TypeManager.EnumToUnderlying and call
2352         recursively. 
2353
2354         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2355         bug #57013
2356
2357         (This.Emit): Use EmitContext.EmitThis to emit our
2358         instance variable.
2359
2360         (This.EmitAssign): Ditto.
2361
2362         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2363         codepaths, we will move all the functionality into
2364         Mono.CSharp.This 
2365
2366         (FieldExpr.EmitAssign): Ditto.
2367
2368         This fixes several hidden bugs that I uncovered while doing a code
2369         review of this today.
2370
2371         * codegen.cs (EmitThis): reworked so the semantics are more clear
2372         and also support value types "this" instances.
2373
2374         * iterators.cs: Changed so that for iterators in value types, we
2375         do not pass the value type as a parameter.  
2376
2377         Initialization of the enumerator helpers is now done in the caller
2378         instead of passing the parameters to the constructors and having
2379         the constructor set the fields.
2380
2381         The fields have now `assembly' visibility instead of private.
2382
2383 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2384
2385         * expression.cs (Argument.Resolve): Check if fields passed as ref
2386         or out are contained in a MarshalByRefObject.
2387
2388         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2389         another compiler type.
2390
2391 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2392
2393         * class.cs (Indexer.Define): use the new name checking method.
2394         Also, return false on an error.
2395         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2396         (is_identifier_[start/part]_character): make static.
2397
2398 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2399
2400         * expression.cs (Binary.ResolveOperator): Do no append strings
2401         twice: since we can be invoked more than once (array evaluation)
2402         on the same concatenation, take care of this here.  Based on a fix
2403         from Ben (bug #56454)
2404
2405 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2406
2407         * codegen.cs: Fix another case where CS1548 must be reported (when 
2408         delay-sign isn't specified and no private is available #56564). Fix
2409         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2410         error when MCS is used on the MS runtime and we need to delay-sign 
2411         (which seems unsupported by AssemblyBuilder - see #56621).
2412
2413 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2414
2415         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2416         (TypeManager.ComputeNamespaces): Faster implementation for
2417         Microsoft runtime.
2418
2419         * compiler.csproj: Updated AssemblyName to mcs.
2420
2421 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2422
2423         * rootcontext.cs: Add new types to the boot resolution.
2424
2425         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2426         MulticastDelegate is not allowed.
2427
2428         * typemanager.cs: Add new types to lookup: System.TypedReference
2429         and ArgIterator.
2430
2431         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2432         check for TypedReference or ArgIterator, they are not allowed. 
2433
2434         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2435         makes us properly catch 1510 in some conditions (see bug 56016 for
2436         details). 
2437
2438 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2439
2440         * CryptoConvert.cs: update from corlib version
2441         with endian fixes.
2442
2443 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2444
2445         * class.cs (Indexer.Define): Check indexername declaration
2446
2447 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2448
2449         * attribute.cs (IsClsCompliant): Fixed problem with handling
2450         all three states (compliant, not-compliant, undetected).
2451
2452 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2453
2454         * attribute.cs (Attribute): Location is now public.
2455         (Resolve): Store resolved arguments (pos_values) in attribute class.
2456         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2457         (GetClsCompliantAttributeValue): New method that gets
2458         CLSCompliantAttribute value.
2459         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2460         if exists else null.
2461         (AttributeTester): New class for CLS-Compliant verification routines.
2462
2463         * class.cs (Emit): Add CLS-Compliant verification.
2464         (Method.GetSignatureForError): Implemented.
2465         (Constructor.GetSignatureForError): Implemented
2466         (Constructor.HasCompliantArgs): Returns if constructor has
2467         CLS-Compliant arguments.
2468         (Constructor.Emit): Override.
2469         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2470         is needed to test only parameters.
2471         (FieldBase.GetSignatureForError): Implemented.
2472         (TypeContainer): New member for storing base interfaces.
2473         (TypeContainer.FindMembers): Search in base interfaces too.
2474
2475         * codegen.cs (GetClsComplianceAttribute): New method that gets
2476         assembly or module CLSCompliantAttribute value.
2477         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2478         for assembly.
2479         (ModuleClass.Emit): Add error 3012 test.
2480
2481         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2482
2483         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2484         state for all decl types.
2485         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2486         if CLS-Compliant tests are required.
2487         (IsClsCompliaceRequired): New method. Analyze whether code
2488         must be CLS-Compliant.
2489         (IsExposedFromAssembly): New method. Returns true when MemberCore
2490         is exposed from assembly.
2491         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2492         value or gets cached value.
2493         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2494         is explicitly marked with CLSCompliantAttribute.
2495         (IsIdentifierClsCompliant): New abstract method. This method is
2496         used to testing error 3005.
2497         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2498         for identifier and parameters CLS-Compliant testing.
2499         (VerifyClsCompliance): New method. The main virtual method for
2500         CLS-Compliant verifications.
2501         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2502         null. I don't know why is null (too many public members !).
2503         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2504         and get value of first CLSCompliantAttribute that found.
2505
2506         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2507         (VerifyClsCompliance): Override and add extra tests.
2508
2509         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2510         clscheck- disable CLS-Compliant verification event if assembly is has
2511         CLSCompliantAttribute(true).
2512
2513         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2514         ApllyAttribute is now called in emit section as in the other cases.
2515         Possible future Emit integration.
2516         (IsIdentifierClsCompliant): New override.
2517         (VerifyClsCompliance): New override.
2518         (GetEnumeratorName): Returns full enum name.
2519
2520         * parameter.cs (GetSignatureForError): Implemented.
2521
2522         * report.cs (WarningData): New struct for Warning message information.
2523         (LocationOfPreviousError): New method.
2524         (Warning): New method. Reports warning based on the warning table.
2525         (Error_T): New method. Reports error based on the error table.
2526
2527         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2528         verifications are done here.
2529
2530         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2531
2532         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2533         CLSCompliantAttribute.
2534         (all_imported_types): New member holds all imported types from other
2535         assemblies.
2536         (LoadAllImportedTypes): New method fills static table with exported types
2537         from all referenced assemblies.
2538         (Modules): New property returns all assembly modules.
2539
2540 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2541
2542         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2543         throwing a parser error.
2544
2545         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2546         which removes the hardcoded get_/set_ prefixes for properties, as
2547         IL allows for the properties to be named something else.  
2548
2549         Bug #56013
2550
2551         * expression.cs: Do not override operand before we know if it is
2552         non-null.  Fix 56207
2553
2554 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2555
2556         * typemanager.cs: support for pinned variables.
2557
2558 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2559
2560         * decl.cs, typemanager.cs: Avoid using an arraylist
2561         as a buffer if there is only one result set.
2562
2563 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2564
2565         * expression.cs: Make sure you cant call a static method
2566         with an instance expression, bug #56174.
2567
2568 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
2569
2570         * class.cs (IsDuplicateImplementation): Improve error reporting to
2571         flag 663 (method only differs in parameter modifier).
2572
2573         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
2574         in preprocessor directives.
2575
2576         * location.cs (LookupFile): Allow for the empty path.
2577
2578         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
2579         better approach for some of that patch, but its failing with the
2580         CharSet enumeration.  For now try/catch will do.
2581
2582         * typemanager.cs: Do not crash if a struct does not have fields.
2583         Fixes 56150.
2584
2585 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2586
2587         * expression.cs: cs0213, cant fix a fixed expression.
2588         fixes 50231.
2589
2590 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2591
2592         * cs-parser.jay: detect invalid embeded statements gracefully.
2593         bug #51113.
2594
2595 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
2596
2597         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
2598         As a regex:
2599         s/
2600         the invocation type may not be a subclass of the tye of the item/
2601         The type of the item must be a subclass of the invocation item.
2602         /g
2603
2604         Fixes bug #50820.
2605
2606 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
2607
2608         * attribute.cs: Added methods to get a string and a bool from an
2609         attribute. Required to information from AssemblyKeyFileAttribute,
2610         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
2611         * codegen.cs: Modified AssemblyName creation to include support for
2612         strongnames. Catch additional exceptions to report them as CS1548.
2613         * compiler.csproj: Updated include CryptoConvert.cs.
2614         * compiler.csproj.user: Removed file - user specific configuration.
2615         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
2616         Mono.Security assembly. The original class is maintained and tested in
2617         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
2618         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
2619         like CSC 8.0 (C# v2) supports.
2620         * Makefile: Added CryptoConvert.cs to mcs sources.
2621         * rootcontext.cs: Added new options for strongnames.
2622
2623 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
2624
2625         * driver.cs: For --expect-error, report error code `2'
2626         if the program compiled with no errors, error code `1' if
2627         it compiled with an error other than the one expected.
2628
2629 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
2630
2631         * compiler.csproj: Updated for Visual Studio .NET 2003.
2632         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
2633         * compiler.sln: Updated for Visual Studio .NET 2003.
2634
2635 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
2636
2637         * expression.cs: Fix bug #47234. We basically need to apply the
2638         rule that we prefer the conversion of null to a reference type
2639         when faced with a conversion to 'object' (csc behaviour).
2640
2641 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2642
2643         * statement.cs: Shorter form for foreach, eliminates
2644         a local variable. r=Martin.
2645
2646 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2647
2648         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
2649         checks if we can use brtrue/brfalse to test for 0.
2650         * expression.cs: use the above in the test for using brtrue/brfalse.
2651         cleanup code a bit.
2652
2653 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2654
2655         * expression.cs: Rewrite string concat stuff. Benefits:
2656
2657         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
2658         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
2659         rather than a concat chain.
2660
2661         * typemanager.cs: Add lookups for more concat overloads.
2662
2663 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
2664
2665         * expression.cs: Emit shorter il code for array init.
2666
2667         newarr
2668         dup
2669         // set 1
2670
2671         // set 2
2672
2673         newarr
2674         stloc.x
2675
2676         ldloc.x
2677         // set 1
2678
2679         ldloc.x
2680         // set 2
2681
2682 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
2683
2684         * statement.cs: Before, two switch blocks would be merged if the
2685         total size of the blocks (end_item - begin_item + 1) was less than
2686         two times the combined sizes of the blocks.
2687
2688         Now, it will only merge if after the merge at least half of the
2689         slots are filled.
2690
2691         fixes 55885.
2692
2693 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
2694
2695         * class.cs : csc build fix for GetMethods(). See bug #52503.
2696
2697 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
2698
2699         * expression.cs: Make sure fp comparisons work with NaN.
2700         This fixes bug #54303. Mig approved this patch a long
2701         time ago, but we were not able to test b/c the runtime
2702         had a related bug.
2703
2704 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
2705
2706         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
2707
2708 2004-03-19  Martin Baulig  <martin@ximian.com>
2709
2710         * class.cs (MemberCore.IsDuplicateImplementation): Report the
2711         error here and not in our caller.
2712
2713 2004-03-19  Martin Baulig  <martin@ximian.com>
2714
2715         * interface.cs: Completely killed this file.
2716         (Interface): We're now a TypeContainer and live in class.cs.
2717
2718         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
2719         argument; we're now also called for interfaces.
2720         (TypeContainer.DefineMembers): Allow this method being called
2721         multiple times.
2722         (TypeContainer.GetMethods): New public method; formerly known as
2723         Interface.GetMethod().  This is used by PendingImplementation.
2724         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
2725         it's now private and non-static.
2726         (Interface): Moved this here; it's now implemented similar to
2727         Class and Struct.
2728         (Method, Property, Event, Indexer): Added `bool is_interface'
2729         argument to their .ctor's.
2730         (MemberBase.IsInterface): New public field.
2731
2732         * cs-parser.jay: Create normal Method, Property, Event, Indexer
2733         instances instead of InterfaceMethod, InterfaceProperty, etc.
2734         (opt_interface_base): Removed; we now use `opt_class_base' instead.
2735         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
2736
2737 2004-03-19  Martin Baulig  <martin@ximian.com>
2738
2739         * class.cs (MethodCore.IsDuplicateImplementation): New private
2740         method which does the CS0111 checking.
2741         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
2742         Use IsDuplicateImplementation().
2743
2744 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
2745
2746         * decl.cs (FindMemberToOverride): New method to find the correct
2747         method or property to override in the base class.
2748         * class.cs
2749             - Make Method/Property use the above method to find the
2750               version in the base class.
2751             - Remove the InheritableMemberSignatureCompare as it is now
2752               dead code.
2753
2754         This patch makes large code bases much faster to compile, as it is
2755         O(n) rather than O(n^2) to do this validation.
2756
2757         Also, it fixes bug 52458 which is that nested classes are not
2758         taken into account when finding the base class member.
2759
2760         Reviewed/Approved by Martin.
2761
2762 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
2763
2764         * interface.cs: In all interface classes removed redundant
2765         member initialization.
2766
2767 2004-03-16  Martin Baulig  <martin@ximian.com>
2768
2769         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
2770
2771 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
2772
2773         * decl.cs (DefineTypeAndParents): New helper method to define a
2774         type's containers before the type itself is defined;  This is a
2775         bug exposed by the recent changes to Windows.Forms when an
2776         implemented interface was defined inside a class that had not been
2777         built yet.   
2778
2779         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
2780
2781         (Check): Loop correctly to report errors modifiers
2782         (UNSAFE was not in the loop, since it was the same as TOP).
2783
2784         * interface.cs: Every interface member now takes a ModFlags,
2785         instead of a "is_new" bool, which we set on the base MemberCore. 
2786
2787         Every place where we called "UnsafeOk" in the interface, now we
2788         call the proper member (InterfaceMethod.UnsafeOK) instead to get
2789         the unsafe settings from the member declaration instead of the
2790         container interface. 
2791
2792         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
2793
2794         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
2795         `set_indexer_name' to the pending bits (one per type).
2796
2797         We fixed a bug today that was picking the wrong method to
2798         override, since for properties the existing InterfaceMethod code
2799         basically ignored the method name.  Now we make sure that the
2800         method name is one of the valid indexer names.
2801
2802 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
2803  
2804         * support.cs (SeekableStreamReader): Keep track of stream byte
2805         positions and don't mix them with character offsets to the buffer.
2806
2807         Patch from Gustavo Giráldez
2808
2809 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
2810
2811         * interface.cs (InterfaceSetGetBase): Removed double member
2812         initialization, base class does it as well.
2813
2814 2004-03-13  Martin Baulig  <martin@ximian.com>
2815
2816         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
2817         when compiling corlib.
2818
2819 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
2820
2821         * convert.cs (ExplicitConversion): We were reporting an error on
2822         certain conversions (object_type source to a value type, when the
2823         expression was `null') before we had a chance to pass it through
2824         the user defined conversions.
2825
2826         * driver.cs: Replace / and \ in resource specifications to dots.
2827         Fixes 50752
2828
2829         * class.cs: Add check for duplicate operators.  Fixes 52477
2830
2831 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
2832
2833         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
2834         that are in the middle of the statements, not only at the end.
2835         Fixes #54987
2836
2837         * class.cs (TypeContainer.AddField): No longer set the
2838         `HaveStaticConstructor' flag, now we call it
2839         `UserDefineStaticConstructor' to diferentiate the slightly
2840         semantic difference.
2841
2842         The situation is that we were not adding BeforeFieldInit (from
2843         Modifiers.TypeAttr) to classes that could have it.
2844         BeforeFieldInit should be set to classes that have no static
2845         constructor. 
2846
2847         See:
2848
2849         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
2850
2851         And most importantly Zoltan's comment:
2852
2853         http://bugzilla.ximian.com/show_bug.cgi?id=44229
2854
2855         "I think beforefieldinit means 'it's ok to initialize the type sometime 
2856          before its static fields are used', i.e. initialization does not need
2857          to be triggered by the first access to the type. Setting this flag
2858          helps the JIT to compile better code, since it can run the static
2859          constructor at JIT time, and does not need to generate code to call it
2860          (possibly lots of times) at runtime. Unfortunately, mcs does not set
2861          this flag for lots of classes like String. 
2862          
2863          csc sets this flag if the type does not have an explicit static 
2864          constructor. The reasoning seems to be that if there are only static
2865          initalizers for a type, and no static constructor, then the programmer
2866          does not care when this initialization happens, so beforefieldinit
2867          can be used.
2868          
2869          This bug prevents the AOT compiler from being usable, since it 
2870          generates so many calls to mono_runtime_class_init that the AOT code
2871          is much slower than the JITted code. The JITted code is faster, 
2872          because it does not generate these calls if the vtable is type is
2873          already initialized, which is true in the majority of cases. But the
2874          AOT compiler can't do this."
2875
2876 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
2877
2878         * class.cs (MethodData.Emit): Refactor the code so symbolic
2879         information is generated for destructors;  For some reasons we
2880         were taking a code path that did not generate symbolic information
2881         before. 
2882
2883 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
2884
2885         * class.cs: Create a Constructor.CheckBase method that
2886         takes care of all validation type code. The method
2887         contains some code that was moved from Define.
2888
2889         It also includes new code that checks for duplicate ctors.
2890         This fixes bug #55148.
2891
2892 2004-03-09  Joshua Tauberer <tauberer@for.net>
2893
2894         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
2895         a { ... }-style array creation invokes EmitStaticInitializers
2896         which is not good for reference-type arrays.  String, decimal
2897         and now null constants (NullCast) are not counted toward
2898         static initializers.
2899
2900 2004-03-05  Martin Baulig  <martin@ximian.com>
2901
2902         * location.cs (SourceFile.HasLineDirective): New public field;
2903         specifies whether the file contains or is referenced by a "#line"
2904         directive.
2905         (Location.DefineSymbolDocuments): Ignore source files which
2906         either contain or are referenced by a "#line" directive.        
2907
2908 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
2909
2910         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
2911         direct access to our parent, so check the method inline there.
2912
2913 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
2914
2915         * expression.cs (Invocation.EmitCall): Miguel's last commit
2916         caused a regression. If you had:
2917
2918             T t = null;
2919             t.Foo ();
2920
2921         In Foo the implict this would be null.
2922
2923 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
2924
2925         * expression.cs (Invocation.EmitCall): If the method is not
2926         virtual, do not emit a CallVirt to it, use Call.
2927
2928         * typemanager.cs (GetFullNameSignature): Improve the method to
2929         cope with ".ctor" and replace it with the type name.
2930
2931         * class.cs (ConstructorInitializer.Resolve): Now the method takes
2932         as an argument the ConstructorBuilder where it is being defined,
2933         to catch the recursive constructor invocations.
2934
2935 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
2936
2937         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
2938         routines to check if a type is an enumerable/enumerator allow
2939         classes that implement the IEnumerable or IEnumerator interfaces.
2940
2941         * class.cs (Property, Operator): Implement IIteratorContainer, and
2942         implement SetYields.
2943
2944         (Property.Define): Do the block swapping for get_methods in the
2945         context of iterators.   We need to check if Properties also
2946         include indexers or not.
2947
2948         (Operator): Assign the Block before invoking the
2949         OperatorMethod.Define, so we can trigger the Iterator code
2950         replacement. 
2951
2952         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
2953         Property and Operator classes are not created when we parse the
2954         declarator but until we have the block completed, so we use a
2955         singleton SimpleIteratorContainer.Simple to flag whether the
2956         SetYields has been invoked.
2957
2958         We propagate this setting then to the Property or the Operator to
2959         allow the `yield' to function.
2960
2961 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
2962
2963         * codegen.cs: Implemented attribute support for modules.
2964         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
2965         Assembly/Module functionality.
2966
2967         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
2968         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
2969         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
2970
2971 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
2972
2973         * interface.cs (FindMembers): The operation is performed on all base
2974         interfaces and not only on the first. It is required for future CLS Compliance patch.
2975
2976 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
2977
2978         * statement.cs, codegen.cs:
2979         This patch deals with patterns such as:
2980
2981         public class List : IEnumerable {
2982
2983                 public MyEnumerator GetEnumerator () {
2984                         return new MyEnumerator(this);
2985                 }
2986
2987                 IEnumerator IEnumerable.GetEnumerator () {
2988                         ...
2989                 }
2990                 
2991                 public struct MyEnumerator : IEnumerator {
2992                         ...
2993                 }
2994         }
2995
2996         Before, there were a few things we did wrong:
2997         1) we would emit callvirt on a struct, which is illegal
2998         2) we emited ldarg when we needed to emit ldarga
2999         3) we would mistakenly call the interface methods on an enumerator
3000         type that derived from IEnumerator and was in another assembly. For example:
3001
3002         public class MyEnumerator : IEnumerator
3003
3004         Would have the interface methods called, even if there were public impls of the
3005         method. In a struct, this lead to invalid IL code.
3006
3007 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3008
3009         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3010           renamed to Emit.
3011
3012         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3013
3014 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3015
3016         * cs-parser.jay: Fix small regression: we were not testing V2
3017         compiler features correctly.
3018
3019         * interface.cs: If the emit context is null, then create one
3020
3021 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3022
3023         * decl.cs (GetSignatureForError): New virtual method to get full name
3024           for error messages.
3025
3026         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3027           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3028
3029         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3030           Duplicated members and code in these classes has been removed.
3031           Better encapsulation in these classes.
3032
3033 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3034
3035         * assign.cs (Assign.DoResolve): When dealing with compound
3036         assignments, there is a new rule in ECMA C# 2.4 (might have been
3037         there before, but it is documented here) that states that in:
3038
3039         a op= b;
3040
3041         If b is of type int, and the `op' is a shift-operator, then the
3042         above is evaluated as:
3043
3044         a = (int) a op b 
3045
3046         * expression.cs (Binary.ResolveOperator): Instead of testing for
3047         int/uint/long/ulong, try to implicitly convert to any of those
3048         types and use that in pointer arithmetic.
3049
3050         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3051         method to print information for from the type, not from the
3052         null-method we were given.
3053
3054 2004-02-01  Duncan Mak  <duncan@ximian.com>
3055
3056         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3057         parsing for cmd, fixes bug #53694.
3058
3059 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3060
3061         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3062         in the member name duplication tests. Property and operator name duplication
3063         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3064
3065 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3066
3067         * interface.cs (PopulateMethod): Fixed crash when interface method
3068         returns not existing type (error test cs0246-3.cs).
3069
3070 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3071
3072         * cs-parser.jay (interface_accessors): Re-write actions to also
3073         store attributes attached to get and set methods. Fix spelling
3074         while at it.
3075
3076         (inteface_property_declaration): Modify accordingly.
3077
3078         (InterfaceAccessorInfo): New helper class to store information to pass
3079         around between rules that use interface_accessors.
3080
3081         * interface.cs (Emit): Apply attributes on the get and set
3082         accessors of properties and indexers too.
3083
3084         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3085         right MethodBuilder when applying attributes to the get and set accessors.
3086
3087 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3088
3089         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3090
3091 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3092
3093         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3094
3095 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3096
3097         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3098         changes that treat `yield' specially when present before `break'
3099         or `return' tokens.
3100
3101         * cs-tokenizer.cs: yield is no longer a keyword.
3102
3103 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3104
3105         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3106         setting for default constructors.
3107         For default constructors are almost every time set wrong Modifier. The
3108         generated IL code has been alright. But inside mcs this values was
3109         wrong and this was reason why several of my CLS Compliance tests
3110         failed.
3111
3112 2004-01-22  Martin Baulig  <martin@ximian.com>
3113
3114         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3115         not a QualifiedIdentifier.  This is what `type_name_expression'
3116         was previously doing.
3117         (type_name_expression): Removed; the code is now in
3118         `namespace_or_type_name'.
3119         (qualified_identifier): Removed, use `namespace_or_type_name'
3120         instead.
3121         (QualifiedIdentifier): Removed this class.      
3122
3123 2004-01-22  Martin Baulig  <martin@ximian.com>
3124
3125         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3126         not a string as alias name.
3127
3128 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3129
3130         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3131         #52730 bug, and instead compute correctly the need to use a
3132         temporary variable when requesting an address based on the
3133         static/instace modified of the field and the constructor.
3134  
3135 2004-01-21  Martin Baulig  <martin@ximian.com>
3136
3137         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3138         class and namespace before looking up aliases.  Fixes #52517.
3139
3140 2004-01-21  Martin Baulig  <martin@ximian.com>
3141
3142         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3143         assinged in a 'try'; fixes exception4.cs.
3144
3145 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3146         * class.cs : Implemented parameter-less constructor for TypeContainer
3147
3148         * decl.cs: Attributes are now stored here. New property OptAttributes
3149
3150         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3151
3152         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3153
3154 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3155
3156         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3157           (CSharpSignature): New method for indexer and property signature.
3158
3159 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3160
3161         * pending.cs (IsVirtualFilter): Faster implementation.
3162
3163 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3164
3165         * typemanager.cs: Avoid inclusion of same assembly more than once.
3166
3167 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3168
3169         * cs-parser.jay: Fixed problem where the last assembly attribute
3170           has been applied also to following declaration (class, struct, etc.)
3171           
3172 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3173
3174         * class.cs: Added error CS0538, CS0539 reporting.
3175         Fixed crash on Microsoft runtime when field type is void.
3176
3177         * cs-parser.jay: Added error CS0537 reporting.
3178
3179         * pending.cs: Added error CS0535 reporting.
3180         Improved error report for errors CS0536, CS0534.
3181
3182 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3183
3184         Merge a few bits from the Anonymous Method MCS tree.
3185
3186         * statement.cs (ToplevelBlock): New class for toplevel methods,
3187         will hold anonymous methods, lifted variables.
3188
3189         * cs-parser.jay: Create toplevel blocks for delegates and for
3190         regular blocks of code. 
3191
3192 2004-01-20  Martin Baulig  <martin@ximian.com>
3193
3194         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3195         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3196         and `NeedExplicitReturn'; added `IsLastStatement'.
3197         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3198         have a `ReturnLabel' or we're not unreachable.
3199
3200         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3201         child's reachability; don't just override ours with it.  Fixes
3202         #58058 (lluis's example).
3203         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3204         InFinally(), InLoop(), InSwitch() and
3205         BreakCrossesTryCatchBoundary() methods.
3206
3207         * statement.cs (Return): Do all error checking in Resolve().
3208         Unless we are the last statement in a top-level block, always
3209         create a return label and jump to it.
3210         (Break, Continue): Do all error checking in Resolve(); also make
3211         sure we aren't leaving a `finally'.
3212         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3213         statement in a top-level block.
3214         (Block.Flags): Added `IsDestructor'.
3215         (Block.IsDestructor): New public property.
3216
3217 2004-01-20  Martin Baulig  <martin@ximian.com>
3218
3219         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3220
3221 2004-01-20  Martin Baulig  <martin@ximian.com>
3222
3223         * statement.cs (Statement.ResolveUnreachable): New public method.
3224         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3225         (Block.Resolve): Resolve unreachable statements.
3226
3227 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3228
3229         * expression.cs: We need to fix the case where we do
3230         not have a temp variable here.
3231
3232         * assign.cs: Only expression compound assignments need
3233         temporary variables.
3234
3235 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3236
3237         * flowanalysis.cs: Reduce memory allocation in a few ways:
3238           - A block with no variables should not allocate a bit
3239             vector for itself.
3240           - A method with no out parameters does not need any tracking
3241             for assignment of the parameters, so we need not allocate
3242             any data for it.
3243           - The arrays:
3244                 public readonly Type[] VariableTypes;
3245                 public readonly string[] VariableNames;
3246             Are redundant. The data is already stored in the variable
3247             map, so we need not allocate another array for it.
3248           - We need to add alot of checks for if (params | locals) == null
3249             due to the first two changes.
3250
3251 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3252
3253         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3254         implement IMemoryLocation, we store a copy on a local variable and
3255         take the address of it.  Patch from Benjamin Jemlich
3256
3257         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3258         to use a special "type_name_expression" rule which reduces the
3259         number of "QualifiedIdentifier" classes created, and instead
3260         directly creates MemberAccess expressions.
3261
3262 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3263
3264         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3265         that fixes #52853.  Null literal assignment to ValueType
3266
3267         * class.cs (MethodData.Emit): Instead of checking the name of the
3268         method to determine if its a destructor, create a new derived
3269         class from Method called Destructor, and test for that.  
3270
3271         * cs-parser.jay: Create a Destructor object instead of a Method.  
3272
3273         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3274
3275         Fixes: 52933
3276
3277 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3278
3279         * expression.cs (Binary.ResolveOperator): Perform an implicit
3280         conversion from MethodGroups to their delegate types on the
3281         Addition operation.
3282
3283         * delegate.cs: Introduce a new class DelegateCreation that is the
3284         base class for `NewDelegate' and `ImplicitDelegateCreation',
3285         factor some code in here.
3286
3287         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3288         conversion from MethodGroups to compatible delegate types. 
3289
3290         * ecore.cs (Expression.Resolve): Do not flag error 654
3291         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3292         we allow conversions from MethodGroups to delegate types now.
3293
3294         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3295         assignments in v2 either.
3296
3297 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3298
3299         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3300         static read-only fields in ctors.
3301
3302         Applied patch from Benjamin Jemlich 
3303
3304         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3305
3306 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3307
3308         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3309         here to return true, as they can be used like this:
3310
3311                 (XXX) int.MEMBER ()
3312
3313         Fixed 49836 and all the other dups
3314
3315 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3316
3317         * driver.cs: Implement /win32res and /win32icon.
3318
3319 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
3320
3321         * cs-parser.jay: Add a rule to improve error handling for the
3322         common mistake of placing modifiers after the type.
3323
3324 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
3325
3326         * cs-parser.jay (interface_event_declaration): Catch
3327         initialization of events on interfaces, and report cs0068
3328
3329         * cs-parser.jay (interface_event_declaration): Catch
3330         initialization of events. 
3331
3332         * ecore.cs: Better report missing constructors.
3333
3334         * expression.cs (Binary.ResolveOperator): My previous bug fix had
3335         the error reporting done in the wrong place.  Fix.
3336
3337         * expression.cs (Binary.ResolveOperator): Catch the 
3338         operator + (E x, E y) error earlier, and later allow for implicit
3339         conversions in operator +/- (E e, U x) from U to the underlying
3340         type of E.
3341
3342         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
3343         52596, if the container class is abstract, the default constructor
3344         is protected otherwise its public (before, we were always public).
3345
3346         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
3347         fixed statement.
3348
3349         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
3350         Jemlich that fixes bug #52597, MCS was generating invalid code for
3351         idisposable structs.   Thanks to Ben for following up with this
3352         bug as well.
3353
3354 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
3355
3356         * driver.cs: Allow assemblies without code to be generated, fixes
3357         52230.
3358
3359 2004-01-07  Nick Drochak <ndrochak@gol.com>
3360
3361         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
3362
3363 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
3364
3365         * cs-parser.jay: Add rules to improve error reporting if fields or
3366         methods are declared at the namespace level (error 116)
3367
3368         * Add rules to catch event add/remove
3369
3370 2004-01-04  David Sheldon <dave-mono@earth.li>
3371
3372   * expression.cs: Added matching ")" to error message for 
3373   CS0077
3374
3375 2004-01-03 Todd Berman <tberman@gentoo.org>
3376
3377         * ecore.cs, attribute.cs:
3378         Applying fix from #52429.
3379
3380 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3381
3382         * ecore.cs, expression.cs, statement.cs:
3383         Total rewrite of how we handle branching. We
3384         now handle complex boolean expressions with fewer
3385         jumps. As well if (x == 0) no longer emits a ceq.
3386
3387         if (x is Foo) is much faster now, because we generate
3388         better code.
3389
3390         Overall, we get a pretty big improvement on our benchmark
3391         tests. The code we generate is smaller and more readable.
3392
3393         I did a full two-stage bootstrap. The patch was reviewed
3394         by Martin and Miguel.
3395
3396 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3397
3398         * cs-parser.jay: Make primary_expression not take a QI.
3399         we dont need this because the member_access rule covers
3400         us here. So we replace the rule with just IDENTIFIER.
3401
3402         This has two good effects. First, we remove a s/r conflict.
3403         Second, we allocate many fewer QualifiedIdentifier objects.
3404
3405 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3406
3407         * attribute.cs: Handle MarshalAs attributes as pseudo, and
3408         set the correct information via SRE. This prevents
3409         hanging on the MS runtime. Fixes #29374.
3410
3411 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
3412
3413         * convert.cs: correctly handle conversions to value types
3414         from Enum and ValueType as unboxing conversions.
3415
3416         Fixes bug #52569. Patch by Benjamin Jemlich.
3417
3418 2004-01-02  Ravi Pratap  <ravi@ximian.com>
3419
3420         * expression.cs (BetterConversion): Prefer int -> uint
3421         over int -> ulong (csc's behaviour). This fixed bug #52046.
3422
3423 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3424
3425         * decl.cs (MemberCache.FindMembers): now returns a
3426         MemberInfo [].
3427
3428         * typemanager.cs: In general, go with with ^^.
3429         (CopyNewMethods): take an IList.
3430         (RealMemberLookup): Only allocate an arraylist
3431         if we copy from two sets of methods.
3432
3433         This change basically does two things:
3434         1) Fewer array lists allocated due to CopyNewMethods.
3435         2) the explicit cast in MemberList costed ALOT.
3436
3437 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
3438
3439         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
3440         a hashtable to avoid needless string allocations when an identifier is
3441         used more than once (the common case).
3442
3443 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3444
3445         * pending.cs: MS's TypeBuilder.GetInterfaces ()
3446         is broken, it will not return anything. So, we
3447         have to use the information we have in mcs to
3448         do the task.
3449
3450         * typemanager.cs: Add a cache for GetInterfaces,
3451         since this will now be used more often (due to ^^)
3452
3453         (GetExplicitInterfaces) New method that gets the
3454         declared, not effective, interfaces on a type
3455         builder (eg, if you have interface IFoo, interface
3456         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
3457         { IBar }.
3458
3459         This patch makes MCS able to bootstrap itself on
3460         Windows again.
3461
3462 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
3463
3464         * expression.cs: Remove the Nop's that Miguel put
3465         in by mistake.
3466
3467 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3468
3469         * report.cs, codegen.cs: Give the real stack trace to
3470         the error when an exception is thrown.
3471
3472 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3473
3474         * decl.cs: only allocate hashtables for ifaces if 
3475         it is an iface!
3476
3477 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
3478
3479         * expression.cs: fix the error from cs0121-2.cs
3480         (a parent interface has two child interfaces that
3481         have a function with the same name and 0 params
3482         and the function is called through the parent).
3483
3484 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
3485
3486         * class.cs, rootcontext.cs, typmanager.cs: do not
3487         leak pointers.
3488
3489 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3490
3491         * codegen.cs: remove stack for the ec flow branching.
3492         It is already a linked list, so no need.
3493
3494 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3495
3496         * Makefile: Allow custom profiler here.
3497
3498 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3499
3500         * typemanager.cs (LookupType):
3501           - Use a static char [], because split takes
3502             a param array for args, so it was allocating
3503             every time.
3504           - Do not store true in a hashtable, it boxes.
3505
3506 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
3507
3508         * flowanalysis.cs: bytify common enums.
3509
3510 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3511
3512         * modifiers.cs: Add a new set of flags for the
3513         flags allowed on explicit interface impls.
3514         * cs-parser.jay: catch the use of modifiers in
3515         interfaces correctly.
3516         * class.cs: catch private void IFoo.Blah ().
3517
3518         All related to bug #50572.
3519
3520 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3521
3522         * decl.cs: Rewrite the consistant accessability checking.
3523         Accessability is not linear, it must be implemented in
3524         a tableish way. Fixes #49704.
3525
3526 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
3527
3528         * expression.cs: Handle negation in a checked context.
3529         We must use subtraction from zero. Fixes #38674.
3530
3531 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3532
3533         * class.cs: Ignore static void main in DLLs.
3534         * rootcontext.cs: Handle the target type here,
3535         since we are have to access it from class.cs
3536         * driver.cs: account for the above.
3537
3538 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3539
3540         * report.cs: Give line numbers and files if available.
3541
3542 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
3543
3544         * driver.cs: Implement /addmodule.
3545
3546         * typemanager.cs:  Change 'modules' field so it now contains Modules not
3547         ModuleBuilders.
3548
3549 2003-12-20  Martin Baulig  <martin@ximian.com>
3550
3551         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
3552         (FieldBase.IsAssigned): Removed this field.
3553         (FieldBase.SetAssigned): New public method.
3554         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
3555
3556 2003-12-20  Martin Baulig  <martin@ximian.com>
3557
3558         * expression.cs (LocalVariableReference.DoResolve): Don't set
3559         `vi.Used' if we're called from DoResolveLValue().
3560
3561         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
3562         returns the usage vector it just merged into the current one -
3563         pass this one to UsageWarning().
3564         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
3565         of the `EmitContext', don't call this recursively on our children.
3566
3567 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
3568
3569         * driver.cs: Implement /target:module.
3570
3571 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
3572
3573         * support.cs (CharArrayHashtable): New helper class.
3574
3575         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
3576         char arrays, not strings, so we can avoid creating a string in
3577         consume_identifier if the identifier is a keyword.
3578
3579 2003-12-16  Martin Baulig  <martin@ximian.com>
3580
3581         * statement.cs (LocalInfo.Assigned): Removed this property.
3582         (LocalInfo.Flags): Removed `Assigned'.
3583         (LocalInfo.IsAssigned): New public method; takes the EmitContext
3584         and uses flow analysis.
3585         (Block.UsageWarning): Made this method private.
3586         (Block.Resolve): Call UsageWarning() if appropriate.
3587
3588         * expression.cs (LocalVariableReference.DoResolve): Always set
3589         LocalInfo.Used here.
3590
3591 2003-12-13  Martin Baulig  <martin@ximian.com>
3592
3593         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
3594         any value here; we're now using flow analysis to figure out
3595         whether a statement/block returns a value.
3596
3597 2003-12-13  Martin Baulig  <martin@ximian.com>
3598
3599         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
3600         working again.
3601         (FlowBranching.MergeFinally): Don't call
3602         `branching.CheckOutParameters()' here, this is called in
3603         MergeTopBlock().
3604         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
3605         when adding the `finally' vector.       
3606
3607 2003-12-13  Martin Baulig  <martin@ximian.com>
3608
3609         * flowanalysis.cs
3610         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
3611         actually work and also fix #48962.
3612
3613 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3614
3615         * decl.cs: Do not check System.Object for nested types,
3616         since we know it does not have any. Big bang for buck:
3617
3618         BEFORE:
3619            Run 1:   8.35 seconds
3620            Run 2:   8.32 seconds
3621            corlib:  17.99 seconds
3622         AFTER:
3623            Run 1:   8.17 seconds
3624            Run 2:   8.17 seconds
3625            corlib:  17.39 seconds
3626
3627 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3628
3629         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
3630         time we are returning 0 members, so we save alot here.
3631
3632 2003-12-11  Martin Baulig  <martin@ximian.com>
3633
3634         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
3635         `MergeChild()', also just take the `FlowBranching' as argument;
3636         call Merge() on it and return the result.
3637         (FlowBranching.Merge): We don't need to do anything if we just
3638         have one sibling.
3639
3640 2003-12-11  Martin Baulig  <martin@ximian.com>
3641
3642         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
3643         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
3644         Maurer for this idea.
3645
3646 2003-12-11  Martin Baulig  <martin@ximian.com>
3647
3648         * flowanalysis.cs (MergeResult): This class is now gone; we now
3649         use the `UsageVector' for this.  The reason for this is that if a
3650         branching just has one sibling, we don't need to "merge" them at
3651         all - that's the next step to do.
3652         (FlowBranching.Merge): We now return a `UsageVector' instead of a
3653         `MergeResult'.
3654
3655 2003-12-11  Martin Baulig  <martin@ximian.com>
3656
3657         Reworked flow analyis and made it more precise and bug-free.  The
3658         most important change is that we're now using a special `Reachability'
3659         class instead of having "magic" meanings of `FlowReturns'.  I'll
3660         do some more cleanups and optimizations and also add some more
3661         documentation this week.
3662
3663         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
3664         largely reworked this class.
3665         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
3666         the new `Reachability' class instead of having "magic" values here.
3667         (FlowBranching): We're now using an instance of `Reachability'
3668         instead of having separate `Returns', `Breaks' etc. fields.
3669
3670         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
3671         based on flow analysis; ignore the return value of block.Emit ().
3672
3673 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
3674
3675         * driver.cs typemanager.cs: Find the mono extensions to corlib even
3676         if they are private.
3677
3678 2003-12-09  Martin Baulig  <martin@ximian.com>
3679
3680         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
3681         call them directly on the UsageVector.
3682
3683 2003-12-09  Martin Baulig  <martin@ximian.com>
3684
3685         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
3686         Changed return type from `FlowReturns' to `Reachability'.
3687
3688 2003-12-09  Martin Baulig  <martin@ximian.com>
3689
3690         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
3691         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
3692         `Reachable' fields with a single `Reachability' one.
3693
3694 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3695
3696         * class.cs (FindMembers): Remove foreach's.
3697
3698         Bootstrap times:
3699
3700         BEFORE
3701                 Run 1:   8.74 seconds
3702                 Run 2:   8.71 seconds
3703
3704         AFTER
3705                 Run 1:   8.64 seconds
3706                 Run 2:   8.58 seconds
3707
3708
3709 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3710
3711         * cs-parser.jay:
3712         * gen-treedump.cs:
3713         * statement.cs:
3714         This patch does a few things:
3715                 1. EmptyStatement is now a singleton, so it is never reallocated.
3716                 2. All blah is EmptyStatement constructs have been changed to
3717                    blah == EmptyStatement.Value, which is much faster and valid
3718                    now that EmptyStatement is a singleton.
3719                 3. When resolving a block, rather than allocating a new array for
3720                    the non-empty statements, empty statements are replaced with
3721                    EmptyStatement.Value
3722                 4. Some recursive functions have been made non-recursive.
3723         Mainly the performance impact is from (3), however (1) and (2) are needed for
3724         this to work. (4) does not make a big difference in normal situations, however
3725         it makes the profile look saner.
3726
3727         Bootstrap times:
3728
3729         BEFORE
3730         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3731         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
3732         Total memory allocated: 56397 KB
3733
3734         AFTER
3735         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
3736         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
3737         Total memory allocated: 55666 KB
3738
3739 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3740
3741         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
3742         than the hashtable in a hashtable version
3743
3744         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
3745         we always end up concating a string. This results in a huge perf
3746         loss, because many strings have to be tracked by the GC. In this
3747         patch, we first use a hashtable that works with two keys, so that
3748         the strings do not need to be concat'ed.
3749
3750         Bootstrap times:
3751         BEFORE
3752                 Run 1:   8.74 seconds
3753                 Run 2:   8.71 seconds
3754
3755         AFTER
3756                 Run 1:   8.65 seconds
3757                 Run 2:   8.56 seconds
3758
3759 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
3760
3761         * Makefile: Add a new target `do-time' that does a quick and simple
3762         profile, leaving easy to parse output.
3763
3764 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
3765
3766         * codegen.cs (Init): Create the dynamic assembly with 
3767         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
3768
3769 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
3770
3771         * support.cs: Make the PtrHashtable use only one
3772         instance of its comparer.
3773
3774 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
3775
3776         * typemanager.cs: Fix lookup of GetNamespaces.
3777
3778 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
3779
3780         * expression.cs: Removed redundant line.
3781
3782         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
3783         ArrayLists, use for loops with bounds.  
3784
3785         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
3786         arraylist.
3787
3788         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
3789         arraylists, use for loop with bounds.
3790
3791         The above three changes give us a 0.071 second performance
3792         improvement out of 3.294 seconds down to 3.223.  On my machine
3793         the above changes reduced the memory usage by 1,387 KB during
3794         compiler bootstrap.
3795
3796         * cs-parser.jay (QualifiedIdentifier): New class used to represent
3797         QualifiedIdentifiers.  Before we created a new string through
3798         concatenation, and mostly later on, the result would be
3799         manipulated by DecomposeQI through string manipulation.
3800
3801         This reduced the compiler memory usage for bootstrapping from
3802         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
3803         compile times in 0.05 seconds.
3804
3805 2003-11-28  Dick Porter  <dick@ximian.com>
3806
3807         * support.cs: Do string compares with the Invariant culture.
3808
3809         * rootcontext.cs: 
3810         * gen-treedump.cs: 
3811         * expression.cs: 
3812         * driver.cs: 
3813         * decl.cs: 
3814         * codegen.cs: 
3815         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
3816         the comparison is done with the Invariant culture.
3817
3818 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
3819
3820         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
3821         GetEnumerator method.
3822
3823         (ProbeCollectionType): Iterate starting at the most specific type
3824         upwards looking for a GetEnumerator
3825
3826         * expression.cs: Shift count can be up to 31 for int/uint and 63
3827         for long/ulong.
3828
3829 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
3830
3831         * statement.cs (Block.LookupLabel): Also look for the label on the
3832         children blocks.  Use a hash table to keep track of visited
3833         nodes. 
3834
3835         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
3836         we actually did transform the other operand, otherwise fall back
3837         to the common codepath that casts to long.
3838
3839         * cs-tokenizer.cs: Use the same code pattern as the int case.
3840         Maybe I should do the parsing myself, and avoid depending on the
3841         Parse routines to get this done.
3842
3843 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
3844
3845         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3846         which fixes bug 51347.  This time test it.
3847
3848         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
3849         attributes for example can not tell the difference between these.
3850         The difference was only a syntax feature of the language. 
3851
3852         * attribute.cs: Apply attributes to delegates.
3853
3854         * delegate.cs: Call the apply attributes method.
3855
3856 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
3857
3858         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
3859         comparing 0 vs Byte.MinValue, not the value
3860
3861         (ImplicitConversionRequired): When reporting a conversion error,
3862         use error 31 to print out the constant error instead of the
3863         simpler 29.
3864
3865         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
3866         which fixes bug 51347.
3867
3868 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
3869
3870         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
3871         which fixes the -warnaserror command line option.
3872
3873 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
3874
3875         * cfold.cs (DoNumericPromotions): During constant folding of
3876         additions on UIntConstant, special case intconstants with
3877         IntConstants like we do on the expression binary operator. 
3878
3879 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
3880
3881         * convert.cs (ImplicitReferenceConversion): We were missing a case
3882         (System.Enum are not value types or class types, so we need to
3883         classify them separatedly).
3884
3885         * driver.cs: We do not support error 2007.
3886
3887 2003-11-12 Jackson Harper <jackson@ximian.com>
3888
3889         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
3890         system directory. Also use the full file name so users can
3891         libraries names mscorlib-o-tron.dll in a non system dir.
3892
3893 2003-11-10  Martin Baulig  <martin@ximian.com>
3894
3895         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
3896         (TypeManager.InitCoreTypes): Initialize them here, but instead of
3897         calling `ResolveType()' on them, directly assign their `Type'.
3898
3899 2003-11-08  Martin Baulig  <martin@ximian.com>
3900
3901         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
3902         return value and the `out parent' parameter.
3903         (TypeContainer.DefineType): Moved the CS0644 check into
3904         GetClassBases().  Don't pass the interface types to the
3905         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
3906         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
3907
3908         * ecore.cs (TypeExpr.IsAttribute): New property.
3909         (TypeExpr.GetInterfaces): New method.
3910
3911         * interface.cs (Interface.GetInterfaceTypeByName): Return a
3912         TypeExpr instead of a Type.
3913         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
3914         (Interface.DefineType): Don't pass the interface types to the
3915         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
3916         them later and then call `TypeBulider.AddInterfaceImplementation()'.
3917
3918         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
3919         instead of a `Type[]'.
3920         (TypeManager.RegisterBuilder): Likewise.
3921         (TypeManager.AddUserInterface): Likewise.
3922         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
3923         `Type[]' and also return a `TypeExpr[]'.
3924         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
3925
3926 2003-11-08  Martin Baulig  <martin@ximian.com>
3927
3928         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
3929         Expression.     
3930
3931 2003-11-08  Martin Baulig  <martin@ximian.com>
3932
3933         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
3934         TypeManager.ResolveExpressionTypes().
3935
3936         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
3937         instead of an Expression.
3938         (TypeExpr): This is now an abstract base class for `TypeExpression'.
3939         (TypeExpression): New public class; formerly known as `TypeExpr'.
3940
3941         * expression.cs (ComposedCast): Derive from TypeExpr.
3942
3943         * typemanager.cs (TypeManager.system_*_expr): These are now
3944         TypExpr's instead of Expression's.
3945         (TypeManager.ResolveExpressionTypes): New public static function;
3946         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
3947         of them.        
3948
3949 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
3950
3951         * expression.cs (New.DoResolve): Do not dereference value that
3952         might be a null return.
3953
3954         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
3955         sure that the constant value has the right type.  Fixes an
3956         unreported bug, similar to 50425.
3957
3958         * const.cs (Const.LookupConstantValue): Call
3959         ImplicitStandardConversionExists before doing a conversion to
3960         avoid havng the TypeManager.ChangeType do conversions.
3961
3962         Reduced the number of casts used
3963
3964         (Const.ChangeType): New routine to enable reuse of the constant
3965         type changing code from statement.
3966
3967         * typemanager.cs (ChangeType): Move common initialization to
3968         static global variables.
3969
3970         Fixes #50425.
3971
3972         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
3973         every value type to go through, even if it was void.  Fix that. 
3974
3975         * cs-tokenizer.cs: Use is_identifier_start_character on the start
3976         character of the define, and the is_identifier_part_character for
3977         the rest of the string.
3978
3979 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
3980
3981         * expression.cs (UnaryMutator.EmitCode): When I updated
3982         LocalVariableReference.DoResolve, I overdid it, and dropped an
3983         optimization done on local variable references.
3984
3985 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
3986
3987         * ecore.cs: Convert the return from Ldlen into an int.
3988
3989 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
3990
3991         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
3992         the accessibility, this is a special case for toplevel non-public
3993         classes (internal for instance).
3994
3995 2003-10-20  Nick Drochak <ndrochak@gol.com>
3996
3997         * ecore.cs: Fix typo and build.  Needed another right paren.
3998
3999 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4000
4001         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4002         `internal' case regular and protected, but not allowing protected
4003         to be evaluated later.  Bug 49840
4004
4005 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4006
4007         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4008         to kb.Nlast, and not the kb.nFirst to isolate the switch
4009         statement.
4010
4011         Extract the underlying type, so enumerations of long/ulong are
4012         treated like long/ulong.
4013
4014 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4015
4016         * expression.cs (New): Overload the meaning of RequestedType to
4017         track the possible creation of the NewDelegate type, since
4018         DoResolve is invoked more than once for new constructors on field
4019         initialization.
4020
4021         See bugs: #48800 and #37014
4022
4023         * cs-parser.jay (declare_local_constants): Take an arraylist
4024         instead of a single constant.
4025
4026         (local_constant_declaration): It should take a
4027         constant_declarators, not a constant_declarator.  Fixes 49487
4028
4029         * convert.cs: Fix error report.
4030
4031 2003-10-13 Jackson Harper <jackson@ximian.com>
4032
4033         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4034         bug #49611
4035
4036 2003-10-09  Martin Baulig  <martin@ximian.com>
4037
4038         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4039         to the .ctor.
4040         (MethodCore.DoDefineParameters): Removed the TypeContainer
4041         argument; use the DeclSpace which was passed to the .ctor instead.
4042         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4043         TypeContainer; we only need a DeclSpace here.
4044
4045 2003-10-09  Martin Baulig  <martin@ximian.com>
4046
4047         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4048         to the .ctor.
4049         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4050         EmitContext's .ctor.    
4051
4052 2003-10-09  Martin Baulig  <martin@ximian.com>
4053
4054         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4055         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4056         AsAccessible(), moved them as well.
4057
4058         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4059
4060 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
4061
4062         * cs-parser.jay : Renamed yyName to yyNames related to jay.
4063
4064 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4065
4066         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4067         generation for >=, as spotted by Paolo, bug 48679.  
4068         Patch from David Waite.
4069
4070         * cs-tokenizer.cs: Add handling for #pragma.
4071
4072         * cs-parser.jay: Allow for both yield and yield return in the
4073         syntax.  The anti-cobolization of C# fight will go on!
4074
4075         * class.cs (TypeBuilder.DefineType): Catch error condition here
4076         (Parent.DefineType erroring out and returning null).
4077
4078         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4079         coping with enumerations variables, we were mistakenly processing
4080         them as a regular value type instead of built-in types.  Fixes the
4081         bug #48063
4082
4083         * typemanager.cs (IsBuiltinOrEnum): New method.
4084
4085 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
4086
4087         * cs-parser.jay: Upgrade: yield now needs the return clause.
4088
4089 2003-09-19  Martin Baulig  <martin@ximian.com>
4090
4091         * decl.cs (MemberCache.SetupCacheForInterface): Take a
4092         `MemberCache parent' argument.  Normally, an interface doesn't
4093         have a parent type except System.Object, but we use this in gmcs
4094         for generic type parameters.
4095
4096 2003-09-18  Martin Baulig  <martin@ximian.com>
4097
4098         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
4099         on `type.IsInterface'; don't check whether the type has a parent
4100         to determine whether it's an interface.
4101
4102 2003-09-15  Martin Baulig  <martin@ximian.com>
4103
4104         * class.cs (TypeContainer.DefineType): Added an error flag to
4105         avoid reporting duplicate CS0146's ("class definition is
4106         circular.").
4107
4108         * driver.cs (Driver.MainDriver): Abort if
4109         RootContext.ResolveTree() reported any errors.
4110
4111 2003-09-07  Martin Baulig  <martin@ximian.com>
4112
4113         * report.cs (Error, Warning): Added overloaded versions which take
4114         a `params object[] args' and call String.Format().
4115
4116 2003-09-07  Martin Baulig  <martin@ximian.com>
4117
4118         * decl.cs (DeclSpace..ctor): Don't call
4119         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
4120         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
4121         (DeclSpace.RecordDecl): New method.
4122
4123         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
4124
4125 2003-09-02  Ravi Pratap  <ravi@ximian.com>
4126
4127         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
4128         value attributes to be applied to ParameterBuilders.
4129
4130         * class.cs (MethodCore.LabelParameters): Make static and more
4131         generic so that it can be used from other places - like interface
4132         methods, for instance.
4133
4134         * interface.cs (Interface.Emit): Call LabelParameters before
4135         emitting attributes on the InterfaceMethod.
4136
4137 2003-08-26  Martin Baulig  <martin@ximian.com>
4138
4139         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
4140         resolving aliases; fixes #47927.
4141
4142 2003-08-26  Martin Baulig  <martin@ximian.com>
4143
4144         * statement.cs (Using.DoResolve): This is internally emitting a
4145         try/finally clause, so we need to set ec.NeedExplicitReturn if we
4146         do not always return.  Fixes #47681.
4147
4148 2003-08-26  Martin Baulig  <martin@ximian.com>
4149
4150         * decl.cs (MemberCore): Moved WarningNotHiding(),
4151         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
4152         into MemberBase.
4153         (AdditionResult): Make this nested in DeclSpace.
4154         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
4155         argument; call NamespaceEntry.Define() unless we're nested in a
4156         class or struct.
4157
4158         * namespace.cs (Namespace.DefineName): New public function.  This
4159         is called from DeclSpace's .ctor to add 
4160         (Namespace.Lookup): Include DeclSpaces in the lookup.
4161
4162         * class.cs (Operator): Derive from MemberBase, not MemberCore.
4163
4164         * const.cs (Const): Derive from MemberBase, not MemberCore.     
4165
4166 2003-08-25  Martin Baulig  <martin@ximian.com>
4167
4168         * convert.cs (Convert.ExplicitReferenceConversion): When
4169         converting from an interface type to a class, unbox if the target
4170         type is a struct type.  Fixes #47822.
4171
4172 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4173
4174         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
4175         #47854.
4176
4177 2003-08-22  Martin Baulig  <martin@ximian.com>
4178
4179         * class.cs (TypeManager.DefineType): When defining a nested type,
4180         call DefineType() on our parent; fixes #47801.
4181
4182 2003-08-22  Martin Baulig  <martin@ximian.com>
4183
4184         * class.cs (MethodData.Define): While checking if a method is an
4185         interface implementation, improve the test a bit more to fix #47654.
4186
4187 2003-08-22  Martin Baulig  <martin@ximian.com>
4188
4189         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
4190         correctly; fixes #47722.
4191
4192 2003-08-22  Martin Baulig  <martin@ximian.com>
4193
4194         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
4195         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
4196
4197         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
4198
4199 2003-08-22  Martin Baulig  <martin@ximian.com>
4200
4201         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
4202         can only be assigned in static constructors.  Fixes #47161.
4203
4204 2003-08-22  Martin Baulig  <martin@ximian.com>
4205
4206         Rewrote and improved the flow analysis code.
4207
4208         * flowbranching.cs (FlowBranching): Make this class abstract.
4209         (FlowBranching.CreateBranching): New static function to create a
4210         new flow branching.
4211         (FlowBranchingBlock, FlowBranchingException): New classes.
4212         (FlowBranching.UsageVector.Type): New public readonly field.
4213         (FlowBranching.UsageVector.Breaks): Removed the setter.
4214         (FlowBranching.UsageVector.Returns): Removed the setter.
4215         (FlowBranching.UsageVector): Added Break(), Return(),
4216         NeverReachable() and Throw() methods to modify the reachability.
4217         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
4218         done by FlowBranching.Merge().
4219         (FlowBranching.UsageVector.MergeChild): New method; merges the
4220         merge result into the current vector.
4221         (FlowBranching.Merge): New abstract method to merge a branching.
4222
4223 2003-08-12  Martin Baulig  <martin@ximian.com>
4224
4225         * expression.cs (Indirection.CacheTemporaries): Create the
4226         LocalTemporary with the pointer type, not its element type.
4227
4228 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
4229
4230         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
4231         token was a keyword or not.
4232
4233         Add `error' options where an IDENTIFIER was expected;  Provide
4234         CheckToken and CheckIdentifierToken convenience error reporting
4235         functions. 
4236
4237         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
4238
4239         * decl.cs: Rename `NamespaceEntry Namespace' public field into
4240         NameSpaceEntry NameSpaceEntry.
4241
4242         (LookupInterfaceOrClass): Avoid creating a full qualified name
4243         from namespace and name: avoid doing lookups when we know the
4244         namespace is non-existant.   Use new Tree.LookupByNamespace which
4245         looks up DeclSpaces based on their namespace, name pair.
4246
4247         * driver.cs: Provide a new `parser verbose' to display the
4248         exception thrown during parsing.  This is turned off by default
4249         now, so the output of a failure from mcs is more graceful.
4250
4251         * namespace.cs: Track all the namespaces defined in a hashtable
4252         for quick lookup.
4253
4254         (IsNamespace): New method
4255
4256 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
4257
4258         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
4259         we know that we need to concatenate (full typename can never be
4260         null). 
4261
4262         * class.cs: ditto.
4263
4264         * statement.cs: Use a bitfield;  Do not initialize to null things
4265         which are done by the constructor by default.
4266
4267         * cs-parser.jay: bug fix, parameter was 4, not 3.
4268
4269         * expression.cs: Just use the property;
4270
4271         * statement.cs: No need for GetVariableInfo method.
4272
4273 2003-08-08  Martin Baulig  <martin@ximian.com>
4274
4275         * flowanalysis.cs (FlowReturns): This is now nested in the
4276         `FlowBranching' class.
4277         (MyBitVector): Moved this here from statement.cs.
4278         (FlowBranching.SiblingType): New enum type.
4279         (FlowBranching.CreateSibling): Added `SiblingType' argument.
4280
4281 2003-08-07  Martin Baulig  <martin@ximian.com>
4282
4283         * flowanalysis.cs (FlowBranchingType): This is now nested in the
4284         `FlowBranching' class and called `BranchingType'.
4285
4286 2003-08-07  Martin Baulig  <martin@ximian.com>
4287
4288         * flowanalysis.cs: Moved all the control flow analysis code into
4289         its own file.
4290
4291 2003-08-07  Martin Baulig  <martin@ximian.com>
4292
4293         * assign.cs (Assign.DoResolve): `target' must either be an
4294         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
4295         #37319.
4296
4297 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
4298
4299         * expression.cs (BinaryMethod): This kind of expression is created by the
4300         Binary class if it determines that the operator has to be handled
4301         by a method.
4302
4303         (BinaryDelegate): This kind of expression is created if we are
4304         dealing with a + or - operator on delegates.
4305
4306         (Binary): remove method, argumetns, and DelegateOperator: when
4307         dealing with methods, 
4308
4309         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
4310
4311         * statement.cs (Block): use bitfields for the three extra booleans
4312         we had in use.   Remove unused topblock parameter.
4313
4314         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
4315
4316         * assign.cs: Drop extra unneeded tests.
4317
4318 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
4319
4320         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
4321
4322         * statement.cs (Foreach): Use VariableStorage instead of
4323         LocalBuilders.   
4324
4325         * codegen.cs (VariableStorage): New class used by clients that
4326         require a variable stored: locals or fields for variables that
4327         need to live across yield.
4328
4329         Maybe provide a convenience api for EmitThis+EmitLoad?
4330
4331         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
4332         these bad boys.
4333
4334 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
4335
4336         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
4337         RemapParameterLValue): New methods that are used to turn a
4338         precomputed FieldInfo into an expression like this:
4339
4340                 instance.FieldInfo
4341
4342         The idea is to use this instead of making LocalVariableReference
4343         have more than one meaning.
4344
4345         * cs-parser.jay: Add error production to BASE.
4346
4347         * ecore.cs: Deal with TypeManager.GetField returning null, which
4348         is now a valid return value.
4349
4350         (FieldExprNoAddress): New expression for Fields whose address can
4351         not be taken.
4352
4353         * expression.cs (LocalVariableReference): During the resolve
4354         phases, create new expressions if we are in a remapping context.
4355         Remove code that dealt with remapping here.
4356
4357         (ParameterReference): same.
4358
4359         (ProxyInstance): New expression, like the `This' expression, but
4360         it is born fully resolved.  We know what we are doing, so remove
4361         the errors that are targeted to user-provided uses of `this'.
4362
4363         * statement.cs (Foreach): our variable is now stored as an
4364         Expression;  During resolution, follow the protocol, dont just
4365         assume it will return this.
4366
4367 2003-08-06  Martin Baulig  <martin@ximian.com>
4368
4369         * support.cs (SeekableStreamReader.cs): New public class.
4370
4371         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
4372         SeekableStreamReader instead of the normal StreamReader.
4373
4374 2003-08-04  Martin Baulig  <martin@ximian.com>
4375
4376         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
4377         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
4378         deambiguate casts and delegate invocations.
4379         (parenthesized_expression): Use the new tokens to ensure this is
4380         not a cast of method invocation.
4381
4382         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
4383         when reading a `)' and Deambiguate_CloseParens () was previously
4384         called.
4385
4386         * expression.cs (ParenthesizedExpression): New class.  This is
4387         just used for the CS0075 test.
4388         (Binary.DoResolve): Check for CS0075.   
4389
4390 2003-07-29  Ravi Pratap  <ravi@ximian.com>
4391
4392         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
4393         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
4394         reference comparison.
4395
4396         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
4397         examine the ReturnType for equality - this is necessary in the
4398         cases of implicit and explicit operators whose signature also
4399         includes the return type.
4400
4401 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
4402
4403         * namespace.cs: Cache the result of the namespace computation,
4404         instead of computing it every time.
4405
4406 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
4407
4408         * decl.cs: Use a global arraylist that we reuse over invocations
4409         to avoid excesive memory consumption.  Reduces memory usage on an
4410         mcs compile by one meg (45 average).
4411
4412         * typemanager.cs (LookupTypeReflection): In .NET pointers are
4413         private, work around that.
4414
4415 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
4416
4417         * literal.cs (IntLiteral): Define Zero and One static literals. 
4418
4419         * cs-parser.jay (integer_literal): use static literals to reduce
4420         memory usage for the most used literals (0, 1 and -1).  211kb
4421         reduced in memory usage.
4422
4423         Replace all calls to `new ArrayList' with `new
4424         ArrayList(4)' which is a good average number for most allocations,
4425         and also requires only 16 bytes of memory for its buffer by
4426         default. 
4427
4428         This reduced MCS memory usage in seven megabytes for the RSS after
4429         bootstrapping.
4430
4431 2003-07-28  Ravi Pratap  <ravi@ximian.com>
4432
4433         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
4434         handle params methods the correct way by forming only one
4435         applicable set with params and normal methods in them. Earlier we
4436         were looking at params methods only if we found no normal methods
4437         which was not the correct thing to do.
4438
4439         (Invocation.BetterFunction): Take separate arguments indicating
4440         when candidate and the best method are params methods in their
4441         expanded form.
4442
4443         This fixes bugs #43367 and #46199.
4444
4445         * attribute.cs: Documentation updates.
4446
4447         (CheckAttribute): Rename to CheckAttributeTarget.
4448         (GetValidPlaces): Rename to GetValidTargets.
4449
4450         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
4451         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
4452
4453         Fixes bug #44468.
4454
4455 2003-07-28  Martin Baulig  <martin@ximian.com>
4456
4457         * class.cs (TypeContainer.DefineMembers): Use the base type's full
4458         name when looking up the base class of a nested class.  Fixes #46977.
4459
4460 2003-07-26  Martin Baulig  <martin@ximian.com>
4461
4462         * expression.cs (Indexers.Indexer): New nested struct; contains
4463         getter, setter and the indexer's type.
4464         (Indexers.Properties): This is now an ArrayList of
4465         Indexers.Indexer's.
4466         (IndexerAccess.DoResolveLValue): Correctly set the type if the
4467         indexer doesn't have any getters.
4468
4469         * assign.cs (Assign.DoResolve): Also do the implicit conversions
4470         for embedded property and indexer assignments.
4471
4472 2003-07-26  Martin Baulig  <martin@ximian.com>
4473
4474         * cs-tokenizer.cs (Tokenizer.xtoken): Report a CS1040 if a
4475         preprocessor directive is not the first non-whitespace character
4476         on a line.
4477
4478 2003-07-26  Martin Baulig  <martin@ximian.com>
4479
4480         * namespace.cs (NamespaceEntry.Lookup): New method; rewrote the
4481         namespace parsing, follow the spec more closely.
4482
4483         * rootcontext.cs (RootContext.NamespaceLookup): Use the new
4484         NamespaceEntry.Lookup().
4485
4486 2003-07-25  Martin Baulig  <martin@ximian.com>
4487
4488         * MethodCore.cs (OverridesSomething): New public field; it's set
4489         from TypeContainer.DefineMembers if this method overrides
4490         something (which doesn't need to be a method).  Fix #39462.
4491
4492 2003-07-25  Ravi Pratap  <ravi@ximian.com>
4493
4494         * typemanager.cs (GetMembers): Ensure that the list of members is
4495         reversed. This keeps things in sync.
4496
4497         * attribute.cs (Attribute.CheckAttribute): Break as soon as we
4498         find an AttributeUsage attribute.
4499
4500         * expression.cs (Invocation.OverloadResolve): Perform the check
4501         which disallows Invoke to be directly called on a Delegate.
4502
4503         (Error_InvokeOnDelegate): Report error cs1533.
4504
4505 2003-07-25  Martin Baulig  <martin@ximian.com>
4506
4507         * expression.cs (Indexers.GetIndexersForType): Only look in the
4508         interface hierarchy if the requested type is already an
4509         interface.  Fixes #46788 while keeping #46502 fixed.
4510
4511 2003-07-25  Martin Baulig  <martin@ximian.com>
4512
4513         * class.cs (TypeContainer.DefineMembers): Check whether all
4514         readonly fields have been assigned and report warning CS0649 if
4515         not.
4516
4517         * statement.cs (LocalInfo.IsFixed): Always return true if this is
4518         a valuetype.
4519
4520 2003-07-24  Ravi Pratap  <ravi@ximian.com>
4521
4522         * decl.cs (MemberCache.AddMethods): Reverse the order of the array
4523         returned from GetMethods to make things consistent with the
4524         assumptions MCS makes about ordering of methods.
4525
4526         This should comprehensively fix bug #45127 and it does :-)
4527
4528         * ecore.cs (MethodGroupExpr.DeclaringType): Correct bug - the
4529         ordering is actually reverse.
4530
4531         * Clean up some debug messages I left lying around.
4532
4533         * interface.cs (Populate*): Get rid of code which emits attributes
4534         since the stage in which we emit attributes is the 'Emit' stage,
4535         not the define stage.
4536
4537         (Emit): Move attribute emission for interface members here.
4538
4539 2003-07-22  Ravi Pratap  <ravi@ximian.com>
4540
4541         * expression.cs (Invocation.OverloadResolve): Follow the spec more
4542         closely: we eliminate methods in base types when we have an
4543         applicable method in a top-level type.
4544
4545         Please see section 14.5.5.1 for an exact description of what goes
4546         on. 
4547
4548         This fixes bug #45127 and a host of other related to corlib compilation.
4549
4550         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
4551         array is the method corresponding to the top-level type (this is
4552         because of the changes made to icall.c) so we change this
4553         accordingly.
4554
4555         (MethodGroupExpr.Name): This too.
4556
4557         * typemanager.cs (GetElementType): New method which does the right
4558         thing when compiling corlib. 
4559
4560         * everywhere: Make use of the above in the relevant places.
4561
4562 2003-07-22  Martin Baulig  <martin@ximian.com>
4563
4564         * cs-parser.jay (invocation_expression): Moved
4565         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
4566         `cast_expression', but create a InvocationOrCast which later
4567         resolves to either an Invocation or a Cast.
4568
4569         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
4570         method; call this before EmitStatement() to make sure that this
4571         expression can be used as a statement.
4572
4573         * expression.cs (InvocationOrCast): New class; resolves to either
4574         an Invocation or a Cast.
4575
4576         * statement.cs (StatementExpression): Call ResolveStatement() on
4577         the ExpressionStatement before emitting it.
4578
4579 2003-07-21  Martin Baulig  <martin@ximian.com>
4580
4581         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
4582         `ref' and `out' attributes match; fixes #46220.
4583         (MemberAccess.ResolveMemberAccess): You can't reference a type
4584         through an expression; fixes #33180.
4585         (Indexers.GetIndexersForType): Don't return the indexers from
4586         interfaces the class implements; fixes #46502.
4587
4588 2003-07-21  Martin Baulig  <martin@ximian.com>
4589
4590         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
4591         CS0661 checks; fixes bug #30442.
4592
4593 2003-07-21  Martin Baulig  <martin@ximian.com>
4594
4595         * decl.cs (AdditionResult): Added `Error'.
4596
4597         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
4598
4599         * typemanager.cs (TypeManager.ChangeType): Catch exceptions;
4600         makes cs0031.cs actually work.
4601
4602 2003-07-20  Martin Baulig  <martin@ximian.com>
4603
4604         * namespace.cs: Fixed that bug which caused a crash when compiling
4605         the debugger's GUI.
4606
4607 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
4608
4609         * typemanager.cs (LookupTypeReflection): Never expose types which
4610         are NotPublic, NestedPrivate, NestedAssembly, or
4611         NestedFamANDAssem.  We used to return these, and later do a check
4612         that would report a meaningful error, but the problem is that we
4613         would not get the real match, if there was a name override.
4614
4615 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
4616
4617         * namespace.cs (Namespace, Name): Do not compute the namespace
4618         name dynamically, compute it in the constructor.  This reduced
4619         memory usage by 1697 KB.
4620
4621         * driver.cs: Use --pause to pause at the end.
4622
4623 2003-07-17  Peter Williams  <peter@newton.cx>
4624
4625         * Makefile: Change the name of the test target so that it doesn't
4626         conflict with the recursive test target.
4627
4628 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
4629
4630         * expression.cs (LocalVariableReference.Emit, EmitAssign,
4631         AddressOf): Do not use EmitThis, that was wrong, use the actual
4632         this pointer.
4633
4634 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
4635
4636         * class.cs (MethodData.Define): While checking if a method is an
4637         interface implementation, improve the test: If we are not public
4638         (use new test here: use the computed MethodAttributes directly,
4639         instead of the parsed modifier flags) check if the `implementing'
4640         method comes from an interface or not.
4641
4642         * pending.cs (VerifyPendingMethods): Slightly better error
4643         message.
4644
4645         * makefile: add test target that does the mcs bootstrap.
4646
4647 2003-07-16  Ravi Pratap  <ravi@ximian.com>
4648
4649         * interface.cs (Define): Do nothing here since there are no
4650         members to populate etc. Move the attribute emission out of here
4651         since this was just totally the wrong place to put it. Attribute
4652         application happens during the 'Emit' phase, not in the 'Define'
4653         phase.
4654
4655         (Emit): Add this method and move the attribute emission here
4656
4657         * rootcontext.cs (EmitCode): Call the Emit method on interface
4658         types too.
4659
4660 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4661
4662         * expression.cs (OverloadResolve): Report error only if Location
4663         is not 'Null' which means that there was a probe going on.
4664
4665 2003-07-14  Martin Baulig  <martin@ximian.com>
4666
4667         * expression.cs (ConditionalLogicalOperator): New public class to
4668         implement user defined conditional logical operators.
4669         This is section 14.11.2 in the spec and bug #40505.
4670
4671 2003-07-14  Martin Baulig  <martin@ximian.com>
4672
4673         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
4674
4675 2003-07-14  Martin Baulig  <martin@ximian.com>
4676
4677         * codegen.cs (EmitContext.InFixedInitializer): New public field.
4678
4679         * ecore.cs (IVariable.VerifyFixed): New interface method.
4680
4681         * expression.cs (Unary.ResolveOperator): When resolving the `&'
4682         operator, check whether the variable is actually fixed.  Fixes bug
4683         #36055.  Set a variable definitely assigned when taking its
4684         address as required by the spec.
4685
4686         * statement.cs (LocalInfo.IsFixed): New field.
4687         (LocalInfo.MakePinned): Set `IsFixed' to true.
4688
4689 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
4690
4691         * attribute.cs (Attribute.Resolve): While doing a Member lookup
4692         for .ctors, ensure that we only ask for members declared in the
4693         attribute type (BindingFlags.DeclaredOnly).
4694
4695         Fixes bug #43632.
4696
4697         * expression.cs (Error_WrongNumArguments): Report error 1501
4698         correctly the way CSC does.
4699
4700 2003-07-13  Martin Baulig  <martin@ximian.com>
4701
4702         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
4703         lookup on the fully qualified name, to make things like "X.X" work
4704         where "X.X" is a fully qualified type name, but we also have a
4705         namespace "X" in the using list.  Fixes #41975.
4706
4707 2003-07-13  Martin Baulig  <martin@ximian.com>
4708
4709         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
4710         function. If we're a CompoundAssign, we need to create an embedded
4711         CompoundAssign, not an embedded Assign.
4712         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
4713         Fixes #45854.
4714
4715 2003-07-13  Martin Baulig  <martin@ximian.com>
4716
4717         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
4718         work to fix bug #46088.
4719
4720 2003-07-13  Ravi Pratap <ravi@ximian.com>
4721
4722         * class.cs (Operator.Emit): Do not emit attributes here - it is
4723         taken care of by the Method class that we delegate too. This takes
4724         care of bug #45876.
4725
4726 2003-07-10  Martin Baulig  <martin@ximian.com>
4727
4728         * expression.cs (TypeOfVoid): New class.
4729         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
4730
4731 2003-07-10  Martin Baulig  <martin@ximian.com>
4732
4733         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
4734         bug #35957.
4735
4736 2003-07-10  Martin Baulig  <martin@ximian.com>
4737
4738         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
4739         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
4740
4741         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
4742
4743         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
4744
4745 2003-07-10  Martin Baulig  <martin@ximian.com>
4746
4747         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
4748         of decimal.  Fixes #42850.
4749
4750         NOTE: I also fixed the created byte blob, but this doesn't work on
4751         the MS runtime and csc never produces any byte blobs for decimal
4752         arrays.
4753
4754 2003-07-10  Martin Baulig  <martin@ximian.com>
4755
4756         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
4757         structs; fixes #32068.
4758         (Block.AddChildVariableNames): Fixed #44302.
4759
4760 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4761
4762         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
4763
4764 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4765
4766         * attribute.cs: And this test is onger needed.
4767
4768 2003-07-08  Martin Baulig  <martin@ximian.com>
4769
4770         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
4771         inaccessible types.  Fixes #36313.
4772
4773         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
4774
4775         * namespace.cs (NamespaceEntry): Create implicit entries for all
4776         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
4777         implicit entries for N1.N2 and N1.
4778
4779 2003-07-08  Martin Baulig  <martin@ximian.com>
4780
4781         Rewrote the handling of namespaces to fix a lot of the issues
4782         wrt. `using' aliases etc.
4783
4784         * namespace.cs (Namespace): Splitted this class into a
4785         per-assembly `Namespace' and a per-file `NamespaceEntry'.
4786
4787         * typemanager.cs (TypeManager.IsNamespace): Removed.
4788         (TypeManager.ComputeNamespaces): Only compute namespaces from
4789         loaded assemblies here, not the namespaces from the assembly we're
4790         currently compiling.
4791
4792 2003-07-08  Martin Baulig  <martin@ximian.com>
4793
4794         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
4795
4796 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4797
4798         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
4799         already fixed it.  
4800
4801         I thought about the memory savings here, but LookupTypeReflection
4802         is used under already very constrained scenarios.  Compiling
4803         corlib or mcs only exposes one hit, so it would not really reduce
4804         any memory consumption.
4805
4806 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
4807
4808         * typemanager.cs: fixes bug #45889 by only adding public types from
4809         other assemblies to the list of known types.
4810
4811 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
4812
4813         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
4814         on the type we resolved.
4815
4816 2003-07-05  Martin Baulig  <martin@ximian.com>
4817
4818         * pending.cs (PendingImplementation.ParentImplements): Don't
4819         create the proxy if the parent is abstract.
4820
4821         * class.cs (TypeContainer.DefineIndexers): Process explicit
4822         interface implementations first.  Fixes #37714.
4823
4824 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
4825
4826         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
4827         defined recursively;  but since we modify the input parameters
4828         (left is set to `this' temporarily), we reset this value if the
4829         left_is_explicit is false, which gives the original semantics to
4830         the code.  
4831
4832         * literal.cs (NullPointer): new class used to represent a null
4833         literal in a pointer context.
4834
4835         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
4836         type is a pointer, use a NullPointer object instead of a
4837         NullLiteral.   Closes 43687
4838
4839         (ExplicitConversion): Convert pointer values using
4840         the conv opcode to the proper type.
4841
4842         * ecore.cs (New): change ValueTypeVariable property into a method,
4843         that returns whether the valuetype is suitable for being used.
4844
4845         * expression.cs (Binary.DoNumericPromotions): Only return if we
4846         the int constant was a valid uint, and we can return both left and
4847         right as uints.  If not, we continue processing, to trigger the
4848         type conversion.  This fixes 39018.
4849
4850         * statement.cs (Block.EmitMeta): During constant resolution, set
4851         the CurrentBlock property on the emitcontext, so that we resolve
4852         constants propertly.
4853
4854 2003-07-02  Martin Baulig  <martin@ximian.com>
4855
4856         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
4857         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
4858
4859         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
4860         than emitting it here.
4861
4862         * statement.cs: Fixed some more flow analysis bugs.
4863
4864 2003-07-02  Martin Baulig  <martin@ximian.com>
4865
4866         * class.cs (MethodData.Define): When implementing interface
4867         methods, set Final unless we're Virtual.
4868
4869         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
4870         check work for interface methods.
4871
4872 2003-07-01  Martin Baulig  <martin@ximian.com>
4873
4874         * ecore.cs (EmitContext.This): Replaced this property with a
4875         GetThis() method which takes a Location argument.  This ensures
4876         that we get the correct error location for a CS0188.
4877
4878 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
4879
4880         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
4881         ImplicitStandardConversion.
4882
4883         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
4884
4885 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
4886
4887         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
4888         optimization.
4889
4890 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
4891
4892         * class.cs (Constructor.Define): Turn off initlocals for unsafe
4893         constructors.
4894
4895         (MethodData.Define): Turn off initlocals for unsafe methods.
4896
4897 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
4898
4899         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
4900         complete;  Fixes #37521.
4901
4902         * delegate.cs: Use Modifiers.TypeAttr to compute the
4903         TypeAttributes, instead of rolling our own.  This makes the flags
4904         correct for the delegates.
4905
4906 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
4907
4908         * class.cs (Constructor.Define): Set the private flag for static
4909         constructors as well.
4910
4911         * cs-parser.jay (statement_expression): Set the return value to
4912         null, to avoid a crash when we catch an error.
4913
4914 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
4915
4916         * cs-parser.jay: Applied patch from Jackson that adds support for
4917         extern and unsafe modifiers to destructor declarations.
4918
4919         * expression.cs: Report error 21 if the user is trying to index a
4920         System.Array.
4921
4922         * driver.cs: Add an error message, suggested by the bug report.
4923
4924         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
4925         if we do not have a ": this ()" constructor initializer.  Fixes 45149
4926
4927 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
4928
4929         * namespace.cs: Add some information to reduce FAQs.
4930
4931 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
4932
4933         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
4934         underlying enumeration types.  Fixes #43915.
4935
4936         * expression.cs: Treat ushort/short as legal values to be used in
4937         bitwise operations.
4938
4939 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
4940
4941         * delegate.cs: transfer custom attributes for paramenters from
4942         the delegate declaration to Invoke and BeginInvoke.
4943
4944 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
4945
4946         * attribute.cs: handle custom marshalers and emit marshal info
4947         for fields, too.
4948
4949 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
4950
4951         * makefile.gnu: Added anonymous.cs to the compiler sources.
4952
4953 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
4954
4955         * iterators.cs: Change the name of the proxy class to include two
4956         underscores.
4957
4958         * cs-parser.jay: Update grammar to include anonymous methods.
4959
4960         * anonymous.cs: new file.
4961
4962 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
4963
4964         * class.cs (Field.Define): Add missing test for pointers and
4965         safety. 
4966
4967 2003-05-27  Ravi Pratap  <ravi@ximian.com>
4968
4969         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
4970         we use the stobj opcode.
4971
4972         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
4973         since it wasn't the correct fix. 
4974
4975         It still is puzzling that we are required to use stobj for IntPtr
4976         which seems to be a ValueType.
4977
4978 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
4979
4980         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
4981         during regular simple name resolution.   Now, the trick is that
4982         instead of returning for processing the simplename, we do a
4983         TypeManager.LookupType (ie, a rooted lookup as opposed to a
4984         contextual lookup type).   If a match is found, return that, if
4985         not, return for further composition.
4986
4987         This fixes long-standing 30485.
4988
4989         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4990         using the address to initialize an object, do an Stobj instead of
4991         using the regular Stelem.
4992
4993         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
4994         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
4995         Because if we are a BaseIndexerAccess that value will be true.
4996         Fixes 43643.
4997
4998         * statement.cs (GotoCase.Resolve): Return after reporting an
4999         error, do not attempt to continue. 
5000
5001         * expression.cs (PointerArithmetic.Emit): If our operand is a
5002         long, convert our constants to match the operand before
5003         multiplying.  Convert to I type before adding.   Fixes 43670.
5004
5005 2003-05-14  Ravi Pratap  <ravi@ximian.com>
5006
5007         * enum.cs (ImplicitConversionExists) : Rename to
5008         ImplicitEnumConversionExists to remove ambiguity. 
5009
5010         * ecore.cs (NullCast): New type of cast expression class which
5011         basically is very similar to EmptyCast with the difference being
5012         it still is a constant since it is used only to cast a null to
5013         something else
5014         (eg. (string) null)
5015
5016         * convert.cs (ImplicitReferenceConversion): When casting a null
5017         literal, we return a NullCast.
5018
5019         * literal.cs (NullLiteralTyped): Remove - I don't see why this
5020         should be around anymore.
5021
5022         The renaming (reported was slightly wrong). Corrections:
5023
5024         ConvertImplicitStandard -> ImplicitConversionStandard
5025         ConvertExplicitStandard -> ExplicitConversionStandard
5026
5027         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
5028         before passing them in !
5029
5030         * convert.cs (ImplicitConversionStandard): When comparing for
5031         equal expr and target types, ensure that expr is not a
5032         NullLiteral.
5033
5034         In general, we must not be checking (expr_type ==
5035         target_type) in the top level conversion methods
5036         (ImplicitConversion, ExplicitConversion etc). This checking is
5037         done in the methods that they delegate to.
5038
5039 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
5040
5041         * convert.cs: Move Error_CannotConvertType,
5042         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
5043         ImplicitNumericConversion, ImplicitConversionExists,
5044         ImplicitUserConversionExists, StandardConversionExists,
5045         FindMostEncompassedType, FindMostSpecificSource,
5046         FindMostSpecificTarget, ImplicitUserConversion,
5047         ExplicitUserConversion, GetConversionOperators,
5048         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
5049         TryImplicitIntConversion, Error_CannotConvertImplicit,
5050         ConvertImplicitRequired, ConvertNumericExplicit,
5051         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
5052         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
5053         its own file.
5054
5055         Perform the following renames:
5056
5057         StandardConversionExists -> ImplicitStandardConversionExists
5058         ConvertImplicit -> ImplicitConversion
5059         ConvertImplicitStandard -> ImplicitStandardConversion
5060         TryImplicitIntConversion -> ImplicitIntConversion
5061         ConvertImplicitRequired -> ImplicitConversionRequired
5062         ConvertNumericExplicit -> ExplicitNumericConversion
5063         ConvertReferenceExplicit -> ExplicitReferenceConversion
5064         ConvertExplicit -> ExplicitConversion
5065         ConvertExplicitStandard -> ExplicitStandardConversion
5066
5067 2003-05-19  Martin Baulig  <martin@ximian.com>
5068
5069         * statement.cs (TypeInfo.StructInfo): Made this type protected.
5070         (TypeInfo): Added support for structs having structs as fields.
5071
5072         * ecore.cs (FieldExpr): Implement IVariable.
5073         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
5074         VariableInfo for the field.
5075
5076 2003-05-18  Martin Baulig  <martin@ximian.com>
5077
5078         * expression.cs (This.DoResolve): Report a CS0027 if we're
5079         emitting a field initializer.
5080
5081 2003-05-18  Martin Baulig  <martin@ximian.com>
5082
5083         * expression.cs (This.ResolveBase): New public function.
5084         (This.DoResolve): Check for CS0188.
5085
5086         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
5087         This.Resolve().
5088
5089         * ecore.cs (MethodGroupExpr.DoResolve): Set the
5090         `instance_expression' to null if we don't have any non-static
5091         methods.
5092
5093 2003-05-18  Martin Baulig  <martin@ximian.com>
5094
5095         Reworked the way how local variables and parameters are handled by
5096         the flow analysis code.
5097
5098         * statement.cs (TypeInfo, VariableMap): New public classes.
5099         (VariableInfo): New public class.  This is now responsible for
5100         checking whether a variable has been assigned.  It is used for
5101         parameters and local variables.
5102         (Block.EmitMeta): Take the InternalParameters as argument; compute
5103         the layout of the flow vectors here.
5104         (Block.LocalMap, Block.ParameterMap): New public properties.
5105         (FlowBranching): The .ctor doesn't get the InternalParameters
5106         anymore since Block.EmitMeta() now computes the layout of the flow
5107         vector.
5108         (MyStructInfo): This class is now known as `StructInfo' and nested
5109         in `TypeInfo'; we don't access this directly anymore.
5110
5111         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
5112         property and removed IsAssigned(), IsFieldAssigned(),
5113         SetAssigned() and SetFieldAssigned(); we now call them on the
5114         VariableInfo so we don't need to duplicate this code everywhere.
5115
5116         * expression.cs (ParameterReference): Added `Block block' argument
5117         to the .ctor.
5118         (LocalVariableReference, ParameterReference, This): The new
5119         VariableInfo class is now responsible for all the definite
5120         assignment stuff.
5121
5122         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
5123         IsParameterAssigned, SetParameterAssigned): Removed.
5124
5125 2003-05-18  Martin Baulig  <martin@ximian.com>
5126
5127         * typemanager.cs (InitCoreTypes): Try calling
5128         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
5129         the 3-args-version.  Corlib now also needs our `void_type'.
5130         (GetMethod): Added overloaded version which takes an optional
5131         `bool report_errors' to allow lookups of optional methods.
5132
5133 2003-05-12  Martin Baulig  <martin@ximian.com>
5134
5135         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
5136         only used for locals and not for parameters.
5137
5138 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
5139
5140         * support.cs (InternalParameters.ParameterType): Return the
5141         ExternalType of the parameter.
5142
5143         * parameter.cs (Parameter.ExternalType): drop the two arguments,
5144         they were unused.
5145
5146 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
5147
5148         * class.cs (MethodData.Define): Do not set the `newslot' on
5149         interface members, if they are also flagged as "override".
5150
5151         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
5152         better code for ++i and i++.  This only works for static fields
5153         and local variables.
5154
5155         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
5156         want to pull the DeclSpace out of the builder_to_declspace instead
5157         of the TypeBuilder (like in TypeContainer.FindMembers).
5158
5159         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
5160         instead of LookupTypeContainer.  Fixes the crash on .NET for
5161         looking up interface members.
5162
5163         * const.cs: Create our own emit context during the Definition
5164         stage, so that constants are evaluated in the proper context, when
5165         a recursive definition happens.
5166
5167 2003-05-11  Martin Baulig  <martin@ximian.com>
5168
5169         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
5170         new block for a switch section.
5171         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
5172         the adding/lookup in the switch block.  Fixes #39828.
5173
5174 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
5175
5176         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
5177         functionality: I needed to convert the data after I had performed
5178         the add/sub operation into the operands type size.
5179
5180         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
5181         pass the type for the box operation, otherwise the resulting
5182         object would have been of type object.
5183
5184         (BoxedCast): Add constructor to specify the type to box as.
5185
5186 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
5187
5188         * iterators.cs: I was reusing the `count' variable inadvertently,
5189         take steps to not allow this to happen.
5190
5191 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
5192
5193         * attribute.cs (Attribute.Resolve): Params attributes are encoded
5194         by creating an array at the point where the params starts and
5195         putting all those arguments there, then adjusting the size of the
5196         array.
5197
5198 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
5199
5200         * expression.cs (New.AddressOf): Implement interface
5201         IMemoryLocation.  This is used when the `new' operator is used in
5202         the context of an invocation to a method on a value type.
5203
5204         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
5205         example. 
5206
5207         * namespace.cs: Also check the using aliases here.
5208
5209         * driver.cs: Move the test for using validity after the types have
5210         been entered, so we do a single pass that also includes the using
5211         aliases. 
5212
5213         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
5214         in the regular case.   CreateSiblingForFinally is doing extra
5215         error checking.
5216
5217         * attribute.cs (GetAttributeArgumentExpression): Store the result
5218         on an out value, and use the return value to indicate failure
5219         instead of using null (which is a valid return for Constant.GetValue).
5220
5221         * statement.cs: Perform the analysis flow for the increment
5222         portion after the statement, because this will be the real flow of
5223         execution.  Fixes #42385
5224
5225         * codegen.cs (EmitContext.EmitArgument,
5226         EmitContext.EmitStoreArgument): New helper functions when the
5227         RemapToProxy flag is set.
5228
5229         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
5230         function.
5231
5232         Add support for remapping parameters. 
5233
5234         * iterators.cs: Propagate parameter values;  Store parameter
5235         values in the proxy classes.
5236
5237 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
5238
5239         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
5240         need a proxy reference;  I do not know what I was thinking
5241
5242         * cs-parser.jay (constructor_initializer): catch another error,
5243         and display nice message.
5244
5245         (field_declaration): catch void field declaration
5246         to flag a better error. 
5247
5248         * class.cs (MemberBase.CheckBase): Report an error instead of a
5249         warning if a new protected member is declared in a struct. 
5250         (Field.Define): catch the error of readonly/volatile.
5251
5252         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
5253
5254         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
5255         volatile variable is taken
5256
5257 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
5258
5259         * statement.cs (Fixed.Resolve): Report an error if we are not in
5260         an unsafe context.
5261
5262 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
5263
5264         * typemanager.cs: reuse the code that handles type clashes for
5265         delegates and enumerations.
5266
5267         * class.cs (Report28): Always report.
5268
5269         * expression.cs (EncodeAsAttribute): Allow nulls here.
5270
5271 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
5272
5273         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
5274         the functionality for testing whether an expression is valid for
5275         an attribute here.  Also handle the case of arrays of elements
5276         being stored. 
5277
5278         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
5279         encoding a linear array into an array of objects that are suitable
5280         to be passed to an CustomAttributeBuilder.
5281
5282         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
5283
5284         * ecore.cs: (FieldExpr): Handle field remapping here.
5285
5286         * iteratators.cs: Pass the instance variable (if the method is an
5287         instance method) to the constructors, so we can access the field
5288         variables on the class.
5289
5290         TODO: Test this with structs.  I think the THIS variable on
5291         structs might have to be a pointer, and not a refenrece
5292
5293 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
5294
5295         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
5296         local variables to fields in a proxy class.
5297
5298         * iterators.cs (PopulateProxy): Rename our internal fields to
5299         <XXX>.  
5300         Create a <THIS> field if we are an instance method, so we can
5301         reference our parent container variables.
5302         (MapVariable): Called back from the EmitContext code to enter a
5303         new variable to field mapping into the proxy class (we just create
5304         a FieldBuilder).
5305
5306         * expression.cs
5307         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
5308         for using the remapped locals to fields.
5309
5310         I placed the code here, because that gives the same semantics to
5311         local variables, and only changes the Emit code.
5312
5313         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
5314         statements inside iterators.
5315         (VariableInfo): Add a FieldBuilder for the cases when we are
5316         remapping local variables to fields in a proxy class
5317
5318         * ecore.cs (SimpleNameResolve): Avoid testing two times for
5319         current_block != null.
5320
5321         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
5322         not cope with strings, as it has been moved to the
5323         TableSwitchEmit.  Fixed bug in switch generation.
5324
5325         * expression.cs (New.DoResolve): Provide more context for the user
5326         when reporting an error.
5327
5328         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
5329         pointers. 
5330
5331         * expression.cs (MemberAccess.DoResolve): When we get a type back,
5332         check the permissions for it.  Note than in a type-resolution
5333         context the check was already present in DeclSpace.ResolveType,
5334         but was missing from the MemberAccess.
5335
5336         (ArrayCreation.CheckIndices): warn if the user has
5337         more nested levels of expressions, but there are no more
5338         dimensions specified.  Avoids crash on bug 41906.
5339
5340 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
5341
5342         * statement.cs (Block): replace Implicit bool, for a generic
5343         flags.   
5344         New flag: `Unchecked'.  This is used during the EmitMeta phase
5345         (which is out-of-line with the regular Resolve/Emit process for a
5346         statement, as this is done ahead of time, but still gets a chance
5347         to call constant resolve).
5348
5349         (Block.Flags): new enum for adding a new flag.
5350
5351         (Block.EmitMeta): track the state of unchecked.
5352
5353         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
5354         to enable constant resolution to work there as well.
5355
5356 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
5357
5358         * typemanager.cs (ienumerable_type): Also look up
5359         System.Collections.IEnumerable. 
5360
5361 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
5362
5363         TODO: Test more than one conditional per method.
5364
5365         * class.cs (Indexer.Define): Report the location where the user is
5366         referencing the unsupported feature.
5367
5368         (MethodData): Overload the use of `conditionals' to
5369         minimize the creation of needless ArrayLists.   This saves roughly
5370         212kb on my machine.
5371
5372         (Method): Implement the new IIteratorContainer interface.
5373         (Method.SetYields): Implement the method by setting the ModFlags
5374         to contain METHOD_YIELDS.
5375
5376         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
5377         which just got set to null.
5378
5379         * iterators.cs: New file.
5380
5381         (Yield, YieldBreak): New statements.
5382
5383         * statement.cs (Return.Resolve): Flag an error if we are used in
5384         an iterator method.
5385
5386         * codegen.cs (InIterator): New flag set if the code is being
5387         compiled in an iterator method.
5388
5389         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
5390         internal modifier, and we just use it to avoid adding extra
5391         fields, as this is seldom used.  
5392
5393         * cs-parser.jay: Add yield_statement (yield and yield break).
5394
5395         * driver.cs: New flag -v2 to turn on version 2 features. 
5396
5397         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
5398         hashtable when v2 is enabled.
5399
5400 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
5401
5402         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
5403         there is already a namespace defined with this name.
5404
5405         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
5406         people upgraded their corlibs.
5407
5408         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
5409         always use fully qualified types, no need to use the compiler
5410         front end.
5411
5412         (TypeManager.IsNamespace): Use binarysearch.
5413
5414         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
5415         AddDelegate): I did not quite use the new IsValid API properly: I
5416         have to pass the short-name and the fullname.  I was passing only
5417         the basename instead of the fullname sometimes. 
5418
5419         (TypeContainer.DefineType): call NamespaceClash.
5420
5421         * interface.cs (Interface.DefineType): use NamespaceClash before
5422         defining the type.
5423
5424         * delegate.cs (Delegate.DefineType): use NamespaceClash before
5425         defining the type.
5426
5427         * enum.cs: (Enum.DefineType): use NamespaceClash before
5428         defining the type.
5429
5430         * typemanager.cs (: 3-line patch that gives us some tasty 11%
5431         speed increase.  First, use the negative_hits cache when we get a
5432         negative.  Second, add the type with its full original name
5433         instead of the new . and + encoded name (reflection uses + to
5434         separate type from a nested type).  Use LookupTypeReflection
5435         directly which bypasses the type->name hashtable (that we already
5436         know does not contain the type.
5437
5438         * decl.cs (DeclSpace.ResolveTypeExpr): track the
5439         location/container type. 
5440
5441         * driver.cs: When passing utf8, use directly the UTF8Encoding.
5442
5443 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
5444
5445         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
5446
5447         * delegate.cs (NewDelegate.Resolve): Test whether an instance
5448         method is being referenced in the method group from a static
5449         context, and report error 120 if so.
5450
5451         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
5452         Error118. 
5453
5454         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
5455         is created, we create the A namespace).
5456
5457         * cs-parser.jay: A namespace also introduces a DeclarationFound.
5458         Fixes #41591
5459
5460 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
5461
5462         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
5463         invocation to ModuleBuilder.GetType with the same values will
5464         return a new type instance, so we need to cache its return
5465         values. 
5466
5467         * expression.cs (Binary.ResolveOperator): Only allow the compare
5468         operators on enums if they are of the same type.
5469
5470         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
5471         types of ValueType on their own case.  Before we were giving them
5472         the same treatment as objects.
5473
5474         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
5475         fullname.  Short name is used to compare against container name.
5476         Fullname is used to check against defined namespace names.
5477
5478         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
5479         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
5480
5481         (Method.CheckBase): Call parent.
5482         (MemberBase.CheckBase): Check for protected members on sealed
5483         classes.
5484         (PropertyBase.CheckBase): Call parent.
5485         (Field.Define): Call parent.
5486
5487         * report.cs: Negative error codes are now mapped to 8000 - code,
5488         so that the display is render more nicely.
5489
5490         * typemanager.cs: Do not use try/catch, instead report a regular
5491         error. 
5492
5493         (GetPointerType, GetReferenceType): These methods provide
5494         mechanisms to obtain the T* and T& from a T.  We had the code
5495         previously scattered around the code base, and it also used
5496         TypeManager.LookupType that would go through plenty of caches.
5497         This one goes directly to the type source.
5498
5499         In some places we did the Type.GetType followed by
5500         ModuleBuilder.GetType, but not in others, so this unifies the
5501         processing as well.
5502
5503         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
5504         statements now that we have namespace information.
5505
5506         * typemanager.cs (IsNamespace): New method, returns whether the
5507         string presented is a namespace or not.
5508
5509         (ComputeNamespaces): New public entry point, computes the list of
5510         available namespaces, using the GetNamespaces API call in Mono, or
5511         the slower version in MS.NET.   
5512
5513         Now before we start the semantic analysis phase, we have a
5514         complete list of namespaces including everything that the user has
5515         provided.
5516
5517         Deleted old code to cache namespaces in .nsc files.
5518
5519 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
5520
5521         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
5522         class/struct location definition Location for the implicit
5523         constructor location.
5524
5525         (Operator.Define): Use the location of the operator for the
5526         implicit Method definition.
5527
5528         (Constructor.Emit): use the constructor location for the implicit
5529         base initializer constructor.
5530
5531         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
5532         and the Expression class now contains two new methods:
5533
5534         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
5535         isolate type lookup from the rest of the resolution process.
5536
5537         Since we use Expressions to hold type definitions due to the way
5538         we parse the input we have historically overloaded Resolve to
5539         perform the Type lookups if a special flag is passed.  Now this is
5540         eliminated and two methods take their place. 
5541
5542         The differences in the two methods between xStep and xTerminal is
5543         that xStep is involved in our current lookup system that uses
5544         SimpleNames to compose a name, while xTerminal is used just to
5545         catch the case where the simplename lookup failed.
5546
5547 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
5548
5549         * expression.cs (ResolveMemberAccess): Remove redundant code.
5550         TypeExpr expressions are always born fully resolved.
5551
5552         * interface.cs (PopulateMethod): Do not lookup the types twice.
5553         We were doing it once during SemanticAnalysis and once during
5554         PopulateMethod.
5555
5556         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
5557         in local variable type definitions, were being returned as a
5558         SimpleName (we decomposed everything into a string), that is
5559         because primary_expression was being used instead of a type in the
5560         grammar (reduce/reduce conflicts).
5561
5562         The part that was wrong is that we converted the expression into a
5563         string (an oversimplification in one hand, compounded with primary
5564         expressions doing string concatenation).
5565
5566         So things like:
5567
5568         A.B.C [] x;
5569
5570         Would return "A.B.C[]" as a SimpleName.  This stopped things like
5571         using clauses from working on this particular context.  And a type
5572         was being matched directly against "A.B.C[]".
5573
5574         We now use the correct approach, and allow for ComposedCast to be
5575         part of the unary expression.  So the "A.B.C []" become a composed
5576         cast of "A.B.C" (as a nested group of MemberAccess with a
5577         SimpleName at the end) plus the rank composition "[]". 
5578
5579         Also fixes 35567
5580
5581 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
5582
5583         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
5584         for the access level checking.
5585
5586         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
5587         `TypeContainer container', because I kept getting confused when I
5588         was debugging this code.
5589
5590         * expression.cs (Indexers): Instead of tracking getters/setters,
5591         we now track them in parallel.  We create one arraylist less, but
5592         most importantly it is possible now for the LValue code to find a
5593         matching get for a set.
5594
5595         (IndexerAccess.DoResolveLValue): Update the code.
5596         GetIndexersForType has been modified already to extract all the
5597         indexers from a type.  The code assumed it did not.
5598
5599         Also make the code set the correct return type for the indexer.
5600         This was fixed a long time ago for properties, but was missing for
5601         indexers.  It used to be void_type.
5602
5603         (Binary.Emit): Test first for doubles instead of
5604         floats, as they are more common.
5605
5606         (Binary.EmitBranchable): Use the .un version of the branch opcodes
5607         when dealing with floats and the <=, >= operators.  This fixes bug
5608         #39314 
5609
5610         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
5611         to load the array value by emitting a load on the foreach variable
5612         type.  This was incorrect.  
5613
5614         We now emit the code to load an element using the the array
5615         variable type, and then we emit the conversion operator.
5616
5617         Fixed #40176
5618
5619 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
5620
5621         * attribute.cs: Avoid allocation of ArrayLists in the common case.
5622
5623 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
5624
5625         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
5626         test for protection before we test for signatures. 
5627
5628         (MethodSignature.ToString): implement.
5629
5630         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
5631         to the case where we reduced into a LongConstant.
5632
5633         * decl.cs (CheckAccessLevel): If the type is an array, we can not
5634         depend on whether the information is acurrate, because the
5635         Microsoft runtime will always claim that the array type is public,
5636         regardless of the real state.
5637
5638         If the type is a pointer, another problem happens: the type is
5639         reported as non-public in Microsoft.  
5640
5641         In both cases we have to call CheckAccessLevel recursively with
5642         the underlying type as the argument to be tested.
5643
5644 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
5645
5646         * assign.cs (Assign.Emit): If we are dealing with a compound
5647         assignment expression, we should use the code path that stores the
5648         intermediate result in a temporary value.  This fixes #40903.
5649
5650         *expression.cs (Indirection.ToString): Provide ToString method for
5651         debugging. 
5652
5653 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
5654
5655         * class.cs: Null out fields holding references to Block objects so
5656         they can be garbage collected.
5657
5658         * expression.cs (OverloadResolve): Remove unused local.
5659
5660 2003-04-07  Martin Baulig  <martin@ximian.com>
5661
5662         * codegen.cs (EmitContext.CurrentFile): New public field.
5663         (EmitContext.Mark): Use the CurrentFile to check whether the
5664         location is in the correct file.
5665         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
5666
5667 2003-04-07  Martin Baulig  <martin@ximian.com>
5668
5669         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
5670
5671         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
5672         location.  [FIXME: The location argument which gets passed to this
5673         method is sometimes wrong!]
5674
5675 2003-04-07  Nick Drochak <ndrochak@gol.com>
5676
5677         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
5678
5679 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
5680
5681         * expression.cs (Indirection.EmitAssign): We were using the
5682         temporary, but returning immediately instead of continuing the
5683         EmitAssing flow.
5684
5685 2003-04-06  Martin Baulig  <martin@ximian.com>
5686
5687         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
5688         if it's a nested child, but also deriving from the outer class.
5689         See test 190.cs.
5690
5691         * typemanager.cs (IsNestedChildOf): Make this work if it's a
5692         nested child, but also deriving from the outer class.  See
5693         test-190.cs.
5694         (FilterWithClosure): We may access private members of the outer
5695         class if we're a nested child and deriving from the outer class.
5696         (RealMemberLookup): Only set `closure_private_ok' if the
5697         `original_bf' contained BindingFlags.NonPublic.
5698
5699 2003-04-05  Martin Baulig  <martin@ximian.com>
5700
5701         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #40670.
5702
5703 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
5704
5705         * class.cs (Event.Define): Do not allow abstract events to have
5706         initializers. 
5707
5708 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
5709
5710         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
5711         block in event declarations.
5712
5713         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
5714         value type, get its address.
5715
5716         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
5717         leaving a class on the stack instead of a boolean value (int
5718         0/1).  Change the code so we compare against null, and then the
5719         result against zero.
5720
5721         * class.cs (TypeContainer.GetClassBases): We were checking for the
5722         parent class being sealed too late.
5723
5724         * expression.cs (Binary.Emit): For <= and >= when dealing with
5725         floating point values, use cgt.un and clt.un instead of cgt and
5726         clt alone.
5727
5728 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
5729
5730         * statement.cs: Apply the same optimization as MS: skip the 
5731         GetEnumerator returning an IEnumerator, and use the one returning a 
5732         CharEnumerator instead. This allows us to avoid the try-finally block 
5733         and the boxing.
5734
5735 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
5736
5737         * cs-parser.jay: Attributes cannot be applied to
5738                          namespaces. Fixes #40473
5739
5740 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5741
5742         * class.cs:
5743         (Add*): check if the name is valid using the full name for constants,
5744         fields, properties and events.
5745
5746 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
5747
5748         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
5749         char constants to be part of the enumeration.
5750
5751         * expression.cs (Conditional.DoResolve): Add support for operator
5752         true. Implements the missing functionality from 14.12
5753
5754         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
5755         operator true/false as required by the spec.
5756
5757         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
5758         implicit conversion to boolean.
5759
5760         * statement.cs (Statement.ResolveBoolean): A boolean expression is
5761         also one where the type implements `operator true'. 
5762
5763         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
5764         get an expression that will invoke operator true based on an
5765         expression.  
5766
5767         (GetConversionOperators): Removed the hack that called op_True
5768         here.  
5769
5770         (Expression.ResolveBoolean): Move this from Statement.
5771
5772 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
5773
5774         * ecore.cs (FieldExpr): do not allow initialization of initonly
5775         fields on derived classes
5776
5777 2003-03-13  Martin Baulig  <martin@ximian.com>
5778
5779         * statement.cs (Block.Emit): Call ig.BeginScope() and
5780         ig.EndScope() when compiling with debugging info; call
5781         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
5782
5783 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
5784
5785         * expression.cs (Indexers): Do not construct immediately, allow
5786         for new members to be appended as we go.  Fixes 38143
5787
5788 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5789
5790         * expression.cs: save/restore context when resolving an unchecked
5791         expression.
5792
5793 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
5794
5795         * cfold.cs: Catch division by zero in modulus operator during
5796         constant folding.
5797
5798 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
5799
5800         * interface.cs (Interface.DefineMembers): Avoid defining members
5801         twice. 
5802
5803 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
5804
5805         * driver.cs: handle the +/- options for -noconfig
5806
5807         * statement.cs (Unckeched.Resolve): Also track the state of
5808         unchecked in the Resolve phase.
5809
5810 2003-02-27  Martin Baulig  <martin@ximian.com>
5811
5812         * ecore.cs (Expression.MemberLookup): Don't create a
5813         MethodGroupExpr for something which is not a method.  Fixes #38291.
5814
5815 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
5816
5817         * class.cs (MemberBase.CheckParameters): Also check that the type
5818         is unmanaged if it is a pointer.
5819
5820         * expression.cs (SizeOf.Resolve): Add location information.
5821
5822         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
5823         a managed type is declared.
5824
5825         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
5826         parameter modifiers as well.  Fixes bug 38606
5827
5828         * class.cs: Very sad.  Am backing out the speed up changes
5829         introduced by the ArrayList -> Array in the TypeContainer, as they
5830         were not actually that much faster, and introduced a bug (no error
5831         reports on duplicated methods).
5832
5833         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
5834         source first, this will guarantee that we have a valid expression
5835         before calling in lower levels functions that will require a
5836         resolved object.  Then use this original_source in the
5837         target.ResolveLValue instead of the original source that was
5838         passed to us.
5839
5840         Another change.  Use target.Resolve instead of LValueResolve.
5841         Although we are resolving for LValues, we will let the Assign code
5842         take care of that (it will be called again from Resolve).  This
5843         basically allows code like this:
5844
5845         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
5846         class Y { void A (X x) { x [0] += o; }
5847
5848         The problem was that the indexer was trying to resolve for
5849         set_Item (idx, object o) and never finding one.  The real set_Item
5850         was set_Item (idx, X).  By delaying the process we get the right
5851         semantics. 
5852
5853         Fixes bug 36505
5854
5855 2003-02-23  Martin Baulig  <martin@ximian.com>
5856
5857         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
5858         while calling DoEmit ().
5859
5860         * codegen.cs (EmitContext.Mark): Don't mark locations in other
5861         source files; if you use the #line directive inside a method, the
5862         compiler stops emitting line numbers for the debugger until it
5863         reaches the end of the method or another #line directive which
5864         restores the original file.
5865
5866 2003-02-23  Martin Baulig  <martin@ximian.com>
5867
5868         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
5869
5870 2003-02-23  Martin Baulig  <martin@ximian.com>
5871
5872         * statement.cs (Block.AddChildVariableNames): We need to call this
5873         recursively, not just for our immediate children.
5874
5875 2003-02-23  Martin Baulig  <martin@ximian.com>
5876
5877         * class.cs (Event.Define): Always make the field private, like csc does.
5878
5879         * typemanager.cs (TypeManager.RealMemberLookup): Make events
5880         actually work, fixes bug #37521.
5881
5882 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
5883
5884         * delegate.cs: When creating the various temporary "Parameters"
5885         classes, make sure that we call the ComputeAndDefineParameterTypes
5886         on those new parameters (just like we do with the formal ones), to
5887         allow them to be resolved in the context of the DeclSpace.
5888
5889         This fixes the bug that Dick observed in Bugzilla #38530.
5890
5891 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
5892
5893         * expression.cs (ResolveMemberAccess): When resolving a constant,
5894         do not attempt to pull a constant if the value was not able to
5895         generate a valid constant.
5896
5897         * const.cs (LookupConstantValue): Do not report more errors than required.
5898
5899 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5900
5901         * expression.cs: fixes bug #38328.
5902
5903 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5904
5905         * class.cs: Changed all the various members that can be part of a
5906         class from being an ArrayList to be an Array of the right type.
5907         During the DefineType type_list, interface_list, delegate_list and
5908         enum_list are turned into types, interfaces, delegates and enums
5909         arrays.  
5910
5911         And during the member population, indexer_list, event_list,
5912         constant_list, field_list, instance_constructor_list, method_list,
5913         operator_list and property_list are turned into their real arrays.
5914
5915         Although we could probably perform this operation earlier, for
5916         good error reporting we need to keep the lists and remove the
5917         lists for longer than required.
5918
5919         This optimization was triggered by Paolo profiling the compiler
5920         speed on the output of `gen-sample-program.pl' perl script. 
5921
5922         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
5923         not crash in methods like MemberLookupFailed that use this field.  
5924
5925         This problem arises when the compiler fails to resolve a type
5926         during interface type definition for example.
5927
5928 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
5929
5930         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
5931         inherit from System.Object, so we have to stop at null, not only
5932         when reaching System.Object.
5933
5934 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
5935
5936         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
5937         DeclaredOnly because the parent indexer might have had a different
5938         name, but did not loop until the top of the hierarchy was reached.
5939
5940         The problem this one fixes is 35492: when a class implemented an
5941         indexer from an interface, we were getting the interface method
5942         (which was abstract) and we were flagging an error (can not invoke
5943         abstract method).
5944
5945         This also keeps bug 33089 functioning, and test-148 functioning.
5946
5947         * typemanager.cs (IsSpecialMethod): The correct way of figuring
5948         out if a method is special is to see if it is declared in a
5949         property or event, or whether it is one of the predefined operator
5950         names.   This should fix correctly #36804.
5951
5952 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
5953
5954         The goal here is to remove the dependency on EmptyCast.Peel ().
5955         Killing it completely.
5956
5957         The problem is that currently in a number of places where
5958         constants are expected, we have to "probe" for an EmptyCast, and
5959         Peel, which is not the correct thing to do, as this will be
5960         repetitive and will likely lead to errors. 
5961
5962         The idea is to remove any EmptyCasts that are used in casts that
5963         can be reduced to constants, so we only have to cope with
5964         constants. 
5965
5966         This bug hunt was triggered by Bug 37363 and the desire to remove
5967         the duplicate pattern where we were "peeling" emptycasts to check
5968         whether they were constants.  Now constants will always be
5969         constants.
5970
5971         * ecore.cs: Use an enumconstant here instead of wrapping with
5972         EmptyCast.  
5973
5974         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
5975         throwing me off.  By handling this we can get rid of a few hacks.
5976
5977         * statement.cs (Switch): Removed Peel() code.
5978
5979 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
5980
5981         * class.cs: Location information for error 508
5982
5983         * expression.cs (New.DoResolve): Add a guard against double
5984         resolution of an expression.  
5985
5986         The New DoResolve might be called twice when initializing field
5987         expressions (see EmitFieldInitializers, the call to
5988         GetInitializerExpression will perform a resolve on the expression,
5989         and later the assign will trigger another resolution
5990
5991         This leads to bugs (#37014)
5992
5993         * delegate.cs: The signature for EndInvoke should contain any ref
5994         or out parameters as well.  We were not doing this in the past. 
5995
5996         * class.cs (Field.Define): Do not overwrite the type definition
5997         inside the `volatile' group.  Turns out that volatile enumerations
5998         were changing the type here to perform a validity test, which
5999         broke conversions. 
6000
6001 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
6002
6003         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
6004         and structs, we do not want to load the instance variable
6005
6006         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
6007         enum_type has to be handled like an object reference (implicit
6008         conversions exists from this to object), but the regular IsClass
6009         and IsValueType tests will never return true for this one.
6010
6011         Also we use TypeManager.IsValueType instead of type.IsValueType,
6012         just for consistency with the rest of the code (this is only
6013         needed if we ever use the construct exposed by test-180.cs inside
6014         corlib, which we dont today).
6015
6016 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
6017
6018         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
6019         just InternalCall.
6020
6021 2003-02-09  Martin Baulig  <martin@ximian.com>
6022
6023         * namespace.cs (Namespace..ctor): Added SourceFile argument.
6024         (Namespace.DefineNamespaces): New static public method; this is
6025         called when we're compiling with debugging to add all namespaces
6026         to the symbol file.
6027
6028         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
6029         pass it to the Namespace's .ctor.
6030
6031         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
6032         and MethodBase arguments; pass the namespace ID to the symwriter;
6033         pass the MethodBase instead of the token to the symwriter.
6034         (SymbolWriter.DefineNamespace): New method to add a namespace to
6035         the symbol file.
6036
6037 2003-02-09  Martin Baulig  <martin@ximian.com>
6038
6039         * symbolwriter.cs: New file.  This is a wrapper around
6040         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
6041         methods here in near future.
6042
6043 2003-02-09  Martin Baulig  <martin@ximian.com>
6044
6045         * codegen.cs (EmitContext.Mark): Just pass the arguments to
6046         ILGenerator.MarkSequencePoint() which are actually used by the
6047         symbol writer.
6048
6049 2003-02-09  Martin Baulig  <martin@ximian.com>
6050
6051         * location.cs (SourceFile): New public sealed class.  This
6052         contains the name and an index which is used in the location's token.
6053         (Location): Reserve an appropriate number of bits in the token for
6054         the source file instead of walking over that list, this gives us a
6055         really huge performance improvement when compiling with debugging.
6056
6057         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
6058         `SourceFile' argument instead of a string.
6059         (Driver.ProcessFile): Add all the files via Location.AddFile(),
6060         but don't parse/tokenize here, we need to generate the list of all
6061         source files before we do that.
6062         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
6063         the files.
6064
6065         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
6066         instead of a string.
6067
6068         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
6069         of a string.
6070
6071 2003-02-09  Martin Baulig  <martin@ximian.com>
6072
6073         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
6074         filename on `#line default'.
6075
6076 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
6077
6078         * statement.cs: don't clear the pinned var when the fixed statement
6079         returns from the method (fixes bug#37752).
6080
6081 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
6082
6083         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
6084         to IsValueType.
6085
6086 2003-02-07  Martin Baulig  <martin@ximian.com>
6087
6088         * driver.cs: Removed the `--debug-args' command line argument.
6089
6090         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
6091         automatically by the AsssemblyBuilder.
6092         (CodeGen.InitializeSymbolWriter): We don't need to call any
6093         initialization function on the symbol writer anymore.  This method
6094         doesn't take any arguments.
6095
6096 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
6097
6098         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
6099         from referenced assemblies as well.
6100
6101 2003-02-02  Martin Baulig  <martin@ximian.com>
6102
6103         * class.cs (MethodData.Emit): Generate debugging info for external methods.
6104
6105 2003-02-02  Martin Baulig  <martin@ximian.com>
6106
6107         * class.cs (Constructor.Emit): Open the symbol writer before
6108         emitting the constructor initializer.
6109         (ConstructorInitializer.Emit): Call ec.Mark() to allow
6110         single-stepping through constructor initializers.
6111
6112 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
6113
6114         * class.cs: Handle error 549: do not allow virtual methods in
6115         sealed classes. 
6116
6117 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
6118
6119         * decl.cs: Check access levels when resolving types
6120
6121 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
6122
6123         * statement.cs: Add parameters and locals set in catch blocks that might 
6124         return to set vector
6125
6126 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
6127
6128         * class.cs (Operator): Set the SpecialName flags for operators.
6129
6130         * expression.cs (Invocation.DoResolve): Only block calls to
6131         accessors and operators on SpecialName methods.
6132
6133         (Cast.TryReduce): Handle conversions from char constants.
6134
6135
6136 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
6137
6138         * statement.cs: small memory and time optimization in FlowBranching.
6139
6140 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
6141
6142         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
6143         problem that the last fix but in the other sid (Set).
6144
6145         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
6146         access when there is no indexer in the hierarchy.
6147
6148 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
6149
6150         * class.cs: Combine some if statements.
6151
6152 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6153
6154         * driver.cs: fixed bug #37187.
6155
6156 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
6157
6158         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
6159         any indexer, it's needed to build a list with all the indexers in the
6160         hierarchy (AllGetters), else we have problems. Fixes #35653.
6161
6162 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
6163
6164         * class.cs (MethodData.Define): It is wrong for an interface
6165         implementation to be static in both cases: explicit and implicit.
6166         We were only handling this in one case.
6167
6168         Improve the if situation there to not have negations.
6169
6170         * class.cs (Field.Define): Turns out that we do not need to check
6171         the unsafe bit on field definition, only on usage.  Remove the test.
6172
6173 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6174
6175         * driver.cs: use assembly.Location instead of Codebase (the latest
6176         patch made mcs fail when using MS assemblies).
6177
6178 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
6179
6180         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
6181         get the path to *corlib.dll.
6182
6183 2003-01-21  Nick Drochak <ndrochak@gol.com>
6184
6185         * cs-tokenizer.cs:
6186         * pending.cs:
6187         * typemanager.cs: Remove compiler warnings
6188
6189 2003-01-20  Duncan Mak  <duncan@ximian.com>
6190
6191         * AssemblyInfo.cs: Bump the version number to 0.19.
6192
6193 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6194
6195         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
6196
6197 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
6198
6199         * class.cs (Constructor::Emit): Emit debugging info for constructors.
6200
6201 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
6202
6203         * cs-parser.jay: Small fix: we were not comparing the constructor
6204         name correctly.   Thanks to Zoltan for the initial pointer.
6205
6206 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
6207
6208         * cs-tokenizer.cs: Set file name when specified with #line
6209
6210 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
6211
6212         * cs-parser.jay: Only perform the constructor checks here if we
6213         are named like the class;  This will help provider a better
6214         error.  The constructor path is taken when a type definition is
6215         not found, but most likely the user forgot to add the type, so
6216         report that rather than the constructor error.
6217
6218 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
6219
6220         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
6221         allocations.
6222
6223 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6224
6225         * cs-parser.jay: Add cleanup call.
6226
6227 2003-01-13  Duncan Mak  <duncan@ximian.com>
6228
6229         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
6230         consistent with other methods.
6231
6232 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
6233
6234         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
6235
6236 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
6237
6238         * attribute.cs: only set GuidAttr to true when we have a
6239         GuidAttribute.
6240
6241 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6242
6243         * ecore.cs:
6244         * expression.cs:
6245         * typemanager.cs: fixes to allow mcs compile corlib with the new
6246         Type.IsSubclassOf fix.
6247
6248 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
6249
6250         * expression.cs (LocalVariableReference.DoResolve): Classify a
6251         constant as a value, not as a variable.   Also, set the type for
6252         the variable.
6253
6254         * cs-parser.jay (fixed_statement): take a type instead of a
6255         pointer_type, so we can produce a better error message later.
6256
6257         * statement.cs (Fixed.Resolve): Flag types that are not pointers
6258         as an error.  
6259
6260         (For.DoEmit): Make inifinite loops have a
6261         non-conditional branch back.
6262
6263         (Fixed.DoEmit): First populate the pinned variables, then emit the
6264         statement, then clear the variables.  Before I was emitting the
6265         code once for each fixed piece.
6266
6267
6268 2003-01-08  Martin Baulig  <martin@ximian.com>
6269
6270         * statement.cs (FlowBranching.MergeChild): A break in a
6271         SWITCH_SECTION does not leave a loop.  Fixes #36155.
6272
6273 2003-01-08  Martin Baulig  <martin@ximian.com>
6274
6275         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
6276         lives in the same number space than `param_map'.  Fixes #36154.
6277
6278 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
6279
6280         * cs-parser.jay (constructor_declaration): Set the
6281         Constructor.ModFlags before probing for it.  This makes the
6282         compiler report 514, 515 and 132 (the code was there, but got
6283         broken). 
6284
6285         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
6286         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
6287         (GotoCase.Resolve): Set `Returns' to ALWAYS.
6288
6289 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
6290
6291         * enum.cs: create the enum static fields using the enum type.
6292
6293 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
6294
6295         * class.cs: don't try to create the ParamBuilder for the return
6296         type if it's not needed (and handle it breaking for the ms runtime
6297         anyway).
6298
6299 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
6300
6301         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
6302
6303 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
6304
6305         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
6306         the command.   This showed up while compiling the JANET source
6307         code, which used \r as its only newline separator.
6308
6309 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
6310
6311         * class.cs (Method.Define): If we are an operator (because it
6312         reuses our code), then set the SpecialName and HideBySig.  #36128
6313
6314 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
6315
6316         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
6317         exception, report error 120 `object reference required'.
6318
6319         * driver.cs: Add --pause option, used during to measure the size
6320         of the process as it goes with --timestamp.
6321
6322         * expression.cs (Invocation.DoResolve): Do not allow methods with
6323         SpecialName to be invoked.
6324
6325 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
6326
6327         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
6328         number before adding it.
6329
6330 2002-12-21  Ravi Pratap  <ravi@ximian.com>
6331
6332         * ecore.cs (StandardImplicitConversion): When in an unsafe
6333         context, we allow conversion between void * to any other pointer
6334         type. This fixes bug #35973.
6335
6336 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
6337
6338         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
6339         is not thrown when extensionless outputs are used 
6340
6341 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6342
6343         * rootcontext.cs: fixed compilation of corlib.
6344
6345 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
6346
6347         * attribute.cs (Attributes.Contains): Add new method.
6348
6349         * class.cs (MethodCore.LabelParameters): if the parameter is an
6350         `out' parameter, check that no attribute `[In]' has been passed.
6351
6352         * enum.cs: Handle the `value__' name in an enumeration.
6353
6354 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
6355
6356         * decl.cs: Added special case to allow overrides on "protected
6357         internal" methods
6358
6359 2002-12-18  Ravi Pratap  <ravi@ximian.com>
6360
6361         * attribute.cs (Attributes.AddAttributeSection): Rename to this
6362         since it makes much more sense.
6363
6364         (Attributes.ctor): Don't require a Location parameter.
6365
6366         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
6367
6368         * attribute.cs (ApplyAttributes): Remove extra Location parameters
6369         since we already have that information per attribute.
6370
6371         * everywhere : make appropriate changes.
6372
6373         * class.cs (LabelParameters): Write the code which actually
6374         applies attributes to the return type. We can't do this on the MS
6375         .NET runtime so we flag a warning in the case an exception is
6376         thrown.
6377
6378 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
6379
6380         * const.cs: Handle implicit null conversions here too.
6381
6382 2002-12-17  Ravi Pratap  <ravi@ximian.com>
6383
6384         * class.cs (MethodCore.LabelParameters): Remove the extra
6385         Type [] parameter since it is completely unnecessary. Instead
6386         pass in the method's attributes so that we can extract
6387         the "return" attribute.
6388
6389 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
6390
6391         * cs-parser.jay (parse): Use Report.Error to flag errors instead
6392         of ignoring it and letting the compile continue.
6393
6394         * typemanager.cs (ChangeType): use an extra argument to return an
6395         error condition instead of throwing an exception.
6396
6397 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
6398
6399         * expression.cs (Unary.TryReduce): mimic the code for the regular
6400         code path.  Perform an implicit cast in the cases where we can
6401         implicitly convert to one of the integral types, and then reduce
6402         based on that constant.   This fixes bug #35483.
6403
6404 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6405
6406         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
6407
6408 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6409
6410         * namespace.cs: fixed bug #35489.
6411
6412 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
6413
6414         * class.cs: Remove some dead code.
6415
6416         * cs-parser.jay: Estimate the number of methods needed
6417         (RootContext.MethodCount);
6418
6419         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
6420         numbers instead of StringBuilders.
6421
6422         * support.cs (PtrHashtable): Add constructor with initial size;
6423         We can now reduce reallocations of the method table.
6424
6425 2002-12-10  Ravi Pratap  <ravi@ximian.com>
6426
6427         * attribute.cs (ApplyAttributes): Keep track of the emitted
6428         attributes on a per-target basis. This fixes bug #35413.
6429
6430 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
6431
6432         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
6433         default to the Windows 1252 encoding.
6434
6435         (UnixParseOption): Support version, thanks to Alp for the missing
6436         pointer. 
6437
6438         * AssemblyInfo.cs: Add nice assembly information.
6439
6440         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
6441         (bug 35169).
6442
6443         * cs-parser.jay: Allow a trailing comma before the close bracked
6444         in the attribute_section production.
6445
6446         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
6447         address of the instance was being taken, I will take this out,
6448         because we take the address of the object immediately here.
6449
6450 2002-12-09  Ravi Pratap  <ravi@ximian.com>
6451
6452         * typemanager.cs (AreMultipleAllowed): Take care of the most
6453         obvious case where attribute type is not in the current assembly -
6454         stupid me ;-)
6455
6456 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
6457
6458         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
6459         definitions, instead of doing that afterwards.  
6460
6461         Also we use a nice little hack, depending on the constructor, we
6462         know if we are a "composed" name or a simple name.  Hence, we
6463         avoid the IndexOf test, and we avoid 
6464
6465         * codegen.cs: Add code to assist in a bug reporter to track down
6466         the source of a compiler crash. 
6467
6468 2002-12-07  Ravi Pratap  <ravi@ximian.com>
6469
6470         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
6471         types have been emitted for a given element and flag an error
6472         if something which does not have AllowMultiple set is used more
6473         than once.
6474
6475         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
6476         attribute types and their corresponding AllowMultiple properties
6477
6478         (AreMultipleAllowed): Check the property for a given type.
6479
6480         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
6481         property in the case we have a TypeContainer.
6482
6483         (Attributes.AddAttribute): Detect duplicates and just skip on
6484         adding them. This trivial fix catches a pretty gross error in our
6485         attribute emission - global attributes were being emitted twice!
6486
6487         Bugzilla bug #33187 is now fixed.
6488
6489 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
6490
6491         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
6492         instead of pp_and).
6493
6494         * expression.cs (Binary.ResolveOperator): I can only use the
6495         Concat (string, string, string) and Concat (string, string,
6496         string, string) if the child is actually a concatenation of
6497         strings. 
6498
6499 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
6500
6501         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
6502         context where we need a 2-character lookahead.
6503
6504         * pending.cs (PendingImplementation): Rework so we can keep track
6505         of interface types all the time, and flag those which were
6506         implemented by parents as optional.
6507
6508 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
6509
6510         * expression.cs (Binary.ResolveOperator): Use
6511         String.Concat(string,string,string) or
6512         String.Concat(string,string,string,string) when possible. 
6513
6514         * typemanager: More helper methods.
6515
6516
6517 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
6518
6519         * pending.cs: remove the bogus return from GetMissingInterfaces()
6520         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
6521
6522 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6523
6524         * namespace.cs: avoid duplicated 'using xxx' being added to
6525         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
6526         when we get more than one 'using' statement for the same namespace.
6527         Report a CS0105 warning for it.
6528
6529 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
6530
6531         * cs-tokenizer.cs (consume_identifier): use read directly, instead
6532         of calling getChar/putback, uses internal knowledge of it.    
6533
6534         (xtoken): Reorder tokenizer so most common patterns are checked
6535         first.  This reduces the compilation time in another 5% (from 8.11s
6536         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
6537
6538         The parsing time is 22% of the compilation in mcs, and from that
6539         64% is spent on the tokenization process.  
6540
6541         I tried using a binary search for keywords, but this is slower
6542         than the hashtable.  Another option would be to do a couple of
6543         things:
6544
6545                 * Not use a StringBuilder, instead use an array of chars,
6546                   with a set value.  Notice that this way we could catch
6547                   the 645 error without having to do it *afterwards*.
6548
6549                 * We could write a hand-parser to avoid the hashtable
6550                   compares altogether.
6551
6552         The identifier consumption process takes 37% of the tokenization
6553         time.  Another 15% is spent on is_number.  56% of the time spent
6554         on is_number is spent on Int64.Parse:
6555
6556                 * We could probably choose based on the string length to
6557                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
6558                   computations. 
6559
6560         Another 3% is spend on wrapping `xtoken' in the `token' function.
6561
6562         Handle 0xa0 as whitespace (#34752)
6563
6564 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
6565
6566         * typemanager.cs (IsCLRType): New routine to tell whether a type
6567         is one of the builtin types.  
6568
6569         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
6570         typecode in more places instead of doing pointer comparissions.
6571         We could leverage some knowledge about the way the typecodes are
6572         laid out.
6573
6574         New code to cache namespaces in assemblies, it is currently not
6575         invoked, to be used soon.
6576
6577         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
6578
6579         * expression.cs (Binary.ResolveOperator): specially handle
6580         strings, and do not perform user-defined operator overloading for
6581         built-in types.
6582
6583 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
6584
6585         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
6586         internalcall as it is a pretty simple operation;  Avoid whenever
6587         possible to call Char.IsLetter.
6588
6589         (consume_identifier): Cut by half the number of
6590         hashtable calls by merging the is_keyword and GetKeyword behavior.
6591
6592         Do not short-circuit, because if we do, we
6593         report errors (ie, #if false && true would produce an invalid
6594         directive error);
6595
6596
6597 2002-11-24  Martin Baulig  <martin@ximian.com>
6598
6599         * expression.cs (Cast.TryReduce): If we're in checked syntax,
6600         check constant ranges and report a CS0221.  Fixes #33186.
6601
6602 2002-11-24  Martin Baulig  <martin@ximian.com>
6603
6604         * cs-parser.jay: Make this work for uninitialized variable
6605         declarations in the `for' initializer.  Fixes #32416.
6606
6607 2002-11-24  Martin Baulig  <martin@ximian.com>
6608
6609         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
6610         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
6611
6612 2002-11-24  Martin Baulig  <martin@ximian.com>
6613
6614         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
6615         argument; if true, we also check for user-defined conversions.
6616         This is only needed if both arguments are of a user-defined type.
6617         Fixes #30443, added test-175.cs.
6618         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
6619
6620         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
6621
6622 2002-11-24  Martin Baulig  <martin@ximian.com>
6623
6624         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
6625         function to get the store opcode.
6626         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
6627         only emit the Ldelema if the store opcode is Stobj.  You must run
6628         both test-34 and test-167 to test this.  Fixes #34529.
6629
6630 2002-11-23  Martin Baulig  <martin@ximian.com>
6631
6632         * ecore.cs (Expression.MemberLookup): Added additional
6633         `qualifier_type' argument which is used when we're being called
6634         from MemberAccess.DoResolve() and null if we're called from a
6635         SimpleName lookup.
6636         (Expression.MemberLookupFailed): New method to report errors; this
6637         does the CS1540 check and reports the correct error message.
6638
6639         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
6640         argument for the CS1540 check and redone the way how we're dealing
6641         with private members.  See the comment in the source code for details.
6642         (FilterWithClosure): Reverted this back to revision 1.197; renamed
6643         `closure_start_type' to `closure_qualifier_type' and check whether
6644         it's not null.  It was not this filter being broken, it was just
6645         being called with the wrong arguments.
6646
6647         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
6648         and pass it the correct `qualifier_type'; this also does the error
6649         handling for us.
6650
6651 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
6652
6653         * expression.cs (Invocation.EmitParams): If the we are dealing
6654         with a non-built-in value type, load its address as well.
6655
6656         (ArrayCreation): Use a a pretty constant instead
6657         of the hardcoded value 2.   Use 6 instead of 2 for the number of
6658         static initializers.  
6659
6660         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
6661         because they are not really value types, just glorified integers. 
6662
6663         * driver.cs: Do not append .exe, the CSC compiler does not do it.
6664
6665         * ecore.cs: Remove redundant code for enumerations, make them use
6666         the same code path as everything else, fixes the casting issue
6667         with enumerations in Windows.Forms.
6668
6669         * attribute.cs: Do only cast to string if it is a string, the
6670         validation happens later.
6671
6672         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
6673         people upgrade their corlibs.
6674
6675         * ecore.cs: Oops, enumerations were not following the entire code path
6676
6677 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
6678
6679         * typemanager.cs (FilterWithClosure): Commented out the test for
6680         1540 in typemanager.cs, as it has problems when accessing
6681         protected methods from a parent class (see test-174.cs). 
6682
6683         * attribute.cs (Attribute.ValidateGuid): new method.
6684         (Attribute.Resolve): Use above.
6685
6686 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
6687
6688         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
6689
6690         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
6691         handling for enumerations, as we only needed the TypeContainer
6692         functionality to begin with (this is required for the fix below to
6693         work for enums that reference constants in a container class for
6694         example). 
6695
6696         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
6697
6698         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
6699         a valid TypeBuilder to perform lookups on.o
6700
6701         * class.cs (InheritableMemberSignatureCompare): Use true in the
6702         call to GetGetMethod and GetSetMethod, because we are comparing
6703         the signature, and we need to get the methods *even* if they are
6704         private. 
6705
6706         (PropertyBase.CheckBase): ditto.
6707
6708         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
6709         GotoCase.Resolve): Use Peel on EmpytCasts.
6710
6711         * ecore.cs (EmptyCast): drop child, add Peel method.
6712
6713 2002-11-17  Martin Baulig  <martin@ximian.com>
6714
6715         * ecore.cs (EmptyCast.Child): New public property.
6716
6717         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
6718         label resolved to an EmptyCast.  Fixes #34162.
6719         (GotoCase.Resolve): Likewise.
6720         (Block.EmitMeta): Likewise.
6721
6722 2002-11-17  Martin Baulig  <martin@ximian.com>
6723
6724         * expression.cs (Invocation.BetterConversion): Prefer int over
6725         uint; short over ushort; long over ulong for integer literals.
6726         Use ImplicitConversionExists instead of StandardConversionExists
6727         since we also need to check for user-defined implicit conversions.
6728         Fixes #34165.  Added test-173.cs.
6729
6730 2002-11-16  Martin Baulig  <martin@ximian.com>
6731
6732         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
6733         with the `true' and `false' literals.  Fixes #33151.
6734
6735 2002-11-16  Martin Baulig  <martin@ximian.com>
6736
6737         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
6738         October 22nd; don't do the cs1540 check for static members.
6739
6740         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
6741         now using our own filter here and doing the cs1540 check again.
6742
6743 2002-11-16  Martin Baulig  <martin@ximian.com>
6744
6745         * support.cs (InternalParameters): Don't crash if we don't have
6746         any fixed parameters.  Fixes #33532.
6747
6748 2002-11-16  Martin Baulig  <martin@ximian.com>
6749
6750         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
6751         when looking up static methods to make this work on Windows.
6752         Fixes #33773.
6753
6754 2002-11-16  Martin Baulig  <martin@ximian.com>
6755
6756         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
6757         a setter rather than using PropertyInfo.CanWrite.
6758
6759 2002-11-15  Nick Drochak  <ndrochak@gol.com>
6760
6761         * class.cs: Allow acces to block member by subclasses. Fixes build
6762         breaker.
6763
6764 2002-11-14  Martin Baulig  <martin@ximian.com>
6765
6766         * class.cs (Constructor.Emit): Added the extern/block check.
6767         Fixes bug #33678.
6768
6769 2002-11-14  Martin Baulig  <martin@ximian.com>
6770
6771         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
6772         iteration while looking for indexers, this is needed because the
6773         indexer may have a different name in our base classes.  Fixed the
6774         error reporting (no indexers at all, not get accessor, no
6775         overloaded match).  Fixes bug #33089.
6776         (IndexerAccess.DoResolveLValue): Likewise.
6777
6778 2002-11-14  Martin Baulig  <martin@ximian.com>
6779
6780         * class.cs (PropertyBase.CheckBase): Make this work for multiple
6781         indexers.  Fixes the first part of bug #33089.
6782         (MethodSignature.InheritableMemberSignatureCompare): Added support
6783         for properties.
6784
6785 2002-11-13  Ravi Pratap  <ravi@ximian.com>
6786
6787         * attribute.cs (Attribute.Resolve): Catch the
6788         NullReferenceException and report it since it isn't supposed to
6789         happen. 
6790
6791 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
6792
6793         * expression.cs (Binary.EmitBranchable): Also handle the cases for
6794         LogicalOr and LogicalAnd that can benefit from recursively
6795         handling EmitBranchable.  The code now should be nice for Paolo.
6796
6797 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
6798
6799         * typemanager.cs (LookupType): Added a negative-hit hashtable for
6800         the Type lookups, as we perform quite a number of lookups on
6801         non-Types.  This can be removed once we can deterministically tell
6802         whether we have a type or a namespace in advance.
6803
6804         But this might require special hacks from our corlib.
6805
6806         * TODO: updated.
6807
6808         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
6809         and double which avoids a conversion from an integer to a double.
6810
6811         * expression.cs: tiny optimization, avoid calling IsConstant,
6812         because it effectively performs the lookup twice.
6813
6814 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
6815
6816         But a bogus return here to keep the semantics of the old code
6817         until the Mono runtime is fixed.
6818
6819         * pending.cs (GetMissingInterfaces): New method used to remove all
6820         the interfaces that are already implemented by our parent
6821         classes from the list of pending methods. 
6822
6823         * interface.cs: Add checks for calls after ResolveTypeExpr.
6824
6825 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
6826
6827         * class.cs (Class.Emit): Report warning 67: event not used if the
6828         warning level is beyond 3.
6829
6830         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
6831         being a NullLiteral.
6832
6833         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
6834         specifiers. 
6835
6836         * class.cs (TypeContainer.GetClassBases): Cover a missing code
6837         path that might fail if a type can not be resolved.
6838
6839         * expression.cs (Binary.Emit): Emit unsigned versions of the
6840         operators. 
6841
6842         * driver.cs: use error 5.
6843
6844 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
6845
6846         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
6847
6848 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
6849
6850         * cs-parser.jay (switch_section): A beautiful patch from Martin
6851         Baulig that fixed 33094.
6852
6853 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
6854
6855         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
6856         Check whether the base is abstract and report an error if so.
6857
6858         * expression.cs (IndexerAccess.DoResolveLValue,
6859         IndexerAccess.DoResolve): ditto. 
6860
6861         (Invocation.DoResolve): ditto.
6862
6863         (Invocation.FullMethodDesc): Improve the report string.
6864
6865         * statement.cs (Block): Eliminate IsVariableDefined as it is
6866         basically just a wrapper for GetVariableInfo.
6867
6868         * ecore.cs (SimpleName): Use new 
6869
6870         * support.cs (ReflectionParamter.ParameterType): We unwrap the
6871         type, as we return the actual parameter ref/unref state on a
6872         different call.
6873
6874 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
6875
6876         * support.cs: Return proper flags REF/OUT fixing the previous
6877         commit.  
6878
6879         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
6880         not used to mean `ref' but `ref or out' in ParameterReference
6881
6882         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
6883         full type signature instead of calling TypeManger.CSharpName
6884         ourselves. 
6885
6886         * support.cs (InternalParameters.ParameterDesc): Do not compare
6887         directly to the modflags, because REF/OUT will actually be bitsets
6888         if set. 
6889
6890         * delegate.cs (VerifyMethod): Check also the modifiers.
6891
6892         * cs-tokenizer.cs: Fix bug where floating point values with an
6893         exponent where a sign was missing was ignored.
6894
6895         * driver.cs: Allow multiple assemblies to be specified in a single
6896         /r: argument
6897
6898 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
6899
6900         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
6901         because identifiers after a parenthesis would end up in this kind
6902         of production, and we needed to desamiguate it for having casts
6903         like:
6904
6905                 (UserDefinedType *) xxx
6906
6907 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
6908
6909         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
6910         we should set on the Bindingflags.NonPublic, but not turn on
6911         private_ok.  private_ok controls whether a Private member is
6912         returned (this is chekced on the filter routine), while the
6913         BindingFlags.NonPublic just controls whether private/protected
6914         will be allowed.   This fixes the problem part of the problem of
6915         private properties being allowed to be used in derived classes.
6916
6917         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
6918         so we can call the children DoResolveLValue method (this will
6919         properly signal errors on lvalue assignments to base properties)
6920
6921         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
6922         getter are null, and we have a property info, we know that this
6923         happened because the lookup failed, so we report an error 122 for
6924         protection level violation.
6925
6926         We also silently return if setter and getter are null in the
6927         resolve functions, this condition only happens if we have flagged
6928         the error before.  This is the other half of the problem. 
6929
6930         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
6931         not have accessibility information, that is why we were returning
6932         true in the filter function in typemanager.cs.
6933
6934         To properly report 122 (property is inaccessible because of its
6935         protection level) correctly, we report this error in ResolveAccess
6936         by failing if both the setter and the getter are lacking (ie, the
6937         lookup failed). 
6938
6939         DoResolve and DoLResolve have been modified to check for both
6940         setter/getter being null and returning silently, the reason being
6941         that I did not want to put the knowledge about this error in upper
6942         layers, like:
6943
6944         int old = Report.Errors;
6945         x = new PropertyExpr (...);
6946         if (old != Report.Errors)
6947                 return null;
6948         else
6949                 return x;
6950
6951         So the property expr is returned, but it is invalid, so the error
6952         will be flagged during the resolve process. 
6953
6954         * class.cs: Remove InheritablePropertySignatureCompare from the
6955         class, as we no longer depend on the property signature to compute
6956         whether it is possible to implement a method or not.
6957
6958         The reason is that calling PropertyInfo.GetGetMethod will return
6959         null (in .NET, in Mono it works, and we should change this), in
6960         cases where the Get Method does not exist in that particular
6961         class.
6962
6963         So this code:
6964
6965         class X { public virtual int A { get { return 1; } } }
6966         class Y : X { }
6967         class Z : Y { public override int A { get { return 2; } } }
6968
6969         Would fail in Z because the parent (Y) would not have the property
6970         defined.  So we avoid this completely now (because the alternative
6971         fix was ugly and slow), and we now depend exclusively on the
6972         method names.
6973
6974         (PropertyBase.CheckBase): Use a method-base mechanism to find our
6975         reference method, instead of using the property.
6976
6977         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
6978         routines are gone now.
6979
6980         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
6981         names, they were incorrectly named.
6982
6983         * cs-tokenizer.cs: Return are more gentle token on failure. 
6984
6985         * pending.cs (PendingImplementation.InterfaceMethod): This routine
6986         had an out-of-sync index variable, which caused it to remove from
6987         the list of pending methods the wrong method sometimes.
6988
6989 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
6990
6991         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
6992         CanWrite, because those refer to this particular instance of the
6993         property, and do not take into account the fact that we can
6994         override single members of a property.
6995
6996         Constructor requires an EmitContext.  The resolution process does
6997         not happen here, but we need to compute the accessors before,
6998         because the resolution does not always happen for properties.
6999
7000         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
7001         subclass, before we did not update this flag, but we did update
7002         bindingflags. 
7003
7004         (GetAccessors): Drop this routine, as it did not work in the
7005         presence of partially overwritten set/get methods. 
7006
7007         Notice that this broke the cs1540 detection, but that will require
7008         more thinking. 
7009
7010 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7011
7012         * class.cs:
7013         * codegen.cs:
7014         * driver.cs: issue a warning instead of an error if we don't support
7015         debugging for the platform. Also ignore a couple of errors that may
7016         arise when trying to write the symbols. Undo my previous patch.
7017
7018 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7019
7020         * driver.cs: ignore /debug switch except for Unix platforms.
7021
7022 2002-10-23  Nick Drochak  <ndrochak@gol.com>
7023
7024         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
7025
7026 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
7027
7028         * driver.cs: Do not make mcs-debug conditional, so we do not break
7029         builds that use it.
7030
7031         * statement.cs (UsageVector.MergeChildren): I would like Martin to
7032         review this patch.  But basically after all the children variables
7033         have been merged, the value of "Breaks" was not being set to
7034         new_breaks for Switch blocks.  I think that it should be set after
7035         it has executed.  Currently I set this to the value of new_breaks,
7036         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
7037         conservative, but I do not understand this code very well.
7038
7039         I did not break anything in the build, so that is good ;-)
7040
7041         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
7042
7043 2002-10-20  Mark Crichton  <crichton@gimp.org>
7044
7045         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
7046
7047 2002-10-20  Nick Drochak  <ndrochak@gol.com>
7048
7049         * cfold.cs: Fixed compile blocker.
7050
7051 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
7052
7053         * driver.cs: I was chekcing the key, not the file.
7054
7055 2002-10-19  Ravi Pratap  <ravi@ximian.com>
7056
7057         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
7058         message that we were generating - we just need to silently return
7059         a null.
7060
7061 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
7062
7063         * class.cs (Event.Define): Change my previous commit, as this
7064         breaks the debugger.  This is a temporary hack, as it seems like
7065         the compiler is generating events incorrectly to begin with.
7066
7067         * expression.cs (Binary.ResolveOperator): Added support for 
7068         "U operator - (E x, E y)"
7069
7070         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
7071         y)".
7072
7073         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
7074         init-only variables, but this path did not take into account that
7075         there might be also instance readonly variables.  Correct this
7076         problem. 
7077
7078         This fixes bug 32253
7079
7080         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
7081         delegates as well.
7082
7083         * driver.cs: Change the extension for modules to `netmodule'
7084
7085         * cs-parser.jay: Improved slightly the location tracking for
7086         the debugger symbols.
7087
7088         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
7089         modifiers that were specified instead of the hardcoded value
7090         (FamAndAssem).  This was basically ignoring the static modifier,
7091         and others.  Fixes 32429.
7092
7093         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
7094         fixed a bug in the process (32476)
7095
7096         * expression.cs (ArrayAccess.EmitAssign): Patch from
7097         hwang_rob@yahoo.ca that fixes bug 31834.3
7098
7099 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
7100
7101         * driver.cs: Make the module extension .netmodule.
7102
7103 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
7104
7105         * driver.cs: Report an error if the resource file is not found
7106         instead of crashing.
7107
7108         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
7109         false, like Emit does.
7110
7111 2002-10-16  Nick Drochak  <ndrochak@gol.com>
7112
7113         * typemanager.cs: Remove unused private member.  Also reported mcs
7114         bug to report this as a warning like csc.
7115
7116 2002-10-15  Martin Baulig  <martin@gnome.org>
7117
7118         * statement.cs (Statement.Emit): Made this a virtual method; emits
7119         the line number info and calls DoEmit().
7120         (Statement.DoEmit): New protected abstract method, formerly knows
7121         as Statement.Emit().
7122
7123         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
7124
7125 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
7126
7127         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
7128         have fixed a remaining problem: not every AddXXXX was adding a
7129         fully qualified name.  
7130
7131         Now everyone registers a fully qualified name in the DeclSpace as
7132         being defined instead of the partial name.  
7133
7134         Downsides: we are slower than we need to be due to the excess
7135         copies and the names being registered this way.  
7136
7137         The reason for this is that we currently depend (on the corlib
7138         bootstrap for instance) that types are fully qualified, because
7139         we dump all the types in the namespace, and we should really have
7140         types inserted into the proper namespace, so we can only store the
7141         basenames in the defined_names array.
7142
7143 2002-10-10  Martin Baulig  <martin@gnome.org>
7144
7145         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
7146         from bug #31834, see the bug report for a testcase which is
7147         miscompiled.
7148
7149 2002-10-10  Martin Baulig  <martin@gnome.org>
7150
7151         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
7152         flow analysis code for this.
7153
7154         * statement.cs (Do, While, For): Tell the flow analysis code about
7155         infinite loops.
7156         (FlowBranching.UsageVector): Added support for infinite loops.
7157         (Block.Resolve): Moved the dead code elimination here and use flow
7158         analysis to do it.
7159
7160 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
7161
7162         * class.cs (Field.Define): Catch cycles on struct type
7163         definitions. 
7164
7165         * typemanager.cs (IsUnmanagedtype): Do not recursively check
7166         fields if the fields are static.  We only need to check instance
7167         fields. 
7168
7169         * expression.cs (As.DoResolve): Test for reference type.
7170
7171         * statement.cs (Using.ResolveExpression): Use
7172         ConvertImplicitRequired, not ConvertImplicit which reports an
7173         error on failture
7174         (Using.ResolveLocalVariableDecls): ditto.
7175
7176         * expression.cs (Binary.ResolveOperator): Report errors in a few
7177         places where we had to.
7178
7179         * typemanager.cs (IsUnmanagedtype): Finish implementation.
7180
7181 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
7182
7183         * expression.cs: Use StoreFromPtr instead of extracting the type
7184         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
7185
7186         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
7187         an enumeration value to a System.Enum, but System.Enum is not a
7188         value type, but an class type, so we need to box.
7189
7190         (Expression.ConvertExplicit): One codepath could return
7191         errors but not flag them.  Fix this.  Fixes #31853
7192
7193         * parameter.cs (Resolve): Do not allow void as a parameter type.
7194
7195 2002-10-06  Martin Baulig  <martin@gnome.org>
7196
7197         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
7198         if it's a class type and not a struct.  Fixes #31815.
7199
7200 2002-10-06  Martin Baulig  <martin@gnome.org>
7201
7202         * statement.cs: Reworked the flow analysis code a bit to make it
7203         usable for dead code elimination.
7204
7205 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7206
7207         * cs-parser.jay: allow empty source files. Fixes bug #31781.
7208
7209 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7210
7211         * expression.cs (ComposedCast.DoResolveType): A quick workaround
7212         to fix the test 165, will investigate deeper.
7213
7214 2002-10-04  Martin Baulig  <martin@gnome.org>
7215
7216         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
7217         finally blocks actually work.
7218         (Try.Resolve): We don't need to create a sibling for `finally' if
7219         there is no finally block.
7220
7221 2002-10-04  Martin Baulig  <martin@gnome.org>
7222
7223         * class.cs (Constructor.Define): The default accessibility for a
7224         non-default constructor is private, not public.
7225
7226 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
7227
7228         * class.cs (Constructor): Make AllowedModifiers public, add
7229         EXTERN.
7230
7231         * cs-parser.jay: Perform the modifiers test here, as the
7232         constructor for the Constructor class usually receives a zero
7233         because of the way we create it (first we create, later we
7234         customize, and we were never checking the modifiers).
7235
7236         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
7237         is a version of LookupTypeReflection that includes the type-name
7238         cache.  This can be used as a fast path for functions that know
7239         the fully qualified name and are only calling into *.GetType() to
7240         obtain a composed type.
7241
7242         This is also used by TypeManager.LookupType during its type
7243         composition.
7244
7245         (LookupType): We now also track the real type name, as sometimes
7246         we can get a quey for the real type name from things like
7247         ComposedCast.  This fixes bug 31422.
7248
7249         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
7250         complete type fullname, it does not have to go through the type
7251         resolution system to obtain the composed version of the type (for
7252         obtaining arrays or pointers).
7253
7254         (Conditional.Emit): Use the EmitBoolExpression to
7255         generate nicer code, as requested by Paolo.
7256
7257         (ArrayCreation.CheckIndices): Use the patch from
7258         hwang_rob@yahoo.ca to validate the array initializers. 
7259
7260 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
7261
7262         * class.cs (ConstructorInitializer.Emit): simplify code by using
7263         Invocation.EmitCall, and at the same time, fix the bugs in calling
7264         parent constructors that took variable arguments. 
7265
7266         * ecore.cs (Expression.ConvertNumericExplicit,
7267         Expression.ImplicitNumericConversion): Remove the code that
7268         manually wrapped decimal (InternalTypeConstructor call is now gone
7269         as well).
7270
7271         * expression.cs (Cast.TryReduce): Also handle decimal types when
7272         trying to perform a constant fold on the type.
7273
7274         * typemanager.cs (IsUnmanagedtype): Partially implemented.
7275
7276         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
7277         that only turned off an error report, and did nothing else. 
7278
7279 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
7280
7281         * driver.cs: Handle and ignore /fullpaths
7282
7283 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
7284
7285         * expression.cs (Binary.ResolveOperator): Catch the case where
7286         DoNumericPromotions returns true, 
7287
7288         (Binary.DoNumericPromotions): Simplify the code, and the tests.
7289
7290 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
7291
7292         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
7293         report error 70.
7294
7295 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
7296
7297         * ecore.cs (ConvertNumericExplicit): It is not enough that the
7298         conversion exists, but it is also required that the conversion be
7299         performed.  This manifested in "(Type64Enum) 2".  
7300
7301         * class.cs (TypeManager.AddMethod): The fix is not to change
7302         AddEnum, because that one was using a fully qualified name (every
7303         DeclSpace derivative does), but to change the AddMethod routine
7304         that was using an un-namespaced name.  This now correctly reports
7305         the duplicated name.
7306
7307         Revert patch until I can properly fix it.  The issue
7308         is that we have a shared Type space across all namespaces
7309         currently, which is wrong.
7310
7311         Options include making the Namespace a DeclSpace, and merge
7312         current_namespace/current_container in the parser.
7313
7314 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
7315
7316         * cs-parser.jay: Improve error reporting when we get a different
7317         kind of expression in local_variable_type and
7318         local_variable_pointer_type. 
7319
7320         Propagate this to avoid missleading errors being reported.
7321
7322         * ecore.cs (ImplicitReferenceConversion): treat
7323         TypeManager.value_type as a target just like object_type.   As
7324         code like this:
7325
7326         ValueType v = 1;
7327
7328         Is valid, and needs to result in the int 1 being boxed before it
7329         is assigned to the value type v.
7330
7331         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
7332         to validate the enumeration name.
7333
7334         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
7335         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
7336         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
7337
7338         * ecore.cs (TryImplicitIntConversion): When doing an
7339         implicit-enumeration-conversion, check if the type is 64-bits and
7340         perform a conversion before passing to EnumConstant.
7341
7342 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
7343
7344         * decl.cs (Error_AmbiguousTypeReference); New routine used to
7345         report ambiguous type references.  Unlike the MS version, we
7346         report what the ambiguity is.   Innovation at work ;-)
7347
7348         (DeclSpace.FindType): Require a location argument to
7349         display when we display an ambiguous error.
7350
7351         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
7352
7353         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
7354
7355         * expression.cs (EmitDynamicInitializers): Apply patch from
7356         hwang_rob@yahoo.ca that fixes the order in which we emit our
7357         initializers. 
7358
7359 2002-09-21  Martin Baulig  <martin@gnome.org>
7360
7361         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
7362         delegate takes no arguments.
7363
7364 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
7365
7366         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
7367         from integers.
7368
7369         * expression.cs: Extract the underlying type.
7370
7371         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
7372
7373         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
7374
7375 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
7376
7377         * class.cs (TypeContainer.DefineType): We can not use the nice
7378         PackingSize with the size set to 1 DefineType method, because it
7379         will not allow us to define the interfaces that the struct
7380         implements.
7381
7382         This completes the fixing of bug 27287
7383
7384         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
7385         means also structs.  This fixes part of the problem. 
7386         (Expresion.ImplicitReferenceConversionExists): ditto.
7387
7388         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
7389         error if there were no errors reported during the type lookup
7390         process, to avoid duplicates or redundant errors.  Without this
7391         you would get an ambiguous errors plus a type not found.  We have
7392         beaten the user enough with the first error.  
7393
7394         (DeclSparce.FindType): Emit a warning if we have an ambiguous
7395         reference. 
7396
7397         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
7398         during the resolution process, stop the lookup, this avoids
7399         repeated error reports (same error twice).
7400
7401         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
7402
7403         * typemanager.cs (LookupType): Redo the type lookup code to match
7404         the needs of System.Reflection.  
7405
7406         The issue is that System.Reflection requires references to nested
7407         types to begin with a "+" sign instead of a dot.  So toplevel
7408         types look like: "NameSpace.TopLevelClass", and nested ones look
7409         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
7410         levels. 
7411
7412 2002-09-19  Martin Baulig  <martin@gnome.org>
7413
7414         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
7415         says that a method always returns or always throws an exception,
7416         don't report the CS0161.
7417
7418         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
7419         set `Returns = new_returns'.
7420
7421 2002-09-19  Martin Baulig  <martin@gnome.org>
7422
7423         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
7424         to an enum constant, check for a CS0176.
7425
7426 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
7427
7428         * class.cs (TypeContainer.CheckPairedOperators): Now we check
7429         for operators that must be in pairs and report errors.
7430
7431         * ecore.cs (SimpleName.DoResolveType): During the initial type
7432         resolution process, when we define types recursively, we must
7433         check first for types in our current scope before we perform
7434         lookups in the enclosing scopes.
7435
7436         * expression.cs (MakeByteBlob): Handle Decimal blobs.
7437
7438         (Invocation.VerifyArgumentsCompat): Call
7439         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
7440         I thought we were supposed to always call this, but there are a
7441         few places in the code where we dont do it.
7442
7443 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
7444
7445         * driver.cs: Add support in -linkres and -resource to specify the
7446         name of the identifier.
7447
7448 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7449
7450         * ecore.cs (StandardConversionExists): Sync with the conversion
7451         code: allow anything-* to void* conversions.
7452
7453         (FindMostSpecificSource): Use an Expression argument
7454         instead of a Type, because we might be handed over a Literal which
7455         gets a few more implicit conversions that plain types do not.  So
7456         this information was being lost.
7457
7458         Also, we drop the temporary type-holder expression when not
7459         required.
7460
7461 2002-09-17  Martin Baulig  <martin@gnome.org>
7462
7463         * class.cs (PropertyBase.CheckBase): Don't check the base class if
7464         this is an explicit interface implementation.
7465
7466 2002-09-17  Martin Baulig  <martin@gnome.org>
7467
7468         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
7469         different `IndexerName' attributes.
7470
7471         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
7472         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
7473         virtual CommonResolve().
7474
7475 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
7476
7477         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
7478         and convert that to the UnderlyingType.
7479
7480         * statement.cs (Foreach.Resolve): Indexers are just like variables
7481         or PropertyAccesses.
7482
7483         * cs-tokenizer.cs (consume_string): Track line numbers and columns
7484         inside quoted strings, we were not doing this before.
7485
7486 2002-09-16  Martin Baulig  <martin@gnome.org>
7487
7488         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
7489         resolve it.  This is needed for the definite assignment check of the
7490         instance expression, fixes bug #29846.
7491         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
7492
7493 2002-09-16  Nick Drochak  <ndrochak@gol.com>
7494
7495         * parameter.cs: Fix compile error.  Cannot reference static member
7496         from an instance object.  Is this an mcs bug?
7497
7498 2002-09-14  Martin Baulig  <martin@gnome.org>
7499
7500         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
7501         multiple times.  Fixes bug #30295, added test-166.cs.
7502
7503 2002-09-14  Martin Baulig  <martin@gnome.org>
7504
7505         * statement.cs (Block.Emit): Don't emit unreachable code.
7506         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
7507         `break' statements.
7508         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
7509
7510 2002-09-14  Martin Baulig  <martin@gnome.org>
7511
7512         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
7513         is set.
7514
7515 2002-09-14  Martin Baulig  <martin@gnome.org>
7516
7517         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
7518         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
7519         be false on the ms runtime.
7520
7521 2002-09-13  Martin Baulig  <martin@gnome.org>
7522
7523         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
7524         the CS0038 error message.
7525
7526 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
7527
7528         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
7529         constant inside, return it.
7530
7531 2002-09-12  Martin Baulig  <martin@gnome.org>
7532
7533         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
7534         implicit conversion can be done between enum types.
7535
7536         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
7537         check whether an implicit conversion to the current enum's UnderlyingType
7538         exists and report an error if not.
7539
7540         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
7541         without debugging support.
7542
7543         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
7544         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
7545
7546 2002-09-12  Martin Baulig  <martin@gnome.org>
7547
7548         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
7549
7550         * ecore.cs (IMemberExpr.DeclaringType): New property.
7551         (SimpleName.SimpleNameResolve): Check whether we're accessing a
7552         nonstatic member of an outer type (CS0038).
7553
7554 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
7555
7556         * driver.cs: Activate the using-error detector at warning level
7557         4 (at least for MS-compatible APIs).
7558
7559         * namespace.cs (VerifyUsing): Small buglett fix.
7560
7561         * pending.cs (PendingImplementation): pass the container pointer. 
7562
7563         * interface.cs (GetMethods): Allow for recursive definition.  Long
7564         term, I would like to move every type to support recursive
7565         definitions, not the current ordering mechanism that we have right
7566         now.
7567
7568         The situation is this: Attributes are handled before interfaces,
7569         so we can apply attributes to interfaces.  But some attributes
7570         implement interfaces, we will now handle the simple cases
7571         (recursive definitions will just get an error).  
7572
7573         * parameter.cs: Only invalidate types at the end if we fail to
7574         lookup all types.  
7575
7576 2002-09-09  Martin Baulig  <martin@gnome.org>
7577
7578         * ecore.cs (PropertyExpr.Emit): Also check for
7579         TypeManager.system_int_array_get_length so this'll also work when
7580         compiling corlib.  Fixes #30003.
7581
7582 2002-09-09  Martin Baulig  <martin@gnome.org>
7583
7584         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
7585         and throw an exception if we can't get the type's size.  Fixed #30040,
7586         added test-165.cs.
7587
7588 2002-09-09  Martin Baulig  <martin@gnome.org>
7589
7590         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
7591
7592         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
7593         context.  Fixes bug #30027.
7594
7595         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
7596         virtual functions.  Fixes bug #30043, added test-164.cs.
7597
7598 2002-09-08  Ravi Pratap  <ravi@ximian.com>
7599
7600         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
7601
7602 2002-09-08  Nick Drochak  <ndrochak@gol.com>
7603
7604         * driver.cs: Use an object to get the windows codepage since it's not a
7605         static property.
7606
7607 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
7608
7609         * statement.cs (For.Emit): for infinite loops (test == null)
7610         return whether there is a break inside, not always "true".
7611
7612         * namespace.cs (UsingEntry): New struct to hold the name of the
7613         using definition, the location where it is defined, and whether it
7614         has been used in a successful type lookup.
7615
7616         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
7617         strings.
7618
7619         * decl.cs: ditto.
7620
7621 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7622
7623         * attribute.cs : Fix incorrect code which relied on catching
7624         a NullReferenceException to detect a null being passed in
7625         where an object was expected.
7626
7627 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
7628
7629         * statement.cs (Try): flag the catch variable as assigned
7630
7631         * expression.cs (Cast): Simplified by using ResolveType instead of
7632         manually resolving.
7633
7634         * statement.cs (Catch): Fix bug by using ResolveType.
7635
7636 2002-09-06  Ravi Pratap  <ravi@ximian.com>
7637
7638         * expression.cs (BetterConversion): Special case for when we have
7639         a NullLiteral as the argument and we have to choose between string
7640         and object types - we choose string the way csc does.
7641
7642         * attribute.cs (Attribute.Resolve): Catch the
7643         NullReferenceException and report error #182 since the Mono
7644         runtime no more has the bug and having this exception raised means
7645         we tried to select a constructor which takes an object and is
7646         passed a null.
7647
7648 2002-09-05  Ravi Pratap  <ravi@ximian.com>
7649
7650         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
7651         message (1502, 1503) when we can't locate a method after overload
7652         resolution. This is much more informative and closes the bug
7653         Miguel reported.
7654
7655         * interface.cs (PopulateMethod): Return if there are no argument
7656         types. Fixes a NullReferenceException bug.
7657
7658         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
7659         expressions too. Previously we were checking only in one place for
7660         positional arguments leaving out named arguments.
7661
7662         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
7663         type to the enum type is not allowed. Remove code corresponding to
7664         that.
7665
7666         (ConvertNumericExplicit): Allow explicit conversions from
7667         the underlying type to enum type. This precisely follows the spec
7668         and closes a bug filed by Gonzalo.
7669
7670 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7671
7672         * compiler.csproj:
7673         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
7674
7675 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
7676
7677         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
7678         it was important that we stored the right value after the
7679         reduction in `converted'.
7680
7681 2002-09-04  Martin Baulig  <martin@gnome.org>
7682
7683         * location.cs (Location.SymbolDocument): Use full pathnames for the
7684         source files.
7685
7686 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
7687
7688         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
7689         of the expression resolve mechanism, because that will catch the
7690         SimpleName error failures.
7691
7692         (Conditional): If we can not resolve the
7693         expression, return, do not crash.
7694
7695 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7696
7697         * cs-tokenizer.cs:
7698         (location): display token name instead of its number.
7699
7700 2002-08-28  Martin Baulig  <martin@gnome.org>
7701
7702         * expression.cs (Binary.ResolveOperator): Don't silently return
7703         but return an error if an operator cannot be applied between two
7704         enum types.
7705
7706 2002-08-28  Martin Baulig  <martin@gnome.org>
7707
7708         * class.cs (Constructor.Define): Set the permission attributes
7709         correctly instead of making all constructors public.
7710
7711 2002-08-28  Martin Baulig  <martin@gnome.org>
7712
7713         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
7714         for private members before reporting a CS0103; if we find anything,
7715         it's a CS0122.
7716
7717 2002-08-28  Martin Baulig  <martin@gnome.org>
7718
7719         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
7720         to check whether `closure_start_type == closure_invocation_type',
7721         we also need to check whether `m.DeclaringType == closure_invocation_type'
7722         before bypassing the permission checks.  We might be accessing
7723         protected/private members from the base class.
7724         (TypeManager.RealMemberLookup): Only set private_ok if private
7725         members were requested via BindingFlags.NonPublic.
7726
7727         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
7728
7729         * expression.cs (MemberAccess.ResolveMemberAccess): Set
7730         MethodGroupExpr.IsExplicitImpl if appropriate.
7731         (Invocation.DoResolve): Don't report the CS0120 for explicit
7732         interface implementations.
7733
7734 2002-08-27  Martin Baulig  <martin@gnome.org>
7735
7736         * expression.cs (Invocation.DoResolve): If this is a static
7737         method and we don't have an InstanceExpression, we must report
7738         a CS0120.
7739
7740 2002-08-25  Martin Baulig  <martin@gnome.org>
7741
7742         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
7743         `==' between a valuetype and an object.
7744
7745 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
7746
7747         * ecore.cs (TypeExpr): Provide a ToString method.
7748
7749 2002-08-24  Martin Baulig  <martin@gnome.org>
7750
7751         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
7752         now called proggie.dbg and it's a binary file.
7753
7754 2002-08-23  Martin Baulig  <martin@gnome.org>
7755
7756         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
7757
7758 2002-08-23  Martin Baulig  <martin@gnome.org>
7759
7760         * struct.cs (MyStructInfo.ctor): Make this work with empty
7761         structs; it's not allowed to use foreach() on null.
7762
7763 2002-08-23  Martin Baulig  <martin@gnome.org>
7764
7765         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
7766         writer the full pathname of the generated assembly.
7767
7768 2002-08-23  Martin Baulig  <martin@gnome.org>
7769
7770         * statements.cs (FlowBranching.UsageVector.MergeChildren):
7771         A `finally' block never returns or breaks; improved handling of
7772         unreachable code.
7773
7774 2002-08-23  Martin Baulig  <martin@gnome.org>
7775
7776         * statement.cs (Throw.Resolve): Allow `throw null'.
7777
7778 2002-08-23  Martin Baulig  <martin@gnome.org>
7779
7780         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
7781         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
7782         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
7783         MemberLookup would return a wrong event if this is an explicit
7784         interface implementation and the class has an event with the same
7785         name.
7786
7787 2002-08-23  Martin Baulig  <martin@gnome.org>
7788
7789         * statement.cs (Block.AddChildVariableNames): New public method.
7790         (Block.AddChildVariableName): Likewise.
7791         (Block.IsVariableNameUsedInChildBlock): Likewise.
7792         (Block.AddVariable): Check whether a variable name has already
7793         been used in a child block.
7794
7795         * cs-parser.jay (declare_local_variables): Mark all variable names
7796         from the current block as being used in a child block in the
7797         implicit block.
7798
7799 2002-08-23  Martin Baulig  <martin@gnome.org>
7800
7801         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
7802         find the symbol writer.
7803
7804         * driver.cs: csc also allows the arguments to /define being
7805         separated by commas, not only by semicolons.
7806
7807 2002-08-23  Martin Baulig  <martin@gnome.org>
7808
7809         * interface.cs (Interface.GetMembers): Added static check for events.
7810
7811 2002-08-15  Martin Baulig  <martin@gnome.org>
7812
7813         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
7814         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
7815
7816         * ecore.cs (Expression.MemberLookup): Added documentation and explained
7817         why the MethodData.EmitDestructor() change was necessary.
7818
7819 2002-08-20  Martin Baulig  <martin@gnome.org>
7820
7821         * class.cs (TypeContainer.FindMembers): Added static check for events.
7822
7823         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
7824
7825         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
7826         use Type.GetEvents(), not Type.FindMembers().
7827
7828 2002-08-20  Martin Baulig  <martin@gnome.org>
7829
7830         * decl.cs (MemberCache): Added a special method cache which will
7831         be used for method-only searched.  This ensures that a method
7832         search will return a MethodInfo with the correct ReflectedType for
7833         inherited methods.      
7834
7835 2002-08-20  Martin Baulig  <martin@gnome.org>
7836
7837         * decl.cs (DeclSpace.FindMembers): Made this public.
7838
7839 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7840
7841         * delegate.cs: fixed build on windows.
7842         [FIXME:  Filed as bug #29150: MCS must report these errors.]
7843
7844 2002-08-19  Ravi Pratap  <ravi@ximian.com>
7845
7846         * ecore.cs (StandardConversionExists): Return a false
7847         if we are trying to convert the void type to anything else
7848         since that is not allowed.
7849
7850         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
7851         we flag error 70 in the event an event is trying to be accessed
7852         directly from outside the declaring type.
7853
7854 2002-08-20  Martin Baulig  <martin@gnome.org>
7855
7856         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
7857         MemberCache from typemanager.cs to decl.cs.
7858
7859 2002-08-19  Martin Baulig  <martin@gnome.org>
7860
7861         * class.cs (TypeContainer): Implement IMemberContainer.
7862         (TypeContainer.DefineMembers): Create the MemberCache.
7863         (TypeContainer.FindMembers): Do better BindingFlags checking; only
7864         return public members if BindingFlags.Public was given, check
7865         whether members are static.
7866
7867 2002-08-16  Martin Baulig  <martin@gnome.org>
7868
7869         * decl.cs (DeclSpace.Define): Splitted this in Define and
7870         DefineMembers.  DefineMembers is called first and initializes the
7871         MemberCache.
7872
7873         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
7874         DefineMembers() on all our DeclSpaces.
7875
7876         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
7877         but call DefineMembers() on all nested interfaces.  We call their
7878         Define() in our new Define() function.
7879
7880         * interface.cs (Interface): Implement IMemberContainer.
7881         (Interface.Define): Moved all code except the attribute stuf to
7882         DefineMembers().
7883         (Interface.DefineMembers): Initialize the member cache.
7884
7885         * typemanager.cs (IMemberFinder): Removed this interface, we don't
7886         need this anymore since we can use MemberCache.FindMembers directly.
7887
7888 2002-08-19  Martin Baulig  <martin@gnome.org>
7889
7890         * typemanager.cs (MemberCache): When creating the cache for an
7891         interface type, add all inherited members.
7892         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
7893         to `out bool used_cache' and documented it.
7894         (TypeManager.MemberLookup): If we already used the cache in the first
7895         iteration, we don't need to do the interfaces check.
7896
7897 2002-08-19  Martin Baulig  <martin@gnome.org>
7898
7899         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
7900         here from IMemberFinder and don't implement this interface anymore.
7901         (DeclSpace.MemberCache): Moved here from IMemberFinder.
7902
7903         * typemanager.cs (IMemberFinder): This interface is now only used by
7904         classes which actually support the member cache.
7905         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
7906         since we only put DeclSpaces into this Hashtable.
7907         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
7908         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
7909
7910 2002-08-16  Martin Baulig  <martin@gnome.org>
7911
7912         * typemanager.cs (ICachingMemberFinder): Removed.
7913         (IMemberFinder.MemberCache): New property.
7914         (TypeManager.FindMembers): Merged this with RealFindMembers().
7915         This function will never be called from TypeManager.MemberLookup()
7916         so we can't use the cache here, just the IMemberFinder.
7917         (TypeManager.MemberLookup_FindMembers): Check whether the
7918         IMemberFinder has a MemberCache and call the cache's FindMembers
7919         function.
7920         (MemberCache): Rewrote larger parts of this yet another time and
7921         cleaned it up a bit.
7922
7923 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
7924
7925         * driver.cs (LoadArgs): Support quoting.
7926
7927         (Usage): Show the CSC-like command line arguments.
7928
7929         Improved a few error messages.
7930
7931 2002-08-15  Martin Baulig  <martin@gnome.org>
7932
7933         * typemanager.cs (IMemberContainer.Type): New property.
7934         (IMemberContainer.IsInterface): New property.
7935
7936         The following changes are conditional to BROKEN_RUNTIME, which is
7937         defined at the top of the file.
7938
7939         * typemanager.cs (MemberCache.MemberCache): Don't add the base
7940         class'es members, but add all members from TypeHandle.ObjectType
7941         if we're an interface.
7942         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
7943         is the current type.
7944         (MemberCache.CacheEntry.Container): Removed this field.
7945         (TypeHandle.GetMembers): Include inherited members.
7946
7947 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7948
7949         * typemanager.cs: fixed compilation and added a comment on a field that
7950         is never used.
7951
7952 2002-08-15  Martin Baulig  <martin@gnome.org>
7953
7954         * class.cs (ConstructorInitializer.Resolve): In the
7955         Expression.MemberLookup call, use the queried_type as
7956         invocation_type.
7957
7958         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
7959         declared' attribute, it's always true.
7960         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
7961         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
7962         temporary wrapper for FindMembers which tells MemberLookup whether
7963         members from the base classes are included in the return value.
7964         This will go away soon.
7965         (TypeManager.MemberLookup): Use this temporary hack here; once the
7966         new MemberCache is completed, we don't need to do the DeclaredOnly
7967         looping here anymore since the MemberCache will take care of this.
7968         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
7969         (MemberCache): When creating the MemberCache for a class, get
7970         members from the current class and all its base classes.
7971         (MemberCache.CacheEntry.Container): New field.  This is a
7972         temporary hack until the Mono runtime is fixed to distinguish
7973         between ReflectedType and DeclaringType.  It allows us to use MCS
7974         with both the MS runtime and the unfixed Mono runtime without
7975         problems and without accecting performance.
7976         (MemberCache.SearchMembers): The DeclaredOnly looping from
7977         TypeManager.MemberLookup is now done here.      
7978
7979 2002-08-14  Martin Baulig  <martin@gnome.org>
7980
7981         * statement.cs (MyStructInfo.MyStructInfo): Don't call
7982         Type.GetFields on dynamic types but get the fields from the
7983         corresponding TypeContainer.
7984         (MyStructInfo.GetStructInfo): Added check for enum types.
7985
7986         * typemanager.cs (MemberList.IsSynchronized): Implemented.
7987         (MemberList.SyncRoot): Implemented.
7988         (TypeManager.FilterWithClosure): No need to check permissions if
7989         closure_start_type == closure_invocation_type, don't crash if
7990         closure_invocation_type is null.
7991
7992 2002-08-13  Martin Baulig  <martin@gnome.org>
7993
7994         Rewrote TypeContainer.FindMembers to use a member cache.  This
7995         gives us a speed increase of about 35% for the self-hosting MCS
7996         build and of about 15-20% for the class libs (both on GNU/Linux).
7997
7998         * report.cs (Timer): New class to get enhanced profiling.  This
7999         whole class is "TIMER" conditional since it remarkably slows down
8000         compilation speed.
8001
8002         * class.cs (MemberList): New class.  This is an IList wrapper
8003         which we're now using instead of passing MemberInfo[]'s around to
8004         avoid copying this array unnecessarily.
8005         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
8006         (ICachingMemberFinder, IMemberContainer): New interface.
8007         (TypeManager.FilterWithClosure): If `criteria' is null, the name
8008         has already been checked, otherwise use it for the name comparision.
8009         (TypeManager.FindMembers): Renamed to RealMemberFinder and
8010         provided wrapper which tries to use ICachingMemberFinder.FindMembers
8011         if possible.  Returns a MemberList, not a MemberInfo [].
8012         (TypeHandle): New class, implements IMemberContainer.  We create
8013         one instance of this class per type, it contains a MemberCache
8014         which is used to do the member lookups.
8015         (MemberCache): New class.  Each instance of this class contains
8016         all members of a type and a name-based hash table.
8017         (MemberCache.FindMembers): This is our new member lookup
8018         function.  First, it looks up all members of the requested name in
8019         the hash table.  Then, it walks this list and sorts out all
8020         applicable members and returns them.
8021
8022 2002-08-13  Martin Baulig  <martin@gnome.org>
8023
8024         In addition to a nice code cleanup, this gives us a performance
8025         increase of about 1.4% on GNU/Linux - not much, but it's already
8026         half a second for the self-hosting MCS compilation.
8027
8028         * typemanager.cs (IMemberFinder): New interface.  It is used by
8029         TypeManager.FindMembers to call FindMembers on a TypeContainer,
8030         Enum, Delegate or Interface.
8031         (TypeManager.finder_to_member_finder): New PtrHashtable.
8032         (TypeManager.finder_to_container): Removed.
8033         (TypeManager.finder_to_delegate): Removed.
8034         (TypeManager.finder_to_interface): Removed.
8035         (TypeManager.finder_to_enum): Removed.
8036
8037         * interface.cs (Interface): Implement IMemberFinder.
8038
8039         * delegate.cs (Delegate): Implement IMemberFinder.
8040
8041         * enum.cs (Enum): Implement IMemberFinder.
8042
8043         * class.cs (TypeContainer): Implement IMemberFinder.
8044
8045 2002-08-12  Martin Baulig  <martin@gnome.org>
8046
8047         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
8048
8049 2002-08-12  Martin Baulig  <martin@gnome.org>
8050
8051         * ecore.cs (ITypeExpression): New interface for expressions which
8052         resolve to a type.
8053         (TypeExpression): Renamed to TypeLookupExpression.
8054         (Expression.DoResolve): If we're doing a types-only lookup, the
8055         expression must implement the ITypeExpression interface and we
8056         call DoResolveType() on it.
8057         (SimpleName): Implement the new ITypeExpression interface.
8058         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
8059         hack, the situation that we're only looking up types can't happen
8060         anymore when this method is called.  Moved the type lookup code to
8061         DoResolveType() and call it.
8062         (SimpleName.DoResolveType): This ITypeExpression interface method
8063         is now doing the types-only lookup.
8064         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
8065         (ResolveFlags): Added MaskExprClass.
8066
8067         * expression.cs (MemberAccess): Implement the ITypeExpression
8068         interface.
8069         (MemberAccess.DoResolve): Added support for a types-only lookup
8070         when we're called via ITypeExpression.DoResolveType().
8071         (ComposedCast): Implement the ITypeExpression interface.
8072
8073         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
8074         Expression.Resolve() with ResolveFlags.Type instead.
8075
8076 2002-08-12  Martin Baulig  <martin@gnome.org>
8077
8078         * interface.cs (Interface.Define): Apply attributes.
8079
8080         * attribute.cs (Attribute.ApplyAttributes): Added support for
8081         interface attributes.
8082
8083 2002-08-11  Martin Baulig  <martin@gnome.org>
8084
8085         * statement.cs (Block.Emit): Only check the "this" variable if we
8086         do not always throw an exception.
8087
8088         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
8089         whether the property has a set accessor.
8090
8091 2002-08-11  Martin Baulig  <martin@gnome.org>
8092
8093         Added control flow analysis support for structs.
8094
8095         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
8096         with control flow analysis turned off.
8097         (IVariable): New interface.
8098         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
8099         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
8100         (FieldExpr.DoResolve): Resolve the instance expression with flow
8101         analysis turned off and do the definite assignment check after the
8102         resolving when we know what the expression will resolve to.
8103
8104         * expression.cs (LocalVariableReference, ParameterReference):
8105         Implement the new IVariable interface, only call the flow analysis
8106         code if ec.DoFlowAnalysis is true.
8107         (This): Added constructor which takes a Block argument.  Implement
8108         the new IVariable interface.
8109         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
8110         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
8111         This does the definite assignment checks for struct members.
8112
8113         * class.cs (Constructor.Emit): If this is a non-static `struct'
8114         constructor which doesn't have any initializer, call
8115         Block.AddThisVariable() to tell the flow analysis code that all
8116         struct elements must be initialized before control returns from
8117         the constructor.
8118
8119         * statement.cs (MyStructInfo): New public class.
8120         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
8121         argument to this indexer.  If non-zero, check an individual struct
8122         member, not the whole struct.
8123         (FlowBranching.CheckOutParameters): Check struct members.
8124         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
8125         overloaded versions of these methods which take an additional
8126         `int field_idx' argument to check struct members.
8127         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
8128         overloaded versions of these methods which take an additional
8129         `string field_name' argument to check struct member.s
8130         (VariableInfo): Implement the IVariable interface.
8131         (VariableInfo.StructInfo): New public property.  Returns the
8132         MyStructInfo instance of the variable if it's a struct or null.
8133         (Block.AddThisVariable): New public method.  This is called from
8134         Constructor.Emit() for non-static `struct' constructor which do
8135         not have any initializer.  It creates a special variable for the
8136         "this" instance variable which will be checked by the flow
8137         analysis code to ensure that all of the struct's fields are
8138         initialized before control returns from the constructor.
8139         (UsageVector): Added support for struct members.  If a
8140         variable/parameter is a struct with N members, we reserve a slot
8141         in the usage vector for each member.  A struct is considered fully
8142         initialized if either the struct itself (slot 0) or all its
8143         members are initialized.
8144
8145 2002-08-08  Martin Baulig  <martin@gnome.org>
8146
8147         * driver.cs (Driver.MainDriver): Only report an error CS5001
8148         if there were no compilation errors.
8149
8150         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
8151         `UnsafeContext' property to determine whether the parent is in
8152         unsafe context rather than checking the parent's ModFlags:
8153         classes nested in an unsafe class are unsafe as well.
8154
8155 2002-08-08  Martin Baulig  <martin@gnome.org>
8156
8157         * statement.cs (UsageVector.MergeChildren): Distinguish between
8158         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
8159         we return.  Added test17() and test18() to test-154.cs.
8160
8161 2002-08-08  Martin Baulig  <martin@gnome.org>
8162
8163         * typemanager.cs (TypeManager.FilterWithClosure): If we have
8164         Family access, make sure the invoking type isn't a subclass of the
8165         queried type (that'd be a CS1540).
8166
8167         * ecore.cs (Expression.MemberLookup): Added overloaded version of
8168         this method which takes an additional `Type invocation_type'.
8169
8170         * expression.cs (BaseAccess.DoResolve): Use the base type as
8171         invocation and query type.
8172         (MemberAccess.DoResolve): If the lookup failed and we're about to
8173         report a CS0122, try a lookup with the ec.ContainerType - if this
8174         succeeds, we must report a CS1540.
8175
8176 2002-08-08  Martin Baulig  <martin@gnome.org>
8177
8178         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
8179         (MethodGroupExpr): Implement the IMemberExpr interface.
8180
8181         * expression (MemberAccess.ResolveMemberAccess): No need to have
8182         any special code for MethodGroupExprs anymore, they're now
8183         IMemberExprs.   
8184
8185 2002-08-08  Martin Baulig  <martin@gnome.org>
8186
8187         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
8188         Family, FamANDAssem and FamORAssem permissions.
8189         (TypeManager.IsSubclassOrNestedChildOf): New public method.
8190
8191 2002-08-08  Martin Baulig  <martin@gnome.org>
8192
8193         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
8194         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
8195         or loop block.
8196
8197 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
8198
8199         * driver.cs: implemented /resource option to embed managed resources.
8200
8201 2002-08-07  Martin Baulig  <martin@gnome.org>
8202
8203         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
8204         (FieldBase.HasFieldInitializer): New public property.
8205         (FieldBase.GetInitializerExpression): New public method.  Resolves and
8206         returns the field initializer and makes sure it is only resolved once.
8207         (TypeContainer.EmitFieldInitializers): Call
8208         FieldBase.GetInitializerExpression to get the initializer, this ensures
8209         that it isn't resolved multiple times.
8210
8211         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
8212         the resolving process (SimpleName/MemberLookup) that we're currently
8213         emitting a field initializer (which must not access any instance members,
8214         this is an error CS0236).
8215
8216         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
8217         argument, if the `IsFieldInitializer' flag is set, we must report and
8218         error CS0236 and not an error CS0120.   
8219
8220 2002-08-07  Martin Baulig  <martin@gnome.org>
8221
8222         * ecore.cs (IMemberExpr): New public interface.
8223         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
8224         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
8225         if the expression is an IMemberExpr.
8226
8227         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
8228         to be null, implicitly default to `this' if we're non-static in
8229         this case.  Simplified the code a lot by using the new IMemberExpr
8230         interface.  Also fixed bug #28176 here.
8231
8232 2002-08-06  Martin Baulig  <martin@gnome.org>
8233
8234         * cs-parser.jay (SimpleLookup): Removed.  We need to create
8235         ParameterReferences during semantic analysis so that we can do a
8236         type-only search when resolving Cast, TypeOf and SizeOf.
8237         (block): Pass the `current_local_parameters' to the Block's
8238         constructor.
8239
8240         * class.cs (ConstructorInitializer): Added `Parameters parameters'
8241         argument to the constructor.
8242         (ConstructorInitializer.Resolve): Create a temporary implicit
8243         block with the parameters.
8244
8245         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
8246         references here if we aren't doing a type-only search.
8247
8248         * statement.cs (Block): Added constructor which takes a
8249         `Parameters parameters' argument.
8250         (Block.Parameters): New public property.
8251
8252         * support.cs (InternalParameters.Parameters): Renamed `parameters'
8253         to `Parameters' and made it public readonly.
8254
8255 2002-08-06  Martin Baulig  <martin@gnome.org>
8256
8257         * ecore.cs (Expression.Warning): Made this public as well.
8258
8259         * report.cs (Report.Debug): Print the contents of collections.
8260
8261 2002-08-06  Martin Baulig  <martin@gnome.org>
8262
8263         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
8264         used to tell Resolve() which kinds of expressions it may return.
8265         (Expression.Resolve): Added overloaded version of this method which
8266         takes a `ResolveFlags flags' argument.  This can be used to tell
8267         Resolve() which kinds of expressions it may return.  Reports a
8268         CS0118 on error.
8269         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
8270         ResolveFlags.SimpleName.
8271         (Expression.Error118): Added overloaded version of this method which
8272         takes a `ResolveFlags flags' argument.  It uses the flags to determine
8273         which kinds of expressions are allowed.
8274
8275         * expression.cs (Argument.ResolveMethodGroup): New public method.
8276         Resolves an argument, but allows a MethodGroup to be returned.
8277         This is used when invoking a delegate.
8278
8279         * TODO: Updated a bit.
8280
8281 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8282
8283         Fixed compilation with csc.
8284
8285         * ecore.cs: Expression.Error made public. Is this correct? Should
8286         Warning be made public too?
8287
8288         * expression.cs: use ea.Location instead of ea.loc.
8289         [FIXME:  Filed as bug #28607: MCS must report these errors.]
8290
8291 2002-08-06  Martin Baulig  <martin@gnome.org>
8292
8293         * ecore.cs (Expression.loc): Moved the location here instead of
8294         duplicating it in all derived classes.
8295         (Expression.Location): New public property.
8296         (Expression.Error, Expression.Warning): Made them non-static and
8297         removed the location argument.
8298         (Expression.Warning): Added overloaded version which takes an
8299         `int level' argument.
8300         (Expression.Error118): Make this non-static and removed the
8301         expression and location arguments.
8302         (TypeExpr): Added location argument to the constructor.
8303
8304         * expression.cs (StaticCallExpr): Added location argument to
8305         the constructor.
8306         (Indirection, PointerArithmetic): Likewise.
8307         (CheckedExpr, UnCheckedExpr): Likewise.
8308         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
8309         (StringPtr): Likewise.
8310
8311
8312 2002-08-05  Martin Baulig  <martin@gnome.org>
8313
8314         * expression.cs (BaseAccess.DoResolve): Actually report errors.
8315
8316         * assign.cs (Assign.DoResolve): Check whether the source
8317         expression is a value or variable.
8318
8319         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
8320         while resolving the corresponding blocks.
8321
8322         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
8323         an error, don't silently return null.
8324
8325         * statement.cs (Block.AddVariable): Do the error reporting here
8326         and distinguish between CS0128 and CS0136.
8327         (Block.DoResolve): Report all unused labels (warning CS0164).
8328         (LabeledStatement): Pass the location to the constructor.
8329         (LabeledStatement.HasBeenReferenced): New property.
8330         (LabeledStatement.Resolve): Set it to true here.
8331
8332         * statement.cs (Return.Emit): Return success even after reporting
8333         a type mismatch error (CS0126 or CS0127), this is what csc does and
8334         it avoids confusing the users with any consecutive errors.
8335
8336 2002-08-05  Martin Baulig  <martin@gnome.org>
8337
8338         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
8339
8340         * const.cs (Const.LookupConstantValue): Catch circular definitions.
8341
8342         * expression.cs (MemberAccess.DoResolve): Silently return if an
8343         error has already been reported.
8344
8345         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
8346         error has already been reported.
8347
8348 2002-08-05  Martin Baulig  <martin@gnome.org>
8349
8350         * statement.cs (UsageVector): Only initialize the `parameters'
8351         vector if we actually have any "out" parameters.
8352
8353 2002-08-05  Martin Baulig  <martin@gnome.org>
8354
8355         * expression.cs (Binary.ResolveOperator): When combining delegates,
8356         they must have the same type.
8357
8358 2002-08-05  Martin Baulig  <martin@gnome.org>
8359
8360         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
8361         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
8362         work with the ms runtime and we also don't need it: if we're a
8363         PropertyBuilder and not in the `indexer_arguments' hash, then we
8364         are a property and not an indexer.
8365
8366         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
8367         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
8368         since the latter one doesn't work with the ms runtime.
8369
8370 2002-08-03  Martin Baulig  <martin@gnome.org>
8371
8372         Fixed bugs #27998 and #22735.
8373
8374         * class.cs (Method.IsOperator): New public field.
8375         (Method.CheckBase): Report CS0111 if there's already a method
8376         with the same parameters in the current class.  Report CS0508 when
8377         attempting to change the return type of an inherited method.
8378         (MethodData.Emit): Report CS0179 if a method doesn't have a body
8379         and it's not marked abstract or extern.
8380         (PropertyBase): New abstract base class for Property and Indexer.
8381         (PropertyBase.CheckBase): Moved here from Property and made it work
8382         for indexers.
8383         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
8384         the same so we can reuse it there.
8385         (Property, Indexer): Derive from PropertyBase.
8386         (MethodSignature.inheritable_property_signature_filter): New delegate
8387         to find properties and indexers.
8388
8389         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
8390         argument and improved error reporting.
8391
8392         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
8393         EmptyReadOnlyParameters and made it a property.
8394
8395         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
8396         version of this method which takes a `PropertyInfo indexer'.
8397         (TypeManager.RegisterIndexer): New method.
8398
8399         * class.cs: Added myself as author of this file :-)
8400
8401 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8402
8403         * class.cs: fixed compilation on windoze.
8404
8405 2002-08-03  Martin Baulig  <martin@gnome.org>
8406
8407         * interface.cs (Interface.GetInterfaceBases): Check whether all
8408         base interfaces are at least as accessible than the current one.
8409
8410         * class.cs (TypeContainer.GetClassBases): Check whether base types
8411         are at least as accessible than the current type.
8412         (TypeContainer.AsAccessible): Implemented and made non-static.
8413         (MemberBase.CheckParameters): Report errors if the accessibility
8414         checks fail.
8415
8416         * delegate.cs (Delegate.Delegate): The default visibility is
8417         internal for top-level types and private for nested types.
8418         (Delegate.Define): Report errors if the accessibility checks fail.
8419
8420         * enum.cs (Enum.Enum): The default visibility is internal for
8421         top-level types and private for nested types.
8422         (Enum.DefineType): Compute the correct visibility.
8423
8424         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
8425         function which takes a `bool is_toplevel' instead of a TypeContainer.
8426
8427         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
8428         builtin type.
8429
8430 2002-08-02  Martin Baulig  <martin@gnome.org>
8431
8432         * expression.cs (LocalVariableReferenc): Added constructor which
8433         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
8434         (LocalVariableReference.IsReadOnly): New property.
8435         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
8436         variable is readonly, use our own readonly flag to do this; you can
8437         use the new constructor to get a writable reference to a read-only
8438         variable.
8439
8440         * cs-parser.jay (foreach_statement, using_statement): Get a writable
8441         reference to the local variable.
8442
8443 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
8444
8445         * rootcontext.cs (ResolveCore): Also include System.Exception
8446
8447         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
8448         we reach an EmptyStatement.
8449
8450         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
8451         is also fine.
8452
8453         * expression.cs (Binary.ResolveOperator): Check error result in
8454         two places.
8455
8456         use brtrue/brfalse directly and avoid compares to null.
8457
8458 2002-08-02  Martin Baulig  <martin@gnome.org>
8459
8460         * class.cs (TypeContainer.Define): Define all nested interfaces here.
8461         Fixes bug #28407, added test-155.cs.
8462
8463 2002-08-01  Martin Baulig  <martin@gnome.org>
8464
8465         * class.cs (Event.EmitDefaultMethod): Make this work with static
8466         events.  Fixes #28311, added verify-3.cs.
8467
8468 2002-08-01  Martin Baulig  <martin@gnome.org>
8469
8470         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
8471         `is_disposable' fields.
8472         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
8473         `hm.is_disposable' if we're using the collection pattern.
8474         (Foreach.EmitCollectionForeach): Use the correct type for the
8475         enumerator's local variable, only emit the try/finally block if
8476         necessary (fixes #27713).
8477
8478 2002-08-01  Martin Baulig  <martin@gnome.org>
8479
8480         * ecore.cs (Expression.report118): Renamed to Error118 and made
8481         it public static.
8482
8483         * statement.cs (Throw.Resolve): Check whether the expression is of
8484         the correct type (CS0118) and whether the type derives from
8485         System.Exception (CS0155).
8486         (Catch.Resolve): New method.  Do the type lookup here and check
8487         whether it derives from System.Exception (CS0155).
8488         (Catch.CatchType, Catch.IsGeneral): New public properties.
8489
8490         * typemanager.cs (TypeManager.exception_type): Added.
8491
8492 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
8493
8494         * driver.cs: Updated About function.
8495
8496 2002-07-31  Martin Baulig  <martin@gnome.org>
8497
8498         Implemented Control Flow Analysis.
8499
8500         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
8501         (EmitContext.CurrentBranching): Added.
8502         (EmitContext.StartFlowBranching): Added.
8503         (EmitContext.EndFlowBranching): Added.
8504         (EmitContext.KillFlowBranching): Added.
8505         (EmitContext.IsVariableAssigned): Added.
8506         (EmitContext.SetVariableAssigned): Added.
8507         (EmitContext.IsParameterAssigned): Added.
8508         (EmitContext.SetParameterAssigned): Added.
8509         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
8510         Added control flow analysis stuff here.
8511
8512         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
8513         resolve the expression as lvalue.
8514         (LocalVariableReference.DoResolve): Check whether the variable has
8515         already been assigned.
8516         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
8517         the parameter as assigned here.
8518         (ParameterReference.DoResolve): Check whether the parameter has already
8519         been assigned.
8520         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
8521         expression as lvalue.
8522
8523         * statement.cs (FlowBranching): New class for the flow analysis code.
8524         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
8525         (LabeledStatement.IsDefined): New public property.
8526         (LabeledStatement.AddUsageVector): New public method to tell flow
8527         analyis that the label may be reached via a forward jump.
8528         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
8529         flow analysis.
8530         (VariableInfo.Number): New public field.  This is used by flow analysis
8531         to number all locals of a block.
8532         (Block.CountVariables): New public property.  This is the number of
8533         local variables in this block (including the locals from all parent
8534         blocks).
8535         (Block.EmitMeta): Number all the variables.
8536
8537         * statement.cs: Added flow analysis support to all classes.
8538
8539 2002-07-31  Martin Baulig  <martin@gnome.org>
8540
8541         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
8542         To get debugging messages, compile mcs with /define:MCS_DEBUG and
8543         then use this argument.
8544
8545         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
8546
8547         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
8548         use this to specify /define options.
8549
8550 2002-07-29  Martin Baulig  <martin@gnome.org>
8551
8552         * statement.cs (Fixed): Moved all code that does variable lookups
8553         and resolvings from Emit to Resolve.
8554
8555         * statement.cs (For): Moved all code that does variable lookups
8556         and resolvings from Emit to Resolve.
8557
8558         * statement.cs (Using): Moved all code that does variable lookups
8559         and resolvings from Emit to Resolve.
8560
8561 2002-07-29  Martin Baulig  <martin@gnome.org>
8562
8563         * attribute.cs (Attribute.Resolve): Explicitly catch a
8564         System.NullReferenceException when creating the
8565         CustromAttributeBuilder and report a different warning message.
8566
8567 2002-07-29  Martin Baulig  <martin@gnome.org>
8568
8569         * support.cs (ParameterData.ParameterName): Added method to
8570         get the name of a parameter.
8571
8572         * typemanager.cs (TypeManager.IsValueType): New public method.
8573
8574 2002-07-29  Martin Baulig  <martin@gnome.org>
8575
8576         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
8577         is a flag which specifies that it's either ref or out.
8578         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
8579         the out parameter to `out Parameter.Modifier mod', also set the
8580         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
8581
8582         * support.cs (InternalParameters.ParameterModifier): Distinguish
8583         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8584         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8585
8586         * expression.cs (Argument.GetParameterModifier): Distinguish
8587         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
8588         Parameter.Modifier.ISBYREF flag if it's either ref or out.
8589
8590 2002-07-29  Martin Baulig  <martin@gnome.org>
8591
8592         * expression.cs (ParameterReference.ParameterReference): Added
8593         `Location loc' argument to the constructor.
8594
8595         * cs-parser.jay: Pass location to ParameterReference.
8596
8597 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
8598
8599         * statement.cs (Try): Initialize the location.
8600
8601         * cs-parser.jay: pass location to Try.
8602
8603         * expression.cs (Unary.Reduce): Change the prototype to return
8604         whether a constant fold could be performed or not.  The result is
8605         returned in an out parameters.  In the case of Indirection and
8606         AddressOf, we want to perform the full tests.
8607
8608 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
8609
8610         * statement.cs (Statement.Emit): Flag dead code.
8611
8612 2002-07-27  Andrew Birkett  <andy@nobugs.org>
8613
8614         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
8615
8616 2002-07-27  Martin Baulig  <martin@gnome.org>
8617
8618         * class.cs (MethodData.Define): Put back call to
8619         TypeManager.AddMethod(), accidentally commented this out.
8620
8621         * report.cs (Debug): New public method to print debugging information,
8622         this is `[Conditional ("DEBUG")]'.
8623
8624 2002-07-26  Martin Baulig  <martin@gnome.org>
8625
8626         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
8627         (switch_statement): Push the current_block to the switch_stack and
8628         pop it again when we're done with the switch.
8629         (switch_section): The new block is a child of the current_block.
8630         Fixes bug #24007, added test-152.cs.
8631
8632 2002-07-27  Martin Baulig  <martin@gnome.org>
8633
8634         * expression.cs (Invocation.EmitArguments): When calling a varargs
8635         function with only its fixed arguments, we need to pass an empty
8636         array.
8637
8638 2002-07-27  Martin Baulig  <martin@gnome.org>
8639
8640         Mono 0.13 has been released.
8641
8642 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
8643
8644         * driver.cs: Rename --resource to --linkres, because that is what
8645         we do currently, we dont support --resource yet.
8646
8647         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
8648
8649 2002-07-25  Martin Baulig  <martin@gnome.org>
8650
8651         * class.cs (MethodData): New public class.  This is a `method builder'
8652         class for a method or one accessor of a Property/Indexer/Event.
8653         (MethodData.GetMethodFlags): Moved here from MemberBase.
8654         (MethodData.ApplyAttributes): Likewise.
8655         (MethodData.ApplyObsoleteAttribute): Likewise.
8656         (MethodData.ApplyConditionalAttribute): Likewise.
8657         (MethodData.ApplyDllImportAttribute): Likewise.
8658         (MethodData.CheckAbstractAndExternal): Likewise.
8659         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
8660         (MethodData.Emit): Formerly known as Method.Emit().
8661         (MemberBase): Moved everything which was specific to a single
8662         accessor/method to MethodData.
8663         (Method): Create a new MethodData and call Define() and Emit() on it.
8664         (Property, Indexer, Event): Create a new MethodData objects for each
8665         accessor and call Define() and Emit() on them.
8666
8667 2002-07-25  Martin Baulig  <martin@gnome.org>
8668
8669         Made MethodCore derive from MemberBase to reuse the code from there.
8670         MemberBase now also checks for attributes.
8671
8672         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
8673         (MemberBase.GetMethodFlags): Moved here from class Method and marked
8674         as virtual.
8675         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
8676         `CallingConventions cc' and `Attributes opt_attrs' arguments.
8677         (MemberBase.ApplyAttributes): New virtual method; applies the
8678         attributes to a method or accessor.
8679         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
8680         (MemberBase.ApplyConditionalAttribute): Likewise.
8681         (MemberBase.ApplyDllImportAttribute): Likewise.
8682         (MemberBase.CheckAbstractAndExternal): Likewise.
8683         (MethodCore.ParameterTypes): This is now a property instead of a
8684         method, it's initialized from DoDefineParameters().
8685         (MethodCore.ParameterInfo): Removed the set accessor.
8686         (MethodCore.DoDefineParameters): New protected virtual method to
8687         initialize ParameterTypes and ParameterInfo.
8688         (Method.GetReturnType): We can now simply return the MemberType.
8689         (Method.GetMethodFlags): Override the MemberBase version and add
8690         the conditional flags.
8691         (Method.CheckBase): Moved some code from Define() here, call
8692         DoDefineParameters() here.
8693         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
8694         here to avoid some larger code duplication.
8695         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
8696         ensure that abstract and external accessors don't declare a body.
8697
8698         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
8699         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
8700         lookup in the attribute's parent classes, so we need to abort as soon
8701         as we found the first match.
8702         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
8703         the attribute has no arguments.
8704
8705         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
8706         of a Method.
8707
8708 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8709
8710         * cs-parser.jay: reverted previous patch.
8711
8712 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8713
8714         * cs-parser.jay: fixed bug #22119.
8715
8716 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8717
8718         * attribute.cs: fixed compilation. The error was:
8719         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
8720         be assigned to before control leaves the current method."
8721         [FIXME:  Filed as bug #28186: MCS must report this error.]
8722
8723 2002-07-25  Martin Baulig  <martin@gnome.org>
8724
8725         * attribute.cs (Attribute.Conditional_GetConditionName): New static
8726         method to pull the condition name ouf of a Conditional attribute.
8727         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
8728         the obsolete message and error flag out of an Obsolete attribute.
8729
8730         * class.cs (Method.GetMethodFlags): New public method to get the
8731         TypeManager.MethodFlags for this method.
8732         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
8733         private methods.
8734         (Method.Define): Get and apply the Obsolete and Conditional attributes;
8735         if we're overriding a virtual function, set the new private variable
8736         `parent_method'; call the new TypeManager.AddMethod().
8737
8738         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
8739         the MethodBuilder and the Method in a PtrHashtable.
8740         (TypeManager.builder_to_method): Added for this purpose.
8741         (TypeManager.MethodFlags): Added IsObsoleteError.
8742         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
8743         Obsolete and Conditional arguments in MethodBuilders.  If we discover
8744         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
8745         the message from the attribute.
8746
8747 2002-07-24  Martin Baulig  <martin@gnome.org>
8748
8749         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
8750         preprocessor directives, ensure that the argument to #define/#undef is
8751         exactly one identifier and that it's actually an identifier.
8752
8753         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
8754         did not work ....
8755
8756 2002-07-24  Martin Baulig  <martin@gnome.org>
8757
8758         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
8759         initialize it to TypeManager.object_type in the constructor.
8760         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
8761         of the `hm.get_current' method if we're using the collection pattern.
8762         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
8763         for the explicit conversion to make it work when we're using the collection
8764         pattern and the `Current' property has a different return type than `object'.
8765         Fixes #27713.
8766
8767 2002-07-24  Martin Baulig  <martin@gnome.org>
8768
8769         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
8770         does not match, but don't report any errors.  This method is called in
8771         order for all methods in a MethodGroupExpr until a matching method is
8772         found, so we don't want to bail out if the first method doesn't match.
8773         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
8774         matches, report the 123.  Fixes #28070.
8775
8776 2002-07-24  Martin Baulig  <martin@gnome.org>
8777
8778         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
8779         TypeManager.TypeToCoreType() to the top of the method so the
8780         following equality checks will work.  Fixes #28107.
8781
8782 2002-07-24  Martin Baulig  <martin@gnome.org>
8783
8784         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
8785         operand is of type uint, and the other operand is of type sbyte,
8786         short or int, the operands are converted to type long." -
8787         Actually do what this comment already told us.  Fixes bug #28106,
8788         added test-150.cs.
8789
8790 2002-07-24  Martin Baulig  <martin@gnome.org>
8791
8792         * class.cs (MethodBase): New abstract class.  This is now a base
8793         class for Property, Indexer and Event to avoid some code duplication
8794         in their Define() and DefineMethods() methods.
8795         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
8796         generic methods for Define() and DefineMethods().
8797         (FieldBase): Derive from MemberBase, not MemberCore.
8798         (Property): Derive from MemberBase, not MemberCore.
8799         (Property.DefineMethod): Moved all the code from this method to the
8800         new MethodBase.DefineAccessor(), just call it with appropriate
8801         argumetnts.
8802         (Property.Define): Call the new Property.DoDefine(), this does some
8803         sanity checks and we don't need to duplicate the code everywhere.
8804         (Event): Derive from MemberBase, not MemberCore.
8805         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
8806         accessors, this will also make them work with interface events.
8807         (Indexer): Derive from MemberBase, not MemberCore.
8808         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
8809         (Indexer.Define): Use the new MethodBase functions.
8810
8811         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
8812         argument to the constructor.
8813         (Interface.FindMembers): Added support for interface events.
8814         (Interface.PopluateEvent): Implemented.
8815
8816         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
8817
8818 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
8819
8820         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
8821         but this is required to check for a method name being the same as
8822         the containing class.  
8823
8824         Handle this now.
8825
8826 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8827
8828         * interface.cs: initialize variable.
8829
8830 2002-07-23  Martin Baulig  <martin@gnome.org>
8831
8832         Implemented the IndexerName attribute in interfaces.
8833
8834         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
8835         name if this is an explicit interface implementation.
8836         (Indexer.InterfaceIndexerName): New public variable.  If we're
8837         implementing an interface indexer, this is the IndexerName in that
8838         interface.  Otherwise, it's the IndexerName.
8839         (Indexer.DefineMethod): If we're implementing interface indexer,
8840         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
8841         and Pending.ImplementIndexer methods.
8842         (Indexer.Define): Also define the PropertyBuilder if we're
8843         implementing an interface indexer and this is neither an explicit
8844         interface implementation nor do the IndexerName match the one in
8845         the interface.
8846
8847         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
8848         If a method is defined here, then we always need to create a proxy
8849         for it.  This is used when implementing interface indexers.
8850         (Pending.IsInterfaceIndexer): New public method.
8851         (Pending.ImplementIndexer): New public method.
8852         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
8853         This is used when implementing interface indexers to define a proxy
8854         if necessary.
8855         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
8856         define a proxy if necessary.
8857
8858         * interface.cs (Interface.IndexerName): New public variable.
8859         (Interface.PopulateIndexer): Set the IndexerName.
8860         (Interface.DefineIndexers): New private method.  Populate all the
8861         indexers and make sure their IndexerNames match.
8862
8863         * typemanager.cs (IndexerPropertyName): Added support for interface
8864         indexers.
8865
8866 2002-07-22  Martin Baulig  <martin@gnome.org>
8867
8868         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
8869         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
8870         ret if HasReturnLabel.
8871         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
8872         variables.
8873
8874         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
8875         and set the ec.LoopBeginTryCatchLevel.
8876         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
8877         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
8878         the current ec.TryCatchLevel, the branch goes out of an exception
8879         block.  In this case, we need to use Leave and not Br.
8880
8881 2002-07-22  Martin Baulig  <martin@gnome.org>
8882
8883         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
8884         block unless the block does not always return or it is contained in
8885         another try { ... } catch { ... } block.  Fixes bug #26506.
8886         Added verify-1.cs to the test suite.
8887
8888 2002-07-22  Martin Baulig  <martin@gnome.org>
8889
8890         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
8891         then we do not always return.  Fixes bug #24985.
8892
8893 2002-07-22  Martin Baulig  <martin@gnome.org>
8894
8895         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
8896         lookup on a per-class level; ie. walk up the class hierarchy until we
8897         found at least one applicable method, then choose the best among them.
8898         Fixes bug #24463 and test-29.cs.
8899
8900 2002-07-22  Martin Baulig  <martin@gnome.org>
8901
8902         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
8903         return types of the methods.  The return type is not part of the
8904         signature and we must not check it to make the `new' modifier work.
8905         Fixes bug #27999, also added test-147.cs.
8906         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
8907
8908         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
8909         on the method's return type.
8910
8911 2002-07-21  Martin Baulig  <martin@gnome.org>
8912
8913         * assign.cs: Make this work if the rightmost source is a constant and
8914         we need to do an implicit type conversion.  Also adding a few more tests
8915         to test-38.cs which should have caught this.
8916
8917         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
8918         target in the makefile for this.  The makefile.gnu is primarily intended
8919         for end-users who don't want to debug the compiler.
8920
8921 2002-07-21  Martin Baulig  <martin@gnome.org>
8922
8923         * assign.cs: Improved the Assign class so it can now handle embedded
8924         assignments (X = Y = Z = something).  As a side-effect this'll now also
8925         consume less local variables.  test-38.cs now passes with MCS, added
8926         a few new test cases to that test.
8927
8928 2002-07-20  Martin Baulig  <martin@gnome.org>
8929
8930         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
8931         instructions.  Fixes bug #27977, also added test-146.cs.
8932
8933 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8934
8935         * cs-tokenizer.cs: fixed getHex ().
8936
8937 2002-07-19  Martin Baulig  <martin@gnome.org>
8938
8939         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
8940         not Type.GetType() to lookup the array type.  This is needed when
8941         we're constructing an array of a user-defined type.
8942         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
8943         single-dimensional arrays, but also for single-dimensial arrays of
8944         type decimal.
8945
8946 2002-07-19  Martin Baulig  <martin@gnome.org>
8947
8948         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
8949         this function is called, it's not allowed to share LocalBuilders
8950         among ILGenerators.
8951
8952 2002-07-19  Martin Baulig  <martin@gnome.org>
8953
8954         * expression.cs (Argument.Resolve): Report an error 118 when trying
8955         to pass a type as argument.
8956
8957 2002-07-18  Martin Baulig  <martin@gnome.org>
8958
8959         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
8960         Conv_R_Un for the signed `long' type.
8961
8962 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
8963
8964         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
8965         `expr' for the temporary result, as that will fail if we do
8966         multiple resolves on the same expression.
8967
8968 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
8969
8970         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
8971         ec.TypeContainer for looking up aliases. 
8972
8973         * class.cs (TypeContainer): Remove LookupAlias from here.
8974
8975         * decl.cs (DeclSpace); Move here.
8976
8977 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
8978
8979         * class.cs (FindMembers): Only call filter if the constructor
8980         bulider is not null.
8981
8982         Also handle delegates in `NestedTypes' now.  Now we will perform
8983         type lookups using the standard resolution process.  This also
8984         fixes a bug.
8985
8986         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
8987         This uses Expressions (the limited kind that can be parsed by the
8988         tree) instead of strings.
8989
8990         * expression.cs (ComposedCast.ToString): Implement, used to flag
8991         errors since now we have to render expressions.
8992
8993         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
8994         FormArrayType. 
8995
8996         * ecore.cs (SimpleName.ToString): ditto.
8997
8998         * cs-parser.jay: Instead of using strings to assemble types, use
8999         Expressions to assemble the type (using SimpleName, ComposedCast,
9000         MemberAccess).  This should fix the type lookups in declarations,
9001         because we were using a different code path for this.
9002
9003         * statement.cs (Block.Resolve): Continue processing statements
9004         even when there is an error.
9005
9006 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
9007
9008         * class.cs (Event.Define): Also remove the `remove' method from
9009         the list of pending items.
9010
9011         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
9012         generate more compact code. 
9013
9014 2002-07-17  Martin Baulig  <martin@gnome.org>
9015
9016         * const.cs (Const.LookupConstantValue): Add support for constant
9017         `unchecked' and `checked' expressions.
9018         Also adding test case test-140.cs for this.
9019
9020 2002-07-17  Martin Baulig  <martin@gnome.org>
9021
9022         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
9023         check whether mi.ReturnType implements the IEnumerator interface; the
9024         `==' and the IsAssignableFrom() will fail in this situation.
9025
9026 2002-07-16  Ravi Pratap  <ravi@ximian.com>
9027
9028         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
9029         here too.
9030
9031 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9032
9033         * expression.cs: fixed bug #27811.
9034
9035 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
9036
9037         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
9038         Molaro: when we are a ref, the value already contains a pointer
9039         value, do not take the address of it.
9040
9041 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
9042         * removed mb-parser.jay and mb-tokenizer.cs
9043
9044 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9045
9046         * expression.cs: check against the building corlib void type.
9047
9048 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
9049
9050         * ecore.cs: fix for valuetype static readonly fields: when 
9051         initializing them, we need their address, not the address of a copy.
9052
9053 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
9054
9055         * typemanager.cs: register also enum_type in corlib.
9056
9057 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9058
9059         * class.cs: allow calling this (but not base) initializers in structs.
9060
9061 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
9062
9063         * ecore.cs: make sure we compare against the building base types
9064         in GetTypeSize ().
9065
9066 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
9067
9068         * typemanager.cs: fix TypeToCoreType() to handle void and object
9069         (corlib gets no more typerefs after this change).
9070
9071 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
9072
9073         * expression.cs (ArrayCreation.EmitArrayArguments): use
9074         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
9075
9076         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
9077         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
9078         array indexes, the runtime actually forbids them.
9079
9080         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
9081         for array arguments here.
9082
9083         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
9084         instead of the default for ValueTypes.
9085
9086         (New.DoEmit): Use IsValueType instead of
9087         IsSubclassOf (value_type)
9088         (New.DoResolve): ditto.
9089         (Invocation.EmitCall): ditto.
9090
9091         * assign.cs (Assign): ditto.
9092
9093         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
9094         Statements *are* currently doing part of their resolution during
9095         Emit.  
9096
9097         Expressions do always resolve during resolve, but statements are
9098         only required to propagate resolution to their children.
9099
9100 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
9101
9102         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
9103
9104         (LoadAssembly): Do not add the dll if it is already specified
9105
9106         (MainDriver): Add the System directory to the link path at the end,
9107         after all the other -L arguments. 
9108
9109         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
9110         wrong opcode for loading bytes and bools (ldelem.i1 instead of
9111         ldelem.u1) and using the opposite for sbytes.
9112
9113         This fixes Digger, and we can finally run it.
9114
9115         * driver.cs (UnixParseOption): Move the option parsing here.  
9116         (CSCParseOption): Implement CSC-like parsing of options.
9117
9118         We now support both modes of operation, the old Unix way, and the
9119         new CSC-like way.  This should help those who wanted to make cross
9120         platform makefiles.
9121
9122         The only thing broken is that /r:, /reference: and /lib: are not
9123         implemented, because I want to make those have the same semantics
9124         as the CSC compiler has, and kill once and for all the confussion
9125         around this.   Will be doing this tomorrow.
9126
9127         * statement.cs (Unsafe.Resolve): The state is checked during
9128         resolve, not emit, so we have to set the flags for IsUnsfe here.
9129
9130 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9131
9132         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
9133         not catch the Error_ObjectRefRequired in SimpleName (as it is
9134         possible to have a class/instance variable name that later gets
9135         deambiguated), we have to check this here.      
9136
9137 2002-07-10  Ravi Pratap  <ravi@ximian.com>
9138
9139         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
9140         make static and put into Expression.
9141
9142         (Event.Define): Register the private field of the event with the 
9143         TypeManager so that GetFieldFromEvent can get at it.
9144
9145         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
9146         keep track of the private field associated with an event which
9147         has no accessors.
9148
9149         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
9150         private field.
9151
9152         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
9153
9154 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
9155
9156         * expression.cs (Binary.EmitBranchable): this routine emits the
9157         Binary expression in a branchable context.  This basically means:
9158         we need to branch somewhere, not just get the value on the stack.
9159
9160         This works together with Statement.EmitBoolExpression.
9161
9162         * statement.cs (Statement.EmitBoolExpression): Use
9163         EmitBranchable. 
9164
9165 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
9166
9167         * statement.cs (For): Reduce the number of jumps in loops.
9168
9169         (For): Implement loop inversion for the For statement.
9170
9171         (Break): We can be breaking out of a Try/Catch controlled section
9172         (foreach might have an implicit try/catch clause), so we need to
9173         use Leave instead of Br.
9174
9175         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
9176         now).  If the instace expression supports IMemoryLocation, we use
9177         the AddressOf method from the IMemoryLocation to extract the
9178         address instead of emitting the instance.
9179
9180         This showed up with `This', as we were emitting the instance
9181         always (Emit) instead of the Address of This.  Particularly
9182         interesting when This is a value type, as we dont want the Emit
9183         effect (which was to load the object).
9184
9185 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
9186
9187         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
9188
9189         * statement.cs (Checked): Set the CheckedState during the resolve
9190         process too, as the ConvCast operations track the checked state on
9191         the resolve process, and not emit.
9192
9193         * cs-parser.jay (namespace_member_declaration): Flag that we have
9194         found a declaration when we do.  This is used to flag error 1529
9195
9196         * driver.cs: Report ok when we display the help only.
9197
9198 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
9199
9200         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
9201
9202 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
9203
9204         * cs-tokenizer.cs (define): We also have to track locally the
9205         defines.  AllDefines is just used for the Conditional Attribute,
9206         but we also need the local defines for the current source code. 
9207
9208 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
9209
9210         * statement.cs (While, For, Do): These loops can exit through a
9211         Break statement, use this information to tell whether the
9212         statement is the last piece of code.
9213
9214         (Break): Flag that we break.
9215
9216         * codegen.cs (EmitContexts): New `Breaks' state variable.
9217
9218 2002-07-03  Martin Baulig  <martin@gnome.org>
9219
9220         * class.cs (TypeContainer.MethodModifiersValid): Allow override
9221         modifiers in method declarations in structs.  Otherwise, you won't
9222         be able to override things like Object.Equals().
9223
9224 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9225
9226         * class.cs (Method, Property, Indexer): Do not allow the public
9227         modifier to be used in explicit interface implementations.
9228
9229         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
9230         override modifiers in method declarations in structs
9231
9232 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
9233
9234         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
9235         integer or real overflow, report an error
9236
9237 2002-07-02  Martin Baulig  <martin@gnome.org>
9238
9239         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
9240         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
9241         to tell the runtime about our newly created System.Object and
9242         System.ValueType types.
9243
9244 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
9245
9246         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
9247         struct instead of Ldarg/Starg.
9248
9249 2002-07-02  Martin Baulig  <martin@gnome.org>
9250
9251         * expression.cs (Indirection.Indirection): Call
9252         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
9253
9254 2002-07-02  Martin Baulig  <martin@gnome.org>
9255
9256         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
9257         ValueType, call TypeManager.TypeToCoreType() on it.
9258         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
9259         the OpCodes.Newarr argument.
9260
9261 2002-07-02  Martin Baulig  <martin@gnome.org>
9262
9263         * expression.cs (Invocation.EmitCall): When compiling corlib,
9264         replace all calls to the system's System.Array type to calls to
9265         the newly created one.
9266
9267         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
9268         System.Array methods.
9269         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
9270         from the system's System.Array type which must be replaced.
9271
9272 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
9273
9274         * typemanager.cs: load unverifiable_code_ctor so we can build
9275         corlib using the correct type. Avoid using GetTypeCode() with
9276         TypeBuilders.
9277         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
9278         TypeManager.object_type to allow building corlib.
9279
9280 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
9281
9282         * ecore.cs: handle System.Enum separately in LoadFromPtr().
9283
9284 2002-07-01  Martin Baulig  <martin@gnome.org>
9285
9286         * class.cs: Make the last change actually work, we need to check
9287         whether `ifaces != null' to avoid a crash.
9288
9289 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
9290
9291         * class.cs: when we build structs without fields that implement
9292         interfaces, we need to add the interfaces separately, since there is
9293         no API to both set the size and add the interfaces at type creation
9294         time.
9295
9296 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
9297
9298         * expression.cs: the dimension arguments to the array constructors
9299         need to be converted if they are a long.
9300
9301 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
9302
9303         * class.cs: don't emit ldarg.0 if there is no parent constructor
9304         (fixes showstopper for corlib).
9305
9306 2002-06-29  Martin Baulig  <martin@gnome.org>
9307
9308         MCS now compiles corlib on GNU/Linux :-)
9309
9310         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
9311         ie. check for MethodImplOptions.InternalCall.
9312
9313         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
9314         and TypeManager.attribute_type are null, so we must explicitly check
9315         whether parent is not null to find out whether it's an attribute type.
9316         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
9317         and SetBuilder, not only if the property is neither abstract nor external.
9318         This is necessary to set the MethodImplOptions on the accessor methods.
9319         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
9320         SetBuilder, see Property.Emit().
9321
9322         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
9323         populate "System.Object", "System.ValueType" and "System.Attribute" since
9324         they've already been populated from BootCorlib_PopulateCoreTypes().
9325
9326 2002-06-29  Martin Baulig  <martin@gnome.org>
9327
9328         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
9329         is the NullLiteral, we also need to make sure that target_type is not
9330         an enum type.   
9331
9332 2002-06-29  Martin Baulig  <martin@gnome.org>
9333
9334         * rootcontext.cs (RootContext.ResolveCore): We must initialize
9335         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
9336         before calling BootstrapCorlib_ResolveDelegate ().
9337
9338 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9339
9340         * statement.cs: fixed build-breaker. All tests passed ok.
9341
9342 2002-06-27  Martin Baulig  <martin@gnome.org>
9343
9344         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
9345         for System.Decimal when compiling corlib.
9346
9347 2002-06-27  Martin Baulig  <martin@gnome.org>
9348
9349         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
9350         switch blocks which contain nothing but a default clause.
9351
9352 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
9353
9354        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
9355
9356 2002-06-27  Martin Baulig  <martin@gnome.org>
9357
9358         * ecore.cs (PropertyExpr.PropertyExpr): Call
9359         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
9360
9361         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
9362         is already a TypeBuilder.
9363
9364 2002-06-27  Martin Baulig  <martin@gnome.org>
9365
9366         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
9367         `target_type == TypeManager.array_type', not IsAssignableFrom() in
9368         the "from an array-type to System.Array" case.  This makes it work
9369         when compiling corlib.
9370
9371 2002-06-27  Martin Baulig  <martin@gnome.org>
9372
9373         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
9374         non-static PropertyExpr, set its InstanceExpression.  This makes
9375         the `ICollection.Count' property work in System/Array.cs.
9376
9377 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
9378
9379         * driver.cs: Made error handling more consistent.  Errors now
9380         tracked by Report class, so many methods which used to return int
9381         now return void.  Main() now prints success/failure and 
9382         errors/warnings message.
9383
9384         Renamed '--probe' compiler argument to '--expect-error'.  Removed
9385         the magic number return values (123 and 124).  Now, if the
9386         expected error occurs, the compiler exits with success (exit value
9387         0).  If the compilation completes without seeing that particular
9388         error, the compiler exits with failure (exit value 1).  The
9389         makefile in mcs/errors has been changed to handle the new behaviour.
9390
9391         * report.cs: Made 'expected error' number a property and renamed
9392         it from 'Probe' to 'ExpectedError'.
9393
9394         * genericparser.cs: Removed error handling support, since it is
9395         now all done by Report class.
9396
9397         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
9398         class, so parse() no longer returns an int.
9399
9400         * namespace.cs: Use Report.Error instead of GenericParser.error
9401
9402 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
9403
9404         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
9405         TypeContainer.AddOperator): At the front of the list put the
9406         explicit implementations, so they get resolved/defined first. 
9407
9408 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
9409
9410         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
9411         interface type is implemented by this TypeContainer.  Used during
9412         explicit interface implementation.
9413
9414         (Property.Define, Indexer.Define, Method.Define): Validate that
9415         the given interface in the explicit implementation is one of the
9416         base classes for the containing type.
9417
9418         Also if we are explicitly implementing an interface, but there is
9419         no match in the pending implementation table, report an error.
9420
9421         (Property.Define): Only define the property if we are
9422         not explicitly implementing a property from an interface.  Use the
9423         correct name also for those properties (the same CSC uses,
9424         although that is really not needed).
9425
9426         (Property.Emit): Do not emit attributes for explicitly implemented
9427         properties, as there is no TypeBuilder.
9428
9429         (Indexer.Emit): ditto.
9430
9431         Hiding then means that we do not really *implement* a pending
9432         implementation, which makes code fail.
9433
9434 2002-06-22  Martin Baulig  <martin@gnome.org>
9435
9436         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
9437         the return value of Object.GetType().  [FIXME: we need to do this whenever
9438         we get a type back from the reflection library].
9439
9440 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
9441
9442         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
9443
9444 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
9445
9446         * attribute.cs: Return null if we can not look up the type.
9447
9448         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
9449         the interface types found.
9450
9451         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
9452         interface types found.
9453
9454         * typemanager.cs (GetInterfaces): Make this routine returns alll
9455         the interfaces and work around the lame differences between
9456         System.Type and System.Reflection.Emit.TypeBuilder in the results
9457         result for GetInterfaces.
9458
9459         (ExpandInterfaces): Given an array of interface types, expand and
9460         eliminate repeated ocurrences of an interface.  This expands in
9461         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
9462         be IA, IB, IC.
9463
9464 2002-06-21  Martin Baulig  <martin@gnome.org>
9465
9466         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
9467         on System.Enum.
9468
9469 2002-06-21  Martin Baulig  <martin@gnome.org>
9470
9471         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
9472         and called with one of the core types, return the corresponding typebuilder for
9473         that type.
9474
9475         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
9476         element type.
9477
9478 2002-06-21  Martin Baulig  <martin@gnome.org>
9479
9480         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
9481         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
9482         (Expression.ConvertReferenceExplicit): Likewise.
9483
9484         * expression.cs (ElementAccess.DoResolve): Likewise.
9485         (ElementAccess.DoResolveLValue): Likewise.
9486
9487 2002-06-10  Martin Baulig  <martin@gnome.org>
9488
9489         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
9490         add the "value" parameter to the parameter list.
9491
9492         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
9493         to our caller.
9494
9495 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
9496
9497         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
9498         the argument to an int, uint, long or ulong, per the spec.  Also
9499         catch negative constants in array creation.
9500
9501 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
9502
9503         * class.cs: do not allow the same interface to appear twice in
9504         the definition list.
9505
9506 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
9507
9508         * ecore.cs: don't use ldlen with System.Array.
9509
9510 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
9511
9512         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
9513
9514 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
9515
9516         * modifiers.cs: produce correct field attributes for protected
9517         internal. Easy fix so miguel can work on ther harder stuff:-)
9518
9519 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
9520
9521         * pending.cs: New file.  Move the code from class.cs here.
9522         Support clearning the pending flag for all methods (when not doing
9523         explicit interface implementation).
9524
9525 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
9526
9527         * rootcontext.cs: added a couple more types needed to bootstrap.
9528
9529 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
9530
9531         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
9532         constructor in the type, instead of any constructor in the type
9533         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
9534         a bug in the Mono runtime when applying the params attribute). 
9535
9536 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
9537         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
9538
9539 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
9540
9541         * expression.cs (Unary.ResolveOperator): Use TypeManager
9542         to resolve the type.
9543
9544 2002-06-13  Ravi Pratap  <ravi@ximian.com>
9545
9546         * cs-parser.jay (enum_member_declaration): Pass in the attributes
9547         attached.
9548
9549         * enum.cs (AddEnumMember): Add support to store the attributes associated 
9550         with each member too.
9551
9552         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
9553         field builders too - this takes care of the enum member case.
9554
9555 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
9556
9557         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
9558         address-of operator on both value types and pointers.
9559
9560 2002-06-10  Martin Baulig  <martin@gnome.org>
9561
9562         * interface.cs (Interface.PopulateIndexer): Add the indexer's
9563         PropertyBuilder to the `property_builders' list.
9564
9565         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
9566         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
9567         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
9568         find any indexers which are inherited from an interface.
9569
9570 2002-06-09  Martin Baulig  <martin@gnome.org>
9571
9572         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
9573         the same type as the constant if necessary.  There's also a test-130.cs
9574         for this.
9575
9576         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
9577
9578         * typemanager.cs (TypeManager.ChangeType): Previously known as
9579         Enum.ChangeEnumType().
9580
9581 2002-06-09  Martin Baulig  <martin@gnome.org>
9582
9583         * expression.cs (Cast.TryReduce): Added support for consts.
9584
9585 2002-06-08  Ravi Pratap  <ravi@ximian.com>
9586
9587         * class.cs (Accessor): Hold attributes information so we can pass
9588         it along.
9589
9590         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
9591         Modify to pass in attributes attached to the methods.
9592
9593         (add_accessor_declaration, remove_accessor_declaration): Ditto.
9594
9595         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
9596         to handle the Accessor kind :-)
9597
9598         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
9599
9600 2002-06-08  Martin Baulig  <martin@gnome.org>
9601
9602         * expression.cs (Unary.TryReduceNegative): Added support for
9603         ULongConstants.
9604
9605 2002-06-08  Martin Baulig  <martin@gnome.org>
9606
9607         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
9608         name can't be found in the `defined_names' - the caller will do a
9609         MemberLookup in this case and thus find methods in System.Enum
9610         such as Enum.IsDefined().
9611
9612 2002-06-08  Martin Baulig  <martin@gnome.org>
9613
9614         * enum.cs (Enum.ChangeEnumType): This is a custom version of
9615         Convert.ChangeType() which works with TypeBuilder created types.
9616         (Enum.LookupEnumValue, Enum.Define): Use it here.
9617
9618         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
9619         `TypeBuilder.BaseType != null' check.
9620         (TypeContainer.FindMembers): Only lookup parent members if we
9621         actually have a parent.
9622         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
9623         (ConstructorInitializer.Resolve): Likewise.
9624
9625         * interface.cs (Interface.FindMembers): Added
9626         `TypeBuilder.BaseType != null' check.
9627
9628         * rootcontext.cs (RootContext.ResolveCore): Added
9629         "System.Runtime.CompilerServices.IndexerNameAttribute" to
9630         classes_second_stage.
9631
9632         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
9633         debug_type and trace_type when compiling with --nostdlib.       
9634
9635 2002-06-07  Martin Baulig  <martin@gnome.org>
9636
9637         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
9638         (AddField): Set it to true when adding a non-static field.
9639         (DefineType): Use `have_nonstatic_fields' to find out whether we
9640         have non-static fields, not `Fields != null'.
9641
9642 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
9643
9644         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
9645         dereferencing a null on the static-field code path)
9646
9647 2002-05-30  Martin Baulig  <martin@gnome.org>
9648
9649         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
9650         to take command line arguments.  Use reflection to call the new
9651         custom `Initialize' function on the symbol writer and pass it the
9652         command line arguments.
9653
9654         * driver.cs (--debug-args): New command line argument to pass command
9655         line arguments to the symbol writer.
9656
9657 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
9658
9659         * assign.cs (DoResolve): Forgot to do the implicit conversion to
9660         the target type for indexers and properties.  Thanks to Joe for
9661         catching this.
9662
9663 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
9664
9665         * typemanager.cs (MethodFlags): returns the method flags
9666         (Obsolete/ShouldIgnore) that control warning emission and whether
9667         the invocation should be made, or ignored. 
9668
9669         * expression.cs (Invocation.Emit): Remove previous hack, we should
9670         not do this on matching a base type, we should do this based on an attribute
9671
9672         Only emit calls to System.Diagnostics.Debug and
9673         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
9674         on the command line.
9675
9676         * rootcontext.cs: Global settings for tracing and debugging.
9677
9678         * cs-tokenizer.cs (define): New utility function to track
9679         defines.   Set the global settings for TRACE and DEBUG if found.
9680
9681 2002-05-25  Ravi Pratap  <ravi@ximian.com>
9682
9683         * interface.cs (Populate*): Pass in the TypeContainer as well as
9684         the DeclSpace as parameters so that we can create EmitContexts and
9685         then use that to apply attributes etc.
9686
9687         (PopulateMethod, PopulateEvent, PopulateProperty)
9688         (PopulateIndexer): Apply attributes everywhere.
9689
9690         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
9691         etc.
9692
9693         (ApplyAttributes): Update accordingly.
9694
9695         We now apply interface attributes for all members too.
9696
9697 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
9698
9699         * class.cs (Indexer.Define); Correctly check if we are explicit
9700         implementation (instead of checking the Name for a ".", we
9701         directly look up if the InterfaceType was specified).
9702
9703         Delay the creation of the PropertyBuilder.
9704
9705         Only create the PropertyBuilder if we are not an explicit
9706         interface implementation.   This means that explicit interface
9707         implementation members do not participate in regular function
9708         lookups, and hence fixes another major ambiguity problem in
9709         overload resolution (that was the visible effect).
9710
9711         (DefineMethod): Return whether we are doing an interface
9712         implementation. 
9713
9714         * typemanager.cs: Temporary hack until we get attributes in
9715         interfaces (Ravi is working on that) and we get IndexerName
9716         support in interfaces.
9717
9718         * interface.cs: Register the indexers as properties.
9719
9720         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
9721         warning, I have verified that this is a bug in the .NET runtime
9722         (JavaScript suffers of the same problem).
9723
9724         * typemanager.cs (MemberLookup): When looking up members for
9725         interfaces, the parent of an interface is the implicit
9726         System.Object (so we succeed in searches of Object methods in an
9727         interface method invocation.  Example:  IEnumerable x;  x.ToString
9728         ()) 
9729
9730 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
9731
9732         * class.cs (Event): Events should also register if they do
9733         implement the methods that an interface requires.
9734
9735         * typemanager.cs (MemberLookup); use the new GetInterfaces
9736         method. 
9737
9738         (GetInterfaces): The code used to lookup interfaces for a type is
9739         used in more than one place, factor it here. 
9740
9741         * driver.cs: Track the errors at the bottom of the file, we kept
9742         on going.
9743
9744         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
9745         instance if the method we are calling is static!
9746
9747 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
9748
9749         * attribute.cs (ApplyAttributes): Make this function filter out
9750         the IndexerName attribute (as that attribute in reality is never
9751         applied) and return the string constant for the IndexerName
9752         attribute. 
9753
9754         * class.cs (TypeContainer.Emit): Validate that all the indexers
9755         have the same IndexerName attribute, and if so, set the
9756         DefaultName attribute on the class. 
9757
9758         * typemanager.cs: The return value might contain other stuff (not
9759         only methods).  For instance, consider a method with an "Item"
9760         property and an Item method.
9761
9762         * class.cs: If there is a problem with the parameter types,
9763         return. 
9764
9765 2002-05-24  Ravi Pratap  <ravi@ximian.com>
9766
9767         * ecore.cs (ImplicitConversionExists): Wrapper function which also
9768         looks at user defined conversion after making a call to 
9769         StandardConversionExists - we need this for overload resolution.
9770
9771         * expression.cs : Update accordingly the various method calls.
9772
9773         This fixes 2 bugs filed against implicit user defined conversions 
9774
9775 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
9776
9777         * statement.cs: Track the result of the assignment.
9778
9779 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
9780
9781         * expression.cs (MemberAccess): Improved error reporting for
9782         inaccessible members.
9783
9784 2002-05-22  Martin Baulig  <martin@gnome.org>
9785
9786         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
9787         itself with debugging support.
9788
9789 2002-05-22  Martin Baulig  <martin@gnome.org>
9790
9791         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
9792         Removed, this isn't needed anymore.
9793
9794 2002-05-20  Martin Baulig  <martin@gnome.org>
9795
9796         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
9797         be underlying type for an enum.
9798
9799 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
9800
9801         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
9802         that splits out the loading of just the core types.
9803
9804         * rootcontext.cs (ResolveCore): Split the struct resolution in
9805         two, so we can load the enumeration underlying types before any
9806         enums are used.
9807
9808         * expression.cs (Is): Bandaid until we fix properly Switch (see
9809         bug #24985 for details).
9810
9811         * typemanager.cs (ImplementsInterface): The hashtable will contain
9812         a null if there are no interfaces implemented.
9813
9814 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
9815
9816         * cs-parser.jay (indexer_declarator): It is fine to have array
9817         parameters
9818
9819 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9820
9821         * typemanager.cs: (RegisterBuilder): New function used to register
9822         TypeBuilders that implement interfaces.  Since
9823         TypeBuilder.GetInterfaces (as usual) does not work with lame
9824         Reflection.Emit. 
9825         (AddUserType): register interfaces.
9826
9827         (ImplementsInterface): Use the builder_to_ifaces hash if we are
9828         dealing with TypeBuilder.  Also, arrays are showing up as
9829         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
9830         methods can not be invoked on them!
9831
9832         * ecore.cs (ExplicitReferenceConversionExists): Made public.
9833         (ImplicitReferenceConversionExists): Split out from
9834         StandardConversionExists. 
9835
9836         * expression.cs (As): We were only implementing one of the three
9837         cases for the as operator.  We now implement them all.
9838         (Is): Implement the various other cases for Is as well.
9839
9840         * typemanager.cs (CACHE): New define used to control if we want or
9841         not the FindMembers cache.  Seems to have a negative impact on
9842         performance currently
9843
9844         (MemberLookup): Nested types have full acess to
9845         enclosing type members
9846
9847         Remove code that coped with instance/static returns for events, we
9848         now catch this in RealFindMembers.
9849
9850         (RealFindMembers): only perform static lookup if the instance
9851         lookup did not return a type or an event.  
9852
9853 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
9854
9855         * assign.cs (CompoundAssign): We pass more semantic information
9856         now to Compound Assignments than we did before: now we have all
9857         the information at hand, and now we resolve the target *before* we
9858         do the expression expansion, which allows the "CacheValue" method
9859         to have the effect we intended (before, a [x] += 1 would generate
9860         two differen ArrayAccess expressions from the ElementAccess,
9861         during the resolution process).
9862
9863         (CompoundAssign.DoResolve): Resolve target and original_source here.
9864
9865 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
9866
9867         * expression.cs (ArrayAccess): dropped debugging information. 
9868
9869         * typemanager.cs: Small bug fix: I was always returning i_members,
9870         instead of one of i_members or s_members (depending on which had
9871         the content).
9872
9873         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
9874         method is invoked before any code generation takes place, and it
9875         is a mechanism to inform that the expression will be invoked more
9876         than once, and that the method should use temporary values to
9877         avoid having side effects
9878
9879         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
9880
9881         * ecore.cs (Expression.CacheTemporaries): Provide empty default
9882         implementation.
9883
9884         * expression.cs (Indirection, ArrayAccess): Add support for
9885         CacheTemporaries in these two bad boys. 
9886
9887         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
9888         ldobj or ldind_ref.  
9889         (StoreFromPtr): Handle stobj as well.
9890
9891         * expression.cs (UnaryMutator): Share more code.
9892
9893         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
9894         down: I was not tracking the Filter function as well, which
9895         was affecting the results of the cache.
9896
9897 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
9898
9899         * attribute.cs: Remove the hack to handle the CharSet property on
9900         StructLayouts. 
9901
9902 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
9903
9904         * attribute.cs (DoResolve): More uglyness, we now only try to
9905         resolve the attribute partially, to extract the CharSet
9906         information (only if we are a StructLayout attribute).  Otherwise 
9907
9908         (GetExtraTypeInfo): Add some code to conditionally kill in the
9909         future this.   I am more and more convinced that the .NET
9910         framework has special code to handle the attribute setting on
9911         certain elements.
9912
9913         * expression.cs (IsParamsMethodApplicable): Revert my previous
9914         foreach change here, it was wrong.
9915
9916 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
9917
9918         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
9919         (pp_expr): do not abort on unknown input, just return.
9920         (eval): abort if there are pending chars.
9921
9922         * attribute.cs (Attribute.Resolve): Positional parameters are
9923         optional.  Deal with that case.
9924
9925         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
9926         the Ansi/Unicode/Auto information for the type.
9927
9928         (TypeContainer.DefineType): instantiate the EmitContext here, as
9929         we will be using it during the type definition (to resolve
9930         attributes) and during the emit phase.
9931
9932         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
9933         to pull type information out of the attributes
9934
9935         (Attribute.Resolve): track the constructor builder, and allow for
9936         multiple invocations (structs and classes will use this).
9937
9938         * ecore.cs (MemberLookupFinal): new version with all the
9939         parameters customizable.
9940
9941         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
9942         constructors.  Return if the result value is null (as the error
9943         would have been flagged already by MemberLookupFinal)
9944
9945         Do not allow instances of abstract classes or interfaces to be
9946         created.
9947
9948         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
9949         We have to compare the assembly property here when dealing with
9950         FamANDAssem and Assembly access modifiers, because we might be
9951         creating an assembly from *modules* (that means that we are not
9952         getting TypeBuilders for types defined in other modules that are
9953         part of this assembly).
9954
9955         (Method.Emit): If the method is marked abstract and has a body,
9956         emit an error. 
9957
9958         (TypeContainer.DefineMembers): If both the defined member and the
9959         parent name match are methods, then do not emit any warnings: let
9960         the Method.Define routine take care of flagging warnings.  But if
9961         there is a mismatch (method overrides something else, or method is
9962         overriwritten by something, then emit warning).
9963
9964         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
9965         set to null, this means `do not check for the return type on the
9966         signature'. 
9967
9968         (Method.Define): set the return type for the method signature to
9969         null, so that we get methods with the same name and parameters and
9970         different return types.  This is used to flag warning 114 (you are
9971         hiding a method, and you probably want to use the new/override
9972         keywords instead).
9973
9974         * typemanager.cs (MemberLookup): Implemented proper access
9975         control, closing a long standing set of bug reports.  The problem
9976         was that the Framework only has two bits: Public and NonPublic,
9977         and NonPublic includes private and protected methods, but we need
9978         to enforce the FamANDAssem, FamOrAssem and Family. 
9979
9980 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
9981
9982         * statement.cs (GotoCase): Return true: Ammounts to giving up
9983         knowledge on whether we return or not, and letting the other case
9984         be responsible for it.
9985
9986 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
9987
9988         * driver.cs: Do not load directories for each file processed, only
9989         do it if there is a pattern.
9990
9991         * ecore.cs: Report readonly assigns here as well, as we might have
9992         been resolved only by MemberAccess.
9993
9994         (SimpleName.SimpleNameResolve): Also be useful for LValue
9995         resolution.   We need this to propagate assign to local readonly variables
9996
9997         * typemanager.cs: Use a ptrhashtable for the criteria, because we
9998         do not want to reuse potential criteria memory.
9999
10000         * class.cs (MyEventBuilder): Set reflected_type;
10001
10002         * ecore.cs (Constantify): Added support for constifying bools.
10003
10004         (RootContext.LookupType): Added a cache for values looked up in
10005         the declaration space.
10006
10007         * typemanager.cs (FindMembers): Now is a front-end to
10008         RealFindMembers, and provides a two-level hashtable-based cache to
10009         the request.  
10010
10011         15% performance improvement: from 22.5 to 19.2 seconds.
10012
10013         * expression.cs (IsParamsMethodApplicable): use foreach.
10014         (Invocation.DoResolve): ditto.
10015         (New.DoResolve): ditto.
10016         (ArrayCreation.DoResolve): ditto.
10017
10018         * ecore.cs (FindMostEncompassingType): use foreach.
10019
10020         * delegate.cs (NewDelegate.DoResolve): Use foreach
10021
10022         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
10023         (RemoveMethods): use foreach.
10024
10025         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
10026         nested foreach statements instead of for, and also break out of
10027         the inner loop once a match is found.
10028
10029         (Invocation.OverloadResolve): Use foreach, simplify the code. 
10030
10031 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
10032
10033         * cfold.cs (BinaryFold): During an enumeration evaluation context,
10034         we actually unwrap the expression to allow for extra information
10035         to be extracted. 
10036
10037         * expression.cs: Use Shr_Un on unsigned operations. 
10038
10039 2002-05-08  Ravi Pratap  <ravi@ximian.com>
10040
10041         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
10042         applicable operators was not being considered correctly. This closes
10043         the bug Miguel reported.
10044
10045 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
10046
10047         * attribute.cs: check that the type derives from System.Attribute
10048         and report the correct error in that case (moved the duplicate code to
10049         its own method, too).
10050
10051 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
10052
10053         * attribute.cs: lookup attribute type name as the spec says: first the
10054         bare attribute name and then name + "Attribute" (nant compiles with
10055         mcs after this fix).
10056
10057 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
10058
10059         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
10060         Because of the way we parse things, we should try to see if a
10061         UIntConstant can fit in an integer.
10062
10063 2002-05-07  Ravi Pratap  <ravi@ximian.com>
10064
10065         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
10066         when we are in an explicit context.
10067
10068         (ConvertReferenceExplicit): When converting from Iface type S to Class
10069         T make sure the rules are implemented as an OR.
10070
10071         * parameter.cs (ParameterType): Make it a property for now although the
10072         purpose really isn't anything immediate.
10073
10074         * expression.cs (Is*Applicable): Do better checking on the parameter type
10075         of a ref/out parameter. The ones from the system assemblies are already 
10076         marked with the correct type so we don't need to do any correction.
10077
10078         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
10079         the object type is standard too so include that.
10080
10081 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10082
10083         * ecore.cs (StandardConversionExists): Augment with missing code:
10084         deal with IntConstant, LongConstants and Enumerations.
10085
10086         * assign.cs: Report the error, instead of failing silently
10087
10088         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
10089         typecontainer that they are declared, because the
10090         typecontainer/namespace will have the list of using clauses that
10091         need to be applied.
10092
10093         Assembly Attributes were escaping the normal registration
10094         mechanism. 
10095
10096         (EmitCode): Apply attributes within an EmitContext that represents
10097         the container they were declared on.
10098
10099         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
10100
10101 2002-05-06  Ravi Pratap  <ravi@ximian.com>
10102
10103         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
10104         Revamp completely - make much cleaner as we now operate only
10105         on a set of Types.
10106
10107         (FindMostSpecificSource, FindMostSpecificTarget): New methods
10108         to implement the logic detailed in the spec more correctly.
10109
10110         (UserDefinedConversion): Update accordingly.
10111
10112 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10113
10114         * statement.cs: Return flow analysis information up.
10115
10116         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
10117         and the default.
10118
10119         (token): Do not consume an extra character before calling
10120         decimal_digits.
10121
10122 2002-05-06  Piers Haken <piersh@friskit.com>
10123
10124         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
10125
10126 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
10127
10128         * class.cs (Constructor.Emit): Set the IsStatic flag in the
10129         EmitContext during the instance constructor initializer
10130         resolution, to stop access to instance variables.
10131
10132         This is mandated by the spec, last paragraph of the `constructor
10133         initializers' section. 
10134
10135 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
10136
10137         * cs-parser.jay, class.cs (Accessor): new class used to represent
10138         an accessor (get or set).  In the past we used `null' to represent
10139         a missing accessor.  But this is ambiguous because there was no
10140         way to tell in abstract indexers/properties if one of them was
10141         specified.
10142
10143         Now there is a way of addressing that.
10144
10145         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
10146         instead of FindMembers.
10147
10148         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
10149         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
10150
10151         * attribute.cs: Treat indexers and properties as the same in terms
10152         of applying attributes
10153
10154         * ecore.cs (FindMostEncompassedType): Use statically initialized
10155         EmptyExpressions()s like we do elsewhere to avoid creating useless
10156         objects (and we take this out of the tight loop).
10157
10158         (GetConversionOperators): Move the code to extract the actual
10159         operators to a separate routine to clean things up.
10160
10161 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
10162
10163         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
10164         events are always registered FieldBuilders.
10165
10166         * class.cs (FieldBase): New class shared by Fields 
10167
10168         * delegate.cs: If we are a toplevel delegate, use our full name.
10169         If we are a nested delegate, then only use our tail name.
10170
10171 2002-05-02  Ravi Pratap  <ravi@ximian.com>
10172
10173         * expression.cs (IsApplicable): Ensure that we add the "&" to
10174         ref/out types before comparing it with the type of the argument.
10175
10176         (IsParamsMethodApplicable): Ditto.
10177
10178         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
10179         silly me ;-)
10180
10181         * delegate.cs : Handle the case when we have more than one applicable
10182         method. Flag an error only when we finish checking all.
10183
10184 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
10185
10186         * expression.cs: Add support for boolean static initializers.
10187
10188 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
10189
10190         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
10191
10192         * parameter.cs (ComputeParameterTypes,
10193         ComputeAndDefineParameterTypes): Better error handling: now we
10194         clear the `types' cache if we fail during any of the type lookups.
10195         We also return the status code correctly to our caller
10196
10197         * delegate.cs: If we fail to define a delegate, abort the extra
10198         steps. 
10199
10200         * expression.cs (Binary.ResolveOperator): for
10201         operator==(object,object) and operator !=(object, object) we also
10202         have to verify that there is an implicit conversion from one to
10203         the other.
10204
10205         (ArrayAccess.DoResolve): Array Access can operate on
10206         non-variables. 
10207
10208 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
10209
10210         * assign.cs (CompoundAssign): A new class used as a "flag" that
10211         the assignment actually is happening as part of a compound
10212         assignment operator.
10213
10214         During compound assignment, a few new rules exist to enable things
10215         like:
10216
10217         byte b |= 1 + 2
10218
10219         From the spec:
10220
10221         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
10222         to the type of x) if y is implicitly convertible to the type of x,
10223         and the operator is a builtin operator and the return type of the
10224         operator is explicitly convertible to the type of x. 
10225
10226         * rootcontext.cs: Reset warning level to 2.  4 catches various
10227         "interesting" features in mcs, we must clean this up at some
10228         point, but currently am trying to kill other bugs ;-)
10229
10230         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
10231         in container classes as well.  
10232
10233         * expression.cs (Binary.ResolveOperator): Handle string case
10234         before anything else (as operator overloading does emit an error
10235         before doing anything else).
10236
10237         This code could go away when we move to a table driven model, but
10238         i could not come up with a good plan last night.
10239
10240 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
10241
10242         * typemanager.cs (CSharpName): reimplementation using regex.
10243         * class.cs: added null check for fields in Emit
10244         * rootcontext.cs: set warninglevel to 4
10245
10246 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
10247
10248         * typemanager.cs (CSharpName): reimplemented with Lupus
10249         suggestion.
10250
10251 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
10252
10253         * statement.cs (If): correclty implement Resolve, because we were
10254         not catching sem errors in there.  The same process is needed
10255         everywhere else. 
10256         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
10257
10258
10259         (Statement.Warning_DeadCodeFound): Factorize code.
10260         (While): Report dead code here too.
10261
10262         (Statement): Added Resolve virtual method to allow
10263         for resolution split from the emit code.
10264
10265 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10266
10267         * statement.cs (EmitBoolExpression): No longer try to resolve the
10268         expression here.    
10269         (MakeBoolean): New utility function that resolve, implicitly
10270         converts to boolean and tags the expression. 
10271
10272
10273         (If, Do): Implement dead code elimination.
10274         (While): Implement loop inversion
10275
10276         (Do, While, For, If): Resolve the expression prior to calling our
10277         code generation.
10278
10279 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
10280
10281         * class.cs:
10282           - added method Report28 (warning: program has more than one entry point)
10283           - added method IsEntryPoint, implements paragraph 10.1 of the spec
10284           - modified method Method.Define, the part at the end of the method
10285
10286         * rootcontext.cs: added static public Location EntryPointLocation;
10287           
10288         * ../errors/cs0028.cs : Add test case for the above warning.              
10289
10290         * typemanager.cs:
10291           - modified method CSharpName to allow arrays of primitive type to
10292             be printed nicely (e.g. instead of System.Int32[][] it now prints
10293             int[][])
10294           - added method CSharpSignature: returns the signature of a method
10295             in string format to be used in reporting errors, warnings, etc.
10296
10297         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
10298         with String.Empty.
10299
10300 2002-04-26  Ravi Pratap  <ravi@ximian.com>
10301
10302         * delegate.cs (Define): Fix extremely silly bug where I was
10303         setting the type of the 'object' parameter of the BeginInvoke
10304         method to System.IAsyncResult instead of System.Object ;-)
10305
10306 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
10307
10308         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
10309         here. 
10310
10311         (Constructor.Emit): return if we fail to initialize the
10312         constructor.  Another door closed!  
10313
10314         * expression.cs (New.DoResolve): Improve error message (from -6 to
10315         1501).  Use DeclaredOnly lookup to find the exact constructor.
10316
10317         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
10318         loop.  This is useful.
10319
10320         * cs-parser.jay: Adjust the default parameters so that destructors
10321         have the proper signature.
10322
10323 2002-04-26  Martin Baulig  <martin@gnome.org>
10324
10325         * driver.cs (LoadAssembly): If `assembly' contains any characters
10326         which are only valid in path names and not in assembly names
10327         (currently slash, backslash and point), use Assembly.LoadFrom ()
10328         instead of Assembly.Load () on the `assembly' (before iteration
10329         over the link_paths).
10330
10331 2002-04-26  Martin Baulig  <martin@gnome.org>
10332
10333         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
10334
10335 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
10336
10337         * class.cs (Property): use the new typemanager.MemberLookup
10338
10339         (TypeContainer.MemberLookup): Implement using the
10340         TypeManager.MemberLookup now. 
10341
10342         * typemanager.cs: Make MemberLookup a function of the TypeManager,
10343         and return MemberInfos, so that these can be used without an
10344         EmitContext (what we had before).
10345
10346 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
10347
10348         * expression.cs: Fix the case where the argument to params if the
10349         type of the params.  I omitted handling this before.   Fixed
10350
10351 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10352
10353         * driver.cs: Call BootCorlib_PopulateCoreType
10354
10355         * class.cs (Property.CheckBase): Check for properties only, not
10356         for all members. 
10357
10358         * interface.cs: Temporary hack: try/catch around the
10359         CustomAttributeBuilder, because I am getting an exception that I
10360         do not understand.
10361
10362         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
10363         types whose definitions are required to be there (attributes are
10364         defined before standard types).
10365
10366         Compute definitions as we boot the various types, as they are used
10367         immediately (value_type class will need object_type, but if we do
10368         not initialize object_type, we will pass a null, which will let
10369         the runtime pick the System.Object from the existing corlib, which
10370         is not what we want).
10371
10372 2002-04-22  Patrik Torstensson <totte@labs2.com>
10373
10374         * cs-tokenizer.cs: fixed a number of trim() issues.
10375
10376 2002-04-22  Ravi Pratap  <ravi@ximian.com>
10377
10378         * expression.cs (Argument.Type): Ensure that we return the correct
10379         type when we have out or ref parameters [in which case we 
10380         append a "&"].
10381
10382 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
10383
10384         * class.cs (Property, Indexer): Allow extern modifier in there. 
10385
10386         * typemanager.cs (InitBaseTypes): Initializes object_type and
10387         value_type, since those will be used early on during the bootstrap
10388         process to compile corlib.
10389
10390         (InitCoreTypes): Move code from here to InitBaseTypes.
10391
10392 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
10393
10394         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
10395         single-dimension arrays as using the ldlen opcode.  
10396
10397         Daniel Lewis discovered this optimization.  
10398
10399         * typemanager.cs: Add signature for System.Array::get_Length
10400
10401 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10402
10403         * statement.cs: report the error when the foreach does not apply to an
10404         array nor a collection.
10405
10406 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
10407
10408         * expression.cs: Add implicit conversions to the operator ~.
10409
10410         * constant.cs (DecimalConstant.Emit): Emit decimal value.
10411
10412         * typemanager.cs: Locate the decimal constructor.
10413
10414 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10415
10416         * attribute.cs: use the new property of TypeOf.
10417         * expression.cs: added 'get' property around typearg.
10418
10419         These changes fix a build breaker reported by NickD. Is this the
10420         correct way to fix?  If not, please, revert my changes and make it
10421         work :-).
10422
10423 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
10424
10425         * attribute.cs: Add support for typeof in attribute invocations.
10426         I am not sure that this is right though.
10427
10428 2002-04-14  Duncan Mak  <duncan@ximian.com>
10429
10430         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
10431         Binary.Operator.Division case.
10432
10433 2002-04-13  Ravi Pratap  <ravi@ximian.com>
10434
10435         * class.cs (DefineType): Ensure that we do a proper check on
10436         attribute types and also register it with the TypeManager.
10437
10438         (TypeContainer.Targets): The default for attribute types is
10439         AttributeTargets.All.
10440
10441         * attribute.cs (ApplyAttributes): Registering the attribute type
10442         is done elsewhere, not when we discover we have a Usage attribute.
10443
10444 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10445
10446         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
10447         and get rid of is_delegate parameter.
10448
10449         * everywhere : update.
10450
10451 2002-04-12  Ravi Pratap  <ravi@ximian.com>
10452
10453         * cs-parser.jay (compilation_unit): Revamp completely to use
10454         some new ideas that I got from Rhys' grammar to solve the problems
10455         with assembly level attributes.
10456
10457         (outer_declaration): New grammar production.
10458
10459         (attribute_sections): Add.
10460
10461         (opt_attributes): Base on attribute_sections
10462
10463         (namespace_declaration): Allow opt_attributes to tackle the case
10464         when we have assembly level attributes - we are clever in this
10465         regard now ;-)
10466
10467         * attribute.cs (ApplyAttributes): Do not worry about assembly 
10468         attributes in the non-global context.
10469
10470         * rootcontext.cs (AddGlobalAttributes): Go back to using this
10471         instead of SetGlobalAttributes.
10472
10473         * class.cs, rootcontext.cs : Ensure we define and generate 
10474         attribute types before anything else.
10475
10476         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
10477         and flag the new error -20 for the case when the attribute type
10478         does not have valid targets specified. csc does not catch this.
10479
10480         * ../errors/errors.txt : update for error # -20
10481
10482 2002-04-11  Ravi Pratap  <ravi@ximian.com>
10483
10484         * support.cs (InternalParameters.ParameterModifier): Do some null
10485         checking and return sane values.
10486
10487         * class.cs (Method.Define): If we are a PInvoke method, ensure
10488         that we are static and extern. Report error # 601
10489
10490         * ../errors/cs0601.cs : Add test case for the above error.
10491
10492 2002-04-07  Ravi Pratap  <ravi@ximian.com>
10493
10494         * rootcontext.cs (attribute_types): We need to keep type of
10495         all attribute types separately and emit code for them first.
10496
10497         (RegisterAttribute) : Implement.
10498
10499         * class.cs (DefineType): Check if the current Type is a custom
10500         attribute type and register it accordingly.
10501
10502         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
10503         adding the first attribute twice and rename to
10504
10505         (SetGlobalAttributes): this.
10506
10507         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
10508         lookups.
10509
10510         * attribute.cs (ApplyAttributes): Take an additional argument telling us
10511         if we are processing global arguments. Hmm, I am unsure of this.
10512
10513 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10514
10515         * expression.cs: added static array of strings to avoid calling
10516         Enum.ToString () for Operator in Binary. Significant recover of
10517         performance.
10518
10519 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
10520
10521         * class.cs (FindMembers): Allow the Builders of the various
10522         members to be null.  If they are skip them.  This only happens
10523         during the PInvoke declaration.
10524
10525 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
10526
10527         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
10528         failure, so we do not keep going afterwards.
10529
10530         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
10531         wanted to pass `false' as the `is_delegate' argument.  If this is
10532         the case, why not use delegate_type == null to mean `is_delegate =
10533         false' and anything else as is_delegate = true.
10534
10535 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
10536
10537         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
10538         code for the section, not the beginning of the tests.
10539
10540 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
10541
10542         * cfold.cs: Handle operator + (Enum x, Underlying x) 
10543
10544         * expression.cs (Binary): same.  Warn about errors where we have
10545         Enum/Enum in operator + as well.
10546
10547 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
10548
10549         * statement.cs:
10550                 - added support for switch(bool)
10551                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
10552                 - add TableSwitchEmit() to handle table-based switch statements
10553
10554 2002-04-05  Ravi Pratap  <ravi@ximian.com>
10555
10556         * expression.cs (Invocation.OverloadResolve): Factor out code which
10557         does parameter compatibility checking with arguments so that we can 
10558         re-use the code even from Delegate.VerifyApplicability
10559
10560         (VerifyArgumentsCompat): Move above code here.
10561
10562         * delegate.cs (VerifyApplicability): Get rid of duplicate code
10563         and instead make a call to the above method.
10564
10565 2002-03-31  Ravi Pratap  <ravi@ximian.com>
10566
10567         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
10568         We use it to keep track of classes which are attribute types.
10569
10570 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
10571
10572         * delegate.cs (Delegate.Define): Correctly define the types in the
10573         presence of fixed and array parameters.
10574
10575         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
10576         doing FindMembers.
10577
10578         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
10579         include NonPublic after the first iteration.
10580
10581         * class.cs (Indexer.CheckBase): Only check if both parents are
10582         non-null. 
10583
10584         * cs-parser.jay (accessor_body): If empty, set to null.
10585
10586         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
10587         same code path here to resolve constants names that we did have in
10588         MemberAccess.DoResolve.  There is too much code duplicated here.
10589
10590 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
10591
10592         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
10593
10594         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
10595         to MakeUnionSet.
10596
10597         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
10598         tokens, numbers and strings.
10599
10600         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
10601         parenthesis.
10602
10603         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
10604         asyncronous parameters and the regular parameters.  
10605
10606         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
10607         specify the target directory.
10608
10609         * expression.cs: (This.DoResolve): Simplify
10610         (As.Emit): Optimize, do not generate IsInst if the expression is
10611         always of the given type.
10612
10613         (Is.DoResolve): Bug fix, we were reporting both always/never for
10614         the is expression.
10615
10616         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
10617         creating too many unnecessary arrays.
10618
10619 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
10620
10621         * class.cs (EmitFieldInitializer): Use Assign expression to assign
10622         fields instead of rolling our own initializer.   Takes care of all
10623         implicit conversions, and drops unnecessary static checks/argument.
10624
10625 2002-03-31  Dick Porter  <dick@ximian.com>
10626
10627         * driver.cs: use the GetDirectories() return values properly, and
10628         use "/" as path separator.
10629
10630 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
10631
10632         * expression.cs (Unary): Optimize - - expr into expr.
10633         (Binary): Optimize a + (-b) into a -b.
10634
10635         * codegen.cs (CodeGen): Made all methods static.
10636
10637 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
10638
10639         * rootcontext.cs: 
10640
10641         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
10642         TypeBuilder property.
10643
10644         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
10645         instead. 
10646
10647         * tree.cs: Removed the various RecordXXXX, and replaced with a
10648         single RecordDecl.  Removed all the accessor methods, and just
10649         left a single access point Type 
10650
10651         * enum.cs: Rename DefineEnum to DefineType.
10652
10653         * decl.cs: New abstract method `DefineType' used to unify the
10654         Defines for Enumerations, Interfaces, TypeContainers and
10655         Delegates.
10656
10657         (FindType): Moved LookupInterfaceOrClass here.  Moved the
10658         LookupBaseClasses method that used to live in class.cs and
10659         interface.cs here, and renamed to FindType.
10660
10661         * delegate.cs: Implement DefineType.  Take advantage of the
10662         refactored pattern for locating the parent builder without taking
10663         the parent_builder argument (which we know does not work if we are
10664         nested, and triggering a toplevel definition).
10665
10666 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10667
10668         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
10669         accessibility of a member has changed during override and report
10670         an error if so.
10671
10672         * class.cs (Method.Define, Property.Define): Only complain on
10673         overrides if the method is private, any other accessibility is
10674         fine (and since we just checked the permission is the same, we are
10675         good to go).
10676
10677         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
10678         and elif are processed always.  The other pre-processing
10679         directives are only processed if we are "taking" the path
10680
10681 2002-03-29  Martin Baulig  <martin@gnome.org>
10682
10683         * class.cs (Method.Emit): Only emit symbolic debugging info if the
10684         current location is not Null.
10685
10686         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
10687         a separate method so we can profile it.
10688
10689         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
10690         `span.Seconds' are just seconds, but no minutes or hours.
10691         (MainDriver): Profile the CodeGen.SaveSymbols calls.
10692
10693 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10694
10695         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
10696         Remove the gratuitous set of Final:
10697
10698                                 // If an interface implementation, then we can set Final.
10699                                 if (((flags & MethodAttributes.Abstract) == 0) &&
10700                                     implementing.DeclaringType.IsInterface)
10701                                         flags |= MethodAttributes.Final;
10702
10703         I do not know what I was smoking when I used that.
10704
10705
10706         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
10707         step into fixing the name resolution issues for delegates and
10708         unifying the toplevel name resolution.
10709
10710 2002-03-28  Martin Baulig  <martin@gnome.org>
10711
10712         * class.cs (Method.Emit): If we have a symbol writer, call its
10713         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
10714         tell it about the current method.
10715
10716         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
10717         writer that we're going to emit the first byte of IL code for a new
10718         statement (a new source line).
10719         (EmitContext.EmitTopBlock): If we have a symbol writer, call
10720         EmitContext.Mark() before emitting any code.
10721
10722         * location.cs (SymbolDocument): Return null when we're Null.
10723
10724         * statement.cs (Statement): Moved the `Location loc' variable here.
10725         (Statement.EmitBoolExpression): If we have a symbol writer, call
10726         ec.Mark() before emitting any code to tell it that we're at the
10727         beginning of a new statement.
10728         (StatementExpression): Added `Location' argument to the constructor.
10729         (Block): Added public readonly variable `StartLocation' and public
10730         variable `EndLocation'.  The latter is to be set using SetEndLocation().
10731         (Block): Added constructor which takes a start and end location.
10732         (Block.SetEndLocation): New method. This sets the end location.
10733         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
10734         local variables we create.
10735         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
10736         each statement and do also mark the begin and end of the block.
10737
10738         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
10739         tell it the current lexer.Location, use Location.Null for the end of the
10740         block.
10741         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
10742         current block, set its end location using SetEndLocation().
10743         (statement_expression): StatementExpression constructor now takes the
10744         lexer.Location as additional argument.
10745         (for_statement, declare_local_variables): Likewise.
10746         (declare_local_variables): When creating a new implicit block, use the
10747         new Block constructor and pass it the lexer.Location.
10748
10749 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
10750
10751         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
10752         members also on the parent interfaces recursively.
10753
10754 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
10755
10756         * report.cs: Use new formats, since Gonzalo finished the missing
10757         bits. 
10758
10759         * expression.cs (Binary.ResolveOperator): added missing operator|
10760         operator& and operator^ for bool/bool.
10761
10762         * cs-parser.jay: CheckDef now takes a Location argument that is
10763         used to report errors more precisly (instead of reporting the end
10764         of a definition, we try to track something which is a lot closer
10765         to the source of the problem).
10766
10767         * cs-tokenizer.cs: Track global token use, so we can properly flag
10768         the use of #define/#undef after the first token has been seen.
10769
10770         Also, rename the reportXXXX to Error_DescriptiveName
10771
10772         * decl.cs (DeclSpace.IsTopLevel): Move property here from
10773         TypeContainer, so that Enum and Interface can use this too.
10774
10775         * class.cs (TypeContainer.LookupInterfaceOrClass,
10776         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
10777         `builder' argument.  Typically this was used to pass the parent
10778         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
10779         the definition).  
10780
10781         The problem is that a nested class could trigger the definition of
10782         a toplevel class, and the builder would be obviously wrong in that
10783         case. 
10784
10785         So we drop this argument, and we compute dynamically the
10786         TypeBuilder/ModuleBuilder (the correct information was available
10787         to us anyways from DeclSpace.Parent)
10788
10789         * interface.cs (Interface.DefineInterface): Drop builder
10790         parameter cleanup like class.cs
10791
10792         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
10793         like class.cs
10794
10795         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
10796         values. 
10797
10798         (Try.Emit): Propagate the returns value from the statement.
10799
10800         (Return.Emit): Even if we are leavning 
10801
10802         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
10803
10804         * modifiers.cs: Fix the computation of MethodAttributes flags.
10805
10806 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
10807
10808         * driver.cs: allow compilation of files that start with '/'.
10809         Add a default case when checking the argument of --target.
10810
10811 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
10812
10813         * interface.cs: Implement the same search algorithm for types in
10814         the interface code.
10815
10816         * delegate.cs: Do not allow multiple definition.
10817
10818         * Recovered ChangeLog that got accidentally amputated
10819
10820         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
10821
10822         * rootcontext.cs: Load manually enum to allow core classes to
10823         contain enumerations.
10824
10825         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
10826         Update to new static methods in TypeManager.
10827
10828         * typemanager.cs (GetMethod, GetConstructor): Use our
10829         implementation of FindMembers to find the members, since during
10830         corlib compilation, the types are TypeBuilders and GetMethod and
10831         GetConstructor do not work.
10832
10833         Make all methods in TypeManager static.
10834
10835         (InitCodeHelpers): Split the functionality from
10836         the InitCodeTypes function.
10837
10838         * driver.cs: Call InitCodeHelpers after we have populated the
10839         types. 
10840
10841         * cs-parser.jay (delegate_declaration): we did not used to compute
10842         the delegate name correctly for void delegates.
10843
10844 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
10845
10846         * rootcontext.cs (RootContext): Init the interface_resolve_order
10847         and type_container_resolve_order always.
10848
10849         (ResolveCore, BootstrapCorlib_ResolveClass,
10850         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
10851         compiler when compiling with --nostdlib
10852
10853         * class.cs (TypeContainer.DefineType): Check that our parent is
10854         not null.  This test is most important when we are bootstraping
10855         the core types.
10856
10857         * codegen.cs: Split out the symbol writing code.
10858
10859 2002-03-25  Martin Baulig  <martin@gnome.org>
10860
10861         * driver.cs (-g): Made -g an alias for --debug.
10862
10863 2002-03-24  Martin Baulig  <martin@gnome.org>
10864
10865         * codegen.cs (SymbolWriter): New public variable. Returns the
10866         current symbol writer.
10867         (CodeGen): Added `bool want_debugging_support' argument to the
10868          constructor. If true, tell the ModuleBuild that we want debugging
10869         support and ask it for the ISymbolWriter.
10870         (Save): If we have a symbol writer, call it's Close() method after
10871         saving the assembly.
10872
10873         * driver.c (--debug): New command line argument to create a
10874         debugger information file.
10875
10876         * location.cs (SymbolDocument): New public property. Returns an
10877         ISymbolDocumentWriter object for the current source file or null
10878         if we don't have a symbol writer.
10879
10880 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
10881
10882         * driver.cs (LoadAssembly): Correctly return when all the paths
10883         have been tried and not before.
10884
10885         * statement.cs (Switch.Emit): return the actual coverage for this
10886         statement (returns/not-returns)
10887
10888         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
10889         switch of the statement if we are the last switch section.  That
10890         kills two problems: try/catch problems (we used to emit an empty
10891         nop at the end) and switch statements where all branches would
10892         return. 
10893
10894 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
10895
10896         * driver.cs: Add default assemblies (the equivalent to the
10897         Microsoft CSC.RSP file)
10898
10899         * cs-tokenizer.cs: When updating `cols and setting it to zero,
10900         also update tokens_seen and set it to false.
10901
10902         * driver.cs: Implement --recurse for Mike.
10903
10904         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
10905         correctly splitting out the paths.
10906
10907 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
10908
10909         * interface.cs (Interface.PopulateProperty): Instead of using
10910         `parent' as the declaration space for the set parameters, use
10911         `this' 
10912
10913         * support.cs (InternalParameters): InternalParameters constructor
10914         takes a DeclSpace instead of a TypeContainer.
10915
10916         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
10917         types are being initialized, load the address of it before calling
10918         the function.  
10919
10920         (New): Provide a mechanism to disable the generation of local
10921         value type temporaries when the caller will be providing us with
10922         an address to store it.
10923
10924         (ArrayCreation.EmitDynamicInitializers): Use it.
10925
10926 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
10927
10928         * expression.cs (Invocation.EmitArguments): Only probe for array
10929         property if there is more than one argument.  Sorry about that.
10930
10931         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
10932         empty param arrays.
10933
10934         * class.cs (Method.LabelParameters): Fix incorrect code path that
10935         prevented the `ParamArrayAttribute' from being applied to the
10936         params attribute.
10937
10938 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
10939
10940         * support.cs (ReflectionParameters): Correctly compute whether the
10941         last argument is a params array.  Fixes the problem with
10942         string.Split ('a')
10943
10944         * typemanager.cs: Make the assemblies array always be non-null
10945         (empty, but non-null)
10946
10947         * tree.cs (RecordDecl): New function that abstracts the recording
10948         of names.  This reports error 101, and provides a pointer to the
10949         previous declaration.  Fixes a crash in the compiler.
10950
10951         * cs-parser.jay (constructor_declaration): Update to new grammar,
10952         and provide a constructor_body that can be empty.
10953
10954 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
10955
10956         * driver.cs: Add support for --resources.
10957
10958         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
10959         Make all types for the various array helper methods be integer.
10960
10961         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
10962         CheckState to ConvCast.
10963
10964         (ConvCast): Now it takes a `checked' state argument, to avoid
10965         depending on the emit context for the conversion, and just using
10966         the resolve time setting.
10967
10968         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
10969         instead of Invocation.EmitArguments.  We do not emit the original
10970         arguments, instead we emit those which have been converted to
10971         unsigned int expressions.
10972
10973         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
10974
10975         * codegen.cs: ditto.
10976
10977         * expression.cs (LocalVariableReference): Drop the use of the
10978         Store function that depended on the variable index.
10979
10980         * statement.cs (VariableInfo): Drop the `Idx' property from this
10981         class, as this is not taking into account the indexes for
10982         temporaries tat we generate during the execution, getting the
10983         indexes wrong.
10984
10985         * class.cs: First emit class initializers, then call the parent
10986         constructor. 
10987
10988         * expression.cs (Binary): Fix opcode emision.
10989         (UnaryMutator.EmitCode): Support checked code generation
10990
10991         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
10992         matches for events for both the Static and Instance scans,
10993         pointing to the same element.   Fix that.
10994
10995 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
10996
10997         * rootcontext.cs (ResolveTree): Always set the
10998         interface_resolve_order, because nested interfaces will be calling
10999         into us.
11000
11001         * class.cs (GetInterfaceOrClass): Track the same resolution
11002         process used by TypeManager.LookupType.  This fixes the nested
11003         type lookups in class declarations (separate path from
11004         LookupType). 
11005
11006         (TypeContainer.DefineType): Also define nested interfaces.
11007         (TypeContainer.RegisterOrder): New public function used to
11008         register the order in which child interfaces need to be closed.
11009
11010         Nested interfaces need to be closed after their parents have been
11011         created. 
11012
11013         * interface.cs (InterfaceAttr): Put all the logic for computing
11014         the interface attribute here. 
11015
11016         (DefineInterface): Register our interface order with the
11017         RootContext or with the TypeContainer depending on the case.
11018
11019 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11020
11021         * cs-parser.jay: rework foreach statement to work with the new
11022         changes to the policy on SimpleNames.
11023
11024         * report.cs: support Stacktrace on warnings as well.
11025
11026         * makefile: drop --unsafe and /unsafe from the compile.
11027
11028 2002-03-13  Ravi Pratap  <ravi@ximian.com>
11029
11030         * ecore.cs (StandardConversionExists): Modify to take an Expression
11031         as the first parameter. Ensure we do null -> reference type conversion
11032         checking.
11033
11034         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
11035         temporary Expression objects.
11036
11037 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
11038
11039         * interface.cs: workaround bug in method overloading resolution
11040         (there is already a bugzilla bug for it).
11041
11042 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
11043
11044         We could also solve this problem by having a separate path for
11045         performing type lookups, instead of DoResolve, we could have a
11046         ResolveType entry point, and only participating pieces of the
11047         production (simplename, deref, array) would implement this. 
11048
11049         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
11050         signal SimpleName to only resolve type names and not attempt to
11051         resolve anything else.
11052
11053         * expression.cs (Cast): Set the flag.
11054
11055         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
11056
11057         * class.cs: Only report 108 if there is no `new' modifier.
11058
11059         * cs-parser.jay: rework foreach statement to work with the new
11060         changes to the policy on SimpleNames.
11061
11062         * report.cs: support Stacktrace on warnings as well.
11063
11064         * makefile: drop --unsafe and /unsafe from the compile.
11065
11066 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
11067
11068         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11069         lookups here, instead of doing that at parse time.  This means
11070         that our grammar will not introduce `LocalVariableReferences' as
11071         expressions at this point.  That solves the problem of code like
11072         this:
11073
11074         class X {
11075            static void Main ()
11076            { int X = 1;
11077             { X x = null }}}
11078
11079         This is only half the fix.  The full fix requires parameters to
11080         also be handled in this way.
11081
11082         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
11083         makes the use more obvious of the DeclSpace.  The
11084         ec.TypeContainer.TypeBuilder is now only used to pull the
11085         TypeBuilder for it.
11086
11087         My theory is that I can get rid of the TypeBuilder completely from
11088         the EmitContext, and have typecasts where it is used (from
11089         DeclSpace to where it matters).  
11090
11091         The only pending problem is that the code that implements Aliases
11092         is on TypeContainer, and probably should go in DeclSpace.
11093
11094         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
11095         lookups here, instead of doing that at parse time.  This means
11096         that our grammar will not introduce `LocalVariableReferences' as
11097         expressions at this point.  That solves the problem of code like
11098         this:
11099
11100         class X {
11101            static void Main ()
11102            { int X = 1;
11103             { X x = null }}}
11104
11105         This is only half the fix.  The full fix requires parameters to
11106         also be handled in this way.
11107
11108         * class.cs (Property.DefineMethod): When implementing an interface
11109         method, set newslot, when implementing an abstract method, do not
11110         set the flag (before we tried never setting it, or always setting
11111         it, which is the difference).
11112         (Indexer.DefineMethod): same.
11113         (Method.DefineMethod): same.
11114
11115         * ecore.cs: Only set the status used flag if we get back a Field.
11116
11117         * attribute.cs: Temporary hack, so Paolo can keep working.
11118
11119 2002-03-08  Ravi Pratap  <ravi@ximian.com>
11120
11121         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
11122         the unmanaged type in the case we have a MarshalAs attribute.
11123
11124         (Resolve): Handle the case when we are parsing the special MarshalAs
11125         attribute [we need to store the unmanaged type to use later]
11126
11127         * typemanager.cs (marshal_as_attr_type): Built in type for the 
11128         MarshalAs Attribute.
11129
11130         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
11131         on parameters and accordingly set the marshalling info.
11132
11133 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
11134
11135         * class.cs: Optimizing slightly by removing redundant code after
11136         we switched to the `NoTypes' return value.
11137         (Property.DefineMethod): use NoTypes here too.
11138
11139         This fixes the bug I introduced in my last batch of changes.
11140
11141 2002-03-05  Ravi Pratap  <ravi@ximian.com>
11142
11143         * tree.cs (RecordEnum): Add. We now keep track of enums too.
11144
11145         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
11146         Enums since those are types too. 
11147
11148         * cs-parser.jay (enum_declaration): Record enums as we parse them.
11149
11150         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
11151         thanks to a call during the lookup process.
11152
11153 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
11154
11155         * statement.cs (Foreach): Lots of work to accomodate a particular
11156         kind of foreach statement that I had not kept in mind.  It is
11157         possible to have foreachs on classes that provide a GetEnumerator
11158         method that return objects that implement the "pattern" for using
11159         a foreach, there is no need to support GetEnumerator
11160         specifically. 
11161
11162         This is needed to compile nant.
11163
11164         * decl.cs: Only report 114 if the member is not `Finalize' and if
11165         the warning level is at least 2.
11166
11167         * class.cs: Moved the compare function from Method to
11168         MethodSignature. 
11169
11170         (MethodSignature.InheritableMemberSignatureCompare): Add new
11171         filter function that is used to extract inheritable methods from a
11172         class. 
11173
11174         (Method.Define): Use the new `inheritable_method_signature_filter'
11175         delegate
11176
11177         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
11178         command. 
11179
11180 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
11181
11182         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
11183
11184         * cs-parser.jay: Add opt_semicolon to the interface declaration.
11185
11186         * expression.cs: Pass location information to
11187         ConvertImplicitStandard. 
11188
11189         * class.cs: Added debugging code to track return values from
11190         interfaces. 
11191
11192 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
11193
11194         * expression.cs (Is.DoResolve): If either side of the `is' is an
11195         interface, do not flag the warning.
11196
11197         * ecore.cs (ImplicitReferenceConversion): We need a separate test
11198         for interfaces
11199
11200         * report.cs: Allow for --fatal to be used with --probe.
11201
11202         * typemanager.cs (NoTypes): Move the definition for the empty Type
11203         array here. 
11204
11205         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
11206         properties. 
11207         (TypeContainer.DefineProxy): New function used to proxy to parent
11208         implementations when implementing interfaces.
11209         (TypeContainer.ParentImplements): used to lookup if our parent
11210         implements a public function that is required by an interface.
11211         (TypeContainer.VerifyPendingMethods): Hook this up.
11212
11213         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
11214         `modules' and `assemblies' arraylists into arrays.  We only grow
11215         these are the very early start up of the program, so this improves
11216         the speedof LookupType (nicely measured).
11217
11218         * expression.cs (MakeByteBlob): Replaced unsafe code with
11219         BitConverter, as suggested by Paolo.
11220
11221         * cfold.cs (ConstantFold.Binary): Special case: perform constant
11222         folding of string concatenation, but if either side is a string,
11223         and the other is not, then return null, and let the runtime use
11224         the concatenation on the string plus the object (using
11225         `Object.ToString'). 
11226
11227 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
11228
11229         Constant Folding has been implemented now.
11230
11231         * expression.cs (Unary.Reduce): Do not throw an exception, catch
11232         the error instead on types that are not supported in one's
11233         complement. 
11234
11235         * constant.cs (Constant and all children): New set of functions to
11236         perform implict and explicit conversions.
11237
11238         * ecore.cs (EnumConstant): Implement the new functions to perform
11239         conversion by proxying to the child expression.
11240
11241         * codegen.cs: (ConstantCheckState): Constant evaluation has its
11242         own separate setting that can not be turned off from the command
11243         line using --unchecked or --checked and is only controlled using
11244         the checked/unchecked statements and expressions.  This setting is
11245         used by the constant folder to flag errors.
11246
11247         * expression.cs (CheckedExpr, UncheckedExpr): Set the
11248         ConstantCheckState as well.   
11249
11250         During Resolve, they also have to flag the state, because the
11251         constant folder runs completely in the Resolve phase.
11252
11253         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
11254         well.
11255
11256 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11257
11258         * cfold.cs: New file, this file contains the constant folder.
11259
11260         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
11261         argument to track whether we are using the resulting address to
11262         load or store a value and provide better error messages. 
11263
11264         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
11265         new AddressOf arguments.
11266
11267         * statement.cs (Foreach.EmitCollectionForeach): Update
11268
11269         * expression.cs (Argument.Emit): Call AddressOf with proper
11270         arguments to track usage.
11271
11272         (New.DoEmit): Call AddressOf with new arguments.
11273
11274         (Unary.Emit): Adjust AddressOf call.
11275
11276 2002-03-01  Ravi Pratap  <ravi@ximian.com>
11277
11278         * cs-parser.jay (member_access): Change the case for pre-defined types
11279         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
11280         this suggestion.
11281
11282         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
11283         a method body.
11284
11285         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
11286         essentially like methods and apply attributes like MethodImplOptions to them too.
11287
11288         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
11289         not being null.
11290
11291         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
11292         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
11293         is the DeclSpace.
11294
11295         * Update code everywhere accordingly.
11296
11297         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
11298
11299         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
11300
11301 2002-02-28  Ravi Pratap  <ravi@ximian.com>
11302
11303         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
11304         try performing lookups against those instead of jumping straight into using
11305         the 'using' clauses.
11306
11307         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
11308
11309         (LookupType): Perform lookups in implicit parents too.
11310
11311         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
11312         sequence as RootContext.LookupType. 
11313
11314         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
11315         the various cases of namespace lookups into this method.
11316
11317 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
11318
11319         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
11320         in positional arguments)
11321
11322         * class.cs (Operator): Update the AllowedModifiers to contain
11323         extern. 
11324
11325         * cs-parser.jay: Update operator declaration to allow for the
11326         operator body to be empty.
11327
11328         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
11329         values. 
11330
11331 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
11332
11333         * class.cs (Method.Emit): Label parameters.
11334
11335         * driver.cs: Return 1 or 0 as the program exit code.
11336
11337 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
11338
11339         * expression.cs: Special case the `null' object when trying to
11340         auto-compute the type, as anything can be explicitly converted to
11341         that. 
11342
11343         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
11344         spotting this Paolo.
11345
11346         (Expression.ImplicitNumericConversion): Perform comparissions of
11347         the type using the underlying type in the case of an enumeration
11348         rather than using the enumeration type for the compare.
11349
11350         Cope with the underlying == type case, which is not possible to
11351         catch before. 
11352
11353         (Expression.ConvertNumericExplicit): Perform comparissions of
11354         the type using the underlying type in the case of an enumeration
11355         rather than using the enumeration type for the compare.
11356
11357         * driver.cs: If the user does not supply an extension, assume .exe
11358
11359         * cs-parser.jay (if_statement): Rewrote so that we can track the
11360         location for the if statement.
11361
11362         * expression.cs (Binary.ConstantFold): Only concat strings when
11363         the operation is "+", not everything ;-)
11364
11365         * statement.cs (Statement.EmitBoolExpression): Take a location
11366         argument. 
11367         (If, While, Do): Track location.
11368
11369         * expression.cs (Binary.ResolveOperator): In the object + string
11370         case, I was missing a call to ConvertImplicit
11371
11372 2002-02-25  Ravi Pratap  <ravi@ximian.com>
11373
11374         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
11375         Location arguments. Ensure we use RootContext.LookupType to do our work
11376         and not try to do a direct Type.GetType and ModuleBuilder.GetType
11377
11378         * interface.cs (PopulateMethod): Handle the type of the parameter being
11379         null gracefully.
11380
11381         * expression.cs (Invocation.BetterFunction): Handle the case when we 
11382         have a params method with no fixed arguments and a call is made with no
11383         arguments.
11384
11385 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
11386
11387         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
11388         the verbatim-string-literal
11389
11390         * support.cs (InternalParameters.ParameterModifier): handle null
11391         fixed parameters.
11392         (InternalParameters.ParameterType): ditto.
11393
11394         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
11395         duplicating the name of the variable parameter.
11396         (GetParameterByName): Fix bug where we were not looking up array
11397         paramters if they were the only present (thanks Paolo!).
11398         (GetParameterInfo): We only have an empty set of types if both
11399         fixed and array are set to null.
11400         (GetParameterInfo-idx): Handle FixedParameter == null
11401
11402         * cs-parser.jay: Handle the case where there is no catch
11403         statements (missing null test).
11404
11405 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
11406
11407         * driver.cs (MainDriver): Be conservative on our command line
11408         handling.
11409
11410         Catch DirectoryNotFoundException when calling GetFiles.
11411
11412         (SplitPathAndPattern): Used to split the input specification into
11413         a path and a pattern that we can feed to Directory.GetFiles.
11414
11415 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
11416
11417         * statement.cs (Fixed): Implement the last case of the Fixed
11418         statement (string handling).
11419
11420         * expression.cs (StringPtr): New class used to return a char * to
11421         a string;  Used by the Fixed statement.
11422
11423         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
11424
11425         * expression.cs (Binary.ResolveOperator): Remove redundant
11426         MemberLookup pn parent type.
11427         Optimize union call, we do not need a union if the types are the same.
11428         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
11429         type.
11430
11431         Specialize the use of MemberLookup everywhere, instead of using
11432         the default settings. 
11433
11434         (StackAlloc): Implement stackalloc keyword.
11435
11436         * cs-parser.jay: Add rule to parse stackalloc.
11437
11438         * driver.cs: Handle /h, /help, /?
11439
11440         * expression.cs (MakeByteBlob): Removed the hacks we had in place
11441         before we supported unsafe code.
11442
11443         * makefile: add --unsafe to the self compilation of mcs.
11444
11445 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
11446
11447         * expression.cs (PointerArithmetic): New class that is used to
11448         perform pointer arithmetic.
11449         (Binary.Resolve): Handle pointer arithmetic
11450         Handle pointer comparission.
11451         (ArrayPtr): Utility expression class that is used to take the
11452         address of an array.
11453
11454         (ElementAccess): Implement array access for pointers
11455
11456         * statement.cs (Fixed): Implement fixed statement for arrays, we
11457         are missing one more case before we are done.
11458
11459         * expression.cs (Indirection): Implement EmitAssign and set the
11460         ExprClass to Variable.  This allows pointer dereferences to be
11461         treated as variables, and to have values assigned to them.
11462
11463         * ecore.cs (Expression.StoreFromPtr): New utility function to
11464         store values dereferencing.
11465
11466 2002-02-20  Ravi Pratap  <ravi@ximian.com>
11467
11468         * expression.cs (Binary.ResolveOperator): Ensure that we are
11469         not trying to operate on a void type - this fixes the reported
11470         bug.
11471
11472         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
11473         the parent implementation is sealed.
11474
11475         * ../errors/cs0239.cs : Add.
11476
11477         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
11478
11479         * typemanager.cs (unverifiable_code_type): Corresponds to 
11480         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
11481         which have unsafe code in them.
11482
11483         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
11484         unsafe context.
11485
11486 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
11487
11488         * cs-tokenizer.cs: Add support for @"litreal strings"
11489
11490         Make tokenizer accept pre-processor directives
11491         on any column (remove the old C-like limitation). 
11492
11493         * rootcontext.cs (EmitCode): Emit any global attributes.
11494         (AddGlobalAttributes): Used to keep track of assembly attributes. 
11495
11496         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
11497
11498         * cs-parser.jay: Add support for global attributes.  
11499
11500 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
11501
11502         * expression.cs (Indirection): New helper class.  Unary will
11503         create Indirection classes to be able to implement the
11504         IMemoryLocation interface on it.
11505
11506 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
11507
11508         * cs-parser.jay (fixed_statement): reference the right statement.
11509
11510         * statement.cs (Fixed.Emit): Finish implementing the fixed
11511         statement for the &x case.
11512
11513 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
11514
11515         * class.cs (Property.Define, Method.Define): Remove newslot when
11516         `implementing'.  
11517
11518         * modifiers.cs: My use of NewSlot when `Abstract' was set was
11519         wrong.  NewSlot should only be used if the `new' keyword is present.
11520
11521         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
11522         locating our system dir.  Sorry about this.
11523
11524 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11525
11526         * driver.cs (GetSystemDir): Compute correctly the location of our
11527         system assemblies.  I was using the compiler directory instead of
11528         the library directory.
11529
11530 2002-02-13  Ravi Pratap  <ravi@ximian.com>
11531
11532         * expression.cs (BetterFunction): Put back in what Miguel commented out
11533         since it is the correct fix. The problem is elsewhere ;-)
11534
11535         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
11536         parameters of the parms method are themselves compatible or not !
11537
11538         (StandardConversionExists): Fix very dangerous bug where we were forgetting
11539         to check that a class implements an interface before saying that an implicit
11540         conversion was allowed. Use ImplementsInterface to do the checking.
11541
11542 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
11543
11544         * class.cs (Method.Define): Track whether we are an explicit
11545         implementation or not.  And only call DefineMethodOverride if we
11546         are an explicit implementation.
11547
11548         (Property.DefineMethod): Ditto.
11549
11550 2002-02-11  Ravi Pratap  <ravi@ximian.com>
11551
11552         * expression.cs (BetterFunction): Catch hideous bug which was
11553          preventing us from detecting ambiguous calls due to implicit casts i.e
11554         cs0121.
11555
11556 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
11557
11558         * support.cs (Pair): Remove un-needed method.  I figured why I was
11559         getting the error in cs-parser.jay, the variable in a foreach loop
11560         is readonly, and the compiler does not really treat this as a variable.
11561
11562         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
11563         instead of EQUALS in grammar.  
11564
11565         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
11566
11567         * expression.cs (Unary.DoResolve): Check whether the argument is
11568         managed or not.
11569
11570 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
11571
11572         * support.cs: Api for Pair to set a value.  Despite the fact that
11573         the variables are public the MS C# compiler refuses to compile
11574         code that accesses the field if the variable is part of a foreach
11575         statement. 
11576
11577         * statement.cs (Fixed): Begin implementation of the fixed
11578         statement.
11579
11580         (Block.AddVariable): Return the VariableInfo on success and null
11581         on failure instead of true/false. 
11582
11583         * cs-parser.jay (foreach): Catch errors on variables already
11584         defined (we were ignoring this value before) and properly unwind
11585         the block hierarchy
11586
11587         (fixed_statement): grammar for the fixed statement.
11588
11589 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
11590
11591         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
11592         pointer types to be incretemented.
11593
11594         (SizeOf): Implement.
11595
11596         * cs-parser.jay (pointer_member_access): Implement
11597         expr->IDENTIFIER production.
11598
11599         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
11600         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
11601         on safe contexts.
11602
11603         (Unary): Implement indirection.
11604
11605         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
11606         use in non-unsafe context).
11607
11608         (SimpleName.DoResolve): Check for pointers in field access on safe
11609         contexts. 
11610
11611         (Expression.LoadFromPtr): Factor the load-indirect code in this
11612         function.  This was duplicated in UnboxCast and ParameterReference
11613
11614 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
11615
11616         * expression.cs (ComposedCast): report an error if a pointer cast
11617         is used in a safe region.
11618
11619         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
11620         pointer type casts in unsafe context.
11621
11622         * codegen.cs (EmitContext): Set up IsUnsafe.
11623
11624         * cs-parser.jay (non_expression_type): Add productions for pointer
11625         casts. 
11626
11627         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
11628         code.  We should not use force into static mode if the method is
11629         not virtual.  Fixes bug in MIS
11630
11631         * statement.cs (Do.Emit, While.Emit, For.Emit,
11632         Statement.EmitBoolExpression): Add support to Do and While to
11633         propagate infinite loop as `I do return' semantics.
11634
11635         Improve the For case to also test for boolean constants.
11636
11637         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
11638         to the list of attributes we can add.
11639
11640         Remove `EmitContext' argument.
11641
11642         * class.cs (Method.Define): Apply parameter attributes.
11643         (Constructor.Define): Apply parameter attributes.
11644         (MethodCore.LabelParameters): Move here the core of labeling
11645         parameters. 
11646
11647         * support.cs (ReflectionParameters.ParameterModifier,
11648         InternalParameters.ParameterModifier): Use IsByRef on the type and
11649         only return the OUT bit for these parameters instead of in/out/ref
11650         flags.
11651
11652         This is because I miss-understood things.  The ParameterInfo.IsIn
11653         and IsOut represent whether the parameter has the [In] and [Out]
11654         attributes set.  
11655
11656 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
11657
11658         * ecore.cs (FieldExpr.Emit): Release temporaries.
11659
11660         * assign.cs (LocalTemporary.Release): new function.
11661
11662         * codegen.cs (EmitContext.GetTemporaryStorage,
11663         EmitContext.FreeTemporaryStorage): Rework the way we deal with
11664         temporary storage.  Now we can "put back" localbuilders when we
11665         are done with them
11666
11667 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
11668
11669         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
11670         need to make a copy of the variable to generate verifiable code.
11671
11672 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
11673
11674         * driver.cs: Compute dynamically the system directory.
11675
11676         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
11677         Slower, but more generally useful.  Used by the abstract
11678         registering implementation. 
11679
11680         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
11681         the rules for the special rule on Type/instances.  First check if
11682         we have the same name, and if so, try that special static path
11683         rather than the instance path.
11684
11685 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
11686
11687         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
11688         for, while and if.
11689
11690         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
11691         Enum, ValueType, Delegate or Array for non-corlib compiles.
11692
11693         * cs-tokenizer.cs: Catch long identifiers (645)
11694
11695         * typemanager.cs (IndexerPropetyName): Ravi never tested this
11696         piece of code.
11697
11698         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
11699         fix, we were returning too early, so we were not registering
11700         pending methods from abstract classes.
11701
11702         Do not register pending methods if the class is abstract.
11703
11704         * expression.cs (Conditional.DoResolve): Report circular implicit
11705         conversions when we neecd to compute it for conditional
11706         expressions. 
11707
11708         (Is.DoResolve): If the expression is always of the provided type,
11709         flag warning 183.  If the expression can not ever be of the
11710         provided type flag warning 184.
11711
11712         * class.cs: Catch 169 as well.
11713
11714         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
11715         read. 
11716
11717 2002-01-18  Nick Drochak  <ndrochak@gol.com>
11718
11719         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
11720
11721 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
11722
11723         * interface.cs: (PopulateMethod): Check for pointers being defined
11724         only if the unsafe context is active.
11725         (PopulateProperty): ditto.
11726         (PopulateIndexer): ditto.
11727
11728         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
11729         specified.  If pointers are present, make sure that they are
11730         present in an unsafe context.
11731         (Constructor, Constructor.Define): ditto.
11732         (Field, Field.Define): ditto.
11733         (Property, Property.Define): ditto.
11734         (Event, Event.Define): ditto.
11735
11736         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
11737         hashtable if there are classes or structs defined.
11738
11739         * expression.cs (LocalVariableReference.DoResolve): Simplify this
11740         code, as the constant resolution moved.
11741
11742         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
11743         the metadata, so we can flag error 133. 
11744
11745         * decl.cs (MemberCore.UnsafeOK): New function to test that a
11746         pointer is being declared in an unsafe context.
11747
11748 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
11749
11750         * modifiers.cs (Modifiers.Check): Require a Location argument.
11751         Report error 227 for Unsafe use.
11752
11753         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
11754
11755         * statement.cs (For.Emit): If the test is null, then report that
11756         we do `return', as we wont reach anything afterwards.
11757
11758         (Switch.SwitchGoverningType): Track the expression that matched
11759         the conversion.
11760
11761         * driver.cs: Allow negative numbers as an error code to flag.
11762
11763         * cs-parser.jay: Handle 1551.
11764
11765         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
11766
11767 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11768
11769         * cs-parser.jay: Report 1518 (type declaration can only contain
11770         class, struct, interface, enum or delegate)
11771
11772         (switch_label): Report 1523 (keywords `case' or `default' must
11773         preced code)
11774
11775         (opt_switch_sections): Report 1522 (empty switch)
11776
11777         * driver.cs: Report 1515 (response file specified multiple times)
11778         Report 1516 (Source file specified multiple times).
11779
11780         * expression.cs (Argument.Resolve): Signal 1510
11781
11782         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
11783         access not allowed in static code)
11784
11785 2002-01-11  Ravi Pratap  <ravi@ximian.com>
11786
11787         * typemanager.cs (IsPointerType): Utility method which we are going
11788         to need a lot.
11789
11790         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
11791         the object type, so we take care of that.
11792
11793         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
11794
11795         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
11796         added to non-params parameters :-)
11797
11798         * typemanager.cs (CSharpName): Include 'void' type too. 
11799
11800         (void_ptr_type): Include in the set of core types.
11801
11802         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
11803         duplicating code.
11804
11805         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
11806         an unsafe context.
11807
11808         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
11809         completely forgotten about it.
11810
11811 2002-01-10  Ravi Pratap  <ravi@ximian.com>
11812
11813         * cs-parser.jay (pointer_type): Add. This begins our implementation
11814         of parsing rules for unsafe code.
11815
11816         (unsafe_statement): Implement.
11817
11818         (embedded_statement): Modify to include the above.
11819
11820         * statement.cs (Unsafe): Implement new class for unsafe blocks.
11821
11822         * codegen.cs (EmitContext.InUnsafe): Add. This determines
11823         if the current context is an unsafe one.
11824
11825         * cs-parser.jay (local_variable_pointer_type): Since local variable types
11826         are handled differently, we need separate rules for them.
11827
11828         (local_variable_declaration): Update to use local_variable_pointer_type
11829         to allow variable declarations of unmanaged pointer types.
11830
11831         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
11832         in unsafe contexts.
11833
11834         * ../errors/cs0214.cs : Add.
11835
11836 2002-01-16  Nick Drochak  <ndrochak@gol.com>
11837
11838         * makefile: remove 'response' file when cleaning.
11839
11840 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
11841
11842         * cs-parser.jay: Report 1524.
11843
11844 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
11845
11846         * typemanager.cs (RegisterMethod): drop checking if we have
11847         registered this from here
11848
11849 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
11850
11851         * class.cs (Method.EmitDestructor): Implement calling our base
11852         destructor. 
11853
11854         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
11855         value of InFinally.
11856
11857         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
11858         this routine and will wrap the call in a try/catch block.  Deal
11859         with the case.
11860
11861 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
11862
11863         * ecore.cs (Expression.MemberLookup): instead of taking a
11864         parameter `same_type' that was used to tell whether we could
11865         access private members we compute our containing type from the
11866         EmitContext.
11867
11868         (FieldExpr): Added partial support for volatile fields.  This does
11869         not work for volatile fields exposed from assemblies, as I can not
11870         figure out how to extract the modreq from it.
11871
11872         Updated all the source files to use this.
11873
11874         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
11875         because it is referenced by MemberLookup very often. 
11876
11877 2002-01-09  Ravi Pratap  <ravi@ximian.com>
11878
11879         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
11880         TypeBuilder.GetCustomAttributes to retrieve what we need.
11881
11882         Get rid of redundant default_member_attr_type as this is the same as
11883         default_member_type which already exists.
11884
11885         * interface.cs, attribute.cs : Update accordingly.
11886
11887 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
11888
11889         * typemanager.cs: Enable IndexerPropertyName again.  It does not
11890         work for TYpeBuilders though.  Ravi, can you please fix this?
11891
11892         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
11893
11894         * expression.cs (Argument.Emit): Handle the case of ref objects
11895         being passed to ref functions;  
11896
11897         (ParameterReference.EmitLoad): Loads the content of the pointer
11898         without dereferencing.
11899
11900 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11901
11902         * cs-tokenizer.cs: Implemented the pre-processing expressions.
11903
11904 2002-01-08  Ravi Pratap  <ravi@ximian.com>
11905
11906         * class.cs (Indexer.DefineMethod): Incorporate the interface
11907         type in the name of the method if we are doing explicit interface
11908         implementation.
11909
11910         * expression.cs (ConversionExists): Remove as it is completely obsolete.
11911
11912         (BetterConversion): Fix extremely trivial bug where we were referring to
11913         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
11914         again !
11915
11916         * ../errors/bug16.cs : Add although we have fixed it.
11917
11918 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
11919
11920         * expression.cs (BaseIndexer): Begin implementation.
11921
11922         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
11923
11924         * cs-parser.jay (indexer_declarator): Use qualified_identifier
11925         production directly to remove a shift/reduce, and implement
11926         explicit interface implementation.
11927
11928         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
11929         after a floating point suffix.
11930
11931         * expression.cs (DoNumericPromotions): Improved the conversion for
11932         uint/uint.  If we have a constant, we avoid doing a typecast to a
11933         larger type.
11934
11935         * class.cs (Indexer): Implement explicit interface implementation
11936         for indexers.
11937
11938 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
11939
11940         * class.cs: make the default instance constructor public and hidebysig.
11941
11942 2001-01-03  Ravi Pratap  <ravi@ximian.com>
11943
11944         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
11945         so we can call it from elsewhere.
11946
11947         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
11948         we emit it internally if the class has a defined indexer; otherwise the user
11949         emits it by decorating the class definition with the DefaultMemberAttribute.
11950
11951         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
11952         attribute is not used on a type which defines an indexer.
11953
11954         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
11955         character when we skip whitespace.
11956
11957         * ../errors/cs0646.cs : Add.
11958
11959 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
11960
11961         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
11962         again. 
11963
11964         * makefile: Add practical target `mcs3.exe' which builds the third
11965         generation compiler. 
11966
11967         * expression.cs (New): Fix structures constructor calling.
11968
11969         * class.cs (Property, Method, Indexer): Emit Final flag on the
11970         method if we are an interface implementation and we are not
11971         abstract. 
11972
11973         * ecore.cs (PropertyExpr): New public field `IsBase', tells
11974         whether this property is referencing a `base' method.
11975
11976         * expression.cs (Invocation.EmitCall): take an extra argument:
11977         is_base, this is used to determine whether the `call' or
11978         `callvirt' opcode should be used.
11979
11980
11981         * delegate.cs: update EmitCall.
11982
11983         * class.cs (Method.Define): Set NewSlot for the cases where we are
11984         not implementing an interface method.
11985
11986         (Property.Define): ditto.
11987
11988 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
11989
11990         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
11991         'r'.  Allows mcs to parse itself fully.
11992
11993 2002-01-02  Ravi Pratap  <ravi@ximian.com>
11994
11995         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
11996         of the number of initializers that require the InitializeArray method.
11997
11998         (CheckIndices): Store the Expression in all cases - not the plain value. Also
11999         update the above field where necessary.
12000
12001         (MakeByteBlob): Update accordingly.
12002
12003         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
12004         greater than 2.
12005
12006         (EmitDynamicInitializers): Update in accordance with the new optimization.
12007
12008         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
12009         same OpCode applies.
12010
12011         * cs-parser.jay : Fix some glaring errors I introduced.
12012
12013 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
12014
12015         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
12016         so that we can check for name clashes there too.
12017
12018         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
12019         for interface indexers.
12020
12021         * interfaces.cs (Define): Emit the default member attribute.
12022
12023         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
12024         variable was being referred to while setting the value ;-)
12025
12026 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
12027
12028         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
12029         byte-by-byte information when we know the data is zero.
12030
12031         Make the block always a multiple of 4, because
12032         DefineInitializedData has a bug.
12033
12034         * assign.cs: Fix, we should assign from the temporary, not from
12035         the source. 
12036
12037         * expression.cs (MakeByteBlob): Fix my incorrect code.
12038
12039 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
12040
12041         * typemanager.cs (EnumToUnderlying): This function is used to get
12042         the underlying type from an enumeration, because it does not
12043         always work. 
12044
12045         * constant.cs: Use the I4_S form for values between -128 and 127.
12046
12047         * statement.cs (Block.LookupLabel): Looks up a label.
12048         (Block): Drop support for labeled blocks.
12049
12050         (LabeledStatement): New kind of statement that represents a label
12051         only.
12052
12053         (Goto): Finally implement this bad boy.
12054
12055         * cs-parser.jay: Update to reflect new mechanism to implement
12056         labels.
12057
12058 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
12059
12060         * codegen.cs (EmitContext.This): a codegen property that keeps the
12061         a single instance of this instead of creating many different this
12062         instances. 
12063
12064         * delegate.cs (Delegate.DoResolve): Update to use the property;
12065
12066         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
12067
12068         * expression.cs (BaseAccess.DoResolve): Ditto.
12069
12070 2001-12-29  Ravi Pratap  <ravi@ximian.com>
12071
12072         * typemanager.cs (methodimpl_attr_type): Add to hold the type
12073         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
12074
12075         (InitCoreTypes): Update accordingly.
12076
12077         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
12078         so we can quickly store the state.
12079
12080         (ApplyAttributes): Set the correct implementation flags
12081         for InternalCall methods.
12082
12083 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
12084
12085         * expression.cs (EmitCall): if a method is not virtual, then do
12086         not use callvirt on it.
12087
12088         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
12089         user defined stuff) requires the use of stobj, which takes an
12090         address on the stack instead of an array and an index.  So emit
12091         the Ldelema operation for it.
12092
12093         (EmitStoreOpcode): Use stobj for valuetypes.
12094
12095         (UnaryMutator.EmitCode): Use the right 1 value depending on
12096         whether we are dealing with int64/uint64, float or doubles.
12097
12098         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
12099         constructors that I implemented last night.
12100
12101         (Constructor.IsDefault): Fix to work properly for static
12102         constructors.
12103
12104         * cs-parser.jay (CheckDef): report method signature errors.
12105         Update error number 103 to be 132.
12106
12107         * decl.cs: New AdditionResult enumeration value: MethodExists.
12108         Although we do this check for methods later on in the semantic
12109         analysis, catching repeated default constructors is so easy that
12110         we catch these here. 
12111
12112         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
12113         promotions code.
12114
12115         (ParameterReference.EmitAssign, Emit): handle
12116         bools as bytes.
12117
12118         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
12119         (ArrayAccess.EmitStoreOpcode): ditto.
12120
12121         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
12122
12123         * expression.cs (MakeByteBlob): Complete all the missing types
12124         (uint, short, ushort, byte, sbyte)
12125
12126         * class.cs: Only init instance field initializers on instance
12127         constructors. 
12128
12129         Rename `constructors' to instance_constructors. 
12130
12131         (TypeContainer.AddConstructor): Only add constructors to the list
12132         if it is not static.
12133
12134         Make sure that we handle default_static_constructor independently
12135         everywhere where we handle instance_constructors
12136
12137 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
12138
12139         * class.cs: Do not lookup or create a base initializer for a
12140         static constructor.
12141
12142         (ConstructorInitializer.Resolve): use the proper type to lookup
12143         for constructors.
12144
12145         * cs-parser.jay: Report error 1585 (modifiers between type and name).
12146
12147         * enum.cs, interface.cs: Remove CloseType, this is taken care by
12148         in DeclSpace. 
12149
12150         * decl.cs: CloseType is now an virtual method, the default
12151         implementation just closes this type.
12152
12153 2001-12-28  Ravi Pratap  <ravi@ximian.com>
12154
12155         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
12156         to PreserveSig by default. Also emit HideBySig on such methods.
12157
12158         Basically, set the defaults to standard values.
12159
12160         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
12161         argument, if candidate is better, it can't be worse than the best !
12162
12163         (Invocation): Re-write bits to differentiate between methods being
12164         applicable in their expanded form and their normal form - for params
12165         methods of course.
12166
12167         Get rid of use_standard everywhere as only standard conversions are allowed
12168         in overload resolution. 
12169
12170         More spec conformance.
12171
12172 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12173
12174         * driver.cs: Add --timestamp, to see where the compiler spends
12175         most of its time.
12176
12177         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
12178         `this' in static code.
12179
12180         (SimpleName.DoResolve): Implement in terms of a helper function
12181         that allows static-references to be passed upstream to
12182         MemberAccess.
12183
12184         (Expression.ResolveWithSimpleName): Resolve specially simple
12185         names when called by MemberAccess to implement the special
12186         semantics. 
12187
12188         (Expression.ImplicitReferenceConversion): Handle conversions from
12189         Null to reference types before others, as Null's type is
12190         System.Object. 
12191
12192         * expression.cs (Invocation.EmitCall): Handle the special case of
12193         calling methods declared on a reference type from a ValueType
12194         (Base classes System.Object and System.Enum)
12195
12196         (MemberAccess.Resolve): Only perform lookups on Enumerations if
12197         the left hand side is a TypeExpr, not on every enumeration. 
12198
12199         (Binary.Resolve): If types are reference types, then do a cast to
12200         object on operators != and == of both arguments.
12201
12202         * typemanager.cs (FindMembers): Extract instance and static
12203         members if requested.
12204
12205         * interface.cs (PopulateProperty): Use void_type instead of null
12206         as the return type for the setter method.
12207
12208         (PopulateIndexer): ditto.
12209
12210 2001-12-27  Ravi Pratap  <ravi@ximian.com>
12211
12212         * support.cs (ReflectionParameters): Fix minor bug where we
12213         were examining the wrong parameter for the ParamArray attribute.
12214
12215         Cope with requests for the type of the parameter at position
12216         greater than the params parameter's. We now return the element
12217         type of the params array as that makes more sense.
12218
12219         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
12220         accordingly as we no longer have to extract the element type
12221         ourselves.
12222
12223         (Invocation.OverloadResolve): Update.
12224
12225 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
12226
12227         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
12228         against IEnumerator, test whether the return value is a descendant
12229         of the IEnumerator interface.
12230
12231         * class.cs (Indexer.Define): Use an auxiliary method to implement
12232         the other bits of the method definition.  Begin support for
12233         explicit interface implementation.
12234
12235         (Property.DefineMethod): Use TypeManager.void_type instead of null
12236         for an empty return value.
12237
12238 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
12239
12240         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
12241         dealing with a FieldExpr which is composed of a FieldBuilder, in
12242         the code path we did extract the constant, but we should have
12243         obtained the underlying value to be able to cast it (otherwise we
12244         end up in an infinite loop, this is what Ravi was running into).
12245
12246         (ArrayCreation.UpdateIndices): Arrays might be empty.
12247
12248         (MemberAccess.ResolveMemberAccess): Add support for section
12249         14.5.4.1 that deals with the special case of E.I when E is a type
12250         and something else, that I can be a reference to a static member.
12251
12252         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
12253         handle a particular array type to create byte blobs, it is just
12254         something we dont generate byteblobs for.
12255
12256         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
12257         arguments. 
12258
12259         * location.cs (Push): remove the key from the hashtable that we
12260         are about to add.   This happens for empty files.
12261
12262         * driver.cs: Dispose files after we have parsed them.
12263
12264         (tokenize): new function that only runs the tokenizer on its
12265         input, for speed testing.
12266
12267 2001-12-26  Ravi Pratap  <ravi@ximian.com>
12268
12269         * class.cs (Event.Define): Define the private field only if there
12270         are no accessors defined.
12271
12272         * expression.cs (ResolveMemberAccess): If there is no associated
12273         field with the event, that means we have an event defined with its
12274         own accessors and we should flag error cs0070 since transforming
12275         ourselves into a field is not valid in that case.
12276
12277         * ecore.cs (SimpleName.DoResolve): Same as above.
12278
12279         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
12280         and charset to sane values.
12281
12282 2001-12-25  Ravi Pratap  <ravi@ximian.com>
12283
12284         * assign.cs (DoResolve): Perform check on events only if they 
12285         are being accessed outside the declaring type.
12286
12287         * cs-parser.jay (event_declarations): Update rules to correctly
12288         set the type of the implicit parameter etc.
12289
12290         (add_accessor, remove_accessor): Set current local parameters.
12291
12292         * expression.cs (Binary): For delegate addition and subtraction,
12293         cast the return value from the method into the appropriate delegate
12294         type.
12295
12296 2001-12-24  Ravi Pratap  <ravi@ximian.com>
12297
12298         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
12299         of these as the workaround is unnecessary.
12300
12301         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
12302         delegate data - none of that is needed at all.
12303
12304         Re-write bits to extract the instance expression and the delegate method
12305         correctly.
12306
12307         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
12308         on delegates too.
12309
12310         * attribute.cs (ApplyAttributes): New method to take care of common tasks
12311         of attaching attributes instead of duplicating code everywhere.
12312
12313         * everywhere : Update code to do attribute emission using the above method.
12314
12315 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12316
12317         * expression.cs (IsParamsMethodApplicable): if there are not
12318         parameters, return immediately.
12319
12320         * ecore.cs: The 0 literal can be implicity converted to an enum
12321         type. 
12322
12323         (SimpleName.DoResolve): First lookup the type, then lookup the
12324         members. 
12325
12326         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
12327         want to get its address.  If the InstanceExpression is not
12328         addressable, store the result in a temporary variable, then get
12329         the address of it.
12330
12331         * codegen.cs: Only display 219 errors on warning level or above. 
12332
12333         * expression.cs (ArrayAccess): Make it implement the
12334         IMemoryLocation interface.
12335
12336         (Binary.DoResolve): handle the operator == (object a, object b)
12337         and operator != (object a, object b) without incurring into a
12338         BoxedCast (because 5 != o should never be performed).
12339
12340         Handle binary enumerator operators.
12341
12342         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
12343         value type, otherwise use Ldelem_ref.
12344
12345         Use precomputed names;
12346
12347         (AddressOf): Implement address of
12348
12349         * cs-parser.jay (labeled_statement): Fix recursive block
12350         addition by reworking the production.
12351
12352         * expression.cs (New.DoEmit): New has a special case:
12353                 
12354                  If we are dealing with a ValueType, we have a few
12355                  situations to deal with:
12356                 
12357                     * The target of New is a ValueType variable, that is
12358                       easy, we just pass this as the variable reference
12359                 
12360                     * The target of New is being passed as an argument,
12361                       to a boxing operation or a function that takes a
12362                       ValueType.
12363                 
12364                       In this case, we need to create a temporary variable
12365                       that is the argument of New.
12366
12367
12368 2001-12-23  Ravi Pratap  <ravi@ximian.com>
12369
12370         * rootcontext.cs (LookupType): Check that current_type is not null before
12371         going about looking at nested types.
12372
12373         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
12374         not implement the IAssignMethod interface any more.
12375
12376         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
12377         where we tranform them into FieldExprs if they are being resolved from within
12378         the declaring type.
12379
12380         * ecore.cs (SimpleName.DoResolve): Do the same here.
12381
12382         * assign.cs (DoResolve, Emit): Clean up code considerably. 
12383
12384         * ../errors/bug10.cs : Add.
12385
12386         * ../errors/cs0070.cs : Add.
12387
12388         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
12389
12390         * assign.cs : Get rid of EventIsLocal everywhere.
12391
12392 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
12393
12394         * ecore.cs (ConvertIntLiteral): finished the implementation.
12395
12396         * statement.cs (SwitchLabel): Convert the value we are using as a
12397         key before looking up the table.
12398
12399 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12400
12401         * codegen.cs (EmitTopBlock): Require a Location argument now.
12402
12403         * cs-parser.jay (constructor_declarator): We need to setup
12404         current_local_parameters before we parse the
12405         opt_constructor_initializer, to allow the variables to be bound
12406         to the constructor arguments.
12407
12408         * rootcontext.cs (LookupType): First lookup nested classes in our
12409         class and our parents before we go looking outside our class.
12410
12411         * expression.cs (ConstantFold): Extract/debox the values at the
12412         beginnning. 
12413
12414         * rootcontext.cs (EmitCode): Resolve the constants first before we
12415         resolve the types.  This is not really needed, but it helps debugging.
12416
12417         * statement.cs: report location.
12418
12419         * cs-parser.jay: pass location to throw statement.
12420
12421         * driver.cs: Small bug fix.
12422
12423         * report.cs: Updated format to be 4-zero filled digits.
12424
12425 2001-12-22  Ravi Pratap  <ravi@ximian.com>
12426
12427         * expression.cs (CheckIndices): Fix minor bug where the wrong
12428         variable was being referred to ;-)
12429
12430         (DoEmit): Do not call EmitStaticInitializers when the 
12431         underlying type is System.Object.
12432
12433 2001-12-21  Ravi Pratap  <ravi@ximian.com>
12434
12435         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
12436         and do the usual workaround for SRE.
12437
12438         * class.cs (MyEventBuilder.EventType): New member to get at the type
12439         of the event, quickly.
12440
12441         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
12442
12443         * assign.cs (Assign.DoResolve): Handle the case when the target
12444         is an EventExpr and perform the necessary checks.
12445
12446         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
12447         interface.
12448
12449         (SimpleName.MemberStaticCheck): Include check for EventExpr.
12450
12451         (EventExpr): Set the type in the constructor itself since we 
12452         are meant to be born fully resolved.
12453
12454         (EventExpr.Define): Revert code I wrote earlier.
12455                 
12456         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
12457         instance expression is null. The instance expression is a This in that case
12458         or a null, depending on whether it is a static method or not.
12459
12460         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
12461         refers to more than one method.
12462
12463         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
12464         and accordingly flag errors.
12465
12466 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12467
12468         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
12469
12470 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
12471
12472         * location.cs (ToString): Provide useful rutine.
12473
12474 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
12475
12476         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
12477         objects, return the actual integral boxed.
12478
12479         * statement.cs (SwitchLabel): define an ILLabel for each
12480         SwitchLabel. 
12481
12482         (Switch.CheckSwitch): If the value is a Literal, extract
12483         the underlying literal.
12484
12485         Also in the unused hashtable we had, add the SwitchLabel so we can
12486         quickly look this value up.
12487
12488         * constant.cs: Implement a bunch of new constants.  Rewrite
12489         Literal based on this.  Made changes everywhere to adapt to this.
12490
12491         * expression.cs (Expression.MakeByteBlob): Optimize routine by
12492         dereferencing array only once, and also copes with enumrations.
12493
12494         bytes are two bytes wide, not one.
12495
12496         (Cast): Perform constant conversions.
12497
12498         * ecore.cs (TryImplicitIntConversion): Return literals instead of
12499         wrappers to the literals here.
12500
12501         * expression.cs (DoNumericPromotions): long literals can converted
12502         to ulong implicity (this is taken care of elsewhere, but I was
12503         missing this spot).
12504
12505         * ecore.cs (Expression.Literalize): Make the return type Literal,
12506         to improve type checking.
12507
12508         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
12509
12510 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12511
12512         * literal.cs: Revert code from ravi that checked the bounds.  The
12513         bounds are sane by the definition of the type itself. 
12514
12515         * typemanager.cs: Fix implementation of ImplementsInterface.  We
12516         need to actually look up in our parent hierarchy for interfaces
12517         implemented. 
12518
12519         * const.cs: Use the underlying type for enumerations
12520
12521         * delegate.cs: Compute the basename for the delegate creation,
12522         that should fix the delegate test case, and restore the correct
12523         Type Lookup semantics in rootcontext
12524
12525         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
12526         referencing a nested type with the Reflection API is using the "+"
12527         sign. 
12528
12529         * cs-parser.jay: Do not require EOF token at the end.
12530
12531 2001-12-20  Ravi Pratap  <ravi@ximian.com>
12532
12533         * rootcontext.cs (LookupType): Concatenate type names with
12534         a '.' instead of a '+' The test suite passes again.
12535
12536         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
12537         field of the enumeration.
12538
12539         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
12540         the case when the member is an EventExpr.
12541
12542         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
12543         static has an associated instance expression.
12544
12545         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
12546
12547         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
12548
12549         * class.cs (Event.Define): Register event and perform appropriate checks
12550         for error #111.
12551
12552         We define the Add and Remove methods even if the use provides none because
12553         in that case, we provide default implementations ourselves.
12554
12555         Define a private field of the type of the event. This is done by the CSC compiler
12556         and we should be doing it too ;-)
12557
12558         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
12559         More methods we use in code we generate.
12560
12561         (multicast_delegate_type, delegate_type): Two separate types since the distinction
12562         is important.
12563
12564         (InitCoreTypes): Update accordingly for the above.
12565
12566         * class.cs (Event.Emit): Generate code for default accessors that we provide
12567
12568         (EmitDefaultMethod): Do the job in the above.
12569
12570         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
12571         appropriate place.
12572
12573 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
12574
12575         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
12576         builders even if we were missing one.
12577
12578         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
12579         pass the Basename as our class name instead of the Name.  The
12580         basename will be correctly composed for us.
12581
12582         * parameter.cs (Paramters): Now takes a Location argument.
12583
12584         * decl.cs (DeclSpace.LookupType): Removed convenience function and
12585         make all the code call directly LookupType in RootContext and take
12586         this chance to pass the Location information everywhere.
12587
12588         * Everywhere: pass Location information.
12589
12590 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
12591
12592         * class.cs (Constructor.Define): Updated way of detecting the
12593         length of the parameters.
12594
12595         (TypeContainer.DefineType): Use basename as the type name for
12596         nested types.
12597
12598         (TypeContainer.Define): Do not recursively define types here, as
12599         definition is taken care in order by the RootContext.
12600
12601         * tree.cs: Keep track of namespaces in a per-file basis.
12602
12603         * parameter.cs (Parameter.ComputeSignature): Update to use
12604         DeclSpace. 
12605
12606         (Parameters.GetSignature): ditto.
12607
12608         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
12609         instead of a TypeContainer.
12610
12611         (Interface.SemanticAnalysis): Use `this' instead of our parent to
12612         resolve names.  Because we need to be resolve in our context, not
12613         our parents.
12614
12615         * driver.cs: Implement response files.
12616
12617         * class.cs (TypeContainer.DefineType): If we are defined, do not
12618         redefine ourselves.
12619
12620         (Event.Emit): Emit the code for add/remove handlers.
12621         (Event.Define): Save the MethodBuilders for add/remove.
12622
12623         * typemanager.cs: Use pair here too.
12624
12625         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
12626         DictionaryEntry requires the first argument to be non-null.  
12627
12628         (enum_declaration): Compute full name for registering the
12629         enumeration.
12630
12631         (delegate_declaration): Instead of using
12632         formal_parameter_list, use opt_formal_parameter_list as the list
12633         can be empty.
12634
12635         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
12636         (EventParsing): New property that controls whether `add' and
12637         `remove' are returned as tokens or identifiers (for events);
12638
12639 2001-12-19  Ravi Pratap  <ravi@ximian.com>
12640
12641         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
12642         use MyEventBuilder only and let it wrap the real builder for us.
12643
12644         (MyEventBuilder): Revamp constructor etc.
12645
12646         Implement all operations that we perform on EventBuilder in precisely the same
12647         way here too.
12648
12649         (FindMembers): Update to use the EventBuilder member.
12650
12651         (Event.Emit): Update accordingly.
12652
12653 2001-12-18  Ravi Pratap  <ravi@ximian.com>
12654
12655         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
12656         by calling the appropriate methods.
12657
12658         (GetCustomAttributes): Make stubs as they cannot possibly do anything
12659         useful.
12660
12661         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
12662
12663 2001-12-17  Ravi Pratap  <ravi@ximian.com>
12664
12665         * delegate.cs (Delegate.Populate): Check that the return type
12666         and various parameters types are indeed accessible.
12667
12668         * class.cs (Constructor.Define): Same here.
12669
12670         (Field.Define): Ditto.
12671
12672         (Event.Define): Ditto.
12673
12674         (Operator.Define): Check that the underlying Method defined itself
12675         correctly - so it's MethodBuilder should not be null.
12676
12677         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
12678         expression happens to be null.
12679
12680         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
12681         members but as of now we don't seem to be able to do anything really useful with it.
12682
12683         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
12684         not the EventBuilder.
12685
12686 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
12687
12688         * cs-tokenizer.cs: Add support for defines.
12689         Add support for #if, #elif, #else, #endif
12690
12691         (eval_var): evaluates a variable.
12692         (eval): stubbed for evaluating functions.
12693
12694         * cs-parser.jay: Pass the defines information
12695
12696         * driver.cs: Add --define command line option.
12697
12698         * decl.cs: Move MemberCore here.
12699
12700         Make it the base class for DeclSpace.  This allows us to catch and
12701         report 108 and 109 for everything now.
12702
12703         * class.cs (TypeContainer.Define): Extract all the members
12704         before populating and emit the warning 108 (new keyword required
12705         to override) instead of having each member implement this.
12706
12707         (MemberCore.Define): New abstract method, we will be using this in
12708         the warning reporting engine in Populate.
12709
12710         (Operator.Define): Adjust to new MemberCore protocol. 
12711
12712         * const.cs (Const): This does not derive from Expression, it is a
12713         temporary object we use to create fields, it is a MemberCore. 
12714
12715         * class.cs (Method.Define): Allow the entry point to be in a
12716         specific class.
12717
12718         * driver.cs: Rewrite the argument handler to clean it up a bit.
12719
12720         * rootcontext.cs: Made it just an auxiliary namespace feature by
12721         making everything static.
12722
12723         * driver.cs: Adapt code to use RootContext type name instead of
12724         instance variable.
12725
12726         * delegate.cs: Remove RootContext argument.
12727
12728         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
12729         argument. 
12730
12731         * class.cs (Event.Define): The lookup can fail.
12732
12733         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
12734
12735         * expression.cs: Resolve the this instance before invoking the code.
12736
12737 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
12738
12739         * cs-parser.jay: Add a production in element_access that allows
12740         the thing to become a "type" reference.  This way we can parse
12741         things like "(string [])" as a type.
12742
12743         Note that this still does not handle the more complex rules of
12744         casts. 
12745
12746
12747         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
12748
12749         * ecore.cs: (CopyNewMethods): new utility function used to
12750         assemble the list of methods from running FindMembers.
12751
12752         (MemberLookup): Rework FindMembers so that 
12753
12754 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
12755
12756         * class.cs (TypeContainer): Remove Delegates who fail to be
12757         defined.
12758
12759         * delegate.cs (Populate): Verify that we dont get null return
12760         values.   TODO: Check for AsAccessible.
12761
12762         * cs-parser.jay: Use basename to emit error 574 (destructor should
12763         have the same name as container class), not the full name.
12764
12765         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
12766         possible representation.  
12767
12768         Also implements integer type suffixes U and L.
12769
12770 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
12771
12772         * expression.cs (ArrayCreation.DoResolve): We need to do the
12773         argument resolution *always*.
12774
12775         * decl.cs: Make this hold the namespace.  Hold the root context as
12776         well.
12777         (LookupType): Move here.
12778
12779         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
12780
12781         * location.cs (Row, Name): Fixed the code, it was always returning
12782         references to the first file.
12783
12784         * interface.cs: Register properties defined through interfaces.
12785
12786         * driver.cs: Add support for globbing on the command line
12787
12788         * class.cs (Field): Make it derive from MemberCore as well.
12789         (Event): ditto.
12790
12791 2001-12-15  Ravi Pratap  <ravi@ximian.com>
12792
12793         * class.cs (Event::Define): Check that the type of the event is a delegate
12794         type else flag error #66.
12795
12796         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
12797         same.
12798
12799         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
12800         values of EntryPoint, CharSet etc etc.
12801
12802         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
12803
12804         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
12805         be null and we should ignore this. I am not sure if this is really clean. Apparently,
12806         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
12807         which needs this to do its work.
12808
12809         * ../errors/cs0066.cs : Add.
12810
12811 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
12812
12813         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
12814         helper functions.
12815
12816         * class.cs: (MethodSignature.MethodSignature): Removed hack that
12817         clears out the parameters field.
12818         (MemberSignatureCompare): Cleanup
12819
12820         (MemberCore): New base class used to share code between MethodCore
12821         and Property.
12822
12823         (RegisterRequiredImplementations) BindingFlags.Public requires
12824         either BindingFlags.Instace or Static.  Use instance here.
12825
12826         (Property): Refactored code to cope better with the full spec.
12827
12828         * parameter.cs (GetParameterInfo): Return an empty array instead
12829         of null on error.
12830
12831         * class.cs (Property): Abstract or extern properties have no bodies.
12832
12833         * parameter.cs (GetParameterInfo): return a zero-sized array.
12834
12835         * class.cs (TypeContainer.MethodModifiersValid): Move all the
12836         method modifier validation to the typecontainer so we can reuse
12837         this on properties.
12838
12839         (MethodCore.ParameterTypes): return an empty sized array of types.
12840
12841         (Property.Define): Test property modifier validity.
12842
12843         Add tests for sealed/override too.
12844
12845         (Method.Emit): abstract or extern methods have no bodies.
12846
12847 2001-12-14  Ravi Pratap  <ravi@ximian.com>
12848
12849         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
12850         thing.
12851
12852         (Method::Define, ::Emit): Modify accordingly.
12853
12854         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
12855
12856         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
12857
12858         * makefile: Pass in /unsafe.
12859
12860 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
12861
12862         * class.cs (MakeKey): Kill routine.
12863
12864         * class.cs (TypeContainer.Define): Correctly define explicit
12865         method implementations (they require the full interface name plus
12866         the method name).
12867
12868         * typemanager.cs: Deply the PtrHashtable here and stop using the
12869         lame keys.  Things work so much better.
12870
12871         This of course broke everyone who depended on `RegisterMethod' to
12872         do the `test for existance' test.  This has to be done elsewhere.
12873
12874         * support.cs (PtrHashtable): A hashtable that avoid comparing with
12875         the object stupid Equals method (because, that like fails all over
12876         the place).  We still do not use it.
12877
12878         * class.cs (TypeContainer.SetRequiredInterface,
12879         TypeContainer.RequireMethods): Killed these two routines and moved
12880         all the functionality to RegisterRequiredImplementations.
12881
12882         (TypeContainer.RegisterRequiredImplementations): This routine now
12883         registers all the implementations required in an array for the
12884         interfaces and abstract methods.  We use an array of structures
12885         which can be computed ahead of time to reduce memory usage and we
12886         also assume that lookups are cheap as most classes will not
12887         implement too many interfaces.
12888
12889         We also avoid creating too many MethodSignatures.
12890
12891         (TypeContainer.IsInterfaceMethod): Update and optionally does not
12892         clear the "pending" bit if we find that there are problems with
12893         the declaration.
12894
12895         (TypeContainer.VerifyPendingMethods): Update to report errors of
12896         methods that look like implementations but are not.
12897
12898         (TypeContainer.Define): Add support for explicit interface method
12899         implementation. 
12900
12901 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
12902
12903         * typemanager.cs: Keep track of the parameters here instead of
12904         being a feature of the TypeContainer.
12905
12906         * class.cs: Drop the registration of parameters here, as
12907         InterfaceMethods are also interface declarations.
12908
12909         * delegate.cs: Register methods with the TypeManager not only with
12910         the TypeContainer.  This code was buggy.
12911
12912         * interface.cs: Full registation here.
12913
12914 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
12915
12916         * expression.cs: Remove reducer for binary expressions, it can not
12917         be done this way.
12918
12919         * const.cs: Put here the code that used to go into constant.cs
12920
12921         * constant.cs: Put here the code for constants, this is a new base
12922         class for Literals.
12923
12924         * literal.cs: Make Literal derive from Constant.
12925
12926 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
12927
12928         * statement.cs (Return.Emit): Report error 157 if the user
12929         attempts to return from a finally block.
12930
12931         (Return.Emit): Instead of emitting a return, jump to the end of
12932         the function.
12933
12934         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
12935         LocalBuilder to store the result of the function.  ReturnLabel is
12936         the target where we jump.
12937
12938
12939 2001-12-09  Radek Doulik  <rodo@ximian.com>
12940
12941         * cs-parser.jay: remember alias in current namespace
12942
12943         * ecore.cs (SimpleName::DoResolve): use aliases for types or
12944         namespaces
12945
12946         * class.cs (LookupAlias): lookup alias in my_namespace
12947
12948         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
12949         aliases hashtable
12950         (LookupAlias): lookup alias in this and if needed in parent
12951         namespaces
12952
12953 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
12954
12955         * support.cs: 
12956
12957         * rootcontext.cs: (ModuleBuilder) Made static, first step into
12958         making things static.  I need this to avoid passing the
12959         TypeContainer when calling ParameterType.
12960
12961         * support.cs (InternalParameters.ParameterType): Remove ugly hack
12962         that did string manipulation to compute the type and then call
12963         GetType.  Use Parameter.ParameterType instead.
12964
12965         * cs-tokenizer.cs: Consume the suffix for floating values.
12966
12967         * expression.cs (ParameterReference): figure out whether this is a
12968         reference parameter or not.  Kill an extra variable by computing
12969         the arg_idx during emission.
12970
12971         * parameter.cs (Parameters.GetParameterInfo): New overloaded
12972         function that returns whether a parameter is an out/ref value or not.
12973
12974         (Parameter.ParameterType): The type of the parameter (base,
12975         without ref/out applied).
12976
12977         (Parameter.Resolve): Perform resolution here.
12978         (Parameter.ExternalType): The full type (with ref/out applied).
12979
12980         * statement.cs (Using.Emit, Using.EmitExpression): Implement
12981         support for expressions on the using statement.
12982
12983 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
12984
12985         * statement.cs (Using.EmitLocalVariableDecls): Split the
12986         localvariable handling of the using statement.
12987
12988         (Block.EmitMeta): Keep track of variable count across blocks.  We
12989         were reusing slots on separate branches of blocks.
12990
12991         (Try.Emit): Emit the general code block, we were not emitting it. 
12992
12993         Check the type of the declaration to be an IDisposable or
12994         something that can be implicity converted to it. 
12995
12996         Emit conversions if required.
12997
12998         * ecore.cs (EmptyExpression): New utility class.
12999         (Expression.ImplicitConversionExists): New utility function.
13000
13001 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
13002
13003         * statement.cs (Using): Implement.
13004
13005         * expression.cs (LocalVariableReference): Support read only variables.
13006
13007         * statement.cs: Remove the explicit emit for the Leave opcode.
13008         (VariableInfo): Add a readonly field.
13009
13010 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
13011
13012         * ecore.cs (ConvCast): new class used to encapsulate the various
13013         explicit integer conversions that works in both checked and
13014         unchecked contexts.
13015
13016         (Expression.ConvertNumericExplicit): Use new ConvCast class to
13017         properly generate the overflow opcodes.
13018
13019 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13020
13021         * statement.cs: The correct type for the EmptyExpression is the
13022         element_type, not the variable type.  Ravi pointed this out.
13023
13024 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13025
13026         * class.cs (Method::Define): Handle PInvoke methods specially
13027         by using DefinePInvokeMethod instead of the usual one.
13028
13029         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
13030         above to do the task of extracting information and defining the method.
13031
13032 2001-12-04  Ravi Pratap  <ravi@ximian.com>
13033
13034         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
13035         of the condition for string type.
13036
13037         (Emit): Move that here. 
13038
13039         (ArrayCreation::CheckIndices): Keep string literals in their expression
13040         form.
13041
13042         (EmitDynamicInitializers): Handle strings appropriately.
13043
13044 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
13045
13046         * codegen.cs (EmitContext): Replace multiple variables with a
13047         single pointer to the current Switch statement.
13048
13049         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
13050         EmitContext.
13051
13052 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13053
13054         * statement.cs 
13055
13056         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
13057         default'.
13058
13059         (Foreach.Emit): Foreach on arrays was not setting
13060         up the loop variables (for break/continue).
13061
13062         (GotoCase): Semi-implented.
13063
13064 2001-12-03  Ravi Pratap  <ravi@ximian.com>
13065
13066         * attribute.cs (CheckAttribute): Handle system attributes by using
13067         Attribute.GetAttributes to examine information we need.
13068
13069         (GetValidPlaces): Same here.
13070
13071         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
13072
13073         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
13074
13075         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
13076
13077         (Method::Define): Set appropriate flags if we have a DllImport attribute.
13078
13079         (Method::Emit): Handle the case when we are a PInvoke method.
13080
13081 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
13082
13083         * expression.cs: Use ResolveWithSimpleName on compound names.
13084
13085 2001-12-02  Ravi Pratap  <ravi@ximian.com>
13086
13087         * constant.cs (EmitConstant): Make sure we resolve the associated expression
13088         before trying to reduce it.
13089
13090         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
13091
13092         * constant.cs (LookupConstantValue): Implement.
13093
13094         (EmitConstant): Use the above in emitting the constant.
13095
13096         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
13097         that are user-defined by doing a LookupConstantValue on them.
13098
13099         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
13100         too, like above.
13101
13102 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
13103
13104         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
13105
13106         (BaseAccess.DoResolve): Implement.
13107
13108         (MemberAccess.DoResolve): Split this routine into a
13109         ResolveMemberAccess routine that can be used independently
13110
13111 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
13112
13113         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
13114         As that share bits of the implementation.  Is returns a boolean,
13115         while As returns the Type that is being probed.
13116
13117 2001-12-01  Ravi Pratap  <ravi@ximian.com>
13118
13119         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
13120         instead of a Literal - much easier.
13121
13122         (EnumInTransit): Remove - utterly useless :-)
13123
13124         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
13125
13126         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
13127
13128         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
13129         chain when we have no associated expression.
13130
13131 2001-11-30  Ravi Pratap  <ravi@ximian.com>
13132
13133         * constant.cs (Define): Use Location while reporting the errror.
13134
13135         Also emit a warning when 'new' is used and there is no inherited
13136         member to hide.
13137
13138         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
13139         populated.
13140
13141         (LookupEnumValue): Implement to lookup an enum member's value and define it
13142         if necessary.
13143
13144         (Populate): Re-write accordingly to use the above routine.
13145
13146 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
13147
13148         * expression.cs (This): Fix prototype for DoResolveLValue to
13149         override the base class DoResolveLValue.
13150
13151         * cs-parser.cs: Report errors cs574 and cs575 (destructor
13152         declarations) 
13153
13154         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
13155         (we need to load the address of the field here).  This fixes
13156         test-22. 
13157
13158         (FieldExpr.DoResolveLValue): Call the DoResolve
13159         function to initialize the Instance expression.
13160
13161         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
13162         correctly the GetEnumerator operation on a value type.
13163
13164         * cs-parser.jay: Add more simple parsing error catches.
13165
13166         * statement.cs (Switch): Add support for string switches.
13167         Handle null specially.
13168
13169         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
13170
13171 2001-11-28  Ravi Pratap  <ravi@ximian.com>
13172
13173         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
13174
13175         (declare_local_constant): New helper function.
13176
13177         * statement.cs (AddConstant): Keep a separate record of constants
13178
13179         (IsConstant): Implement to determine if a variable is a constant.
13180
13181         (GetConstantExpression): Implement.
13182
13183         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
13184
13185         * statement.cs (IsVariableDefined): Re-write.
13186
13187 2001-11-27  Ravi Pratap  <ravi@ximian.com>
13188
13189         * class.cs (TypeContainer::FindMembers): Look for constants
13190         in the case when we are looking for MemberTypes.Field
13191
13192         * expression.cs (MemberAccess::DoResolve): Check that in the
13193         case we are a FieldExpr and a Literal, we are not being accessed
13194         by an instance reference.
13195
13196         * cs-parser.jay (local_constant_declaration): Implement.
13197
13198         (declaration_statement): Implement for constant declarations.
13199
13200 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
13201
13202         * statement.cs (Switch): Catch double defaults.
13203
13204         (Switch): More work on the switch() statement
13205         implementation.  It works for integral values now, need to finish
13206         string support.
13207
13208
13209 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13210
13211         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
13212         integer literals into other integer literals.  To be used by
13213         switch. 
13214
13215 2001-11-24  Ravi Pratap  <ravi@ximian.com>
13216
13217         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
13218         some memory.
13219
13220         (EmitDynamicInitializers): Cope with the above since we extract data
13221         directly from ArrayData now.
13222
13223         (ExpectInitializers): Keep track of whether initializers are mandatory
13224         or not.
13225
13226         (Bounds): Make it a hashtable to prevent the same dimension being 
13227         recorded for every element in that dimension.
13228
13229         (EmitDynamicInitializers): Fix bug which prevented the Set array method
13230         from being found.
13231
13232         Also fix bug which was causing the indices to be emitted in the reverse
13233         order.
13234
13235 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
13236
13237         * expression.cs (ArrayCreation): Implement the bits that Ravi left
13238         unfinished.  They do not work, because the underlying code is
13239         sloppy.
13240
13241 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13242
13243         * cs-parser.jay: Remove bogus fixme.
13244
13245         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
13246         on Switch statement.
13247
13248 2001-11-23  Ravi Pratap  <ravi@ximian.com>
13249
13250         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
13251         the same. 
13252
13253         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
13254         parameter. Apparently, any expression is allowed. 
13255
13256         (ValidateInitializers): Update accordingly.
13257
13258         (CheckIndices): Fix some tricky bugs thanks to recursion.
13259
13260         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
13261         I was being completely brain-dead.
13262
13263         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
13264         and re-write acordingly.
13265
13266         (DelegateInvocation): Re-write accordingly.
13267
13268         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
13269
13270         (MakeByteBlob): Handle types more correctly.
13271
13272         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
13273         initialization from expressions but it is incomplete because I am a complete
13274         Dodo :-|
13275
13276 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13277
13278         * statement.cs (If.Emit): Fix a bug that generated incorrect code
13279         on If.  Basically, we have to return `true' (ie, we do return to
13280         our caller) only if both branches of the if return.
13281
13282         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
13283         short-circuit operators, handle them as short circuit operators. 
13284
13285         (Cast.DoResolve): Resolve type.
13286         (Cast.Cast): Take an expression as the target type.
13287
13288         * cs-parser.jay (cast_expression): Remove old hack that only
13289         allowed a limited set of types to be handled.  Now we take a
13290         unary_expression and we resolve to a type during semantic
13291         analysis.
13292
13293         Use the grammar productions from Rhys to handle casts (this is
13294         not complete like Rhys syntax yet, we fail to handle that corner
13295         case that C# has regarding (-x), but we will get there.
13296
13297 2001-11-22  Ravi Pratap  <ravi@ximian.com>
13298
13299         * class.cs (EmitFieldInitializer): Take care of the case when we have a
13300         field which is an array type.
13301
13302         * cs-parser.jay (declare_local_variables): Support array initialization too.
13303
13304         * typemanager.cs (MakeKey): Implement.
13305
13306         (everywhere): Use the above appropriately.
13307
13308         * cs-parser.jay (for_statement): Update for array initialization while
13309         declaring variables.
13310
13311         * ecore.cs : The error message was correct, it's the variable's names that
13312         were misleading ;-) Make the code more readable.
13313
13314         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
13315         the correct type etc.
13316
13317         (ConvertExplicit): Handle Enum types by examining the underlying type.
13318
13319 2001-11-21  Ravi Pratap  <ravi@ximian.com>
13320
13321         * parameter.cs (GetCallingConvention): Always return
13322         CallingConventions.Standard for now.
13323
13324 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
13325
13326         * expression.cs (Binary.ResolveOperator): Update the values of `l'
13327         and `r' after calling DoNumericPromotions.
13328
13329         * ecore.cs: Fix error message (the types were in the wrong order).
13330
13331         * statement.cs (Foreach.ProbeCollectionType): Need to pass
13332         BindingFlags.Instance as well 
13333
13334         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
13335         implicit int literal conversion in an empty cast so that we
13336         propagate the right type upstream.
13337
13338         (UnboxCast): new class used to unbox value types.
13339         (Expression.ConvertExplicit): Add explicit type conversions done
13340         by unboxing.
13341
13342         (Expression.ImplicitNumericConversion): Oops, forgot to test for
13343         the target type before applying the implicit LongLiterals to ULong
13344         literal cast.
13345
13346 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
13347
13348         * cs-parser.jay (for_statement): Reworked the way For works: now
13349         we declare manually any variables that are introduced in
13350         for_initializer to solve the problem of having out-of-band code
13351         emition (that is what got for broken).
13352
13353         (declaration_statement): Perform the actual variable declaration
13354         that used to be done in local_variable_declaration here.
13355
13356         (local_variable_declaration): Do not declare anything, just pass
13357         the information on a DictionaryEntry
13358
13359 2001-11-20  Ravi Pratap  <ravi@ximian.com>
13360
13361         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
13362         re-write of the logic to now make it recursive.
13363
13364         (UpdateIndices): Re-write accordingly.
13365
13366         Store element data in a separate ArrayData list in the above methods.
13367
13368         (MakeByteBlob): Implement to dump the array data into a byte array.
13369
13370 2001-11-19  Ravi Pratap  <ravi@ximian.com>
13371
13372         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
13373         into CheckIndices.
13374
13375         * constant.cs (Define): Implement.
13376
13377         (EmitConstant): Re-write fully.
13378
13379         Pass in location info.
13380
13381         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
13382         respectively.
13383
13384         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
13385         DictionaryEntry since we need location info too.
13386
13387         (constant_declaration): Update accordingly.
13388
13389         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
13390         code into another method : UpdateIndices.
13391
13392 2001-11-18  Ravi Pratap  <ravi@ximian.com>
13393
13394         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
13395         some type checking etc.
13396
13397 2001-11-17  Ravi Pratap  <ravi@ximian.com>
13398
13399         * expression.cs (ArrayCreation::ValidateInitializers): Implement
13400         bits to provide dimension info if the user skips doing that.
13401
13402         Update second constructor to store the rank correctly.
13403
13404 2001-11-16  Ravi Pratap  <ravi@ximian.com>
13405
13406         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
13407         and try to implement.
13408
13409         * ../errors/cs0150.cs : Add.
13410
13411         * ../errors/cs0178.cs : Add.
13412
13413 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
13414
13415         * statement.cs: Implement foreach on multi-dimensional arrays. 
13416
13417         * parameter.cs (Parameters.GetParameterByName): Also lookup the
13418         name of the params argument.
13419
13420         * expression.cs: Use EmitStoreOpcode to get the right opcode while
13421         initializing the array.
13422
13423         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
13424         we can use this elsewhere.
13425
13426         * statement.cs: Finish implementation of foreach for single
13427         dimension arrays.
13428
13429         * cs-parser.jay: Use an out-of-band stack to pass information
13430         around, I wonder why I need this.
13431
13432         foreach_block: Make the new foreach_block the current_block.
13433
13434         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
13435         function used to return a static Parameters structure.  Used for
13436         empty parameters, as those are created very frequently.
13437
13438         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
13439
13440 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13441
13442         * interface.cs : Default modifier is private, not public. The
13443         make verify test passes again.
13444
13445 2001-11-15  Ravi Pratap  <ravi@ximian.com>
13446
13447         * support.cs (ReflectionParameters): Fix logic to determine
13448         whether the last parameter is a params one. Test 9 passes again.
13449
13450         * delegate.cs (Populate): Register the builders we define with
13451         RegisterParameterForBuilder. Test 19 passes again.
13452
13453         * cs-parser.jay (property_declaration): Reference $6 instead
13454         of $$ to get at the location.
13455
13456         (indexer_declaration): Similar stuff.
13457
13458         (attribute): Ditto.
13459
13460         * class.cs (Property): Register parameters for the Get and Set methods
13461         if they exist. Test 23 passes again.
13462
13463         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
13464         call to EmitArguments as we are sure there aren't any params arguments. 
13465         Test 32 passes again.
13466
13467         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
13468         IndexOutOfRangeException. 
13469
13470         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
13471         Test 33 now passes again.
13472
13473 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
13474
13475         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
13476         broke a bunch of things.  Will have to come up with a better way
13477         of tracking locations.
13478
13479         * statement.cs: Implemented foreach for single dimension arrays.
13480
13481 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13482
13483         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
13484         an error.  This removes the lookup from the critical path.
13485
13486         * cs-parser.jay: Removed use of temporary_loc, which is completely
13487         broken. 
13488
13489 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
13490
13491         * support.cs (ReflectionParameters.ParameterModifier): Report
13492         whether the argument is a PARAMS argument or not.
13493
13494         * class.cs: Set the attribute `ParamArrayAttribute' on the
13495         parameter argument.
13496
13497         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
13498         and cons_param_array_attribute (ConstructorInfo for
13499         ParamArrayAttribute)., 
13500
13501         * codegen.cs: Emit the return using the `Return' statement, that
13502         way we can report the error correctly for missing return values. 
13503
13504         * class.cs (Method.Emit): Clean up.
13505
13506         * expression.cs (Argument.Resolve): Take another argument: the
13507         location where this argument is used.  Notice that this is not
13508         part of the "Argument" class as to reduce the size of the
13509         structure (we know the approximate location anyways).
13510
13511         Test if the argument is a variable-reference, if not, then
13512         complain with a 206.
13513
13514         (Argument.Emit): Emit addresses of variables.
13515
13516         (Argument.FullDesc): Simplify.
13517
13518         (Invocation.DoResolve): Update for Argument.Resolve.
13519
13520         (ElementAccess.DoResolve): ditto.
13521
13522         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
13523         method should be virtual, as this method is always virtual.
13524
13525         (NewDelegate.DoResolve): Update for Argument.Resolve.
13526
13527         * class.cs (ConstructorInitializer.DoResolve): ditto.
13528
13529         * attribute.cs (Attribute.Resolve): ditto.
13530
13531 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
13532
13533         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
13534
13535         * expression.cs (ParameterReference): Drop IStackStorage and implement
13536         IAssignMethod instead. 
13537
13538         (LocalVariableReference): ditto.
13539
13540         * ecore.cs (FieldExpr): Drop IStackStorage and implement
13541         IAssignMethod instead. 
13542
13543 2001-11-13  Miguel de Icaza <miguel@ximian.com>
13544
13545         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
13546         enumerations that are used in heavily used structures derive from
13547         byte in a laughable and pathetic attempt to reduce memory usage.
13548         This is the kind of pre-optimzations that you should not do at
13549         home without adult supervision.
13550
13551         * expression.cs (UnaryMutator): New class, used to handle ++ and
13552         -- separatedly from the other unary operators.  Cleans up the
13553         code, and kills the ExpressionStatement dependency in Unary.
13554
13555         (Unary): Removed `method' and `Arguments' from this class, making
13556         it smaller, and moving it all to SimpleCall, so I can reuse this
13557         code in other locations and avoid creating a lot of transient data
13558         strucutres when not required.
13559
13560         * cs-parser.jay: Adjust for new changes.
13561
13562 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
13563
13564         * enum.cs (Enum.Populate): If there is a failure during
13565         definition, return
13566
13567         * cs-parser.jay (opt_enum_base): we used to catch type errors
13568         here, but this is really incorrect.  The type error should be
13569         catched during semantic analysis.
13570
13571 2001-12-11  Ravi Pratap  <ravi@ximian.com>
13572
13573         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
13574         current_local_parameters as expected since I, in my stupidity, had forgotten
13575         to do this :-)
13576
13577         * attribute.cs (GetValidPlaces): Fix stupid bug.
13578
13579         * class.cs (Method::Emit): Perform check on applicability of attributes.
13580
13581         (Constructor::Emit): Ditto.
13582
13583         (Field::Emit): Ditto.
13584
13585         (Field.Location): Store location information.
13586
13587         (Property, Event, Indexer, Operator): Ditto.
13588
13589         * cs-parser.jay (field_declaration): Pass in location for each field.
13590
13591         * ../errors/cs0592.cs : Add.
13592
13593 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13594
13595         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
13596
13597         (InitCoreTypes): Update accordingly.
13598
13599         (RegisterAttrType, LookupAttr): Implement.
13600
13601         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
13602         info about the same.
13603
13604         (Resolve): Update to populate the above as necessary.
13605
13606         (Error592): Helper.
13607
13608         (GetValidPlaces): Helper to the above.
13609
13610         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
13611
13612         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
13613
13614 2001-11-12  Ravi Pratap  <ravi@ximian.com>
13615
13616         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
13617
13618         * ../errors/cs0617.cs : Add.
13619
13620 2001-11-11  Ravi Pratap  <ravi@ximian.com>
13621
13622         * enum.cs (Emit): Rename to Populate to be more consistent with what
13623         we expect it to do and when exactly it is called.
13624
13625         * class.cs, rootcontext.cs : Update accordingly.
13626
13627         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
13628         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
13629
13630         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
13631
13632         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
13633         of a fieldinfo using the above, when dealing with a FieldBuilder.
13634
13635 2001-11-10  Ravi Pratap  <ravi@ximian.com>
13636
13637         * ../errors/cs0031.cs : Add.
13638
13639         * ../errors/cs1008.cs : Add.
13640
13641         * ../errrors/cs0543.cs : Add.
13642
13643         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
13644         enum type.
13645
13646         (FindMembers): Implement.
13647
13648         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
13649         enums and delegates too.
13650
13651         (enum_types): Rename to builder_to_enum.
13652
13653         (delegate_types): Rename to builder_to_delegate.
13654
13655         * delegate.cs (FindMembers): Implement.
13656
13657 2001-11-09  Ravi Pratap  <ravi@ximian.com>
13658
13659         * typemanager.cs (IsEnumType): Implement.
13660
13661         * enum.cs (Emit): Re-write parts to account for the underlying type
13662         better and perform checking etc.
13663
13664         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
13665         of the underlying type.
13666
13667         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
13668         value
13669
13670         * enum.cs (error31): Helper to report error #31.
13671
13672         * cs-parser.jay (enum_declaration): Store location of each member too.
13673
13674         * enum.cs (member_to_location): New hashtable. 
13675
13676         (AddEnumMember): Update location hashtable.
13677
13678         (Emit): Use the location of each member while reporting errors.
13679
13680 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
13681
13682         * cs-parser.jay: A for_initializer if is a
13683         local_variable_declaration really ammount to have an implicit
13684         block with the variable declaration and no initializer for for.
13685
13686         * statement.cs (For.Emit): Cope with null initializers.
13687
13688         This fixes the infinite loop on for initializers.
13689
13690 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
13691
13692         * enum.cs: More cleanup.
13693
13694         * ecore.cs: Remove dead code.
13695
13696         * class.cs (Property.Emit): More simplification.
13697         (Event.Emit): ditto.
13698
13699         Reworked to have less levels of indentation.
13700
13701 2001-11-08  Ravi Pratap  <ravi@ximian.com>
13702
13703         * class.cs (Property): Emit attributes.
13704
13705         (Field): Ditto.
13706
13707         (Event): Ditto.
13708
13709         (Indexer): Ditto.
13710
13711         (Operator): Ditto.
13712
13713         * enum.cs (Emit): Ditto.
13714
13715         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
13716         Enums too.
13717
13718         * class.cs (Field, Event, etc.): Move attribute generation into the
13719         Emit method everywhere.
13720
13721         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
13722         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
13723         as we had no way of defining nested enums !
13724
13725         * rootcontext.cs : Adjust code accordingly.
13726
13727         * typemanager.cs (AddEnumType): To keep track of enum types separately.
13728
13729 2001-11-07  Ravi Pratap  <ravi@ximian.com>
13730
13731         * expression.cs (EvalConstantExpression): Move into ecore.cs
13732
13733         * enum.cs (Enum): Rename some members and make them public and readonly
13734         according to our convention.
13735
13736         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
13737         nothing else.
13738
13739         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
13740
13741         (Enum::Emit): Write a simple version for now which doesn't try to compute
13742         expressions. I shall modify this to be more robust in just a while.
13743
13744         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
13745
13746         (TypeContainer::CloseType): Create the Enum types too.
13747
13748         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
13749
13750         * expression.cs (EvalConstantExpression): Get rid of completely.
13751
13752         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
13753         user-defined values and other cases.
13754
13755         (IsValidEnumLiteral): Helper function.
13756
13757         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
13758         out there in the case we had a literal FieldExpr.
13759
13760         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
13761
13762         (Literalize): Revamp a bit to take two arguments.
13763
13764         (EnumLiteral): New class which derives from Literal to wrap enum literals.
13765
13766 2001-11-06  Ravi Pratap  <ravi@ximian.com>
13767
13768         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
13769
13770         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
13771
13772         (Resolve): Use the above to ensure we have proper initializers.
13773
13774 2001-11-05  Ravi Pratap  <ravi@ximian.com>
13775
13776         * expression.cs (Expression::EvalConstantExpression): New method to 
13777         evaluate constant expressions.
13778
13779         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
13780
13781 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
13782
13783         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
13784         in an array.
13785
13786         (Binary.ResolveOperator): Handle operator != (object a, object b)
13787         and operator == (object a, object b);
13788
13789         (Binary.DoNumericPromotions): Indicate whether the numeric
13790         promotion was possible.
13791
13792         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
13793         Implement.  
13794
13795         Made the ArrayAccess implement interface IAssignMethod instead of
13796         IStackStore as the order in which arguments are passed reflects
13797         this.
13798
13799         * assign.cs: Instead of using expr.ExprClass to select the way of
13800         assinging, probe for the IStackStore/IAssignMethod interfaces.
13801
13802         * typemanager.cs: Load InitializeArray definition.
13803
13804         * rootcontext.cs (RootContext.MakeStaticData): Used to define
13805         static data that can be used to initialize arrays. 
13806
13807 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
13808
13809         * expression.cs: Handle operator== and operator!= for booleans.
13810
13811         (Conditioal.Reduce): Implement reducer for the ?: operator.
13812
13813         (Conditional.Resolve): Implement dead code elimination.
13814
13815         (Binary.Resolve): Catch string literals and return a new
13816         concatenated string.
13817
13818         (Unary.Reduce): Implement reduction of unary expressions.
13819
13820         * ecore.cs: Split out the expression core handling here.
13821
13822         (Expression.Reduce): New method used to perform constant folding
13823         and CSE.  This is needed to support constant-expressions. 
13824
13825         * statement.cs (Statement.EmitBoolExpression): Pass true and false
13826         targets, and optimize for !x.
13827
13828 2001-11-04  Ravi Pratap  <ravi@ximian.com>
13829
13830         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
13831         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
13832         set custom atttributes.
13833
13834         * literal.cs (Literal::GetValue): New abstract method to return the actual
13835         value of the literal, cast as an object.
13836
13837         (*Literal): Implement GetValue method.
13838
13839         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
13840         expressions to the arraylist but objects of type Argument.
13841
13842         * class.cs (TypeContainer::Emit): Emit our attributes too.
13843
13844         (Method::Emit, Constructor::Emit): Ditto.
13845
13846         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
13847         to be ignoring earlier.
13848
13849 2001-11-03  Ravi Pratap  <ravi@ximian.com>
13850
13851         * attribute.cs (AttributeSection::Define): Implement to do the business
13852         of constructing a CustomAttributeBuilder.
13853
13854         (Attribute): New trivial class. Increases readability of code.  
13855
13856         * cs-parser.jay : Update accordingly.
13857
13858         (positional_argument_list, named_argument_list, named_argument): New rules
13859
13860         (attribute_arguments): Use the above so that we are more correct.
13861
13862 2001-11-02  Ravi Pratap  <ravi@ximian.com>
13863
13864         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
13865         to perform all checks for a method with a params parameter.
13866
13867         (Invocation::OverloadResolve): Update to use the above method and therefore
13868         cope correctly with params method invocations.
13869
13870         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
13871         params too.
13872
13873         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
13874         constructors in our parent too because we can't afford to miss out on 
13875         protected ones ;-)
13876
13877         * attribute.cs (AttributeSection): New name for the class Attribute
13878
13879         Other trivial changes to improve readability.
13880
13881         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
13882         use the new class names.
13883
13884 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13885
13886         * class.cs (Method::Define): Complete definition for params types too
13887
13888         (Indexer::Define): Ditto.
13889
13890         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
13891         Cope everywhere with a request for info about the array parameter.
13892
13893 2001-11-01  Ravi Pratap  <ravi@ximian.com>
13894
13895         * tree.cs (RecordNamespace): Fix up to check for the correct key.
13896
13897         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
13898         local_variable_type to extract the string corresponding to the type.
13899
13900         (local_variable_type): Fixup the action to use the new helper method.
13901
13902         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
13903         go.
13904
13905         * expression.cs : Clean out code which uses the above.
13906
13907 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13908
13909         * typemanager.cs (RegisterMethod): Check if we already have an existing key
13910         and bale out if necessary by returning a false.
13911
13912         (RegisterProperty): Ditto.
13913
13914         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
13915         and print out appropriate error messages.
13916
13917         * interface.cs (everywhere): Ditto.
13918
13919         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
13920         location to constructor.
13921
13922         * class.cs (Property, Event, Indexer): Update accordingly.
13923
13924         * ../errors/cs111.cs : Added.
13925
13926         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
13927         of a method, as laid down by the spec.
13928
13929         (Invocation::OverloadResolve): Use the above method.
13930
13931 2001-10-31  Ravi Pratap  <ravi@ximian.com>
13932
13933         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
13934         now take a TypeContainer and a Parameters object.
13935
13936         (ParameterData): Modify return type of ParameterModifier method to be 
13937         Parameter.Modifier and not a string.
13938
13939         (ReflectionParameters, InternalParameters): Update accordingly.
13940
13941         * expression.cs (Argument::GetParameterModifier): Same here.
13942
13943         * support.cs (InternalParameters::ParameterType): Find a better way of determining
13944         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
13945         symbol in it at all so maybe this is only for now.
13946
13947 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13948
13949         * support.cs (InternalParameters): Constructor now takes an extra argument 
13950         which is the actual Parameters class.
13951
13952         (ParameterDesc): Update to provide info on ref/out modifiers.
13953
13954         * class.cs (everywhere): Update call to InternalParameters to pass in
13955         the second argument too.
13956
13957         * support.cs (ParameterData): Add ParameterModifier, which is a method 
13958         to return the modifier info [ref/out etc]
13959
13960         (InternalParameters, ReflectionParameters): Implement the above.
13961
13962         * expression.cs (Argument::ParameterModifier): Similar function to return
13963         info about the argument's modifiers.
13964
13965         (Invocation::OverloadResolve): Update to take into account matching modifiers 
13966         too.
13967
13968         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
13969         a new SetFormalParameters object which we pass to InternalParameters.
13970
13971 2001-10-30  Ravi Pratap  <ravi@ximian.com>
13972
13973         * expression.cs (NewArray): Merge into the ArrayCreation class.
13974
13975 2001-10-29  Ravi Pratap  <ravi@ximian.com>
13976
13977         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
13978         NewUserdefinedArray into one as there wasn't much of a use in having
13979         two separate ones.
13980
13981         * expression.cs (Argument): Change field's name to ArgType from Type.
13982
13983         (Type): New readonly property which returns the proper type, taking into 
13984         account ref/out modifiers.
13985
13986         (everywhere): Adjust code accordingly for the above.
13987
13988         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
13989         whether we are emitting for a ref or out parameter.
13990
13991         * expression.cs (Argument::Emit): Use the above field to set the state.
13992
13993         (LocalVariableReference::Emit): Update to honour the flag and emit the
13994         right stuff.
13995
13996         * parameter.cs (Attributes): Set the correct flags for ref parameters.
13997
13998         * expression.cs (Argument::FullDesc): New function to provide a full desc.
13999
14000         * support.cs (ParameterData): Add method ParameterDesc to the interface.
14001
14002         (ReflectionParameters, InternalParameters): Implement the above method.
14003
14004         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
14005         reporting errors.
14006
14007         (Invocation::FullMethodDesc): Ditto. 
14008
14009 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
14010
14011         * cs-parser.jay: Add extra production for the second form of array
14012         creation. 
14013
14014         * expression.cs (ArrayCreation): Update to reflect the above
14015         change. 
14016
14017         * Small changes to prepare for Array initialization.
14018
14019 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
14020
14021         * typemanager.cs (ImplementsInterface): interface might be null;
14022         Deal with this problem;
14023
14024         Also, we do store negative hits on the cache (null values), so use
14025         this instead of calling t.GetInterfaces on the type everytime.
14026
14027 2001-10-28  Ravi Pratap  <ravi@ximian.com>
14028
14029         * typemanager.cs (IsBuiltinType): New method to help determine the same.
14030
14031         * expression.cs (New::DoResolve): Get rid of array creation code and instead
14032         split functionality out into different classes.
14033
14034         (New::FormArrayType): Move into NewBuiltinArray.
14035
14036         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
14037         quite useless.
14038
14039         (NewBuiltinArray): New class to handle creation of built-in arrays.
14040
14041         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
14042         account creation of one-dimensional arrays.
14043
14044         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
14045
14046         (NewUserdefinedArray::DoResolve): Implement.
14047
14048         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
14049
14050         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
14051         we maintain inside the TypeManager. This is necessary to perform lookups on the
14052         module builder.
14053
14054         (LookupType): Update to perform GetType on the module builders too.     
14055
14056         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
14057
14058         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
14059
14060 2001-10-23  Ravi Pratap  <ravi@ximian.com>
14061
14062         * expression.cs (New::DoResolve): Implement guts of array creation.
14063
14064         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
14065
14066 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
14067
14068         * expression.cs: Fix bug I introduced lsat night that broke
14069         Delegates. 
14070
14071         (Expression.Resolve): Report a 246 error (can not resolve name)
14072         if we find a SimpleName in the stream.
14073
14074         (Expression.ResolveLValue): Ditto.
14075
14076         (Expression.ResolveWithSimpleName): This function is a variant of
14077         ResolveName, this one allows SimpleNames to be returned without a
14078         warning.  The only consumer of SimpleNames is MemberAccess
14079
14080 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
14081
14082         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
14083         might arrive here.  I have my doubts that this is correct.
14084
14085         * statement.cs (Lock): Implement lock statement.
14086
14087         * cs-parser.jay: Small fixes to support `lock' and `using'
14088
14089         * cs-tokenizer.cs: Remove extra space
14090
14091         * driver.cs: New flag --checked, allows to turn on integer math
14092         checking. 
14093
14094         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
14095         Threading.Monitor.Exit 
14096
14097 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
14098
14099         * expression.cs (IndexerAccess::DoResolveLValue): Set the
14100         Expression Class to be IndexerAccess.
14101
14102         Notice that Indexer::DoResolve sets the eclass to Value.
14103
14104 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
14105
14106         * class.cs (TypeContainer::Emit): Emit code for indexers.
14107
14108         * assign.cs (IAssignMethod): New interface implemented by Indexers
14109         and Properties for handling assignment.
14110
14111         (Assign::Emit): Simplify and reuse code. 
14112
14113         * expression.cs (IndexerAccess, PropertyExpr): Implement
14114         IAssignMethod, clean up old code. 
14115
14116 2001-10-22  Ravi Pratap  <ravi@ximian.com>
14117
14118         * typemanager.cs (ImplementsInterface): New method to determine if a type
14119         implements a given interface. Provides a nice cache too.
14120
14121         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
14122         method.
14123
14124         (ConvertReferenceExplicit): Ditto.
14125
14126         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
14127         various methods, with correct names etc.
14128
14129         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
14130         Operator.UnaryNegation.
14131
14132         * cs-parser.jay (operator_declarator): Be a little clever in the case where
14133         we have a unary plus or minus operator.
14134
14135         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
14136         UnaryMinus.
14137
14138         * everywhere : update accordingly.
14139
14140         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
14141         respectively.
14142
14143         * class.cs (Method::Define): For the case where we are implementing a method
14144         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
14145         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
14146
14147 2001-10-21  Ravi Pratap  <ravi@ximian.com>
14148
14149         * interface.cs (FindMembers): Implement to work around S.R.E
14150         lameness.
14151
14152         * typemanager.cs (IsInterfaceType): Implement.
14153
14154         (FindMembers): Update to handle interface types too.
14155
14156         * expression.cs (ImplicitReferenceConversion): Re-write bits which
14157         use IsAssignableFrom as that is not correct - it doesn't work.
14158
14159         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
14160         and accordingly override EmitStatement.
14161
14162         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
14163         using the correct logic :-)
14164
14165 2001-10-19  Ravi Pratap  <ravi@ximian.com>
14166
14167         * ../errors/cs-11.cs : Add to demonstrate error -11 
14168
14169 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
14170
14171         * assign.cs (Assign::Resolve): Resolve right hand side first, and
14172         then pass this as a hint to ResolveLValue.
14173
14174         * expression.cs (FieldExpr): Add Location information
14175
14176         (FieldExpr::LValueResolve): Report assignment to readonly
14177         variable. 
14178
14179         (Expression::ExprClassFromMemberInfo): Pass location information.
14180
14181         (Expression::ResolveLValue): Add new method that resolves an
14182         LValue. 
14183
14184         (Expression::DoResolveLValue): Default invocation calls
14185         DoResolve. 
14186
14187         (Indexers): New class used to keep track of indexers in a given
14188         Type. 
14189
14190         (IStackStore): Renamed from LValue, as it did not really describe
14191         what this did.  Also ResolveLValue is gone from this interface and
14192         now is part of Expression.
14193
14194         (ElementAccess): Depending on the element access type
14195
14196         * typemanager.cs: Add `indexer_name_type' as a Core type
14197         (System.Runtime.CompilerServices.IndexerNameAttribute)
14198
14199         * statement.cs (Goto): Take a location.
14200
14201 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14202
14203         * delegate.cs (Delegate::VerifyDelegate): New method to verify
14204         if two delegates are compatible.
14205
14206         (NewDelegate::DoResolve): Update to take care of the case when
14207         we instantiate a delegate from another delegate.
14208
14209         * typemanager.cs (FindMembers): Don't even try to look up members
14210         of Delegate types for now.
14211
14212 2001-10-18  Ravi Pratap  <ravi@ximian.com>
14213
14214         * delegate.cs (NewDelegate): New class to take care of delegate
14215         instantiation.
14216
14217         * expression.cs (New): Split the delegate related code out into 
14218         the NewDelegate class.
14219
14220         * delegate.cs (DelegateInvocation): New class to handle delegate 
14221         invocation.
14222
14223         * expression.cs (Invocation): Split out delegate related code into
14224         the DelegateInvocation class.
14225
14226 2001-10-17  Ravi Pratap  <ravi@ximian.com>
14227
14228         * expression.cs (New::DoResolve): Implement delegate creation fully
14229         and according to the spec.
14230
14231         (New::DoEmit): Update to handle delegates differently.
14232
14233         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
14234         because of which we were printing out arguments in reverse order !
14235
14236         * delegate.cs (VerifyMethod): Implement to check if the given method
14237         matches the delegate.
14238
14239         (FullDelegateDesc): Implement.
14240
14241         (VerifyApplicability): Implement.
14242
14243         * expression.cs (Invocation::DoResolve): Update to accordingly handle
14244         delegate invocations too.
14245
14246         (Invocation::Emit): Ditto.
14247
14248         * ../errors/cs1593.cs : Added.
14249
14250         * ../errors/cs1594.cs : Added.
14251
14252         * delegate.cs (InstanceExpression, TargetMethod): New properties.
14253
14254 2001-10-16  Ravi Pratap  <ravi@ximian.com>
14255
14256         * typemanager.cs (intptr_type): Core type for System.IntPtr
14257
14258         (InitCoreTypes): Update for the same.
14259
14260         (iasyncresult_type, asynccallback_type): Ditto.
14261
14262         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
14263         correct.
14264
14265         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
14266         too.
14267
14268         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
14269         the builders for the 4 members of a delegate type :-)
14270
14271         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
14272         type.
14273
14274         * expression.cs (New::DoResolve): Implement guts for delegate creation.
14275
14276         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
14277
14278 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
14279
14280         * statement.cs (Break::Emit): Implement.   
14281         (Continue::Emit): Implement.
14282
14283         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14284         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14285         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
14286         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
14287         end loop
14288
14289         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
14290         properties that track the label for the current loop (begin of the
14291         loop and end of the loop).
14292
14293 2001-10-15  Ravi Pratap  <ravi@ximian.com>
14294
14295         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
14296         use of emitting anything at all.
14297
14298         * class.cs, rootcontext.cs : Get rid of calls to the same.
14299
14300         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
14301
14302         (Populate): Define the constructor correctly and set the implementation
14303         attributes.
14304
14305         * typemanager.cs (delegate_types): New hashtable to hold delegates that
14306         have been defined.
14307
14308         (AddDelegateType): Implement.
14309
14310         (IsDelegateType): Implement helper method.
14311
14312         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
14313
14314         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
14315         and accordingly handle it.
14316
14317         * delegate.cs (Populate): Take TypeContainer argument.
14318         Implement bits to define the Invoke method. However, I still haven't figured out
14319         how to take care of the native int bit :-(
14320
14321         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
14322         Qualify the name of the delegate, not its return type !
14323
14324         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
14325         conversion.
14326
14327         (StandardConversionExists): Checking for array types turns out to be recursive.
14328
14329         (ConvertReferenceExplicit): Implement array conversion.
14330
14331         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
14332
14333 2001-10-12  Ravi Pratap  <ravi@ximian.com>
14334
14335         * cs-parser.jay (delegate_declaration): Store the fully qualified
14336         name as it is a type declaration.
14337
14338         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
14339         readonly.
14340
14341         (DefineDelegate): Renamed from Define. Does the same thing essentially,
14342         as TypeContainer::DefineType.
14343
14344         (Populate): Method in which all the definition of the various methods (Invoke)
14345         etc is done.
14346
14347         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
14348         see.
14349
14350         (CloseDelegate): Finally creates the delegate.
14351
14352         * class.cs (TypeContainer::DefineType): Update to define delegates.
14353         (Populate, Emit and CloseType): Do the same thing here too.
14354
14355         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
14356         delegates in all these operations.
14357
14358 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
14359
14360         * expression.cs: LocalTemporary: a new expression used to
14361         reference a temporary that has been created.
14362
14363         * assign.cs: Handle PropertyAccess back here, so that we can
14364         provide the proper semantic access to properties.
14365
14366         * expression.cs (Expression::ConvertReferenceExplicit): Implement
14367         a few more explicit conversions. 
14368
14369         * modifiers.cs: `NEW' modifier maps to HideBySig.
14370
14371         * expression.cs (PropertyExpr): Make this into an
14372         ExpressionStatement, and support the EmitStatement code path. 
14373
14374         Perform get/set error checking, clean up the interface.
14375
14376         * assign.cs: recognize PropertyExprs as targets, and if so, turn
14377         them into toplevel access objects.
14378
14379 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
14380
14381         * expression.cs: PropertyExpr::PropertyExpr: use work around the
14382         SRE.
14383
14384         * typemanager.cs: Keep track here of our PropertyBuilders again to
14385         work around lameness in SRE.
14386
14387 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
14388
14389         * expression.cs (LValue::LValueResolve): New method in the
14390         interface, used to perform a second resolution pass for LValues. 
14391
14392         (This::DoResolve): Catch the use of this in static methods.
14393
14394         (This::LValueResolve): Implement.
14395
14396         (This::Store): Remove warning, assigning to `this' in structures
14397         is 
14398
14399         (Invocation::Emit): Deal with invocation of
14400         methods on value types.  We need to pass the address to structure
14401         methods rather than the object itself.  (The equivalent code to
14402         emit "this" for structures leaves the entire structure on the
14403         stack instead of a pointer to it). 
14404
14405         (ParameterReference::DoResolve): Compute the real index for the
14406         argument based on whether the method takes or not a `this' pointer
14407         (ie, the method is static).
14408
14409         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
14410         value types returned from functions when we need to invoke a
14411         method on the sturcture.
14412
14413
14414 2001-10-11  Ravi Pratap  <ravi@ximian.com>
14415
14416         * class.cs (TypeContainer::DefineType): Method to actually do the business of
14417         defining the type in the Modulebuilder or Typebuilder. This is to take
14418         care of nested types which need to be defined on the TypeBuilder using
14419         DefineNestedMethod.
14420
14421         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
14422         methods in RootContext, only ported to be part of TypeContainer.
14423
14424         (TypeContainer::GetInterfaceOrClass): Ditto.
14425
14426         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
14427
14428         * interface.cs (Interface::DefineInterface): New method. Does exactly
14429         what RootContext.CreateInterface did earlier, only it takes care of nested types 
14430         too.
14431
14432         (Interface::GetInterfaces): Move from RootContext here and port.
14433
14434         (Interface::GetInterfaceByName): Same here.
14435
14436         * rootcontext.cs (ResolveTree): Re-write.
14437
14438         (PopulateTypes): Re-write.
14439
14440         * class.cs (TypeContainer::Populate): Populate nested types too.
14441         (TypeContainer::Emit): Emit nested members too.
14442
14443         * typemanager.cs (AddUserType): Do not make use of the FullName property,
14444         instead just use the name argument passed in as it is already fully
14445         qualified.
14446
14447         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
14448         to TypeContainer mapping to see if a type is user-defined.
14449
14450         * class.cs (TypeContainer::CloseType): Implement. 
14451
14452         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
14453         the default constructor.
14454
14455         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
14456         twice.
14457
14458         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
14459
14460         * interface.cs (CloseType): Create the type here.
14461
14462         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
14463         the hierarchy.
14464
14465         Remove all the methods which are now in TypeContainer.
14466
14467 2001-10-10  Ravi Pratap  <ravi@ximian.com>
14468
14469         * delegate.cs (Define): Re-write bits to define the delegate
14470         correctly.
14471
14472 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
14473
14474         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
14475
14476         * expression.cs (ImplicitReferenceConversion): handle null as well
14477         as a source to convert to any reference type.
14478
14479         * statement.cs (Return): Perform any implicit conversions to
14480         expected return type.  
14481
14482         Validate use of return statement.  
14483
14484         * codegen.cs (EmitContext): Pass the expected return type here.
14485
14486         * class.cs (Method, Constructor, Property): Pass expected return
14487         type to EmitContext.
14488
14489 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
14490
14491         * expression.cs: Make DoResolve take an EmitContext instead of a
14492         TypeContainer.
14493
14494         Replaced `l' and `location' for `loc', for consistency.
14495
14496         (Error, Warning): Remove unneeded Tc argument.
14497
14498         * assign.cs, literal.cs, constant.cs: Update to new calling
14499         convention. 
14500
14501         * codegen.cs: EmitContext now contains a flag indicating whether
14502         code is being generated in a static method or not.
14503
14504         * cs-parser.jay: DecomposeQI, new function that replaces the old
14505         QualifiedIdentifier.  Now we always decompose the assembled
14506         strings from qualified_identifier productions into a group of
14507         memberaccesses.
14508
14509 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
14510
14511         * rootcontext.cs: Deal with field-less struct types correctly now
14512         by passing the size option to Define Type.
14513
14514         * class.cs: Removed hack that created one static field. 
14515
14516 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14517
14518         * statement.cs: Moved most of the code generation here. 
14519
14520 2001-10-09  Ravi Pratap  <ravi@ximian.com>
14521
14522         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
14523         seem very right.
14524
14525         (ElementAccess): Remove useless bits for now - keep checks as the spec
14526         says.
14527
14528 2001-10-08  Ravi Pratap  <ravi@ximian.com>
14529
14530         * expression.cs (ElementAccess::DoResolve): Remove my crap code
14531         and start performing checks according to the spec.
14532
14533 2001-10-07  Ravi Pratap  <ravi@ximian.com>
14534
14535         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
14536         rank_specifiers instead.
14537
14538         (rank_specifiers): Change the order in which the rank specifiers are stored
14539
14540         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
14541
14542         * expression.cs (ElementAccess): Implement the LValue interface too.
14543
14544 2001-10-06  Ravi Pratap  <ravi@ximian.com>
14545
14546         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
14547         except that user defined conversions are not included.
14548
14549         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
14550         perform the conversion of the return type, if necessary.
14551
14552         (New::DoResolve): Check whether we are creating an array or an object
14553         and accordingly do the needful.
14554
14555         (New::Emit): Same here.
14556
14557         (New::DoResolve): Implement guts of array creation.
14558
14559         (New::FormLookupType): Helper function.
14560
14561 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
14562
14563         * codegen.cs: Removed most of the code generation here, and move the
14564         corresponding code generation bits to the statement classes. 
14565
14566         Added support for try/catch/finalize and throw.
14567
14568         * cs-parser.jay: Added support for try/catch/finalize.
14569
14570         * class.cs: Catch static methods having the flags override,
14571         virtual or abstract.
14572
14573         * expression.cs (UserCast): This user cast was not really doing
14574         what it was supposed to do.  Which is to be born in fully resolved
14575         state.  Parts of the resolution were being performed at Emit time! 
14576
14577         Fixed this code.
14578
14579 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14580
14581         * expression.cs: Implicity convert the result from UserCast.
14582
14583 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14584
14585         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
14586         prevented it from working correctly. 
14587
14588         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
14589         merely ConvertImplicit.
14590
14591 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
14592
14593         * typemanager.cs: Make the LookupTypeContainer function static,
14594         and not per-instance.  
14595
14596         * class.cs: Make static FindMembers (the one that takes a Type
14597         argument). 
14598
14599         * codegen.cs: Add EmitForeach here.
14600
14601         * cs-parser.jay: Make foreach a toplevel object instead of the
14602         inline expansion, as we need to perform semantic analysis on it. 
14603
14604 2001-10-05  Ravi Pratap  <ravi@ximian.com>
14605
14606         * expression.cs (Expression::ImplicitUserConversion): Rename to
14607         UserDefinedConversion.
14608
14609         (Expression::UserDefinedConversion): Take an extra argument specifying 
14610         whether we look for explicit user conversions too.
14611
14612         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
14613
14614         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
14615
14616         (ExplicitUserConversion): Make it a call to UserDefinedConversion
14617         with the appropriate arguments.
14618
14619         * cs-parser.jay (cast_expression): Record location too.
14620
14621         * expression.cs (Cast): Record location info.
14622
14623         (Expression::ConvertExplicit): Take location argument.
14624
14625         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
14626         to determine if we are doing explicit conversions.
14627
14628         (UserCast::Emit): Update accordingly.
14629
14630         (Expression::ConvertExplicit): Report an error if everything fails.
14631
14632         * ../errors/cs0030.cs : Add.
14633
14634 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
14635
14636         * modifiers.cs: If the ABSTRACT keyword is present, also set the
14637         virtual and newslot bits. 
14638
14639         * class.cs (TypeContainer::RegisterRequiredImplementations):
14640         Record methods we need.
14641
14642         (TypeContainer::MakeKey): Helper function to make keys for
14643         MethodBases, since the Methodbase key is useless.
14644
14645         (TypeContainer::Populate): Call RegisterRequiredImplementations
14646         before defining the methods.   
14647
14648         Create a mapping for method_builders_to_methods ahead of time
14649         instead of inside a tight loop.
14650
14651         (::RequireMethods):  Accept an object as the data to set into the
14652         hashtable so we can report interface vs abstract method mismatch.
14653
14654 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14655
14656         * report.cs: Make all of it static.
14657
14658         * rootcontext.cs: Drop object_type and value_type computations, as
14659         we have those in the TypeManager anyways.
14660
14661         Drop report instance variable too, now it is a global.
14662
14663         * driver.cs: Use try/catch on command line handling.
14664
14665         Add --probe option to debug the error reporting system with a test
14666         suite. 
14667
14668         * report.cs: Add support for exiting program when a probe
14669         condition is reached.
14670
14671 2001-10-03  Ravi Pratap  <ravi@ximian.com>
14672
14673         * expression.cs (Binary::DoNumericPromotions): Fix the case when
14674         we do a forcible conversion regardless of type, to check if 
14675         ForceConversion returns a null.
14676
14677         (Binary::error19): Use location to report error.
14678
14679         (Unary::error23): Use location here too.
14680
14681         * ../errors/cs0019.cs : Check in.
14682
14683         * ../errors/cs0023.cs : Check in.
14684
14685         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
14686         case of a non-null MethodInfo object with a length of 0 !
14687
14688         (Binary::ResolveOperator): Flag error if overload resolution fails to find
14689         an applicable member - according to the spec :-)
14690         Also fix logic to find members in base types.
14691
14692         (Unary::ResolveOperator): Same here.
14693
14694         (Unary::report23): Change name to error23 and make first argument a TypeContainer
14695         as I was getting thoroughly confused between this and error19 :-)
14696
14697         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
14698         (::FindMostEncompassedType): Implement.
14699         (::FindMostEncompassingType): Implement.
14700         (::StandardConversionExists): Implement.
14701
14702         (UserImplicitCast): Re-vamp. We now need info about most specific
14703         source and target types so that we can do the necessary conversions.
14704
14705         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
14706         mathematical union with no duplicates.
14707
14708 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
14709
14710         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
14711         in order from base classes to child classes, so that we can in
14712         child classes look up in our parent for method names and
14713         attributes (required for handling abstract, virtual, new, override
14714         constructs: we need to instrospect our base class, and if we dont
14715         populate the classes in order, the introspection might be
14716         incorrect.  For example, a method could query its parent before
14717         the parent has any methods and would determine that the parent has
14718         no abstract methods (while it could have had them)).
14719
14720         (RootContext::CreateType): Record the order in which we define the
14721         classes.
14722
14723 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
14724
14725         * class.cs (TypeContainer::Populate): Also method definitions can
14726         fail now, keep track of this.
14727
14728         (TypeContainer::FindMembers): Implement support for
14729         DeclaredOnly/noDeclaredOnly flag.
14730
14731         (Constructor::Emit) Return the ConstructorBuilder.
14732
14733         (Method::Emit) Return the MethodBuilder. 
14734         Check for abstract or virtual methods to be public.
14735
14736         * rootcontext.cs (RootContext::CreateType): Register all the
14737         abstract methods required for the class to be complete and the
14738         interface methods that must be implemented. 
14739
14740         * cs-parser.jay: Report error 501 (method requires body if it is
14741         not marked abstract or extern).
14742
14743         * expression.cs (TypeOf::Emit): Implement.
14744
14745         * typemanager.cs: runtime_handle_type, new global type.
14746
14747         * class.cs (Property::Emit): Generate code for properties.
14748
14749 2001-10-02  Ravi Pratap  <ravi@ximian.com>
14750
14751         * expression.cs (Unary::ResolveOperator): Find operators on base type
14752         too - we now conform exactly to the spec.
14753
14754         (Binary::ResolveOperator): Same here.
14755
14756         * class.cs (Operator::Define): Fix minor quirk in the tests.
14757
14758         * ../errors/cs0215.cs : Added.
14759
14760         * ../errors/cs0556.cs : Added.
14761
14762         * ../errors/cs0555.cs : Added.
14763
14764 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14765
14766         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
14767         single integer which is really efficient
14768
14769 2001-10-01  Ravi Pratap  <ravi@ximian.com>
14770
14771         *  expression.cs (Expression::ImplicitUserConversion): Use location
14772         even in the case when we are examining True operators.
14773  
14774         * class.cs (Operator::Define): Perform extensive checks to conform
14775         with the rules for operator overloading in the spec.
14776
14777         * expression.cs (Expression::ImplicitReferenceConversion): Implement
14778         some of the other conversions mentioned in the spec.
14779
14780         * typemanager.cs (array_type): New static member for the System.Array built-in
14781         type.
14782
14783         (cloneable_interface): For System.ICloneable interface.
14784
14785         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
14786         we start resolving the tree and populating types.
14787
14788         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
14789  
14790 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
14791
14792         * expression.cs (Expression::ExprClassFromMemberInfo,
14793         Expression::Literalize): Create literal expressions from
14794         FieldInfos which are literals.
14795
14796         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
14797         type casts, because they were wrong.  The test suite in tests
14798         caught these ones.
14799
14800         (ImplicitNumericConversion): ushort to ulong requires a widening
14801         cast. 
14802
14803         Int32 constant to long requires widening cast as well.
14804
14805         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
14806         for integers because the type on the stack is not i4.
14807
14808 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
14809
14810         * expression.cs (report118): require location argument. 
14811
14812         * parameter.cs: Do not dereference potential null value.
14813
14814         * class.cs: Catch methods that lack the `new' keyword when
14815         overriding a name.  Report warnings when `new' is used without
14816         anything being there to override.
14817
14818         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
14819
14820         * class.cs: Only add constructor to hashtable if it is non-null
14821         (as now constructors can fail on define).
14822
14823         (TypeManager, Class, Struct): Take location arguments.
14824
14825         Catch field instance initialization in structs as errors.
14826
14827         accepting_filter: a new filter for FindMembers that is static so
14828         that we dont create an instance per invocation.
14829
14830         (Constructor::Define): Catch errors where a struct constructor is
14831         parameterless 
14832
14833         * cs-parser.jay: Pass location information for various new
14834         constructs. 
14835
14836         * delegate.cs (Delegate): take a location argument.
14837
14838         * driver.cs: Do not call EmitCode if there were problesm in the
14839         Definition of the types, as many Builders wont be there. 
14840
14841         * decl.cs (Decl::Decl): Require a location argument.
14842
14843         * cs-tokenizer.cs: Handle properly hex constants that can not fit
14844         into integers, and find the most appropiate integer for it.
14845
14846         * literal.cs: Implement ULongLiteral.
14847
14848         * rootcontext.cs: Provide better information about the location of
14849         failure when CreateType fails.
14850
14851 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
14852
14853         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
14854         as well.
14855
14856         * expression.cs (Binary::CheckShiftArguments): Add missing type
14857         computation.
14858         (Binary::ResolveOperator): Add type to the logical and and logical
14859         or, Bitwise And/Or and Exclusive Or code paths, it was missing
14860         before.
14861
14862         (Binary::DoNumericPromotions): In the case where either argument
14863         is ulong (and most signed types combined with ulong cause an
14864         error) perform implicit integer constant conversions as well.
14865
14866 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14867
14868         * expression.cs (UserImplicitCast): Method should always be
14869         non-null. 
14870         (Invocation::BetterConversion): Simplified test for IntLiteral.
14871
14872         (Expression::ImplicitNumericConversion): Split this routine out.
14873         Put the code that performs implicit constant integer conversions
14874         here. 
14875
14876         (Expression::Resolve): Become a wrapper around DoResolve so we can
14877         check eclass and type being set after resolve.
14878
14879         (Invocation::Badness): Remove this dead function
14880
14881         (Binary::ResolveOperator): Do not compute the expensive argumnets
14882         unless we have a union for it.
14883
14884         (Probe::Emit): Is needs to do an isinst and then
14885         compare against null.
14886
14887         (::CanConvert): Added Location argument.  If the Location argument
14888         is null (Location.Null), then we do not report errors.  This is
14889         used by the `probe' mechanism of the Explicit conversion.  We do
14890         not want to generate an error for something that the user
14891         explicitly requested to be casted.  But the pipeline for an
14892         explicit cast first tests for potential implicit casts.
14893
14894         So for now, if the Location is null, it means `Probe only' to
14895         avoid adding another argument.   Might have to revise this
14896         strategy later.
14897
14898         (ClassCast): New class used to type cast objects into arbitrary
14899         classes (used in Explicit Reference Conversions).
14900
14901         Implement `as' as well.
14902
14903         Reverted all the patches from Ravi below: they were broken:
14904
14905                 * The use of `level' as a mechanism to stop recursive
14906                   invocations is wrong.  That was there just to catch the
14907                   bug with a strack trace but not as a way of addressing
14908                   the problem.
14909
14910                   To fix the problem we have to *understand* what is going
14911                   on and the interactions and come up with a plan, not
14912                   just get things going.
14913
14914                 * The use of the type conversion cache that I proposed
14915                   last night had an open topic: How does this work across
14916                   protection domains.  A user defined conversion might not
14917                   be public in the location where we are applying the
14918                   conversion, a different conversion might be selected
14919                   (ie, private A->B (better) but public B->A (worse),
14920                   inside A, A->B applies, but outside it, B->A will
14921                   apply).
14922
14923                 * On top of that (ie, even if the above is solved),
14924                   conversions in a cache need to be abstract.  Ie, `To
14925                   convert from an Int to a Short use an OpcodeCast', not
14926                   `To convert from an Int to a Short use the OpcodeCast on
14927                   the variable 5' (which is what this patch was doing).
14928
14929 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14930
14931         * expression.cs (Invocation::ConversionExists): Re-write to use
14932         the conversion cache
14933
14934         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
14935         cache all conversions done, not just user-defined ones.
14936
14937         (Invocation::BetterConversion): The real culprit. Use ConversionExists
14938         to determine if a conversion exists instead of acutually trying to 
14939         perform the conversion. It's faster too.
14940
14941         (Expression::ConvertExplicit): Modify to use ConversionExists to check
14942         and only then attempt the implicit conversion.
14943
14944 2001-09-28  Ravi Pratap  <ravi@ximian.com>
14945
14946         * expression.cs (ConvertImplicit): Use a cache for conversions
14947         already found. Check level of recursion and bail out if necessary.
14948
14949 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
14950
14951         * typemanager.cs (string_concat_string_string, string_concat_object_object):
14952         Export standard methods that we expect for string operations.
14953
14954         * statement.cs (Block::UsageWarning): Track usage of variables and
14955         report the errors for not used variables.
14956
14957         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
14958         operator. 
14959
14960 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
14961
14962         * codegen.cs: remove unnneded code 
14963
14964         * expression.cs: Removed BuiltinTypeAccess class
14965
14966         Fix the order in which implicit conversions are
14967         done.  
14968
14969         The previous fixed dropped support for boxed conversions (adding a
14970         test to the test suite now)
14971
14972         (UserImplicitCast::CanConvert): Remove test for source being null,
14973         that code is broken.  We should not feed a null to begin with, if
14974         we do, then we should track the bug where the problem originates
14975         and not try to cover it up here.
14976
14977         Return a resolved expression of type UserImplicitCast on success
14978         rather than true/false.  Ravi: this is what I was talking about,
14979         the pattern is to use a static method as a "constructor" for
14980         objects. 
14981
14982         Also, do not create arguments until the very last minute,
14983         otherwise we always create the arguments even for lookups that
14984         will never be performed. 
14985
14986         (UserImplicitCast::Resolve): Eliminate, objects of type
14987         UserImplicitCast are born in a fully resolved state. 
14988
14989         * typemanager.cs (InitCoreTypes): Init also value_type
14990         (System.ValueType). 
14991
14992         * expression.cs (Cast::Resolve): First resolve the child expression.
14993
14994         (LValue): Add new method AddressOf to be used by
14995         the `&' operator.  
14996
14997         Change the argument of Store to take an EmitContext instead of an
14998         ILGenerator, because things like FieldExpr need to be able to call
14999         their children expression to generate the instance code. 
15000
15001         (Expression::Error, Expression::Warning): Sugar functions for
15002         reporting errors.
15003
15004         (Expression::MemberLookup): Accept a TypeContainer instead of a
15005         Report as the first argument.
15006
15007         (Expression::ResolvePrimary): Killed.  I still want to improve
15008         this as currently the code is just not right.
15009
15010         (Expression::ResolveMemberAccess): Simplify, but it is still
15011         wrong. 
15012
15013         (Unary::Resolve): Catch errors in AddressOf operators.
15014
15015         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
15016         index to a byte for the short-version, or the compiler will choose
15017         the wrong Emit call, which generates the wrong data.
15018
15019         (ParameterReference::Emit, ::Store): same.
15020
15021         (FieldExpr::AddressOf): Implement.
15022
15023         * typemanager.cs: TypeManager: made public variable instead of
15024         property.
15025
15026         * driver.cs: document --fatal.
15027
15028         * report.cs (ErrorMessage, WarningMessage): new names for the old
15029         Error and Warning classes.
15030
15031         * cs-parser.jay (member_access): Turn built-in access to types
15032         into a normal simplename
15033
15034 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15035
15036         * expression.cs (Invocation::BetterConversion): Fix to cope
15037         with q being null, since this was introducing a bug.
15038
15039         * expression.cs (ConvertImplicit): Do built-in conversions first.
15040
15041 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15042
15043         * expression.cs (UserImplicitCast::Resolve): Fix bug.
15044
15045 2001-09-27  Ravi Pratap  <ravi@ximian.com>
15046
15047         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
15048         I had introduced long ago (what's new ?).
15049
15050         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
15051         the work of all the checking. 
15052         (ConvertImplicit): Call CanConvert and only then create object if necessary.
15053         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
15054
15055         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
15056         that is the right way. 
15057
15058         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
15059         overloading resolution. Use everywhere instead of cutting and pasting code.
15060
15061         (Binary::ResolveOperator): Use MakeUnionSet.
15062
15063         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
15064         we have to convert to bool types. Not complete yet.
15065
15066 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
15067
15068         * typemanager.cs (TypeManager::CSharpName): support ushort.
15069
15070         * expression.cs (Expression::TryImplicitIntConversion): Attempts
15071         to provide an expression that performsn an implicit constant int
15072         conversion (section 6.1.6).
15073         (Expression::ConvertImplicitRequired): Reworked to include
15074         implicit constant expression conversions.
15075
15076         (Expression::ConvertNumericExplicit): Finished.
15077
15078         (Invocation::Emit): If InstanceExpression is null, then it means
15079         that we perform a call on this.
15080
15081 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15082
15083         * expression.cs (Unary::Emit): Remove some dead code.
15084         (Probe): Implement Resolve and Emit for `is'.
15085         (Expression::ConvertImplicitRequired): Attempt to do constant
15086         expression conversions here.  Maybe should be moved to
15087         ConvertImplicit, but I am not sure.
15088         (Expression::ImplicitLongConstantConversionPossible,
15089         Expression::ImplicitIntConstantConversionPossible): New functions
15090         that tell whether is it possible to apply an implicit constant
15091         expression conversion.
15092
15093         (ConvertNumericExplicit): Started work on explicit numeric
15094         conversions.
15095
15096         * cs-parser.jay: Update operator constants.
15097
15098         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
15099         (Parameters::GetSignature): Hook up VerifyArgs here.
15100         (Parameters::VerifyArgs): Verifies that no two arguments have the
15101         same name. 
15102
15103         * class.cs (Operator): Update the operator names to reflect the
15104         ones that the spec expects (as we are just stringizing the
15105         operator names).
15106
15107         * expression.cs (Unary::ResolveOperator): Fix bug: Use
15108         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
15109         previous usage did only work for our methods.
15110         (Expression::ConvertImplicit): Handle decimal implicit numeric
15111         conversions as well.
15112         (Expression::InternalTypeConstructor): Used to invoke constructors
15113         on internal types for default promotions.
15114
15115         (Unary::Emit): Implement special handling for the pre/post
15116         increment/decrement for overloaded operators, as they need to have
15117         the same semantics as the other operators.
15118
15119         (Binary::ResolveOperator): ditto.
15120         (Invocation::ConversionExists): ditto.
15121         (UserImplicitCast::Resolve): ditto.
15122
15123 2001-09-26  Ravi Pratap  <ravi@ximian.com>
15124
15125         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
15126         operator, return after emitting body. Regression tests pass again !
15127
15128         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
15129         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
15130         (Invocation::OverloadResolve): Ditto.
15131         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
15132
15133         * everywhere : update calls to the above methods accordingly.
15134
15135 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
15136
15137         * assign.cs (Assign): Make it inherit from ExpressionStatement.
15138
15139         * expression.cs (ExpressionStatement): New base class used for
15140         expressions that can appear in statements, so that we can provide
15141         an alternate path to generate expression that do not leave a value
15142         on the stack.
15143
15144         (Expression::Emit, and all the derivatives): We no longer return
15145         whether a value is left on the stack or not.  Every expression
15146         after being emitted leaves a single value on the stack.
15147
15148         * codegen.cs (EmitContext::EmitStatementExpression): Use the
15149         facilties of ExpressionStatement if possible.
15150
15151         * cs-parser.jay: Update statement_expression.
15152
15153 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
15154
15155         * driver.cs: Change the wording of message
15156
15157 2001-09-25  Ravi Pratap  <ravi@ximian.com>
15158
15159         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
15160         the type of the expression to the return type of the method if
15161         we have an overloaded operator match ! The regression tests pass again !
15162         (Unary::ResolveOperator): Ditto.
15163
15164         * expression.cs (Invocation::ConversionExists): Correct the member lookup
15165         to find "op_Implicit", not "implicit" ;-)
15166         (UserImplicitCast): New class to take care of user-defined implicit conversions.
15167         (ConvertImplicit, ForceConversion): Take TypeContainer argument
15168
15169         * everywhere : Correct calls to the above accordingly.
15170
15171         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
15172         (ConvertImplicit): Do user-defined conversion if it exists.
15173
15174 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
15175
15176         * assign.cs: track location.
15177         (Resolve): Use implicit conversions on assignment.
15178
15179         * literal.cs: Oops.  Not good, Emit of short access values should
15180         pass (Bytes) or the wrong argument will be selected.
15181
15182         * expression.cs (Unary::Emit): Emit code for -expr.
15183
15184         (Unary::ResolveOperator): Handle `Substract' for non-constants
15185         (substract from zero from the non-constants).
15186         Deal with Doubles as well. 
15187
15188         (Expression::ConvertImplicitRequired): New routine that reports an
15189         error if no implicit conversion exists. 
15190
15191         (Invocation::OverloadResolve): Store the converted implicit
15192         expressions if we make them
15193
15194 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15195
15196         * class.cs (ConstructorInitializer): Take a Location argument.
15197         (ConstructorBaseInitializer): Same here.
15198         (ConstructorThisInitializer): Same here.
15199
15200         * cs-parser.jay : Update all calls accordingly.
15201
15202         * expression.cs (Unary, Binary, New): Take location argument.
15203         Update accordingly everywhere.
15204
15205         * cs-parser.jay : Update all calls to the above to take a location
15206         argument.
15207
15208         * class.cs : Ditto.
15209
15210 2001-09-24  Ravi Pratap  <ravi@ximian.com>
15211
15212         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
15213         (Invocation::BetterConversion): Same here
15214         (Invocation::ConversionExists): Ditto.
15215
15216         (Invocation::ConversionExists): Implement.
15217
15218 2001-09-22  Ravi Pratap  <ravi@ximian.com>
15219
15220         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
15221         Also take an additional TypeContainer argument.
15222
15223         * All over : Pass in TypeContainer as argument to OverloadResolve.
15224
15225         * typemanager.cs (CSharpName): Update to check for the string type and return
15226         that too.
15227
15228         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
15229         a given method.
15230
15231 2001-09-21  Ravi Pratap  <ravi@ximian.com>
15232
15233         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
15234         (Invocation::BetterFunction): Implement.
15235         (Invocation::BetterConversion): Implement.
15236         (Invocation::ConversionExists): Skeleton, no implementation yet.
15237
15238         Okay, things work fine !
15239
15240 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
15241
15242         * typemanager.cs: declare and load enum_type, delegate_type and
15243         void_type. 
15244
15245         * expression.cs (Expression::Emit): Now emit returns a value that
15246         tells whether a value is left on the stack or not.  This strategy
15247         might be reveted tomorrow with a mechanism that would address
15248         multiple assignments.
15249         (Expression::report118): Utility routine to report mismatches on
15250         the ExprClass.
15251
15252         (Unary::Report23): Report impossible type/operator combination
15253         utility function.
15254
15255         (Unary::IsIncrementableNumber): Whether the type can be
15256         incremented or decremented with add.
15257         (Unary::ResolveOperator): Also allow enumerations to be bitwise
15258         complemented. 
15259         (Unary::ResolveOperator): Implement ++, !, ~,
15260
15261         (Invocation::Emit): Deal with new Emit convetion.
15262
15263         * All Expression derivatives: Updated their Emit method to return
15264         whether they leave values on the stack or not.
15265
15266         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
15267         stack for expressions that are statements. 
15268
15269 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15270
15271         * expression.cs (LValue): New interface.  Must be implemented by
15272         LValue objects.
15273         (LocalVariableReference, ParameterReference, FieldExpr): Implement
15274         LValue interface.
15275
15276         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
15277         interface for generating code, simplifies the code.
15278
15279 2001-09-20  Ravi Pratap  <ravi@ximian.com>
15280
15281         * expression.cs (everywhere): Comment out return statements in ::Resolve
15282         methods to avoid the warnings.
15283
15284 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
15285
15286         * driver.cs (parse): Report error 2001 if we can not open the
15287         source file.
15288
15289         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
15290         not resolve it.
15291
15292         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
15293         object. 
15294
15295         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
15296         otherwise nested blocks end up with the same index.
15297
15298         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
15299
15300         * expression.cs:  Instead of having FIXMEs in the Resolve
15301         functions, throw exceptions so it is obvious that we are facing a
15302         bug. 
15303
15304         * cs-parser.jay (invocation_expression): Pass Location information.
15305
15306         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
15307         Use a basename for those routines because .NET does not like paths
15308         on them. 
15309
15310         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
15311         already defined.
15312
15313 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
15314
15315         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
15316         are loading the correct data types (throws an exception if not).
15317         (TypeManager::InitCoreTypes): Use CoreLookupType
15318
15319         * expression.cs (Unary::ResolveOperator): return the child
15320         expression for expressions which are just +expr.
15321         (Unary::ResolveOperator): Return negative literals for -LITERAL
15322         expressions (otherwise they are Unary {Literal}).
15323         (Invocation::Badness): Take into account `Implicit constant
15324         expression conversions'.
15325
15326         * literal.cs (LongLiteral): Implement long literal class.
15327         (IntLiteral): export the `Value' of the intliteral. 
15328
15329 2001-09-19  Ravi Pratap  <ravi@ximian.com>
15330
15331         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
15332
15333         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
15334         instead of 'Operator'
15335
15336         * expression.cs (Binary::ResolveOperator): Update accordingly.
15337         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
15338         and 'Minus'
15339
15340         * cs-parser.jay (unary_expression): Update to use the new names.
15341
15342         * gen-treedump.cs (GetUnary): Same here.
15343
15344         * expression.cs (Unary::Resolve): Implement.
15345         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
15346         operators are found instead of making noise ;-)
15347         (Unary::ResolveOperator): New method to do precisely the same thing which
15348         Binary::ResolveOperator does for Binary expressions.
15349         (Unary.method, .Arguments): Add.
15350         (Unary::OperName): Implement.   
15351         (Unary::ForceConversion): Copy and Paste !
15352
15353         * class.cs (Operator::Define): Fix a small bug for the case when we have 
15354         a unary operator.
15355
15356         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
15357         for the inbuilt operators. Only overloading works for now ;-)
15358
15359 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
15360
15361         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
15362         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
15363
15364         * expression.cs (This::Emit): Implement. 
15365         (This::Resolve): Implement.
15366         (TypeOf:Resolve): Implement.
15367         (Expression::ResolveSimpleName): Add an implicit this to instance
15368         field references. 
15369         (MemberAccess::Resolve): Deal with Parameters and Fields. 
15370         Bind instance variable to Field expressions.
15371         (FieldExpr::Instance): New field used to track the expression that
15372         represents the object instance.
15373         (FieldExpr::Resolve): Track potential errors from MemberLookup not
15374         binding 
15375         (FieldExpr::Emit): Implement.
15376
15377         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
15378         the last instruction contains a return opcode to avoid generating
15379         the last `ret' instruction (this generates correct code, and it is
15380         nice to pass the peverify output).
15381
15382         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
15383         initializer for static and instance variables.
15384         (Constructor::Emit): Allow initializer to be null in the case of
15385         static constructors.  Only emit initializer for instance
15386         constructors. 
15387
15388         (TypeContainer::FindMembers): Return a null array if there are no
15389         matches.
15390
15391         Also fix the code for the MemberTypes.Method branch, as it was not
15392         scanning that for operators (or tried to access null variables before).
15393
15394         * assign.cs (Assign::Emit): Handle instance and static fields. 
15395
15396         * TODO: Updated.
15397
15398         * driver.cs: Stop compilation if there are parse errors.
15399
15400         * cs-parser.jay (constructor_declaration): Provide default base
15401         initializer for non-static constructors.
15402         (constructor_declarator): Do not provide a default base
15403         initializers if none was specified.
15404         Catch the fact that constructors should not have parameters.
15405
15406         * class.cs: Do not emit parent class initializers for static
15407         constructors, that should be flagged as an error.
15408
15409 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15410
15411         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
15412         Move back code into TypeContainer::Populate.
15413
15414 2001-09-18  Ravi Pratap  <ravi@ximian.com>
15415
15416         * class.cs (TypeContainer::AddConstructor): Fix the check to
15417         compare against Name, not Basename. 
15418         (Operator::OpType): Change Plus and Minus to Add and Subtract.
15419
15420         * cs-parser.jay : Update accordingly.
15421
15422         * class.cs (TypeContainer::FindMembers): For the case where we are searching
15423         for methods, don't forget to look into the operators too.
15424         (RegisterMethodBuilder): Helper method to take care of this for
15425         methods, constructors and operators.
15426         (Operator::Define): Completely revamp.
15427         (Operator.OperatorMethod, MethodName): New fields.
15428         (TypeContainer::Populate): Move the registering of builders into
15429         RegisterMethodBuilder.
15430         (Operator::Emit): Re-write.
15431
15432         * expression.cs (Binary::Emit): Comment out code path to emit method
15433         invocation stuff for the case when we have a user defined operator. I am
15434         just not able to get it right !
15435
15436 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15437
15438         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
15439         argument. 
15440
15441         (Expression::MemberLookup): Provide a version that allows to
15442         specify the MemberTypes and BindingFlags. 
15443
15444         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
15445         so it was not fetching variable information from outer blocks.
15446
15447         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
15448         Beforefieldinit as it was buggy.
15449
15450         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
15451         that Ravi put here.  
15452
15453         * class.cs (Constructor::Emit): Only emit if block is not null.
15454         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
15455         deal with this by semantically definining it as if the user had
15456         done it.
15457
15458         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
15459         constructors as we now "emit" them at a higher level.
15460
15461         (TypeContainer::DefineDefaultConstructor): Used to define the
15462         default constructors if none was provided.
15463
15464         (ConstructorInitializer): Add methods Resolve and Emit. 
15465
15466         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
15467
15468 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15469
15470         * class.cs (TypeContainer::EmitDefaultConstructor): Register
15471         the default constructor builder with our hashtable for methodbuilders
15472         to methodcores.
15473
15474         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
15475         and argument_count is 0 in which case we have a match.
15476         (Binary::ResolveOperator): More null checking and miscellaneous coding
15477         style cleanup.
15478
15479 2001-09-17  Ravi Pratap  <ravi@ximian.com>
15480
15481         * rootcontext.cs (IsNameSpace): Compare against null.
15482
15483         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
15484
15485         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
15486         and Unary::Operator.
15487
15488         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
15489         accordingly.
15490
15491         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
15492         we have overloaded operators.
15493         (Binary::ResolveOperator): Implement the part which does the operator overload
15494         resolution.
15495
15496         * class.cs (Operator::Emit): Implement.
15497         (TypeContainer::Emit): Emit the operators we have too.
15498
15499         * expression.cs (Binary::Emit): Update to emit the appropriate code for
15500         the case when we have a user-defined operator.
15501
15502 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
15503
15504         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
15505
15506 2001-09-16  Ravi Pratap  <ravi@ximian.com>
15507
15508         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
15509         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
15510         (Constructor::Emit): Implement.
15511         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
15512         if we have no work to do. 
15513         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
15514         Emit method.
15515
15516         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
15517         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
15518
15519         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
15520         of parent.parent.
15521
15522 2001-09-15  Ravi Pratap  <ravi@ximian.com>
15523
15524         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
15525         in the source.
15526         (Tree::RecordNamespace): Method to do what the name says ;-)
15527         (Tree::Namespaces): Property to get at the namespaces hashtable.
15528
15529         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
15530         keep track.
15531
15532         * rootcontext.cs (IsNamespace): Fixed it :-)
15533
15534 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15535
15536         * class.cs (TypeContainer::FindMembers): Add support for
15537         constructors. 
15538         (MethodCore): New class that encapsulates both the shared aspects
15539         of a Constructor and a Method.  
15540         (Method, Constructor): Factored pieces into MethodCore.
15541
15542         * driver.cs: Added --fatal which makes errors throw exceptions.
15543         Load System assembly as well as part of the standard library.
15544
15545         * report.cs: Allow throwing exceptions on errors for debugging.
15546
15547         * modifiers.cs: Do not use `parent', instead use the real type
15548         container to evaluate permission settings.
15549
15550         * class.cs: Put Ravi's patch back in.  He is right, and we will
15551         have to cope with the
15552
15553 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15554
15555         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
15556         FamORAssem, not FamANDAssem.
15557
15558 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
15559
15560         * driver.cs: Added --parse option that only parses its input files
15561         and terminates.
15562
15563         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
15564         incorrect.  IsTopLevel is not used to tell whether an object is
15565         root_types or not (that can be achieved by testing this ==
15566         root_types).  But to see if this is a top-level *class* (not
15567         necessarly our "toplevel" container). 
15568
15569 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15570
15571         * enum.cs (Enum::Define): Modify to call the Lookup method on the
15572         parent instead of a direct call to GetType.
15573
15574 2001-09-14  Ravi Pratap  <ravi@ximian.com>
15575
15576         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
15577         Modifiers.TypeAttr. This should just be a call to that method.
15578
15579         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
15580         object so that we can determine if we are top-level or not.
15581
15582         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
15583         TypeContainer too.
15584
15585         * enum.cs (Enum::Define): Ditto.
15586
15587         * modifiers.cs (FieldAttr): Re-write.
15588
15589         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
15590         (TypeContainer::HaveStaticConstructor): New property to provide access
15591         to precisely that info.
15592
15593         * modifiers.cs (MethodAttr): Re-write.
15594         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
15595
15596         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
15597         of top-level types as claimed.
15598
15599 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15600
15601         * expression.cs (MemberLookup): Fruitless attempt to lookup
15602         constructors.  Maybe I need to emit default constructors?  That
15603         might be it (currently .NET emits this for me automatically).
15604         (Invocation::OverloadResolve): Cope with Arguments == null.
15605         (Invocation::EmitArguments): new function, shared by the new
15606         constructor and us.
15607         (Invocation::Emit): Handle static and instance methods.  Emit
15608         proper call instruction for virtual or non-virtual invocations.
15609         (New::Emit): Implement.
15610         (New::Resolve): Implement.
15611         (MemberAccess:Resolve): Implement.
15612         (MethodGroupExpr::InstanceExpression): used conforming to the spec
15613         to track instances.
15614         (FieldExpr::Resolve): Set type.
15615
15616         * support.cs: Handle empty arguments.
15617                 
15618         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
15619         SimpleLookup): Auxiliary routines to help parse a qualifier
15620         identifier.  
15621
15622         Update qualifier_identifier rule.
15623
15624         * codegen.cs: Removed debugging messages.
15625
15626         * class.cs: Make this a global thing, this acts just as a "key" to
15627         objects that we might have around.
15628
15629         (Populate): Only initialize method_builders_to_methods once.
15630
15631         * expression.cs (PropertyExpr): Initialize type from the
15632         PropertyType. 
15633
15634         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
15635         Resolve pattern.  Attempt to implicitly convert value to boolean.
15636         Emit code.
15637
15638         * expression.cs: Set the type for the int32/int32 argument case.
15639         (Binary::ResolveOperator): Set the return type to boolean for
15640         comparission operators
15641
15642         * typemanager.cs: Remove debugging print code.
15643
15644         (Invocation::Resolve): resolve type.
15645
15646         * class.cs: Allocate a MemberInfo of the correct size, as the code
15647         elsewhere depends on the test to reflect the correct contents.
15648
15649         (Method::) Keep track of parameters, due to System.Reflection holes
15650
15651         (TypeContainer::Populate): Keep track of MethodBuilders to Method
15652         mapping here.
15653
15654         (TypeContainer::FindMembers): Use ArrayList and then copy an array
15655         of the exact size and return that.
15656
15657         (Class::LookupMethodByBuilder): New function that maps
15658         MethodBuilders to its methods.  Required to locate the information
15659         on methods because System.Reflection bit us again.
15660
15661         * support.cs: New file, contains an interface ParameterData and
15662         two implementations: ReflectionParameters and InternalParameters
15663         used to access Parameter information.  We will need to grow this
15664         as required.
15665
15666         * expression.cs (Invocation::GetParameterData): implement a cache
15667         and a wrapper around the ParameterData creation for methods. 
15668         (Invocation::OverloadResolve): Use new code.
15669
15670 2001-09-13  Ravi Pratap  <ravi@ximian.com>
15671
15672         * class.cs (TypeContainer::EmitField): Remove and move into 
15673         (Field::Define): here and modify accordingly.
15674         (Field.FieldBuilder): New member.
15675         (TypeContainer::Populate): Update accordingly.
15676         (TypeContainer::FindMembers): Implement.
15677
15678 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
15679
15680         * statement.cs: (VariableInfo::VariableType): New field to be
15681         initialized with the full type once it is resolved. 
15682
15683 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
15684
15685         * parameter.cs (GetParameterInfo): Use a type cache to compute
15686         things only once, and to reuse this information
15687
15688         * expression.cs (LocalVariableReference::Emit): Implement.
15689         (OpcodeCast::Emit): fix.
15690
15691         (ParameterReference::Resolve): Implement.
15692         (ParameterReference::Emit): Implement.
15693
15694         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
15695         that are expressions need to stay as Expressions.
15696
15697         * typemanager.cs (CSharpName): Returns the C# name of a type if
15698         possible. 
15699
15700         * expression.cs (Expression::ConvertImplicit): New function that
15701         implements implicit type conversions.
15702
15703         (Expression::ImplicitReferenceConversion): Implements implicit
15704         reference conversions.
15705
15706         (EmptyCast): New type for transparent casts.
15707
15708         (OpcodeCast): New type for casts of types that are performed with
15709         a sequence of bytecodes.
15710
15711         (BoxedCast): New type used for casting value types into reference
15712         types.  Emits a box opcode.
15713
15714         (Binary::DoNumericPromotions): Implements numeric promotions of
15715         and computation of the Binary::Type.
15716
15717         (Binary::EmitBranchable): Optimization.
15718
15719         (Binary::Emit): Implement code emission for expressions.
15720
15721         * typemanager.cs (TypeManager): Added two new core types: sbyte
15722         and byte.
15723
15724 2001-09-12  Ravi Pratap  <ravi@ximian.com>
15725
15726         * class.cs (TypeContainer::FindMembers): Method which does exactly
15727         what Type.FindMembers does, only we don't have to use reflection. No
15728         implementation yet.
15729
15730         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
15731         typecontainer objects as we need to get at them.
15732         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
15733
15734         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
15735         typecontainer object.
15736
15737         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
15738         of just a Report object.
15739
15740 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15741
15742         * class.cs (Event::Define): Go back to using the prefixes "add_" and
15743         "remove_"
15744         (TypeContainer::Populate): Now define the delegates of the type too.
15745         (TypeContainer.Delegates): Property to access the list of delegates defined
15746         in the type.
15747
15748         * delegates.cs (Delegate::Define): Implement partially.
15749
15750         * modifiers.cs (TypeAttr): Handle more flags.
15751
15752 2001-09-11  Ravi Pratap  <ravi@ximian.com>
15753
15754         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
15755         and not <=
15756         (Operator::Define): Re-write logic to get types by using the LookupType method
15757         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
15758         (Indexer::Define): Ditto.
15759         (Event::Define): Ditto.
15760         (Property::Define): Ditto.
15761
15762 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15763
15764         * class.cs (TypeContainer::Populate): Now define operators too. 
15765         (TypeContainer.Operators): New property to access the list of operators
15766         in a type.
15767         (Operator.OperatorMethodBuilder): New member to hold the method builder
15768         for the operator we are defining.
15769         (Operator::Define): Implement.
15770
15771 2001-09-10  Ravi Pratap  <ravi@ximian.com>
15772
15773         * class.cs (Event::Define): Make the prefixes of the accessor methods
15774         addOn_ and removeOn_ 
15775
15776         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
15777         of the location being passed in too. Ideally, this should go later since all
15778         error reporting should be done through the Report object.
15779
15780         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
15781         (Populate): Iterate thru the indexers we have and define them too.
15782         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
15783         for the get and set accessors.
15784         (Indexer::Define): Implement.
15785
15786 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
15787
15788         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
15789         my previous implementation, did not work.
15790
15791         * typemanager.cs: Add a couple of missing types (the longs).
15792
15793         * literal.cs: Use TypeManager.bool_type instead of getting it.
15794
15795         * expression.cs (EventExpr): New kind of expressions.
15796         (Expressio::ExprClassFromMemberInfo): finish
15797
15798 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
15799
15800         * assign.cs: Emit stores to static fields differently.
15801
15802 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15803
15804         * Merge in changes and adjust code to tackle conflicts. Backed out my
15805         code in Assign::Resolve ;-) 
15806
15807 2001-09-08  Ravi Pratap  <ravi@ximian.com>
15808
15809         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
15810         instead Report.Error and also pass in the location.
15811         (CSharpParser::Lexer): New readonly property to return the reference
15812         to the Tokenizer object.
15813         (declare_local_variables): Use Report.Error with location instead of plain 
15814         old error.
15815         (CheckDef): Ditto.
15816
15817         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
15818         (Operator.CheckBinaryOperator): Ditto.
15819
15820         * cs-parser.jay (operator_declarator): Update accordingly.
15821
15822         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
15823         (CheckBinaryOperator): Same here.
15824
15825         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
15826         on the name without any prefixes of namespace names etc. This is because we
15827         already might have something already fully qualified like 
15828         'System.Console.WriteLine'
15829
15830         * assign.cs (Resolve): Begin implementation. Stuck ;-)
15831
15832 2001-09-07  Ravi Pratap  <ravi@ximian.com>
15833
15834         * cs-tokenizer.cs (location): Return a string which also contains
15835         the file name.
15836
15837         * expression.cs (ElementAccess): New class for expressions of the
15838         type 'element access.'
15839         (BaseAccess): New class for expressions of the type 'base access.'
15840         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
15841         respectively.
15842
15843         * cs-parser.jay (element_access): Implement action.
15844         (base_access): Implement actions.
15845         (checked_expression, unchecked_expression): Implement.
15846
15847         * cs-parser.jay (local_variable_type): Correct and implement.
15848         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
15849
15850         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
15851
15852         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
15853         name and the specifiers.
15854
15855         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
15856
15857         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
15858         making them all public ;-)
15859
15860         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
15861         class anyways.
15862
15863 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
15864
15865         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
15866         PropertyExprs.
15867         (FieldExpr, PropertyExprs): New resolved expressions.
15868         (SimpleName::MemberStaticCheck): Perform static checks for access
15869         to non-static fields on static methods. Maybe this should be
15870         generalized for MemberAccesses. 
15871         (SimpleName::ResolveSimpleName): More work on simple name
15872         resolution. 
15873
15874         * cs-parser.jay (primary_expression/qualified_identifier): track
15875         the parameter index.
15876
15877         * codegen.cs (CodeGen::Save): Catch save exception, report error.
15878         (EmitContext::EmitBoolExpression): Chain to expression generation
15879         instead of temporary hack.
15880         (::EmitStatementExpression): Put generic expression code generation.
15881
15882         * assign.cs (Assign::Emit): Implement variable assignments to
15883         local variables, parameters and fields.
15884
15885 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
15886
15887         * statement.cs (Block::GetVariableInfo): New method, returns the
15888         VariableInfo for a variable name in a block.
15889         (Block::GetVariableType): Implement in terms of GetVariableInfo
15890
15891         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
15892         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
15893
15894 2001-09-06  Ravi Pratap  <ravi@ximian.com>
15895
15896         * cs-parser.jay (operator_declaration): Continue on my quest : update
15897         to take attributes argument.
15898         (event_declaration): Ditto.
15899         (enum_declaration): Ditto.
15900         (indexer_declaration): Ditto.
15901
15902         * class.cs (Operator::Operator): Update constructor accordingly.
15903         (Event::Event): Ditto.
15904
15905         * delegate.cs (Delegate::Delegate): Same here.
15906
15907         * enum.cs (Enum::Enum): Same here.
15908
15909 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15910
15911         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
15912
15913         * ../tests/cs0658.cs : New file to demonstrate error 0658.
15914
15915         * attribute.cs (Attributes): New class to encapsulate all attributes which were
15916         being passed around as an arraylist.
15917         (Attributes::AddAttribute): Method to add attribute sections.
15918
15919         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
15920         (struct_declaration): Update accordingly.
15921         (constant_declaration): Update.
15922         (field_declaration): Update.
15923         (method_header): Update.
15924         (fixed_parameter): Update.
15925         (parameter_array): Ditto.
15926         (property_declaration): Ditto.
15927         (destructor_declaration): Ditto.
15928
15929         * class.cs (Struct::Struct): Update constructors accordingly.
15930         (Class::Class): Ditto.
15931         (Field::Field): Ditto.
15932         (Method::Method): Ditto.
15933         (Property::Property): Ditto.
15934         (TypeContainer::OptAttribute): update property's return type.
15935
15936         * interface.cs (Interface.opt_attributes): New member.
15937         (Interface::Interface): Update to take the extra Attributes argument.
15938
15939         * parameter.cs (Parameter::Parameter): Ditto.
15940
15941         * constant.cs (Constant::Constant): Ditto.
15942
15943         * interface.cs (InterfaceMemberBase): New OptAttributes field.
15944         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
15945         the attributes as a parameter.
15946         (InterfaceProperty): Update constructor call.
15947         (InterfaceEvent): Ditto.
15948         (InterfaceMethod): Ditto.
15949         (InterfaceIndexer): Ditto.
15950
15951         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
15952         pass the attributes too.
15953         (interface_event_declaration): Ditto.
15954         (interface_property_declaration): Ditto.
15955         (interface_method_declaration): Ditto.
15956         (interface_declaration): Ditto.
15957
15958 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
15959
15960         * class.cs (Method::Define): Track the "static Main" definition to
15961         create an entry point. 
15962
15963         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
15964         EntryPoint if we find it. 
15965
15966         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
15967         (EmitContext::ig): Make this variable public.
15968
15969         * driver.cs: Make the default output file be the first file name
15970         with the .exe extension.  
15971
15972         Detect empty compilations
15973
15974         Handle various kinds of output targets.  Handle --target and
15975         rename -t to --dumper.
15976
15977         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
15978         methods inherited from Expression return now an Expression.  This
15979         will is used during the tree rewriting as we resolve them during
15980         semantic analysis.
15981
15982         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
15983         the spec.  Missing entirely is the information about
15984         accessability of elements of it.
15985
15986         (Expression::ExprClassFromMemberInfo): New constructor for
15987         Expressions that creates a fully initialized Expression based on
15988         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
15989         a Type.
15990
15991         (Invocation::Resolve): Begin implementing resolution of invocations.
15992
15993         * literal.cs (StringLiteral):  Implement Emit.
15994
15995 2001-09-05  Ravi Pratap  <ravi@ximian.com>
15996
15997         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
15998         member.
15999
16000 2001-09-04  Ravi Pratap  <ravi@ximian.com>
16001
16002         * cs-parser.jay (attribute_arguments): Implement actions.
16003         (attribute): Fix bug in production. Implement action.
16004         (attribute_list): Implement.
16005         (attribute_target): Implement.
16006         (attribute_target_specifier, opt_target_specifier): Implement
16007         (CheckAttributeTarget): New method to check if the attribute target
16008         is valid.
16009         (attribute_section): Implement.
16010         (opt_attributes): Implement.
16011
16012         * attribute.cs : New file to handle attributes.
16013         (Attribute): Class to hold attribute info.
16014
16015         * cs-parser.jay (opt_attribute_target_specifier): Remove production
16016         (attribute_section): Modify production to use 2 different rules to 
16017         achieve the same thing. 1 s/r conflict down !
16018         Clean out commented, useless, non-reducing dimension_separator rules.
16019
16020         * class.cs (TypeContainer.attributes): New member to hold list
16021         of attributes for a type.
16022         (Struct::Struct): Modify to take one more argument, the attribute list.
16023         (Class::Class): Ditto.
16024         (Field::Field): Ditto.
16025         (Method::Method): Ditto.
16026         (Property::Property): Ditto.
16027
16028         * cs-parser.jay (struct_declaration): Update constructor call to
16029         pass in the attributes too.
16030         (class_declaration): Ditto.
16031         (constant_declaration): Ditto.
16032         (field_declaration): Ditto.
16033         (method_header): Ditto.
16034         (fixed_parameter): Ditto.
16035         (parameter_array): Ditto.
16036         (property_declaration): Ditto.
16037
16038         * constant.cs (Constant::Constant): Update constructor similarly.
16039         Use System.Collections.
16040
16041         * parameter.cs (Parameter::Parameter): Update as above.
16042
16043 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16044
16045         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
16046         (TypeContainer.delegates): New member to hold list of delegates.
16047
16048         * cs-parser.jay (delegate_declaration): Implement the action correctly 
16049         this time as I seem to be on crack ;-)
16050
16051 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
16052
16053         * rootcontext.cs (RootContext::IsNamespace): new function, used to
16054         tell whether an identifier represents a namespace.
16055
16056         * expression.cs (NamespaceExpr): A namespace expression, used only
16057         temporarly during expression resolution.
16058         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
16059         utility functions to resolve names on expressions.
16060
16061 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
16062
16063         * codegen.cs: Add hook for StatementExpressions. 
16064
16065         * class.cs: Fix inverted test for static flag in methods.
16066
16067 2001-09-02  Ravi Pratap  <ravi@ximian.com>
16068
16069         * class.cs (Operator::CheckUnaryOperator): Correct error number used
16070         to make it coincide with MS' number.
16071         (Operator::CheckBinaryOperator): Ditto.
16072
16073         * ../errors/errors.txt : Remove error numbers added earlier.
16074
16075         * ../errors/cs1019.cs : Test case for error # 1019
16076
16077         * ../errros/cs1020.cs : Test case for error # 1020
16078
16079         * cs-parser.jay : Clean out commented cruft.
16080         (dimension_separators, dimension_separator): Comment out. Ostensibly not
16081         used anywhere - non-reducing rule.
16082         (namespace_declarations): Non-reducing rule - comment out.
16083
16084         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
16085         with TypeContainer::AddEnum.
16086
16087         * delegate.cs : New file for delegate handling classes.
16088         (Delegate): Class for declaring delegates.
16089
16090         * makefile : Update.
16091
16092         * cs-parser.jay (delegate_declaration): Implement.
16093
16094 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
16095
16096         * class.cs (Event::Define): Implement.
16097         (Event.EventBuilder): New member.
16098
16099         * class.cs (TypeContainer::Populate): Update to define all enums and events
16100         we have.
16101         (Events): New property for the events arraylist we hold. Shouldn't we move to using
16102         readonly fields for all these cases ?
16103
16104 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16105
16106         * class.cs (Property): Revamp to use the convention of making fields readonly.
16107         Accordingly modify code elsewhere.
16108
16109         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
16110         the Define method of the Property class.
16111
16112         * class.cs : Clean up applied patch and update references to variables etc. Fix 
16113         trivial bug.
16114         (TypeContainer::Populate): Update to define all the properties we have. Also
16115         define all enumerations.
16116
16117         * enum.cs (Define): Implement.
16118
16119 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
16120
16121         * cs-parser.jay (overloadable_operator): The semantic value is an
16122         enum of the Operator class.
16123         (operator_declarator): Implement actions.
16124         (operator_declaration): Implement.
16125
16126         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
16127         validity of definitions.
16128         (Operator::CheckBinaryOperator): Static method to check for binary operators
16129         (TypeContainer::AddOperator): New method to add an operator to a type.
16130
16131         * cs-parser.jay (indexer_declaration): Added line to actually call the
16132         AddIndexer method so it gets added ;-)
16133
16134         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
16135         already taken care of by the MS compiler ?  
16136
16137 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16138
16139         * class.cs (Operator): New class for operator declarations.
16140         (Operator::OpType): Enum for the various operators.
16141
16142 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
16143
16144         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
16145         ostensibly handle this in semantic analysis.
16146
16147         * cs-parser.jay (general_catch_clause): Comment out
16148         (specific_catch_clauses, specific_catch_clause): Ditto.
16149         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
16150         (catch_args, opt_catch_args): New productions.
16151         (catch_clause): Rewrite to use the new productions above
16152         (catch_clauses): Modify accordingly.
16153         (opt_catch_clauses): New production to use in try_statement
16154         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
16155         and re-write the code in the actions to extract the specific and
16156         general catch clauses by being a little smart ;-)
16157
16158         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
16159         Hooray, try and catch statements parse fine !
16160
16161 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16162
16163         * statement.cs (Block::GetVariableType): Fix logic to extract the type
16164         string from the hashtable of variables.
16165
16166         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
16167         I end up making that mistake ;-)
16168         (catch_clauses): Fixed gross error which made Key and Value of the 
16169         DictionaryEntry the same : $1 !!
16170
16171 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16172
16173         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
16174
16175         * cs-parser.jay (event_declaration): Correct to remove the semicolon
16176         when the add and remove accessors are specified. 
16177
16178 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
16179
16180         * cs-parser.jay (IndexerDeclaration): New helper class to hold
16181         information about indexer_declarator.
16182         (indexer_declarator): Implement actions.
16183         (parsing_indexer): New local boolean used to keep track of whether
16184         we are parsing indexers or properties. This is necessary because 
16185         implicit_parameters come into picture even for the get accessor in the 
16186         case of an indexer.
16187         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
16188
16189         * class.cs (Indexer): New class for indexer declarations.
16190         (TypeContainer::AddIndexer): New method to add an indexer to a type.
16191         (TypeContainer::indexers): New member to hold list of indexers for the
16192         type.
16193
16194 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16195
16196         * cs-parser.jay (add_accessor_declaration): Implement action.
16197         (remove_accessor_declaration): Implement action.
16198         (event_accessors_declaration): Implement
16199         (variable_declarators): swap statements for first rule - trivial.
16200
16201         * class.cs (Event): New class to hold information about event
16202         declarations.
16203         (TypeContainer::AddEvent): New method to add an event to a type
16204         (TypeContainer::events): New member to hold list of events.
16205
16206         * cs-parser.jay (event_declaration): Implement actions.
16207
16208 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
16209
16210         * cs-parser.jay (dim_separators): Implement. Make it a string
16211         concatenating all the commas together, just as they appear.
16212         (opt_dim_separators): Modify accordingly
16213         (rank_specifiers): Update accordingly. Basically do the same
16214         thing - instead, collect the brackets here.
16215         (opt_rank_sepcifiers): Modify accordingly.
16216         (array_type): Modify to actually return the complete type string
16217         instead of ignoring the rank_specifiers.
16218         (expression_list): Implement to collect the expressions
16219         (variable_initializer): Implement. We make it a list of expressions
16220         essentially so that we can handle the array_initializer case neatly too.
16221         (variable_initializer_list): Implement.
16222         (array_initializer): Make it a list of variable_initializers
16223         (opt_array_initializer): Modify accordingly.
16224
16225         * expression.cs (New::NType): Add enumeration to help us
16226         keep track of whether we have an object/delegate creation
16227         or an array creation.
16228         (New:NewType, New::Rank, New::Indices, New::Initializers): New
16229         members to hold data about array creation.
16230         (New:New): Modify to update NewType
16231         (New:New): New Overloaded contructor for the array creation
16232         case.
16233
16234         * cs-parser.jay (array_creation_expression): Implement to call
16235         the overloaded New constructor.
16236
16237 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
16238
16239         * class.cs (TypeContainer::Constructors): Return member
16240         constructors instead of returning null.
16241
16242 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
16243
16244         * typemanager.cs (InitCoreTypes): Initialize the various core
16245         types after we have populated the type manager with the user
16246         defined types (this distinction will be important later while
16247         compiling corlib.dll)
16248
16249         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
16250         on Expression Classification.  Now all expressions have a method
16251         `Resolve' and a method `Emit'.
16252
16253         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
16254         generation from working.     Also add some temporary debugging
16255         code. 
16256
16257 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
16258
16259         * codegen.cs: Lots of code generation pieces.  This is only the
16260         beginning, will continue tomorrow with more touches of polish.  We
16261         handle the fundamentals of if, while, do, for, return.  Others are
16262         trickier and I need to start working on invocations soon.
16263
16264         * gen-treedump.cs: Bug fix, use s.Increment here instead of
16265         s.InitStatement. 
16266
16267         * codegen.cs (EmitContext): New struct, used during code
16268         emission to keep a context.   Most of the code generation will be
16269         here. 
16270
16271         * cs-parser.jay: Add embedded blocks to the list of statements of
16272         this block.  So code generation proceeds in a top down fashion.
16273
16274 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
16275
16276         * statement.cs: Add support for multiple child blocks.
16277
16278 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
16279
16280         * codegen.cs (EmitCode): New function, will emit the code for a
16281         Block of code given a TypeContainer and its ILGenerator. 
16282
16283         * statement.cs (Block): Standard public readonly optimization.
16284         (Block::Block constructors): Link children. 
16285         (Block::Child): Child Linker.
16286         (Block::EmitVariables): Emits IL variable declarations.
16287
16288         * class.cs: Drop support for MethodGroups here, delay until
16289         Semantic Analysis.
16290         (Method::): Applied the same simplification that I did before, and
16291         move from Properties to public readonly fields.
16292         (Method::ParameterTypes): Returns the parameter types for the
16293         function, and implements a cache that will be useful later when I
16294         do error checking and the semantic analysis on the methods is
16295         performed.
16296         (Constructor::GetCallingConvention): Renamed from CallingConvetion
16297         and made a method, optional argument tells whether this is a class
16298         or a structure to apply the `has-this' bit.
16299         (Method::GetCallingConvention): Implement, returns the calling
16300         convention. 
16301         (Method::Define): Defines the type, a second pass is performed
16302         later to populate the methods.
16303
16304         (Constructor::ParameterTypes): implement a cache similar to the
16305         one on Method::ParameterTypes, useful later when we do semantic
16306         analysis. 
16307
16308         (TypeContainer::EmitMethod):  New method.  Emits methods.
16309
16310         * expression.cs: Removed MethodGroup class from here.
16311
16312         * parameter.cs (Parameters::GetCallingConvention): new method.
16313
16314 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
16315
16316         * class.cs (TypeContainer::Populate): Drop RootContext from the
16317         argument. 
16318
16319         (Constructor::CallingConvention): Returns the calling convention.
16320         (Constructor::ParameterTypes): Returns the constructor parameter
16321         types. 
16322
16323         (TypeContainer::AddConstructor): Keep track of default constructor
16324         and the default static constructor.
16325
16326         (Constructor::) Another class that starts using `public readonly'
16327         instead of properties. 
16328
16329         (Constructor::IsDefault): Whether this is a default constructor. 
16330
16331         (Field::) use readonly public fields instead of properties also.
16332
16333         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
16334         track of static constructors;  If none is used, turn on
16335         BeforeFieldInit in the TypeAttributes. 
16336
16337         * cs-parser.jay (opt_argument_list): now the return can be null
16338         for the cases where there are no arguments. 
16339
16340         (constructor_declarator): If there is no implicit `base' or
16341         `this', then invoke the default parent constructor. 
16342
16343         * modifiers.cs (MethodAttr): New static function maps a set of
16344         modifiers flags into a MethodAttributes enum
16345         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
16346         MethodAttr, TypeAttr to represent the various mappings where the
16347         modifiers are used.
16348         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
16349
16350 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
16351
16352         * parameter.cs (GetParameterInfo): Fix bug where there would be no
16353         method arguments.
16354
16355         * interface.cs (PopulateIndexer): Implemented the code generator
16356         for interface indexers.
16357
16358 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
16359
16360         * interface.cs (InterfaceMemberBase): Now we track the new status
16361         here.  
16362
16363         (PopulateProperty): Implement property population.  Woohoo!  Got
16364         Methods and Properties going today. 
16365
16366         Removed all the properties for interfaces, and replaced them with
16367         `public readonly' fields. 
16368
16369 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
16370
16371         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
16372         initialize their hashtables/arraylists only when they are needed
16373         instead of doing this always.
16374
16375         * parameter.cs: Handle refs and out parameters.
16376
16377         * cs-parser.jay: Use an ArrayList to construct the arguments
16378         instead of the ParameterCollection, and then cast that to a
16379         Parameter[] array.
16380
16381         * parameter.cs: Drop the use of ParameterCollection and use
16382         instead arrays of Parameters.
16383
16384         (GetParameterInfo): Use the Type, not the Name when resolving
16385         types. 
16386
16387 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
16388
16389         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
16390         and instead use public readonly fields.
16391
16392         * class.cs: Put back walking code for type containers.
16393
16394 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
16395
16396         * class.cs (MakeConstant): Code to define constants.
16397
16398         * rootcontext.cs (LookupType): New function.  Used to locate types 
16399
16400
16401 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
16402
16403         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
16404         this System.Reflection code is.  Kudos to Microsoft
16405
16406         * typemanager.cs: Implement a type cache and avoid loading all
16407         types at boot time.  Wrap in LookupType the internals.  This made
16408         the compiler so much faster.  Wow.  I rule!
16409
16410         * driver.cs: Make sure we always load mscorlib first (for
16411         debugging purposes, nothing really important).
16412
16413         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
16414         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
16415
16416         * rootcontext.cs: Lookup types on their namespace;  Lookup types
16417         on namespaces that have been imported using the `using' keyword.
16418
16419         * class.cs (TypeContainer::TypeAttr): Virtualize.
16420         (Class::TypeAttr): Return attributes suitable for this bad boy.
16421         (Struct::TypeAttr): ditto.
16422         Handle nested classes.
16423         (TypeContainer::) Remove all the type visiting code, it is now
16424         replaced with the rootcontext.cs code
16425
16426         * rootcontext.cs (GetClassBases): Added support for structs. 
16427
16428 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
16429
16430         * interface.cs, statement.cs, class.cs, parameter.cs,
16431         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
16432         Drop use of TypeRefs, and use strings instead.
16433
16434 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
16435
16436         * rootcontext.cs: 
16437
16438         * class.cs (Struct::Struct): set the SEALED flags after
16439         checking the modifiers.
16440         (TypeContainer::TypeAttr): new property, returns the
16441         TypeAttributes for a class.  
16442
16443         * cs-parser.jay (type_list): Oops, list production was creating a
16444         new list of base types.
16445
16446         * rootcontext.cs (StdLib): New property.
16447         (GetInterfaceTypeByName): returns an interface by type name, and
16448         encapsulates error handling here.
16449         (GetInterfaces): simplified.
16450         (ResolveTree): Encapsulated all the tree resolution here.
16451         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
16452         types. 
16453
16454         * driver.cs: Add support for --nostdlib, to avoid loading the
16455         default assemblies.
16456         (Main): Do not put tree resolution here. 
16457
16458         * rootcontext.cs: Beginning of the class resolution.
16459
16460 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
16461
16462         * rootcontext.cs: Provide better error reporting. 
16463
16464         * cs-parser.jay (interface_base): set our $$ to be interfaces.
16465
16466         * rootcontext.cs (CreateInterface): Handle the case where there
16467         are no parent interfaces.
16468
16469         (CloseTypes): Routine to flush types at the end.
16470         (CreateInterface): Track types.
16471         (GetInterfaces): Returns an array of Types from the list of
16472         defined interfaces.
16473
16474         * typemanager.c (AddUserType): Mechanism to track user types (puts
16475         the type on the global type hash, and allows us to close it at the
16476         end). 
16477
16478 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
16479
16480         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
16481         RecordInterface instead.
16482
16483         * cs-parser.jay: Updated to reflect changes above.
16484
16485         * decl.cs (Definition): Keep track of the TypeBuilder type that
16486         represents this type here.  Not sure we will use it in the long
16487         run, but wont hurt for now.
16488
16489         * driver.cs: Smaller changes to accomodate the new code.
16490
16491         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
16492         when done. 
16493
16494         * rootcontext.cs (CreateInterface):  New method, used to create
16495         the System.TypeBuilder type for interfaces.
16496         (ResolveInterfaces): new entry point to resolve the interface
16497         hierarchy. 
16498         (CodeGen): Property, used to keep track of the code generator.
16499
16500 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
16501
16502         * cs-parser.jay: Add a second production for delegate_declaration
16503         with `VOID'.
16504
16505         (enum_body): Put an opt_comma here instead of putting it on
16506         enum_body or enum_member_declarations so we can handle trailing
16507         commas on enumeration members.  Gets rid of a shift/reduce.
16508
16509         (type_list): Need a COMMA in the middle.
16510
16511         (indexer_declaration): Tell tokenizer to recognize get/set
16512
16513         * Remove old targets.
16514
16515         * Re-add the parser target.
16516
16517 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16518
16519         * cs-parser.jay: Add precendence rules for a number of operators
16520         ot reduce the number of shift/reduce conflicts in the grammar.
16521
16522 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
16523
16524         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
16525         and put it here.
16526
16527         Get rid of old crufty code.
16528
16529         * rootcontext.cs: Use this to keep track of the parsed
16530         representation and the defined types available to the program. 
16531
16532         * gen-treedump.cs: adjust for new convention.
16533
16534         * type.cs: Split out the type manager, and the assembly builder
16535         from here. 
16536
16537         * typemanager.cs: the type manager will live here now.
16538
16539         * cil-codegen.cs: And the code generator here. 
16540
16541 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
16542
16543         * makefile: Fixed up for easy making.
16544
16545 2001-07-13  Simon Cozens <simon@simon-cozens.org>
16546
16547         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
16548         the 
16549
16550         (unary_expression): Expand pre_increment_expression and
16551         post_decrement_expression to reduce a shift/reduce.
16552
16553 2001-07-11  Simon Cozens
16554
16555         * cs-tokenizer.cs: Hex numbers should begin with a 0.
16556
16557         Improve allow_keyword_as_indent name.
16558
16559 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
16560
16561         * Adjustments for Beta2. 
16562
16563 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
16564
16565         * decl.cs: Added `Define' abstract method.
16566         (InTransit): new property, used to catch recursive definitions. 
16567
16568         * interface.cs: Implement `Define'. 
16569
16570         * modifiers.cs: Map Modifiers.constants to
16571         System.Reflection.TypeAttribute flags.
16572
16573         * class.cs: Keep track of types and user-defined types.
16574         (BuilderInit): New method for creating an assembly
16575         (ResolveType): New function to launch the resolution process, only
16576         used by interfaces for now.
16577
16578         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
16579         that are inserted into the name space. 
16580
16581 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
16582
16583         * ARGH.  I have screwed up my tree so many times due to the use of
16584         rsync rather than using CVS.  Going to fix this at once. 
16585
16586         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
16587         load types.
16588
16589 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
16590
16591         * Experiment successful: Use System.Type rather that our own
16592         version of Type.  
16593
16594 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
16595
16596         * cs-parser.jay: Removed nsAliases from here.
16597
16598         Use new namespaces, handle `using XXX;' 
16599
16600         * namespace.cs: Reimplemented namespace handling, use a recursive
16601         definition of the class.  Now we can keep track of using clauses
16602         and catch invalid using clauses.
16603
16604 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
16605
16606         * gen-treedump.cs: Adapted for all the renaming.
16607
16608         * expression.cs (Expression): this class now has a Type property
16609         which returns an expression Type.
16610
16611         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
16612         `Type', as this has a different meaning now in the base
16613
16614 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
16615
16616         * interface.cs, class.cs: Removed from all the sources the
16617         references to signature computation, as we can not do method
16618         signature computation during the parsing time, as we are not
16619         trying to solve at that point distinguishing:
16620
16621         class X {
16622                 void a (Blah x) {}
16623                 void a (NS.Blah x) {}
16624         }
16625
16626         Which depending on the context might be valid or not, as we do not
16627         know if Blah is the same thing as NS.Blah at that point.
16628
16629         * Redid everything so the code uses TypeRefs now instead of
16630         Types.  TypeRefs are just temporary type placeholders, that need
16631         to be resolved.  They initially have a pointer to a string and the
16632         current scope in which they are used.  This is used later by the
16633         compiler to resolve the reference to an actual Type. 
16634
16635         * DeclSpace is no longer a CIR.Type, and neither are
16636         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
16637         are all DeclSpaces, but no Types. 
16638
16639         * type.cs (TypeRefManager): This implements the TypeRef manager,
16640         which keeps track of all the types that need to be resolved after
16641         the parsing has finished. 
16642
16643 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
16644
16645         * ARGH.  We are going to have to store `foreach' as a class rather
16646         than resolving it, as we need to verify error 1579 after name
16647         resolution.   *OR* we could keep a flag that says `This request to
16648         IEnumerator comes from a foreach statement' which we can then use
16649         to generate the error.
16650
16651 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
16652
16653         * class.cs (TypeContainer.AddMethod): we now add methods to the
16654         MethodGroup instead of the method hashtable.  
16655
16656         * expression.cs: Add MethodGroup abstraction, which gets us one
16657         step closer to the specification in the way we handle method
16658         declarations.  
16659
16660         * cs-parser.jay (primary_expression): qualified_identifier now
16661         tried to match up an identifier to a local variable reference or
16662         to a parameter reference.
16663
16664         current_local_parameters is now a parser global variable that
16665         points to the current parameters for the block, used during name
16666         lookup.
16667
16668         (property_declaration): Now creates an implicit `value' argument to
16669         the set accessor.
16670
16671 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
16672
16673         * parameter.cs: Do not use `param' arguments as part of the
16674         signature, per the spec.
16675
16676 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
16677
16678         * decl.cs: Base class for classes, structs and interfaces.  This
16679         is the "Declaration Space" 
16680
16681         * cs-parser.jay: Use CheckDef for checking declaration errors
16682         instead of having one on each function.
16683
16684         * class.cs: Factor out some code for handling error handling in
16685         accordance to the "Declarations" section in the "Basic Concepts"
16686         chapter in the ECMA C# spec.
16687
16688         * interface.cs: Make all interface member classes derive from
16689         InterfaceMemberBase.
16690
16691 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
16692
16693         * Many things: all interfaces are parsed and generated in
16694         gen-treedump.  Support for member variables, constructors,
16695         destructors, properties, constants is there.
16696
16697         Beginning of the IL backend, but very little done, just there for
16698         testing purposes. 
16699
16700 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
16701
16702         * cs-parser.jay: Fix labeled statement.
16703
16704         * cs-tokenizer.cs (escape): Escape " and ' always.
16705         ref_line, ref_name: keep track of the line/filename as instructed
16706         by #line by the compiler.
16707         Parse #line.
16708
16709 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
16710
16711         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
16712         to match the values in System.CodeDOM.
16713
16714         Divid renamed to Divide.
16715
16716         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
16717         statements. 
16718         (Statements.set): remove.
16719
16720         * System.CodeDOM/CodeCatchClause.cs: always have a valid
16721         statements. 
16722
16723         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
16724         falseStatements always have valid values. 
16725
16726         * cs-parser.jay: Use System.CodeDOM now.
16727