2004-10-14 Umadevi S <sumadevi@novell.com>
[mono.git] / mcs / gmcs / ChangeLog
1 2004-10-13  Martin Baulig  <martin@ximian.com>
2
3         * generic.cs (TypeManager.InflatedConstraints): New nested class.
4         (TypeParameter.DefineType): If we're a method type parameter and
5         that method is overriding something, "inflate" its constraints.
6
7 2004-10-12  Martin Baulig  <martin@ximian.com>
8
9         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
10         and have type arguments, create and resolve a ConstructedType.
11
12 2004-10-12  Martin Baulig  <martin@ximian.com>
13
14         * decl.cs (MemberCache.FindMemberToOverride): Use
15         TypeManager.IsEqual() to compare the parameters and Type.Equals()
16         to compare the invocationType.
17
18         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
19         When comparing two type parameters, only do the signature-only
20         comparision for method type parameters.
21
22 2004-10-11  Martin Baulig  <martin@ximian.com>
23
24         * report.cs: Don't make --fatal abort on warnings, we have
25         -warnaserror for that.
26
27 2004-10-11  Martin Baulig  <martin@ximian.com>
28
29         * typemanager.cs
30         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
31         (TypeManager.IsEqual): Call ourself recursively instead of using
32         Type.IsEqual(). 
33
34 2004-10-11  Martin Baulig  <martin@ximian.com>
35
36         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
37         on our own type parameters, not on the ones we inherit from a containing
38         class.
39
40         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
41         the comparision.
42
43         * generic.cs (TypeParameter.Define): We may only be called once.
44
45         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
46         instead of TypeManager.IsEqual().
47
48 2004-09-28  Martin Baulig  <martin@ximian.com>
49
50         * generic.cs
51         (GenericConstraints.EffectiveBaseClass): New public property.
52         (TypeParameter.GenericConstraints): New public property.
53         (ConstructedType.CheckConstraints): Improved.
54
55         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
56         (Convert.TypeParameterConversion): New private method; use this in
57         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
58         for all conversions related to type parameters.
59
60 2004-09-24  Martin Baulig  <martin@ximian.com>
61
62         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
63         type parameter conversions for type parameters which are known to
64         be reference types.
65
66 2004-09-24  Martin Baulig  <martin@ximian.com>
67
68         * generic.cs (GenericConstraints): Added `IsReferenceType' and
69         `IsValueType' properties.
70
71         * support.cs (ReflectionConstraints): Use
72         Type.GetGenericParameterConstraints() instead of the old hack.
73
74 2004-09-24  Martin Baulig  <martin@ximian.com>
75
76         * generic.cs (GenericConstraints): Moved here and made it an
77         abstract class.
78
79         * support.cs (GenericConstraints): Moved to generic.cs.
80
81 2004-09-24  Martin Baulig  <martin@ximian.com>
82
83         * support.cs
84         (ReflectionConstraints): Un-nested this class and made it public.
85
86         * typemanager.cs
87         (TypeManager.GetTypeParameterConstraints): New public method.
88         (TypeManager.HasConstructorConstraint): Use the attributes.
89
90 2004-09-24  Martin Baulig  <martin@ximian.com>
91
92         * support.cs (GenericConstraints): Replaced `HasConstructor',
93         `IsReferenceType' and `IsValueType' with `Attributes'.
94         (ReflectionParameters.ReflectionConstraints): Removed the Create()
95         method and made the .ctor public.
96
97         * generic.cs (Constraints.Attributes): New public property.
98         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
99         `IsReferenceType' -> `HasReferenceTypeConstraint' and
100         `IsValueType' -> `HasValueTypeConstraint'.
101
102 2004-09-23  Martin Baulig  <martin@ximian.com>
103
104         * generic.cs (Constraints): Reflect latest runtime changes.
105
106 2004-09-23  Martin Baulig  <martin@ximian.com>
107
108         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
109         (Convert.ImplicitReferenceConversionExists): Likewise.
110
111 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
112
113         * class.cs (Operator.Define): Add error 448 and 559 report.
114         
115 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
116
117         * class.cs (MemberBase.IsTypePermitted): New protected
118         method for checking error CS0610.
119
120 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
121
122         * class.cs (TypeContainer.HasExplicitLayout): New property
123         Returns whether container has StructLayout attribute set Explicit.
124         (FieldMember): New abstract class for consts and fields.
125         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
126         (Field): Reuse FieldMember.
127
128         * const.cs (Const): Reuse FieldMember.
129
130         * rootcontext.cs: EmitConstants call moved to class.
131
132 2004-09-22  Martin Baulig  <martin@ximian.com>
133
134         Marek and me just fixed one of our oldest bugs: #28562 :-)
135
136         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
137
138         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
139         we're an EnumConstant, just return that.
140         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
141         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
142         to get the value which'll actually be written into the attribute.
143         However, we have to use GetValue() to access the attribute's value
144         in the compiler.        
145
146 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
147
148         * constant.cs (Constant.IsNegative): New abstract property
149         IsNegative.
150
151         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
152         (StackAlloc.DoResolve): Reused IsNegative.
153
154 2004-09-22  Martin Baulig  <martin@ximian.com>
155
156         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
157         public method; like LookupTypeContainer, but also works for
158         generic instances.
159
160         * report.cs (Report.SymbolRelatedToPreviousError): Use
161         TypeManager.LookupGenericTypeContainer().       
162
163 2004-09-22  Martin Baulig  <martin@ximian.com>
164
165         Thanks to Peter Sestoft for this bug report.
166
167         * expression.cs (Conditional): If both the `trueExpr' and the
168         `falseExpr' is a NullLiteral, return a NullLiteral.
169
170 2004-09-22  Martin Baulig  <martin@ximian.com>
171
172         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
173         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
174         for the "get_Current" call.
175
176 2004-09-21  Martin Baulig  <martin@ximian.com>
177
178         * convert.cs (Convert.ImplicitReferenceConversion): When
179         converting to an interface type, first check whether we're
180         converting from a reference type.
181
182 2004-09-14  Martin Baulig  <martin@ximian.com>
183
184         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
185
186 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
187
188         Fixed bug #61902
189         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
190         called and is obsolete then this member suppress message
191         when call is inside next [Obsolete] method or type.
192
193         * expression.cs: Use TestObsoleteMethodUsage member.
194
195 2004-09-14  Martin Baulig  <martin@ximian.com>
196
197         * genericparser.cs: Removed.
198
199 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
200
201         * class.cs (MethodCore.CheckBase): Fix bug #65757.
202
203 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
204
205         * attribute.cs (Attribute.Resolve): Add error 653 report.
206
207         * class.cs (Class.ApplyAttributeBuilder): Add error 641
208         report.
209         (Method.ApplyAttributeBuilder): Add error 685 report.
210         (Operator.Define): Add error 564 report.
211
212         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
213
214         * expression.cs (Invocation.DoResolve): Add error
215         245 and 250 report.
216
217         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
218         error 674 report.
219
220 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
221
222         * class.cs (ConstructorInitializer.Resolve):
223         Wrong error number (515->516).
224
225 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
226
227         * class.cs (Indexer.Define): Add error 631 report.
228
229 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
230
231         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
232
233 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
234
235         * expression.cs (Probe.DoResolve): Add error CS0241 report.
236
237 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
238
239         * cs-parser.jay: Added error CS0241 report.
240
241 2004-09-10  Raja R Harinath  <rharinath@novell.com>
242
243         * cs-parser.jay (fixed_statement): Introduce a scope for the
244         declaration in the 'fixed' statement.
245
246 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
247
248         * cs-parser.jay: Added CS0230 error report.
249
250 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
251
252         * cs-parser.jay: Added errors CS0231 and CS0257 report.
253
254 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
255
256         * expression.cs (Argument.Resolve): Added error CS0192 and
257         CS0199 report.
258
259 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
260
261         C# 2.0 #pragma warning feature
262
263         * cs-tokenizer.cs (PreProcessPragma): New method; 
264         Handles #pragma directive.
265
266         * report.cs (WarningRegions): New class; Support
267         class for #pragma warning directive. It tests whether
268         warning is enabled for a given line.
269
270 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
271
272         * const.cs: Add more descriptive error report, tahnks to
273         Sebastien. 
274
275 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
276
277         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
278
279 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
280
281         * expression.cs: Apply patch from Ben: Remove dead code from
282         ArrayCreation, and remove the TurnintoConstant call in const.cs,
283         as that code just threw an exception anwyays.
284
285         * const.cs: Remove the call to the turnintoconstant, for details
286         see bug: #63144
287         
288         * literal.cs: The type of the null-literal is the null type;  So
289         we use a placeholder type (literal.cs:System.Null, defined here)
290         for it.
291
292         * expression.cs (Conditional.DoResolve): Remove some old code that
293         is no longer needed, conversions have been fixed.
294
295         (ArrayCreationExpression.DoResolve): Return false if we fail to
296         resolve the inner expression.
297
298 2004-09-07  Raja R Harinath  <rharinath@novell.com>
299
300         Fix test-290.cs.
301         * cs-parser.jay (delegate_declaration): Record a delegate
302         declaration as a type declaration.
303         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
304
305 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
306
307         * parameter.cs: Do not crash if the type can not be resolved. 
308
309         * expression.cs: Report errors with unsafe pointers, fixes #64896
310
311 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
312
313         * expression.cs: Pointer arith always needs to do a conv.i
314         if the operand is a long. fix 65320
315
316 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
317
318         Fixed cs0619-37.cs, cs0619-38.cs
319
320         * enum.cs (GetObsoleteAttribute): Removed.
321
322         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
323         on Enum member is double staged. The first is tested member
324         and then enum.
325
326 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
327
328         Fixed #56986, #63631, #65231
329
330         * class.cs: (TypeContainer.AddToMemberContainer): New method,
331         adds member to name container.
332         (TypeContainer.AddToTypeContainer): New method, adds type to
333         name container.
334         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
335         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
336         AddOperator): Simplified by reusing AddToMemberContainer.
337         (TypeContainer.UserDefinedStaticConstructor): Changed to property
338         instead of field.
339         (Method.CheckForDuplications): Fixed implementation to test all
340         possibilities.
341         (MemberBase): Detection whether member is explicit interface
342         implementation is now in constructor.
343         (MemberBase.UpdateMemberName): Handles IndexerName.
344         (Accessor): Changed to keep also location information.
345         (AbstractPropertyEventMethod): Is derived from MemberCore.
346         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
347         will be emited or not.
348         (PropertyBase.AreAccessorsDuplicateImplementation):
349         Tests whether accessors are not in collision with some method.
350         (Operator): Is derived from MethodCore to simplify common
351         operations.
352
353         * decl.cs (Flags.TestMethodDuplication): Test for duplication
354         must be performed.
355         (DeclSpace.AddToContainer): Adds the member to defined_names
356         table. It tests for duplications and enclosing name conflicts.
357
358         * enum.cs (EnumMember): Clean up to reuse the base structures
359
360 2004-09-03  Martin Baulig  <martin@ximian.com>
361
362         Merged latest changes into gmcs.  Please keep this comment in
363         here, it makes it easier for me to see what changed in MCS since
364         the last time I merged.
365
366 2004-09-03  Martin Baulig  <martin@ximian.com>
367
368         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
369         into TypeContainer, to make partial classes work again.
370
371 2004-09-03  Martin Baulig  <martin@ximian.com>
372
373         * rootcontext.cs (RootContext.V2): Removed.
374
375 2004-03-23  Martin Baulig  <martin@ximian.com>
376
377         * expression.cs (Invocation.OverloadResolve): Added `bool
378         may_fail' argument and use it instead of the Location.IsNull() hack.
379
380 2004-09-09  Martin Baulig  <martin@ximian.com>
381
382         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
383
384 2004-09-09  Martin Baulig  <martin@ximian.com>
385
386         * generic.cs (TypeParameter.DefineType): Added support for
387         explicit interface methods.
388
389 2004-09-09  Martin Baulig  <martin@ximian.com>
390
391         * README.Changes: New document.  Started to list important changes
392         between MCS and GMCS here.
393
394 2004-09-08  Martin Baulig  <martin@ximian.com>
395
396         * class.cs
397         (TypeContainer.CheckRecursiveDefinition): New protected method.
398         (TypeContainer.DefineType): Move the CS0146 check into
399         CheckRecursiveDefinition().     
400
401 2004-09-06  Martin Baulig  <martin@ximian.com>
402
403         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
404         types for the constructor constraint.
405
406 2004-09-03  Martin Baulig  <martin@ximian.com>
407
408         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
409         into TypeContainer, to make partial classes work again.
410
411 2004-09-03  Martin Baulig  <martin@ximian.com>
412
413         * rootcontext.cs (RootContext.V2): Removed.
414
415 2004-03-23  Martin Baulig  <martin@ximian.com>
416
417         * expression.cs (Invocation.OverloadResolve): Added `bool
418         may_fail' argument and use it instead of the Location.IsNull() hack.
419
420 2004-09-03  Martin Baulig  <martin@ximian.com>
421
422         Merged latest changes into gmcs.  Please keep this comment in
423         here, it makes it easier for me to see what changed in MCS since
424         the last time I merged.
425
426 2004-09-03  Raja R Harinath  <rharinath@novell.com>
427
428         Fix #61128.
429         * expression.cs (BetterConversion): Don't allow either conversion 
430         to be null.  Remove redundant implicit conversion test when 'q ==
431         null' -- when this function is invoked, we already know that the
432         implicit conversion exists.
433         (BetterFunction): Assume that 'best' is non-null.  Remove
434         redundant reimplementation of IsApplicable when 'best' is null.
435         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
436         number of arguments.
437         (IsAncestralType): Extract from OverloadResolve.
438         (OverloadResolve): Make robust to the MethodGroupExpr being
439         unsorted.  Implement all the logic of Section 14.5.5.1, and
440         support overloading of methods from multiple applicable types.
441         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
442
443         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
444         (RealError, Warning): Append type of report to related symbol.
445
446 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
447
448         * enum.cs: Fixed CLS-Compliance checks for enum members.
449         Error tests cs3008-8.cs, cs3014-8.cs
450
451 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
452
453         Fixed bug #62342, #63102
454         * class.cs: ImplementIndexer uses member.IsExplicitImpl
455         like ImplementMethod.
456
457 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
458
459         * attribute.cs (Attribute.GetAttributeArgumentExpression):
460         Fixed bug #65170.
461
462 2004-09-02  Martin Baulig  <martin@ximian.com>
463
464         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
465         TypeManager.GetArgumentTypes() rather than calling GetParameters()
466         on the MethodBase.
467
468 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
469
470         C# 2.0 Static classes implemented
471
472         * class.cs (TypeContainer): instance_constructors,
473         initialized_fields, initialized_static_fields,
474         default_constructor, base_inteface_types are protected to be
475         accessible from StaticClass.
476         (TypeContainer.DefineDefaultConstructor): New virtual method
477         for custom default constructor generating
478         (StaticClass): New class to handle "Static classes" feature.
479
480         * cs-parser.jay: Handle static keyword on class like instance
481         of StaticClass.
482
483         * driver.cs: Added "/langversion" command line switch with two
484         options (iso-1, default).
485
486 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
487
488         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
489
490 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
491
492         * delegate.cs: Style.
493
494 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
495
496         * delegate.cs: Add seperate instance expr field for miguel.
497
498 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
499
500         * PointerArithmetic (Resolve): make sure we are not doing
501         pointer arith on void*. Also, make sure we are resolved
502         by not setting eclass until resolve.
503
504         All callers: Make sure that PointerArithmetic gets resolved.
505
506 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
507
508         * ArrayCreation (LookupType): If the type does not resolve 
509         to an array, give an error.
510
511 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
512
513         * statement.cs (Try.Resolve): Fixed bug #64222
514
515 2004-08-27  Martin Baulig  <martin@ximian.com>
516
517         * class.cs
518         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
519         crash here.     
520
521 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
522
523         * ecore.cs (Constantify): Get underlying type via
524         System.Enum.GetUnderlyingType to avoid StackOverflow on the
525         Windows in special cases.
526
527 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
528
529         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
530         for obtaining also private methods.
531         (GetRemoveMethod): Used GetRemoveMethod (true)
532         for obtaining also private methods.
533
534 2004-09-02  Martin Baulig  <martin@ximian.com>
535
536         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
537         TypeManager.GetArgumentTypes() rather than calling GetParameters()
538         on the MethodBase.
539
540 2004-08-27  Martin Baulig  <martin@ximian.com>
541
542         * class.cs
543         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
544         crash here.     
545
546 2004-08-25  Martin Baulig  <martin@ximian.com>
547
548         * support.cs (ReflectionParameters..ctor): If this is a generic
549         method, retrieve and store its type parameters.
550         (InternalParameters..ctor): Added `TypeParameter[]' argument.
551         (ReflectionParameters.GenericConstraints): The argument specifies
552         the type parameter, not the method parameter.
553         (InternalParameters.GenericConstraints): Likewise.
554
555         * generic.cs (TypeParameter.DefineType): Correctly handle
556         constraints wrt. generic methods in interfaces and their
557         implementations.        
558
559 2004-08-24  Martin Baulig  <martin@ximian.com>
560
561         * generic.cs (TypeParameter.IsSubclassOf): New public method.
562         (Constraints.IsSubclassOf): New internal method.
563
564         * typemanager.cs (TypeManager.FindMembers): Added special support
565         for GenericTypeParameterBuilder's.      
566         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
567         type parameters.
568
569 2004-08-24  Martin Baulig  <martin@ximian.com>
570
571         * typemanager.cs
572         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
573         this for accessibility checks.
574         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
575         IsNestedFamilyAccessible.
576         (TypeManager.IsSubclassOf): New method, do what the name actually
577         says.   
578
579 2004-08-24  Martin Baulig  <martin@ximian.com>
580
581         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
582         as a SimpleName, include the generic arity.
583
584 2004-08-24  Martin Baulig  <martin@ximian.com>
585
586         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
587         MethodAttributes.HideBySig for operators.
588
589 2004-08-23  Martin Baulig  <martin@ximian.com>
590
591         Back to the old error reporting system :-)
592
593         * report.cs (Message): Removed.
594         (Report.MessageData, ErrorData, WarningData): Removed.
595         (Report.Error, Warning): Back to the old system.
596
597 2004-08-23  Martin Baulig  <martin@ximian.com>
598
599         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
600
601         * class.cs (TypeContainer.ParentContainer): New public virtual
602         method; replaces the explicit interface implementation.
603         (ClassPart.ParentContainer): Override.
604
605 2004-08-23  Martin Baulig  <martin@ximian.com>
606
607         * statement.cs (Switch): Added support for constant switches; see
608         #59428 or test-285.cs.
609
610 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
611
612         Fixed bug #62740.
613         * statement.cs (GetEnumeratorFilter): Removed useless
614         logic because C# specs is strict. GetEnumerator must be
615         public.
616
617 2004-08-22  Martin Baulig  <martin@ximian.com>
618
619         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
620         a switch and may break, reset the barrier.  Fixes #59867.
621
622 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
623
624         CLS-Compliance speed up (~5% for corlib)
625
626         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
627         New method. Tests container for CLS-Compliant names
628
629         * class.cs (TypeContainer.VerifyClsName): New method.
630         Checks whether container name is CLS Compliant.
631         (Constructor): Implements IMethodData.
632
633         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
634         low-case table for CLS Compliance test.
635         (MemberCache.VerifyClsParameterConflict): New method.
636         Checks method parameters for CS3006 error.
637
638         * enum.cs (EnumMember): Is derived from MemberCore.
639         (Enum.VerifyClsName): Optimized for better performance.
640
641 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
642
643         * report.cs: Renamed Error_T to Error and changed all
644         references.
645
646 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
647
648         * class.cs (TypeContainer.IndexerArrayList): New inner class
649         container for indexers.
650         (TypeContainer.DefaultIndexerName): New constant for default
651         indexer name. Replaced all "Item" with this constant.
652         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
653
654         * typemanager.cs (TypeManager.default_member_ctor): Cache here
655         DefaultMemberAttribute constructor.
656
657 2004-08-05  Martin Baulig  <martin@ximian.com>
658
659         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
660         Fix bug #59429.
661
662 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
663
664         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
665         multi platforms problem.
666
667         * compiler.csproj: Included shared files.
668
669 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
670
671         Fix bug 60333, 55971 in the more general way
672         * attribute.cs (Attribute.GetAttributeArgumentExpression):
673         Added arg_type argument for constant conversion.
674         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
675
676 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
677
678         Fix bug #59760
679         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
680         OperatorArrayList, MethodCoreArrayList for typecontainer
681         containers. Changed class member types to these new types.
682         (MethodArrayList.DefineMembers): Added test for CS0659.
683
684 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
685
686         * cfold.cs: Synchronize the folding with the code in expression.cs
687         Binary.DoNumericPromotions for uint operands.
688
689         * attribute.cs: Revert patch from Raja, it introduced a regression
690         while building Blam-1.2.1 (hard to isolate a test case).
691
692 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
693
694         Fix for #55382
695         * class.cs:
696         (TypeContainer.Define): Renamed to DefineContainerMembers because of
697         name collision.
698         (MethodCore.parent_method): New member. The method we're overriding
699         if this is an override method.
700         (MethodCore.CheckBase): Moved from Method class and made common.
701         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
702         private.
703         (MethodCore.CheckForDuplications): New abstract method. For custom
704         member duplication search in a container
705         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
706         method and its return type.
707         (Event.conflict_symbol): New member. Symbol with same name in the
708         parent class.
709
710         * decl.cs:
711         (MemberCache.FindMemberWithSameName): New method. The method
712         is looking for conflict with inherited symbols.
713
714 2004-08-04  Martin Baulig  <martin@ximian.com>
715
716         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
717
718         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
719
720 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
721
722         * report.cs (Message): New enum for better error, warning reference in
723         the code.
724         (MessageData): New inner abstract class. It generally handles printing of
725         error and warning messages.
726         Removed unused Error, Warning, Message methods.
727
728 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
729
730         Fix for cs0592-8.cs test
731         * attribute.cs
732         (Attributable.ValidAttributeTargets): Made public.
733         (Attribute.ExplicitTarget): New member for explicit target value.
734         (Attribute.CheckTargets): Now we translate explicit attribute
735         target to Target here.
736
737 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
738
739         * ecore.cs (MethodGroupExpr): new IsBase property.
740
741         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
742
743         * delegate.cs (DelegateCreation): store a MethodGroupExpr
744         rather than an instance expr.
745
746         (DelegateCreation.Emit): Use the method group rather than
747         the instance expression. Also, if you have base.Foo as the
748         method for a delegate, make sure to emit ldftn, not ldftnvirt.
749
750         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
751
752         (NewDelegate.DoResolve): Only check for the existance of Invoke
753         if the method is going to be needed. Use MethodGroupExpr.
754
755         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
756
757         * expression.cs: For pointer arith., make sure to use
758         the size of the type, not the size of the pointer to
759         the type.
760
761 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
762
763         Fix for #60722
764         * class.cs (Class): Added error CS0502 test.
765
766 2004-08-03  John Luke  <jluke@cfl.rr.com>
767             Raja R Harinath  <rharinath@novell.com>
768
769         Fix for #60997.
770         * attribute.cs (Attribute.complained_before): New flag.
771         (Attribute.ResolveType, Attribute.Resolve),
772         (Attribute.DefinePInvokeMethod): Set it.
773         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
774         
775 2004-08-03  Martin Baulig  <martin@ximian.com>
776
777         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
778         use a user-defined operator; we still need to do numeric
779         promotions in case one argument is a builtin type and the other
780         one has an implicit conversion to that type.  Fixes #62322.
781
782 2004-08-18  Martin Baulig  <martin@ximian.com>
783
784         * class.cs (Method.Define): Use the correct method name when
785         creating the MethodBuilder for a generic method.
786
787 2004-08-17  Martin Baulig  <martin@ximian.com>
788
789         * generic.cs (Constraints): Support type parameter constraints.
790
791 2004-08-16  Martin Baulig  <martin@ximian.com>
792
793         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
794         (Token.GENERIC_DIMENSION): New token; this is returned if we
795         encounter an unbound generic type in a typeof() expression.
796
797         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
798         this token is only generated while parsing a typeof() expression.
799         (typeof_expression): Removed the old unbound_type hack.
800
801         * generic.cs (TypeArguments.IsUnbound): New public property.
802
803         * decl.cs (MemberName): Added support for unbound types.
804
805 2004-08-14  Martin Baulig  <martin@ximian.com>
806
807         * typemanager.cs
808         (TypeManager.IsEqualGenericInstance): New static method.
809         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
810         just used to check accessibility, so follow the rules of 26.1.6.        
811
812         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
813         ConstructedType instead of a TypeExpression if we have type arguments.
814
815         * cs-parser.jay (typeof_expression): Support unbound generic types.
816
817         * ecore.cs (UnboundTypeExpression): New public class.
818
819 2004-08-12  Martin Baulig  <martin@ximian.com>
820
821         * typemanager.cs (TypeManager.IsNestedChildOf): Use
822         TypeManager.IsEqual() rather than `=='.
823
824         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
825         generic instances as well.
826
827 2004-08-12  Martin Baulig  <martin@ximian.com>
828
829         * expression.cs (Invocation.InferType): We can only infer method
830         type parameters.  Fixes #62647.
831
832 2004-08-11  Martin Baulig  <martin@ximian.com>
833
834         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
835         before resolving the base classes.
836
837 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
838
839         * Makefile: install .mdb file too.
840
841 2004-08-05  Martin Baulig  <martin@ximian.com>
842
843         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
844         initializer, the current type is just the TypeBuilder, not the
845         instantiated generic type.
846         (FieldExpr.IsFieldInitializer): New public property.
847
848 2004-08-04  Martin Baulig  <martin@ximian.com>
849
850         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
851
852         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
853
854 2004-08-03  Martin Baulig  <martin@ximian.com>
855
856         * class.cs (MethodData.Define): If we're an explicit
857         implementation, remove the generic arity from the type name.
858
859 2004-08-03  Martin Baulig  <martin@ximian.com>
860
861         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
862         use a user-defined operator; we still need to do numeric
863         promotions in case one argument is a builtin type and the other
864         one has an implicit conversion to that type.  Fixes #62322.
865
866 2004-08-02  Martin Baulig  <martin@ximian.com>
867
868         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
869         `TypeExpr[]' array.
870         (TypeContainer.GetClassBases): Return the unexpanded list of
871         interfaces; we expand them later.
872         (TypeContainer.DefineType): After creating the TypeBuilder, call
873         TypeManager.ExpandInterfaces() to get an expanded and resolved
874         list of interfaces.
875
876         * ecore.cs (TypeExpr.GetInterfaces): Removed
877
878         * generics.cs (Constraints.InterfaceConstraints): Remove.
879         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
880         register the interface constraints.
881
882         * typemanager.cs
883         (TypeManager.AddUserType): Removed the `ifaces' argument.
884         (TypeManager.AddTypeParameter): Likewise.
885         (TypeManager.AddUserInterface): Removed, was unused.
886         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
887         `TypeExpr[]' array for the interfaces.
888         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
889         has been defined, returns a list of the resolved interfaces types.
890         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
891         (TypeManager.GetExplicitInterfaces): Likewise.  
892
893 2004-08-02  Martin Baulig  <martin@ximian.com>
894
895         * expression.cs (Invocation.EmitCall): If we're invoking a method
896         on a type parameter, use the new `Constrained' prefix opcode.
897
898 2004-08-02  Martin Baulig  <martin@ximian.com>
899
900         * statement.cs (LocalInfo.Flags): Added `IsThis'.
901         (LocalInfo.IsThis): New public property.
902         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
903
904 2004-08-01  Martin Baulig  <martin@ximian.com>
905
906         * class.cs (TypeContainer.GetClassBases): Don't set the default
907         here since we may get called from GetPartialBases().
908         (TypeContainer.DefineType): If GetClassBases() didn't return a
909         parent, use the default one.
910
911 2004-07-30  Martin Baulig  <martin@ximian.com>
912
913         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
914
915         * class.cs (SourceMethod): New public class, derive from the
916         symbol writer's ISourceMethod.
917         (Method): Use the new symbol writer API.
918
919         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
920         as argument and use the new symbol writer.
921
922         * location.cs
923         (SourceFile): Implement the symbol writer's ISourceFile.
924         (Location.SymbolDocument): Removed.
925         (Location.SourceFile): New public property.
926
927         * symbolwriter.cs: Use the new symbol writer API.
928
929 2004-07-30  Raja R Harinath  <rharinath@novell.com>
930
931         * Makefile (install-local): Remove.  Functionality moved to
932         executable.make.
933
934 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
935
936         * Makefile: Install mcs.exe.config file together with mcs.exe.
937         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
938         correct runtime version.
939         
940 2004-07-25  Martin Baulig  <martin@ximian.com>
941
942         * class.cs
943         (TypeContainer.RegisterOrder): Removed, this was unused.
944         (TypeContainer, interface_order): Removed.
945         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
946         TypeContainer as argument since we can also be called with a
947         `PartialContainer' for a partial class/struct/interface.
948         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
949         of checking whether we're an `Interface' - we could be a
950         `PartialContainer'.
951         (PartialContainer.Register): Override; call
952         AddClass()/AddStruct()/AddInterface() on our parent.
953
954         * cs-parser.jay (interface_member_declaration): Add things to the
955         `current_container', not the `current_class'.
956
957         * rootcontext.cs (RegisterOrder): The overloaded version which
958         takes an `Interface' was unused, removed.
959
960         * typemanager.cs (TypeManager.LookupInterface): Return a
961         `TypeContainer', not an `Interface'.
962         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
963         contain a `PartialContainer' for an interface, so check it's
964         `Kind' to figure out what it is.
965
966 2004-07-25  Martin Baulig  <martin@ximian.com>
967
968         * class.cs (Class.DefaultTypeAttributes): New public constant.
969         (Struct.DefaultTypeAttributes): Likewise.
970         (Interface.DefaultTypeAttributes): Likewise.
971         (PartialContainer.TypeAttr): Override this and add the
972         DefaultTypeAttributes.
973
974 2004-07-25  Martin Baulig  <martin@ximian.com>
975
976         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
977         we can just use the `Parent' field instead.
978
979 2004-07-25  Martin Baulig  <martin@ximian.com>
980
981         * class.cs (TypeContainer.Emit): Renamed to EmitType().
982
983 2004-07-25  Martin Baulig  <martin@ximian.com>
984
985         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
986         our parts before defining any methods.
987         (TypeContainer.VerifyImplements): Make this virtual.
988         (ClassPart.VerifyImplements): Override and call VerifyImplements()
989         on our PartialContainer.
990
991 2004-07-25  Martin Baulig  <martin@ximian.com>
992
993         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
994
995         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
996         argument, we can just use the `Parent' field instead.
997
998         * class.cs
999         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1000         (MemberBase.DoDefine): Likewise.
1001
1002 2004-07-24  Martin Baulig  <martin@ximian.com>
1003
1004         * decl.cs (MemberCore.Parent): New public field.
1005         (DeclSpace.Parent): Moved to MemberCore.
1006
1007         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1008         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1009         parent's .ctor.
1010         (FieldBase, Field, Operator): Likewise.
1011         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1012         (EventField, Event): Likewise.
1013
1014 2004-07-23  Martin Baulig  <martin@ximian.com>
1015
1016         * class.cs (PartialContainer): New public class.
1017         (ClassPart): New public class.
1018         (TypeContainer): Added support for partial classes.
1019         (TypeContainer.GetClassBases): Splitted some of the functionality
1020         out into GetNormalBases() and GetPartialBases().
1021
1022         * cs-tokenizer.cs (Token.PARTIAL): New token.
1023         (Tokenizer.consume_identifier): Added some hacks to recognize
1024         `partial', but only if it's immediately followed by `class',
1025         `struct' or `interface'.
1026
1027         * cs-parser.jay: Added support for partial clases.
1028
1029 2004-07-23  Martin Baulig  <martin@ximian.com>
1030
1031         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1032         a `DeclSpace' and also made it readonly.
1033         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1034         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1035         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1036
1037         * cs-parser.jay: Pass the `current_class', not the
1038         `current_container' (at the moment, this is still the same thing)
1039         to a new Method, Property, Event, Indexer or Constructor.
1040
1041 2004-07-23  Martin Baulig  <martin@ximian.com>
1042
1043         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1044         and removed the `current_interface' one.
1045         (struct_declaration, class_declaration, interface_declaration):
1046         Set `current_class' to the newly created class/struct/interface;
1047         set their `Bases' and call Register() before parsing their body.
1048
1049 2004-07-23  Martin Baulig  <martin@ximian.com>
1050
1051         * class.cs (Kind): New public enum.
1052         (TypeContainer): Made this class abstract.
1053         (TypeContainer.Kind): New public readonly field.
1054         (TypeContainer.CheckDef): New public method; moved here from
1055         cs-parser.jay.
1056         (TypeContainer.Register): New public abstract method.
1057         (TypeContainer.GetPendingImplementations): New public abstract
1058         method.
1059         (TypeContainer.GetClassBases): Removed the `is_class' and
1060         `is_iface' parameters.
1061         (TypeContainer.DefineNestedTypes): Formerly known as
1062         DoDefineType().
1063         (ClassOrStruct): Made this class abstract.
1064
1065         * tree.cs (RootTypes): New public type. 
1066
1067 2004-07-20  Martin Baulig  <martin@ximian.com>
1068
1069         * tree.cs (Tree.RecordNamespace): Removed.
1070         (Tree.Namespaces): Removed.
1071
1072         * rootcontext.cs (RootContext.IsNamespace): Removed.
1073
1074         * cs-parser.jay (namespace_declaration): Just create a new
1075         NamespaceEntry here.
1076
1077 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
1078
1079         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
1080         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
1081         entry to make sure it runs in the correct runtime version.
1082         
1083 2004-07-18  Martin Baulig  <martin@ximian.com>
1084
1085         * generic.cs (ConstructedType.CheckConstraints): Improved
1086         constraints checking.
1087
1088 2004-07-18  Martin Baulig  <martin@ximian.com>
1089
1090         * expression.cs (Invocation.BetterMethod): Call
1091         TypeManager.TypeToCoreType() on all types and removed my previous
1092         hack; we're already doig the right thing here.
1093
1094 2004-07-17  Martin Baulig  <martin@ximian.com>
1095
1096         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
1097
1098 2004-07-16  Martin Baulig  <martin@ximian.com>
1099
1100         * iterators.cs: Added generics support.
1101
1102 2004-07-16  Martin Baulig  <martin@ximian.com>
1103
1104         * iterators.cs: Rewrote this.  We're now using one single Proxy
1105         class for both the IEnumerable and the IEnumerator interface and
1106         `Iterator' derives from Class so we can use the high-level API.
1107
1108         * class.cs (TypeContainer.AddIterator): New method.
1109         (TypeContainer.DoDefineType): New protected virtual method, which
1110         is called from DefineType().
1111         (TypeContainer.DoDefineMembers): Call DefineType() and
1112         DefineMembers() on all our iterators.
1113         (TypeContainer.Emit): Call Emit() on all our iterators.
1114         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1115
1116         * codegen.cs (EmitContext.CurrentIterator): New public field.
1117
1118 2004-07-15  Martin Baulig  <martin@ximian.com>
1119
1120         * typemanager.cs
1121         (TypeManager.not_supported_exception_type): New type.   
1122
1123 2004-07-14  Martin Baulig  <martin@ximian.com>
1124
1125         * typemanager.cs
1126         (TypeManager.generic_ienumerable_type): New type.
1127         (TypeManager.generic_ienumerator_type): New type.
1128
1129         * rootcontext.cs
1130         (RootContext.interfaces_first_stage): Added
1131         "System.Collections.Generic.IEnumerator`1" and
1132         "System.Collections.Generic.IEnumerable`1".     
1133
1134 2004-07-14  Martin Baulig  <martin@ximian.com>
1135
1136         * iterators.cs: Use real error numbers.
1137
1138 2004-07-14  Martin Baulig  <martin@ximian.com>
1139
1140         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1141         requires this to be a System.Collection.IEnumerable and not a
1142         class implementing that interface.
1143         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1144
1145 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1146
1147         * class.cs: Fixed previous fix, it broke some error tests.
1148
1149 2004-07-12  Martin Baulig  <martin@ximian.com>
1150
1151         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1152         Fixes #61293.
1153
1154 2004-07-14  Martin Baulig  <martin@ximian.com>
1155
1156         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
1157         an exclamation mark (!) for the generic arity to reflect the
1158         latest spec changes; ie. use "System.Collections.Generic.IList`1".
1159
1160 2004-07-13  Martin Baulig  <martin@ximian.com>
1161
1162         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
1163         specifiers being part of a type argument.
1164
1165 2004-07-13  Martin Baulig  <martin@ximian.com>
1166
1167         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
1168         name for generic types.
1169
1170 2004-07-13  Martin Baulig  <martin@ximian.com>
1171
1172         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
1173         bit to fix #60119.
1174
1175 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1176
1177         * assign.cs (LocalTemporary): Add new argument: is_address,If
1178         `is_address' is true, then the value that we store is the address
1179         to the real value, and not the value itself.
1180         
1181         * ecore.cs (PropertyExpr): use the new local temporary
1182         stuff to allow us to handle X.Y += z (where X is a struct)
1183
1184 2004-07-08  Martin Baulig  <martin@ximian.com>
1185
1186         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1187         not always return, just like we're doing in Using.Resolve().
1188
1189 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1190
1191         * cs-parser.jay (fixed_statement): flag this as Pinned.
1192
1193 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1194
1195         * typemanager.cs (TypeManager): Removed MakePinned method, this
1196         mechanism is replaced with the .NET 2.x compatible mechanism of
1197         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1198
1199         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1200         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1201         `IsFixed' property which has a different meaning.
1202
1203 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1204
1205         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1206         visible from inside a nested class, not just the names of the
1207         immediately enclosing class.
1208         Fix for bug #60730.
1209
1210 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1211
1212         * expression.cs (BetterConversion): Remove buggy special-case
1213         handling of "implicit constant expression conversions".  At this
1214         point, we already know that the conversion is possible -- we're
1215         only checking to see which is better.
1216
1217 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1218
1219         * cs-parser.jay: Added error CS0210 test.
1220
1221 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1222
1223         * cs-parser.jay: Added error CS0134 test.
1224
1225 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1226
1227         Fix bug #52507
1228         * cs-parser.jay: Added error CS0145 test.
1229
1230 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1231
1232         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1233
1234 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1235         
1236         * expression.cs (StackAlloc.Resolve): The argument may not
1237         be a constant; deal with this case.
1238         
1239 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1240
1241         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1242         GetIndexerAttributeValue.
1243         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1244
1245         * class.cs (Indexer.Define): Added error tests for CS0415,
1246         CS0609.
1247
1248 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1249
1250         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1251         property code.
1252
1253 2004-06-23  Martin Baulig  <martin@ximian.com>
1254
1255         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1256         neither return nor throw, reset the barrier as well.  Fixes #60457.
1257
1258 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1259
1260         * class.cs : EventAttributes is now set to None by default.
1261           This fixes bug #60459.
1262
1263 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1264
1265         Fix bug #60219
1266         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1267         Don't throw exception but return null (it's sufficient now).
1268
1269 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1270
1271         * typemanager.cs (GetArgumentTypes): Faster implementation.
1272
1273 2004-06-18  Martin Baulig  <martin@ximian.com>
1274
1275         * attribute.cs (Attribute.Resolve): Check whether we're an
1276         EmptyCast which a Constant child.  Fixes #60333.
1277
1278 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1279
1280         * statement.cs (EmitCollectionForeach): Account for the fact that
1281         not all valuetypes are in areas which we can take the address of.
1282         For these variables, we store to a temporary variable. Also, make
1283         sure that we dont emit a `callvirt' on a valuetype method.
1284
1285 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1286
1287         * expression.cs (StackAlloc.DoReSolve): Added test for
1288         negative parameter (CS0247).
1289
1290 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1291
1292         Fix bug #59792
1293         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1294
1295 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1296
1297         Fix bug #59781
1298         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1299         ulong.
1300
1301 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1302
1303         Fix bug #58254 & cs1555.cs, cs1556.cs
1304         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1305
1306 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1307
1308         * cs-parser.jay: Added error CS1669 test for indexers.
1309
1310 2004-06-18  Martin Baulig  <martin@ximian.com>
1311
1312         * generics.cs (GenericMethod.ctor): Don't take an Attributes
1313         argument.  Fixes #60441.
1314
1315 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
1316         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
1317         The name needs to have the actual name of the method in order
1318         for other tests (such as the one in OverloadResolve for Invoke
1319         on a delegate) to work. As well, it does not really help
1320         error reporting because the method group had multiple methods.
1321         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
1322         Make profiling work.
1323         
1324 2004-06-13  Martin Baulig  <martin@ximian.com>
1325
1326         * cs-parser.jay: Don't allow generic attributes.
1327
1328 2004-06-13  Martin Baulig  <martin@ximian.com>
1329
1330         * class.cs (MemberBase.DoDefineBase): New protected method.
1331         (MemberBase.DoDefine): Compute the `flags' in the new
1332         DoDefineBase() which must be called first.
1333         (Method.Define): Call DoDefineBase() first so we have the flags
1334         when defining the generic method.
1335
1336         * cs-parser.jay (interface_method_declaration): Support generic methods.
1337
1338 2004-06-13  Martin Baulig  <martin@ximian.com>
1339
1340         * decl.cs (TypeName): Removed.
1341         (MemberName): Removed TypeName and MemberNow; now we just have
1342         MemberName.
1343
1344         * cs-parser.jay: Don't distinguish between type arguments and type
1345         parameters in the grammar and simplified the rules a bit.  The
1346         reduce/reduce conflicts are now gone (except the one we inherited
1347         from mcs).
1348
1349 2004-06-11  Martin Baulig  <martin@ximian.com>
1350
1351         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1352         call this twice: for params and varargs methods.
1353
1354 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1355
1356         * class.cs:
1357         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1358
1359 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1360
1361         * attribute.cs (Attribute.GetValidTargets): Made public.
1362
1363         * class.cs: 
1364         (AbstractPropertyEventMethod): New class for better code sharing.
1365         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1366         CS1667 report.
1367         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1368
1369 2004-06-09  Martin Baulig  <martin@ximian.com>
1370
1371         * cs-parser.jay: Removed a reduce/reduce conflict.
1372
1373 2004-06-03  Martin Baulig  <martin@ximian.com>
1374
1375         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
1376         GetSimpleName() and return a SimpleName.
1377
1378         * ecore.cs (SimpleName.Arguments): New public field.
1379         (SimpleName): Added overloaded ctor which takes an additional
1380         TypeArguments argument.
1381         (SimpleName.SimpleNameResolve): Added support for generic methods.
1382         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
1383         formerly in MemberAccess.DoResolve(), but we also need it in
1384         SimpleNameResolve().
1385
1386         * expression.cs (MemberAccess.DoResolve): Use the new
1387         MethodGroupExpr.ResolveGeneric().       
1388
1389 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1390
1391         * decl.cs: If possible, use lookuptypedirect here. We can only do
1392         this if there is no `.' after the namespace. Avoids using
1393         LookupType, which does lots of slow processing.
1394         (FindNestedType) New method, does what it says :-).
1395         * namespace.cs: use LookupTypeDirect.
1396         * rootcontext.cs: use membercache, if possible.
1397         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1398
1399 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1400
1401         * expression.cs:
1402         According to the spec, 
1403
1404         In a member access of the form E.I, if E is a single identifier,
1405         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1406         field, property, localvariable, or parameter with the same type as
1407         the meaning of E as a type-name (§3.8), then both possible
1408         meanings of E are permitted.
1409
1410         We did not check that E as a simple-name had the same type as E as
1411         a type name.
1412
1413         This trivial check gives us 5-7% on bootstrap time.
1414
1415 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1416
1417         * expression.cs (Invocation.OverloadResolve): Avoid the
1418         use of hashtables and boxing here by allocating on demand.
1419
1420 2004-05-30  Martin Baulig  <martin@ximian.com>
1421
1422         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1423         we're doing a silent lookup.  Don't try to lookup nested types in
1424         TypeManager.object_type (thanks to Ben Maurer).
1425
1426 2004-05-30  Martin Baulig  <martin@ximian.com>
1427
1428         Committing a patch from Ben Maurer.
1429
1430         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1431
1432 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1433
1434         * convert.cs: add a trivial cache for overload operator resolution.
1435
1436 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
1437
1438         * attribute.cs
1439         (AttributeTester.GetObsoleteAttribute): Returns instance of
1440         ObsoleteAttribute when type is obsolete.
1441
1442         * class.cs
1443         (TypeContainer.VerifyObsoleteAttribute): Override.
1444         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1445         (MethodCode.VerifyObsoleteAttribute): Override.
1446         (MemberBase.VerifyObsoleteAttribute): Override.
1447
1448         * decl.cs
1449         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1450         and report proper error.
1451
1452         *delegate.cs
1453         (Delegate.VerifyObsoleteAttribute): Override.
1454
1455         * ecore.cs
1456         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1457         and report proper error.
1458         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1459
1460         * enum.cs
1461         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1462         and enum member.
1463
1464         * expression.cs
1465         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1466         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1467         Added test for ObsoleteAttribute.
1468
1469         * statement.cs
1470         (Catch): Derived from Statement.
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  Marek Safar  <marek.safar@seznam.cz>
1499
1500         Fixed bug #59071 & cs0160.cs
1501         * statement.cs (Try.Resolve): Check here whether order of catch
1502         clauses matches their dependencies.
1503
1504 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1505
1506         Fixed bug #58624
1507         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
1508         unsafe type.
1509
1510 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1511
1512         * expression.cs (Invocation.OverloadResolve): Avoid the
1513         use of hashtables and boxing here by allocating on demand.
1514
1515 2004-05-30  Martin Baulig  <martin@ximian.com>
1516
1517         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1518         we're doing a silent lookup.  Don't try to lookup nested types in
1519         TypeManager.object_type (thanks to Ben Maurer).
1520
1521 2004-05-30  Martin Baulig  <martin@ximian.com>
1522
1523         Committing a patch from Ben Maurer.
1524
1525         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
1526
1527 2004-05-29  Martin Baulig  <martin@ximian.com>
1528
1529         * class.cs (IMethodData.ShouldIgnore): New method.
1530
1531         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1532         `Location' argument, we don't need it anywhere.  Use
1533         `IMethodData.ShouldIgnore ()' instead of
1534         `MethodData.GetMethodFlags ()'.
1535         (TypeManager.AddMethod): Removed.
1536         (TypeManager.AddMethod2): Renamed to AddMethod.
1537
1538 2004-05-29  Martin Baulig  <martin@ximian.com>
1539
1540         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1541
1542         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1543         converting from a class type S to an interface type and we already
1544         have an object on the stack, don't box it again.  Fixes #52578.
1545
1546 2004-05-29  Martin Baulig  <martin@ximian.com>
1547
1548         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1549         Added support for `params' parameters.  Fixes #59267.
1550
1551 2004-05-29  Martin Baulig  <martin@ximian.com>
1552
1553         * literal.cs (NullPointer): Provide a private .ctor which sets
1554         `type' to TypeManager.object_type.  Fixes #59048.
1555
1556 2004-05-29  Martin Baulig  <martin@ximian.com>
1557
1558         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1559         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1560
1561         * ecore.cs (EventExpr.instance_expr): Make the field private.
1562
1563 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1564
1565         Fixed bug #50080 & cs0214-2.cs
1566         * expression.cs (Cast.DoResolve): Check unsafe context here.
1567         
1568         * statement.cs (Resolve.DoResolve): Likewise.
1569
1570 2004-05-26  Martin Baulig  <martin@ximian.com>
1571
1572         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1573
1574         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1575         (RootContext.LookupType): Pass down the `silent' flag.
1576
1577 2004-05-25  Martin Baulig  <martin@ximian.com>
1578
1579         * expression.cs
1580         (MethodGroupExpr.IdenticalTypeName): New public property.
1581         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1582         expression actually refers to a type.
1583
1584 2004-05-25  Martin Baulig  <martin@ximian.com>
1585
1586         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1587         for #56176 and made it actually work.
1588
1589 2004-05-25  Martin Baulig  <martin@ximian.com>
1590
1591         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1592         (FieldExpr, PropertyExpr): Override and implement
1593         CacheTemporaries.  Fixes #52279.
1594
1595 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1596
1597         * location.cs: In the new compiler listing a file twice is a
1598         warning, not an error.
1599
1600 2004-05-24  Martin Baulig  <martin@ximian.com>
1601
1602         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1603         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1604
1605 2004-05-24  Martin Baulig  <martin@ximian.com>
1606
1607         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1608         walking the `using' list.  Fixes #53921.
1609
1610 2004-05-24  Martin Baulig  <martin@ximian.com>
1611
1612         * const.cs (Const.LookupConstantValue): Added support for
1613         EmptyCast's; fixes #55251.
1614
1615 2004-05-24  Martin Baulig  <martin@ximian.com>
1616
1617         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1618         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1619         which does the CS0135 check.  The reason is that we first need to
1620         check whether the variable actually exists.
1621
1622 2004-05-24  Martin Baulig  <martin@ximian.com>
1623
1624         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1625         than RootContext.LookupType() to find the explicit interface
1626         type.  Fixes #58584.
1627
1628 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1629
1630         * Makefile: Simplify.  Use executable.make.
1631         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1632
1633 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1634
1635         * decl.cs:
1636         * enum.cs:
1637         Use the invariant culture when doing String.Compare for CLS case
1638         sensitivity.
1639         
1640 2004-05-23  Martin Baulig  <martin@ximian.com>
1641
1642         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1643         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1644
1645         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1646
1647 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1648
1649         * class.cs (MemberBase.Define): Reuse MemberType member for 
1650         resolved type. Other methods can use it too.
1651
1652 2004-05-23  Martin Baulig  <martin@ximian.com>
1653
1654         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1655         the variable also exists in the current block (otherwise, we need
1656         to report a CS0103).  Fixes #58670.
1657
1658 2004-05-23  Martin Baulig  <martin@ximian.com>
1659
1660         * flowanalysis.cs (Reachability.Reachable): Compute this
1661         on-the-fly rather than storing it as a field.
1662
1663 2004-05-23  Martin Baulig  <martin@ximian.com>
1664
1665         * flowanalysis.cs (Reachability.And): Manually compute the
1666         resulting `barrier' from the reachability.      
1667        
1668 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1669
1670         Fix bug #57835
1671         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1672         instance of ObsoleteAttribute when symbol is obsolete.
1673
1674         * class.cs
1675         (IMethodData): Extended interface for ObsoleteAttribute support.
1676
1677 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1678
1679         * attribute.cs: Fix bug #55970
1680
1681 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1682
1683         Fix bug #52705
1684         * attribute.cs
1685         (GetObsoleteAttribute): New method. Creates the instance of
1686         ObsoleteAttribute.
1687         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1688         ObsoleteAttribute when member is obsolete.
1689         (AttributeTester.Report_ObsoleteMessage): Common method for
1690         Obsolete error/warning reporting.
1691
1692         * class.cs
1693         (TypeContainer.base_classs_type): New member for storing parent type.
1694
1695         * decl.cs
1696         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1697         for this MemberCore.
1698
1699 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1700
1701         * attribute.cs, const.cs: Fix bug #58590
1702
1703 2004-05-21  Martin Baulig  <martin@ximian.com>
1704
1705         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1706         out parameters if the end of the method is unreachable.  Fixes
1707         #58098. 
1708
1709 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1710
1711         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1712         Hari was right, why extra method.
1713
1714 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1715
1716         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1717
1718 2004-05-20  Martin Baulig  <martin@ximian.com>
1719
1720         * delegate.cs: Convert this file to Unix mode - like the original
1721         version in mcs is.
1722
1723 2004-05-20  Martin Baulig  <martin@ximian.com>
1724
1725         * attribute.cs: Convert this file to Unix mode - like the original
1726         version in mcs is.
1727
1728 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1729
1730        Fix bug #58688 (MCS does not report error when the same attribute
1731        is assigned twice)
1732
1733        * attribute.cs (Attribute.Emit): Distinction between null and default.
1734
1735 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1736
1737        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1738        of a top-level attribute without an attribute target.
1739        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1740        Make non-static.
1741        (Attribute.Conditional_GetConditionName), 
1742        (Attribute.Obsolete_GetObsoleteMessage): Update.
1743        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1744        part of ScanForIndexerName.
1745        (Attribute.CanIgnoreInvalidAttribute): New function.
1746        (Attribute.ScanForIndexerName): Move to ...
1747        (Attributes.ScanForIndexerName): ... here.
1748        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1749        (Attributes.Search): New internal variant that can choose not to
1750        complain if types aren't resolved.  The original signature now
1751        complains.
1752        (Attributes.GetClsCompliantAttribute): Use internal variant, with
1753        complaints suppressed.
1754        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1755        only if it not useful.
1756        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1757        top-level for attributes that are shared between the assembly
1758        and a top-level class.
1759        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1760        * class.cs: Update to reflect changes.
1761        (DefineIndexers): Fuse loops.
1762        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1763        a couple more variants of attribute names.
1764
1765 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1766
1767         Fix bug #52585 (Implemented explicit attribute declaration)
1768
1769         * attribute.cs:
1770         (Attributable.ValidAttributeTargets): New abstract method. It gets
1771         list of valid attribute targets for explicit target declaration.
1772         (Attribute.Target): It holds target itself.
1773         (AttributeSection): Removed.
1774         (Attribute.CheckTargets): New method. It checks whether attribute
1775         target is valid for the current element.
1776
1777         * class.cs:
1778         (EventProperty): New class. For events that are declared like
1779         property (with add and remove accessors).
1780         (EventField): New class. For events that are declared like field.
1781         class.cs
1782
1783         * cs-parser.jay: Implemented explicit attribute target declaration.
1784
1785         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1786         Override ValidAttributeTargets.
1787
1788         * parameter.cs:
1789         (ReturnParameter): Class for applying custom attributes on 
1790         the return type.
1791         (ParameterAtribute): New class. Class for applying custom
1792         attributes on the parameter type.
1793
1794 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1795
1796         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1797         definitions. 
1798
1799         (Method): Allow UNSAFE here.
1800
1801         * modifiers.cs: Support unsafe reporting.
1802
1803 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1804
1805         * decl.cs: Fix bug #58478.
1806
1807 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1808
1809         * statement.cs: When checking for unreachable code on an EmptyStatement,
1810         set the location. Fixes bug #58488.
1811
1812 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1813
1814         * driver.cs: Add -pkg handling.
1815
1816         From Gonzalo: UseShelLExecute=false
1817
1818 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1819
1820         * attribute.cs:
1821         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1822         for attribute.
1823         (Attribute.IsClsCompliaceRequired): Moved to base for better
1824         accesibility.
1825         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1826         when attribute is AttributeUsageAttribute.
1827         (Attribute.GetValidTargets): Simplified.
1828         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1829         attribute for this type.
1830         (Attribute.ApplyAttributes): Method renamed to Emit and make
1831         non-static.
1832         (GlobalAttributeSection): New class for special handling of global
1833         attributes (assembly, module).
1834         (AttributeSection.Emit): New method.
1835
1836         * class.cs: Implemented Attributable abstract methods.
1837         (MethodCore.LabelParameters): Moved to Parameter class.
1838         (Accessor): Is back simple class.
1839         (PropertyMethod): Implemented Attributable abstract class.
1840         (DelegateMethod): Implemented Attributable abstract class.
1841         (Event): New constructor for disctintion between normal Event
1842         and Event with accessors.
1843
1844         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1845
1846         * codegen.cs, const.cs, decl.cs, delegate.cs:
1847         (CommonAssemblyModulClass): Implemented Attributable abstract class
1848         and simplified.
1849
1850         * enum.cs: Implement IAttributeSupport interface.
1851         (EnumMember): New class for emum members. Implemented Attributable
1852         abstract class
1853
1854         * parameter.cs:
1855         (ParameterBase): Is abstract.
1856         (ReturnParameter): New class for easier [return:] attribute handling.
1857
1858         * typemanager.cs: Removed builder_to_attr.
1859
1860 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1861
1862         Fix bug #57151.
1863         * attribute.cs (Attribute.GetPositionalValue): New function.
1864         * class.cs (TypeContainer.VerifyMembers): New function.
1865         (TypeContainer.Emit): Use it.
1866         (ClassOrStruct): New base class for Class and Struct.
1867         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1868         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1869         class.
1870         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1871         then each non-static field should have a FieldOffset attribute.
1872         Otherwise, none of the fields should have a FieldOffset attribute.
1873         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1874         and FieldOffset attributes.
1875         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1876         (TypeManager.field_offset_attribute_type): New core types.
1877         (TypeManager.InitCoreTypes): Initialize them.
1878
1879 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1880
1881         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1882         Return correct type.
1883         From bug #58270.
1884
1885 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1886
1887         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1888         be implicitly converted to ulong.
1889         
1890         * expression.cs: The logic for allowing operator &, | and ^ worked
1891         was wrong, it worked before because we did not report an error in
1892         an else branch.  Fixes 57895.
1893
1894         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1895         allow volatile fields to be reference types.
1896
1897 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1898
1899         * driver.cs: Add support for /debug-
1900
1901 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1902
1903         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1904         Add a 'complain' parameter to silence errors.
1905         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1906         silently overlooked type-resolutions.
1907         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1908         to reflect changes.
1909         (Attributes.Search): New function.
1910         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1911         (Attributes.GetAttributeFullName): Remove hack.
1912         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1913         Update to reflect changes.
1914         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1915         Use Attributes.Search instead of nested loops.
1916
1917 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1918
1919         * decl.cs:
1920         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1921         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1922         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1923
1924         * report.cs: (Report.Warning): Renamed to Warning_T because of
1925         parameter collision.
1926
1927 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1928
1929         * expression.cs (MemberAccess.ResolveMemberAccess):
1930         Exit with non-zero status after Report.Error.
1931         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1932         Likewise.
1933         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1934
1935 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1936
1937         * support.cs: Don't hang when the file is empty.
1938
1939 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1940
1941         * support.cs: In SeekableStreamReader, compute the preamble size of the
1942           underlying stream. Position changes should take into account that initial
1943           count of bytes.
1944
1945 2004-05-03  Todd Berman  <tberman@sevenl.net>
1946
1947         * driver.cs: remove unused GetSysVersion function.
1948
1949 2004-05-03  Todd Berman  <tberman@sevenl.net>
1950
1951         * driver.cs: Remove the hack from saturday, as well as the hack
1952         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1953         link_paths to get that bit proper.
1954
1955 2004-05-01  Todd Berman  <tberman@sevenl.net>
1956
1957         * driver.cs: Try a LoadFrom before a Load, this checks the current
1958         path. This is currently a bug in mono that is be fixed, however, this
1959         provides a workaround for now. This will be removed when the bug
1960         is fixed.
1961
1962 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1963
1964         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1965         incomplete key pairs (#57941).
1966
1967 2004-05-01  Todd Berman  <tberman@sevenl.net>
1968
1969         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1970         from the GAC
1971
1972 2004-04-30  Jackson Harper  <jackson@ximian.com>
1973
1974         * codegen.cs: Open keys readonly.
1975         
1976 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1977
1978         * typemanager.cs: don't report cyclic struct layout when a struct
1979         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1980         which has 2 Pango.Rectangle fields.
1981
1982 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1983
1984         * expression.cs: Handle IntPtr comparisons with IL code
1985         rather than a method call.
1986
1987 2004-04-29  Martin Baulig  <martin@ximian.com>
1988
1989         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1990         the list of PropertyInfo's in class hierarchy and find the
1991         accessor.  Fixes #56013.
1992
1993 2004-04-29  Martin Baulig  <martin@ximian.com>
1994
1995         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
1996
1997 2004-04-29  Martin Baulig  <martin@ximian.com>
1998
1999         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2000
2001         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2002
2003 2004-04-29  Martin Baulig  <martin@ximian.com>
2004
2005         * class.cs (ConstructorInitializer.Resolve): Check whether the
2006         parent .ctor is accessible.  Fixes #52146.
2007
2008 2004-04-29  Martin Baulig  <martin@ximian.com>
2009
2010         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2011
2012         * statement.cs (Using.EmitLocalVariableDecls): Use
2013         TypeManager.idisposable_type, not typeof (IDisposable).
2014         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2015
2016 2004-04-29  Martin Baulig  <martin@ximian.com>
2017
2018         * class.cs (Event.Define): Don't emit the field and don't set
2019         RTSpecialName and SpecialName for events on interfaces.  Fixes
2020         #57703. 
2021
2022 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2023
2024         Refactor Attribute.ApplyAttributes.
2025         * attribute.cs (Attributable): New base class for objects that can
2026         have Attributes applied on them.
2027         (Attribute): Make AttributeUsage fields public.
2028         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2029         (Attribute.IsInternalCall): New property.
2030         (Attribute.UsageAttr): Convert to a public read-only property.
2031         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2032         (Attribute.ResolveType, Attribute.Resolve)
2033         (Attribute.ScanForIndexerName): Update to reflect changes.
2034         (Attribute.CheckAttributeTarget): Re-format.
2035         (Attribute.ApplyAttributes): Refactor, to various
2036         Attributable.ApplyAttributeBuilder methods.
2037         * decl.cs (MemberCore): Make Attributable.
2038         * class.cs (Accessor): Make Attributable.
2039         (MethodData.ApplyAttributes): Use proper attribute types, not
2040         attribute names.
2041         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2042         (TypeContainer.ApplyAttributeBuilder)
2043         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2044         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2045         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2046         (Operator.ApplyAttributeBuilder): New factored-out methods.
2047         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2048         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2049         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2050         * parameter.cs (ParameterBase): New Attributable base class
2051         that can also represent Return types.
2052         (Parameter): Update to the changes.
2053
2054 2004-04-29  Jackson Harper  <jackson@ximian.com>
2055
2056         * driver.cs: Prefer the corlib system version when looking for
2057         assemblies in the GAC. This is still a hack, but its a better hack
2058         now.
2059         
2060 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2061
2062         * decl.cs, enum.cs: Improved error 3005 reporting.
2063   
2064         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2065         (related_symbols): New private member for list of symbols
2066         related to reported error/warning.
2067         
2068         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2069
2070 2004-04-29  Martin Baulig  <martin@ximian.com>
2071
2072         * ecore.cs (Expression.Constantify): If we're an enum and
2073         TypeManager.TypeToCoreType() doesn't give us another type, use
2074         t.UnderlyingSystemType.  Fixes #56178.  
2075
2076 2004-04-29  Martin Baulig  <martin@ximian.com>
2077
2078         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2079         interfaces and for each interface, only add members directly
2080         declared in that interface.  Fixes #53255.
2081
2082 2004-04-28  Martin Baulig  <martin@ximian.com>
2083
2084         * expression.cs (ConditionalLogicalOperator): Use a temporary
2085         variable for `left' to avoid that we evaluate it more than once;
2086         bug #52588.
2087
2088 2004-04-28  Martin Baulig  <martin@ximian.com>
2089
2090         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2091         `void[]' (CS1547).
2092
2093 2004-04-28  Martin Baulig  <martin@ximian.com>
2094
2095         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2096         void (CS1547).
2097
2098         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2099         whether the type is not void (CS1547).
2100
2101 2004-04-28  Martin Baulig  <martin@ximian.com>
2102
2103         * expression.cs (Unary.DoResolveLValue): Override this and report
2104         CS0131 for anything but Operator.Indirection.
2105
2106 2004-04-28  Martin Baulig  <martin@ximian.com>
2107
2108         Committing a patch from Ben Maurer; see bug #50820.
2109
2110         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2111         check for classes.
2112
2113         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2114         classes.        
2115
2116 2004-04-28  Martin Baulig  <martin@ximian.com>
2117
2118         Committing a patch from Ben Maurer; see bug #50820.
2119
2120         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2121         check for classes.
2122
2123         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2124         classes.        
2125
2126 2004-04-28  Martin Baulig  <martin@ximian.com>
2127
2128         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2129         (Block.AddLabel): Call DoLookupLabel() to only search in the
2130         current block.
2131
2132 2004-04-28  Martin Baulig  <martin@ximian.com>
2133
2134         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2135         comparing StringConstants and NullLiterals in Equality and Inequality.
2136
2137 2004-04-28  Jackson Harper  <jackson@ximian.com>
2138
2139         * driver.cs: Attempt to load referenced assemblies from the
2140         GAC. This is the quick and dirty version of this method that
2141         doesnt take into account versions and just takes the first
2142         canidate found. Will be good enough for now as we will not have more
2143         then one version installed into the GAC until I update this method.
2144
2145 2004-04-28  Martin Baulig  <martin@ximian.com>
2146
2147         * typemanager.cs (TypeManager.CheckStructCycles): New public
2148         static method to check for cycles in the struct layout.
2149
2150         * rootcontext.cs (RootContext.PopulateTypes): Call
2151         TypeManager.CheckStructCycles() for each TypeContainer.
2152         [Note: We only need to visit each type once.]
2153
2154 2004-04-28  Martin Baulig  <martin@ximian.com>
2155
2156         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2157
2158         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2159         success and added `out object value'.  Use a `bool resolved' field
2160         to check whether we've already been called rather than
2161         `ConstantValue != null' since this breaks for NullLiterals.
2162
2163 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2164
2165         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2166         setting of this flag, since the 'set' method may be non-public.
2167
2168 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2169
2170         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2171         check on current_vector.Block.
2172
2173 2004-04-27  Martin Baulig  <martin@ximian.com>
2174
2175         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2176         a field initializer.  Fixes #56459.
2177
2178 2004-04-27  Martin Baulig  <martin@ximian.com>
2179
2180         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2181         we're not attempting to use an indexer.  Fixes #52154.
2182
2183 2004-04-27  Martin Baulig  <martin@ximian.com>
2184
2185         * statement.cs (Return): Don't create a return label if we don't
2186         need it; reverts my change from January 20th.  Thanks to Ben
2187         Maurer for this.
2188
2189 2004-04-27  Martin Baulig  <martin@ximian.com>
2190
2191         According to the spec, `goto' can only leave a nested scope, but
2192         never enter it.
2193
2194         * statement.cs (Block.LookupLabel): Only lookup in the current
2195         block, don't recurse into parent or child blocks.
2196         (Block.AddLabel): Check in parent and child blocks, report
2197         CS0140/CS0158 if we find a duplicate.
2198         (Block): Removed this indexer for label lookups.
2199         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2200         this already does the error reporting for us.
2201
2202         * flowanalysis.cs
2203         (FlowBranching.UsageVector.Block): New public variable; may be null.
2204         (FlowBranching.CreateSibling): Added `Block' argument.
2205         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2206         label for the target of a `goto' and check whether we're not
2207         leaving a `finally'.
2208
2209 2004-04-27  Martin Baulig  <martin@ximian.com>
2210
2211         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2212         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2213         just for returns).
2214
2215 2004-04-27  Martin Baulig  <martin@ximian.com>
2216
2217         * statement.cs (Block.AddLabel): Also check for implicit blocks
2218         and added a CS0158 check.
2219
2220 2004-04-27  Martin Baulig  <martin@ximian.com>
2221
2222         * flowanalysis.cs (FlowBranchingLoop): New class.
2223         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2224         UsageVector's instead of an ArrayList.
2225         (FlowBranching.Label): Likewise.
2226         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2227         (FlowBranching.AddBreakVector): New method.
2228
2229 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2230
2231         * attribute.cs: Small regression fix: only convert the type if we
2232         the type is different, fixes System.Drawing build.
2233
2234 2004-04-27  Martin Baulig  <martin@ximian.com>
2235
2236         * attribute.cs (Attribute.Resolve): If we have a constant value
2237         for a named field or property, implicity convert it to the correct
2238         type.
2239
2240 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2241
2242         * statement.cs (Block.Block): Implicit blocks share
2243         'child_variable_names' fields with parent blocks.
2244         (Block.AddChildVariableNames): Remove.
2245         (Block.AddVariable): Mark variable as "used by a child block" in
2246         every surrounding block.
2247         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2248         been used in a child block, complain about violation of "Invariant
2249         meaning in blocks" rule.
2250         * cs-parser.jay (declare_local_variables): Don't use
2251         AddChildVariableNames.
2252         (foreach_statement): Don't create an implicit block: 'foreach'
2253         introduces a scope.
2254
2255 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2256
2257         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2258         converting from 0L to ulong.  Fixes 57522.
2259
2260 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2261
2262         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2263         derived class hides via 'new' keyword field from base class (test-242.cs).
2264         TODO: Handle this in the more general way.
2265         
2266         * class.cs (CheckBase): Ditto.
2267
2268 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2269
2270         * decl.cs (caching_flags): New member for storing cached values
2271         as bit flags.
2272         (MemberCore.Flags): New enum where bit flags for caching_flags
2273         are defined.
2274         (MemberCore.cls_compliance): Moved to caching_flags.
2275         (DeclSpace.Created): Moved to caching_flags.
2276
2277         * class.cs: Use caching_flags instead of DeclSpace.Created
2278         
2279 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2280
2281         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2282         if we are only a derived class, not a nested class.
2283
2284         * typemanager.cs: Same as above, but do this at the MemberLookup
2285         level (used by field and methods, properties are handled in
2286         PropertyExpr).   Allow for the qualified access if we are a nested
2287         method. 
2288
2289 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2290
2291         * class.cs: Refactoring.
2292         (IMethodData): New inteface; Holds links to parent members
2293         to avoid member duplication (reduced memory allocation).
2294         (Method): Implemented IMethodData interface.
2295         (PropertyBase): New inner classes for get/set methods.
2296         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2297         (Event): New inner classes for add/remove methods.
2298         (Event.DelegateMethod): Implemented IMethodData interface.
2299
2300         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2301         EmitContext (related to class.cs refactoring).
2302
2303 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2304
2305         * delegate.cs (Delegate.VerifyApplicability): If the number of
2306         arguments are the same as the number of parameters, first try to
2307         verify applicability ignoring  any 'params' modifier on the last
2308         parameter.
2309         Fixes #56442.
2310
2311 2004-04-08  Martin Baulig  <martin@ximian.com>
2312
2313         Merged latest changes into gmcs.  Please keep this comment in
2314         here, it makes it easier for me to see what changed in MCS since
2315         the last time I merged.
2316
2317 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2318
2319         * class.cs (TypeContainer.AddIndexer): Use
2320         'ExplicitInterfaceName' to determine if interface name was
2321         explicitly specified.  'InterfaceType' is not initialized at this time.
2322         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2323         Indexers array is already in the required order.  Initialize
2324         'IndexerName' only if there are normal indexers.
2325         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2326         (TypeContainer.Emit): Emit DefaultMember attribute only if
2327         IndexerName is initialized.
2328         Fixes #56300.
2329
2330 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2331
2332         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2333         Fixes #57007
2334
2335 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2336
2337         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2338         attributes.
2339         Fix for #56456.
2340
2341         * attribute.cs (Attribute.Resolve): Check for duplicate named
2342         attributes.
2343         Fix for #56463.
2344
2345 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2346
2347         * iterators.cs (MarkYield): track whether we are in an exception,
2348         and generate code accordingly.  Use a temporary value to store the
2349         result for our state.
2350
2351         I had ignored a bit the interaction of try/catch with iterators
2352         since their behavior was not entirely obvious, but now it is
2353         possible to verify that our behavior is the same as MS .NET 2.0
2354
2355         Fixes 54814
2356
2357 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2358
2359         * iterators.cs: Avoid creating temporaries if there is no work to
2360         do. 
2361
2362         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2363         Enumerations, use TypeManager.EnumToUnderlying and call
2364         recursively. 
2365
2366         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2367         bug #57013
2368
2369         (This.Emit): Use EmitContext.EmitThis to emit our
2370         instance variable.
2371
2372         (This.EmitAssign): Ditto.
2373
2374         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2375         codepaths, we will move all the functionality into
2376         Mono.CSharp.This 
2377
2378         (FieldExpr.EmitAssign): Ditto.
2379
2380         This fixes several hidden bugs that I uncovered while doing a code
2381         review of this today.
2382
2383         * codegen.cs (EmitThis): reworked so the semantics are more clear
2384         and also support value types "this" instances.
2385
2386         * iterators.cs: Changed so that for iterators in value types, we
2387         do not pass the value type as a parameter.  
2388
2389         Initialization of the enumerator helpers is now done in the caller
2390         instead of passing the parameters to the constructors and having
2391         the constructor set the fields.
2392
2393         The fields have now `assembly' visibility instead of private.
2394
2395 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2396
2397         * expression.cs (Argument.Resolve): Check if fields passed as ref
2398         or out are contained in a MarshalByRefObject.
2399
2400         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2401         another compiler type.
2402
2403 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2404
2405         * class.cs (Indexer.Define): use the new name checking method.
2406         Also, return false on an error.
2407         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2408         (is_identifier_[start/part]_character): make static.
2409
2410 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2411
2412         * expression.cs (Binary.ResolveOperator): Do no append strings
2413         twice: since we can be invoked more than once (array evaluation)
2414         on the same concatenation, take care of this here.  Based on a fix
2415         from Ben (bug #56454)
2416
2417 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2418
2419         * codegen.cs: Fix another case where CS1548 must be reported (when 
2420         delay-sign isn't specified and no private is available #56564). Fix
2421         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2422         error when MCS is used on the MS runtime and we need to delay-sign 
2423         (which seems unsupported by AssemblyBuilder - see #56621).
2424
2425 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2426
2427         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2428         (TypeManager.ComputeNamespaces): Faster implementation for
2429         Microsoft runtime.
2430
2431         * compiler.csproj: Updated AssemblyName to mcs.
2432
2433 2004-05-11  Jackson Harper  <jackson@ximian.com>
2434
2435         * Makefile: Preserve MONO_PATH
2436         
2437 2004-05-11  Jackson Harper  <jackson@ximian.com>
2438
2439         * Makefile: Use mono and mcs to build gmcs
2440         
2441 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
2442
2443         * codegen.cs: Add patch from Robert Shade
2444         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
2445         sync with mcs.
2446
2447 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
2448
2449         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2450         incomplete key pairs (#57941).
2451
2452 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2453
2454         * codegen.cs: Fix another case where CS1548 must be reported (when 
2455         delay-sign isn't specified and no private is available #56564). Fix
2456         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2457         error when MCS is used on the MS runtime and we need to delay-sign 
2458         (which seems unsupported by AssemblyBuilder - see #56621).
2459
2460 2004-04-29  Jackson Harper  <jackson@ximian.com>
2461
2462         * Makefile: Set MONO_PATH to use the bootstrap corlib
2463         * driver.cs: Check the GAC for referenced assemblies.
2464                 
2465 2004-04-29  Martin Baulig  <martin@ximian.com>
2466
2467         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
2468
2469 2004-04-07  Martin Baulig  <martin@ximian.com>
2470
2471         * expression.cs (Binary.ResolveOperator): Added special case for
2472         Equality/Inequality between a type parameter and a null literal.
2473
2474 2004-04-07  Martin Baulig  <martin@ximian.com>
2475
2476         * convert.cs: Check null literal -> type parameter conversions.
2477
2478 2004-04-07  Martin Baulig  <martin@ximian.com>
2479
2480         * generic.cs (ConstructedType.CheckConstraints): Enforce the
2481         `class' and `struct' constraints.
2482
2483 2004-04-07  Martin Baulig  <martin@ximian.com>
2484
2485         * generic.cs (SpecialConstraint): New public enum.
2486         (Constraints.Resolve): Added support for the `class' and `struct'
2487         constraints.
2488
2489         * cs-parser.jay (type_parameter_constraint): Added support for the
2490         `class' and `struct' constraints.
2491
2492 2004-04-07  Martin Baulig  <martin@ximian.com>
2493
2494         * support.cs (GenericConstraints): Replaced `Types' by
2495         `ClassConstraint' and `InterfaceConstraints'; added
2496         `HasClassConstraint'.   
2497
2498 2004-04-07  Martin Baulig  <martin@ximian.com>
2499
2500         * generic.cs
2501         (Constraints.InterfaceConstraints): New public property.
2502         (Constraints.Types): Make this property public
2503         (TypeParameter): Implement IMemberContainer.
2504         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
2505         instead of a TypeBuilder/MethodBuilder; pass the interface
2506         constraints to TypeManager.AddTypeParameter().
2507         (TypeParameter.DefineType): Just take an EmitContext and no
2508         TypeBuilder/MethodBuilder.  Use the new public API.
2509
2510         * typemanager.cs (TypeManager.AddTypeParameter): Added
2511         `TypeExpr[]' argument; add the interfaces to the
2512         `builder_to_ifaces' hash.
2513         (TypeManager.LookupMemberContainer): For
2514         GenericTypeParameterBuilders, get the TypeParameter from the
2515         `builder_to_type_param'.
2516         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
2517         the TypeParameter and call FindMembers on it.
2518
2519 2004-04-07  Martin Baulig  <martin@ximian.com>
2520
2521         * class.cs
2522         (MethodCore.GenericMethod): Moved this field here from Method.
2523         (MethodCore.IsDuplicateImplementation): Take the number of type
2524         parameters into account if we're a generic method.
2525
2526         * expression.cs (Invocation.InferTypeArguments): Don't return true
2527         if `arguments' is null; we still need to check whether we actually
2528         don't need to infer anything in this case.
2529         (MemberAccess): Merged the functionality from GenericMemberAccess
2530         into this class.
2531
2532         * generic.cs (GenericMemberAccess): Removed.
2533
2534 2004-04-05  Martin Baulig  <martin@ximian.com>
2535
2536         * decl.cs (MemberCore): For generic classes, interfaces and
2537         structs, `Name' now includes the number of type parameters
2538         ("Stack!1.Node!1").
2539         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
2540         encode the number of type arguments in the type name.
2541
2542         * expression.cs (Expression.MemberLookup): Removed the
2543         `num_type_args' argument; we now encode the number of type
2544         arguments in the type name.
2545
2546         * ecore.cs (SimpleName): Encode the number of type arguments in
2547         the type name itself.
2548
2549         * generic.cs (ConstructedType): Likewise.
2550
2551         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
2552         `MemberName'; we now include the number of type parameters in the
2553         type name.
2554
2555         * typemanager.cs (TypeManager.CheckGeneric): Removed.
2556         (TypeManager.MemberLookup): Removed the
2557         `num_type_args' argument; we now encode the number of type
2558         arguments in the type name.     
2559
2560 2004-04-03  Martin Baulig  <martin@ximian.com>
2561
2562         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
2563         (MemberCore.MemberName): Moved here from MemberBase.
2564         (DeclSpace.SetParameterInfo): Just take the constraints as an
2565         ArrayList; we already have the type parameters in our
2566         `MemberName'; also do the CS0080 reporting here.
2567
2568         * cs-parser.jay (struct_declaration): Use `member_name' instead of
2569         `IDENTIFIER opt_type_parameter_list'; when constructing our
2570         `MemberName', it'll already include our type parameters.
2571         (class_declaration, interface_declaration): Likewise.
2572         (delegate_declaration): Likewise.
2573         (MakeName): Take a MemberName and return a MemberName.
2574         The following two changes are required to avoid shift/reduce conflicts:
2575         (member_name): Don't include a TypeName anymore; ie. this is now
2576         just 'IDENTIFIER opt_type_parameter_list'.
2577         (property_declaration, event_declaration): Use a
2578         `namespace_or_type_name' instead of a `member_name'.            
2579
2580 2004-04-03  Martin Baulig  <martin@ximian.com>
2581
2582         * decl.cs (MemberName): Renamed to `TypeName' and created a new
2583         `MemberName' class.
2584         (TypeName): Formerly known as MemberName.
2585
2586         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
2587         instead of a `MemberName'.
2588
2589         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
2590         (member_name): New rule; create a MemberName.
2591
2592 2004-04-02  Martin Baulig  <martin@ximian.com>
2593
2594         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
2595         (CS0305 and CS0308).
2596
2597 2004-04-02  Martin Baulig  <martin@ximian.com>
2598
2599         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
2600         support for nested types.
2601
2602 2004-04-02  Martin Baulig  <martin@ximian.com>
2603
2604         * ecore.cs (IAlias): New public interface.
2605         (TypeExpr, TypeExpression): Implement IAlias.
2606         (TypeAliasExpression): New public class.
2607
2608         * namespace.cs (Namespace): Implement IAlias.
2609         (Namespace.Lookup): Return an IAlias instead on an object.
2610         (Namespace.DefineName): Take an IAlias instead of an object.
2611         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
2612         an object.
2613         (NamespaceEntry.UsingAlias): Take a Membername instead of an
2614         Expression.
2615         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
2616         object.
2617         (NamespaceEntry.Lookup): Likewise.
2618
2619         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
2620         instead of a Type.      
2621
2622         * decl.cs (DeclSpace): Implement IAlias.
2623         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
2624
2625         * generic.cs (ConstructedType): Improved error checking.
2626
2627 2004-04-02  Martin Baulig  <martin@ximian.com>
2628
2629         * convert.cs: Added type parameter conversions.
2630
2631         * ecore.cs
2632         (UnboxCast.Emit): Emit an `unbox.any' for type params.
2633         (ClassCast.Emit): If the source type is a type parameter, box it.
2634         If the target type is a type parameter, emit an `unbox.any'
2635         instead of a `classcast'.1      
2636
2637 2004-04-01  Martin Baulig  <martin@ximian.com>
2638
2639         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
2640
2641 2004-04-01  Martin Baulig  <martin@ximian.com>
2642
2643         * generic.cs (ConstructedType.CheckConstraints): Use
2644         Convert.ImplicitStandardConversionExists(); user-defined implicit
2645         conversions are not allowed according to the spec.
2646
2647 2004-03-30  Martin Baulig  <martin@ximian.com>
2648
2649         * expression.cs (New): Added support for type parameters.
2650
2651         * typemanager.cs
2652         (TypeManager.activator_type): New public static field.
2653         (TypeManager.activator_create_instance): Likewise.
2654
2655 2004-03-30  Martin Baulig  <martin@ximian.com>
2656
2657         * typemanager.cs (TypeManager.HasConstructorConstraint): New
2658         public method.
2659
2660 2004-03-30  Martin Baulig  <martin@ximian.com>
2661
2662         * generic.cs (ConstructedType.CheckConstraints): Actually follow
2663         the spec here: the argument type must be convertible to the
2664         constraints.
2665
2666 2004-03-30  Martin Baulig  <martin@ximian.com>
2667
2668         * generic.cs
2669         (TypeParameter.Define, TypeParameter.DefineMethod): Call
2670         TypeManager.AddTypeParameter().
2671         (ConstructedType.CheckConstraints): Re-enable this and actually
2672         check whether we have a constructor constraint.
2673
2674         * typemanager.cs
2675         (TypeManager.builder_to_type_param): New static field.
2676         (TypeManager.AddTypeParameter): New static method.
2677         (TypeManager.LookupTypeParameter): New public method.
2678
2679 2004-03-30  Martin Baulig  <martin@ximian.com>
2680
2681         * generic.cs (TypeParameter.DefineType): Return a boolean and use
2682         the new API to actually define the constructor constraint.
2683
2684         * typemanager.cs
2685         (TypeManager.new_constraint_attr_type): New static field.
2686         (TypeManager.InitCoreTypes): Initialize it.
2687
2688 2004-03-30  Martin Baulig  <martin@ximian.com>
2689
2690         * generic.cs (Constraints): Completed error checking, use correct
2691         error numbers.
2692
2693 2004-03-29  Martin Baulig  <martin@ximian.com>
2694
2695         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
2696
2697         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2698         public version which takes a `ParameterData pd' instead of an
2699         `ArrayList args'.
2700
2701 2004-03-29  Martin Baulig  <martin@ximian.com>
2702
2703         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
2704         not a MethodInfo.       
2705
2706 2004-03-29  Martin Baulig  <martin@ximian.com>
2707
2708         * expression.cs (Argument.ResolveMethodGroup): If we're a
2709         ConstructedType, call GetMemberAccess() on it.  
2710
2711 2004-03-29  Martin Baulig  <martin@ximian.com>
2712
2713         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
2714         (MethodCore.CheckGenericOverride): When overriding a generic
2715         method, check whether the constraints match.
2716
2717         * support.cs (GenericConstraints): New public interface.
2718         (ParameterData.GenericConstraints): New public method.
2719
2720         * parameter.cs (Parameter.Resolve): Check whether we're a generic
2721         method parameter and compute our constraints if appropriate.
2722         (Parameter.GenericConstraints): New public property.
2723
2724         * generic.cs (Constraints): Implement GenericConstraints.
2725
2726 2004-03-29  Martin Baulig  <martin@ximian.com>
2727
2728         * decl.cs (MemberCache.FindMemberToOverride): Use
2729         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
2730
2731 2004-03-29  Martin Baulig  <martin@ximian.com>
2732
2733         * generic.cs (GenericMethod.Define): Resolve our type parameters.
2734
2735 2004-03-29  Martin Baulig  <martin@ximian.com>
2736
2737         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
2738         not allowed on non-generic declarations").
2739
2740 2004-03-29  Martin Baulig  <martin@ximian.com>
2741
2742         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2743         public version of this method.
2744
2745         * class.cs (MethodCore.IsDuplicateImplementation): Use
2746         Invocation.InferTypeArguments() to check this.
2747
2748 2004-03-29  Martin Baulig  <martin@ximian.com>
2749
2750         * convert.cs: Use TypeManager.IsDelegateType() instead of
2751         comparing types correctly.
2752
2753 2004-03-29  Martin Baulig  <martin@ximian.com>
2754
2755         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
2756         types directly to make it work for generic instances.
2757
2758         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
2759
2760 2004-03-29  Martin Baulig  <martin@ximian.com>
2761
2762         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
2763         support for arrays.     
2764
2765 2004-03-24  Martin Baulig  <martin@ximian.com>
2766
2767         * decl.cs (DeclSpace.FindType): Also use
2768         TypeManager.CheckGeneric() for types from the using clauses.
2769
2770 2004-03-23  Martin Baulig  <martin@ximian.com>
2771
2772         * expression.cs (Invocation.OverloadResolve): Added `bool
2773         may_fail' argument and use it instead of the Location.IsNull() hack.
2774
2775 2004-03-23  Martin Baulig  <martin@ximian.com>
2776
2777         * expression.cs (Invocation.InferType): Use correct type inference
2778         rules here.     
2779
2780 2004-03-23  Martin Baulig  <martin@ximian.com>
2781
2782         * ecore.cs (MethodGroupExpr.Name): Use
2783         TypeManager.CSharpSignature() instead of just the name.
2784
2785         * expression.cs (Invocation.OverloadResolve): Provide better error
2786         reporting.
2787         (Invocation.DoResolve): OverloadResolve() never returns null
2788         without reporting an error, so removed the error -6 reporting here.
2789
2790 2004-03-23  Martin Baulig  <martin@ximian.com>
2791
2792         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
2793         generic methods.
2794
2795         * cs-parser.jay (delegate_declaration): Support generic delegates.
2796
2797         * delegate.cs: Support generic delegates.
2798
2799 2004-03-22  Martin Baulig  <martin@ximian.com>
2800
2801         * expression.cs (Invocation.InferParamsTypeArguments): New static
2802         method; does type inference for params arguments.
2803
2804 2004-03-21  Martin Baulig  <martin@ximian.com>
2805
2806         * typemanager.cs (TypeManager.IsGenericMethod): New public static
2807         method; checks whether a method is a generic method.    
2808
2809         * expression.cs (Invocation.InferTypeArguments): New static method;
2810         infer type arguments for generic method invocation.
2811
2812         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
2813         property; we set this to true if we're resolving a generic method
2814         invocation and the user specified type arguments, ie. we're not
2815         doing type inference.
2816
2817 2004-03-20  Martin Baulig  <martin@ximian.com>
2818
2819         * class.cs (MethodData.DeclaringType): New public property.
2820         (MethodData.Define): Set DeclaringType here.
2821         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
2822         instead of OperatorMethodBuilder.DeclaringType.
2823
2824 2004-03-20  Martin Baulig  <martin@ximian.com>
2825
2826         * cs-tokenizer.cs (xtoken): Return a special
2827         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
2828
2829         * cs-parser.jay (default_value_expression): Switch to the new
2830         syntax (14.5.13).
2831
2832 2004-03-19  Martin Baulig  <martin@ximian.com>
2833
2834         * decl.cs (MemberName): New class.  We use this to "construct"
2835         namespace_or_type_name's.
2836
2837         * generics.cs (TypeArguments.GetDeclarations): New public method;
2838         returns the type arguments as a string[] and reports a CS0081 if
2839         one of them is not an identifier.
2840
2841         * class.cs (MemberBase): The .ctor now takes the name as a
2842         MemberName instead of a string.
2843         (MemberBase.ExplicitInterfaceName): Changed type from string to
2844         Expression.
2845         (MemberBase.DoDefine): If we're an explicit implementation, the
2846         InterfaceType may be a generic instance.
2847
2848         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
2849         (namespace_name): Call MemberName.GetName () to transform the
2850         MemberName into a string and ensure we don't have any type
2851         arguments.
2852         (type_name): Call MemberName.GetTypeExpression() to transfrom the
2853         MemberName into an expression.
2854         (method_header): Use namespace_or_type_name instead of member_name.     
2855
2856 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2857
2858         * rootcontext.cs: Add new types to the boot resolution.
2859
2860         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2861         MulticastDelegate is not allowed.
2862
2863         * typemanager.cs: Add new types to lookup: System.TypedReference
2864         and ArgIterator.
2865
2866         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2867         check for TypedReference or ArgIterator, they are not allowed. 
2868
2869         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2870         makes us properly catch 1510 in some conditions (see bug 56016 for
2871         details). 
2872
2873 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2874
2875         * CryptoConvert.cs: update from corlib version
2876         with endian fixes.
2877
2878 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2879
2880         * class.cs (Indexer.Define): Check indexername declaration
2881
2882 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2883
2884         * attribute.cs (IsClsCompliant): Fixed problem with handling
2885         all three states (compliant, not-compliant, undetected).
2886
2887 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2888
2889         * attribute.cs (Attribute): Location is now public.
2890         (Resolve): Store resolved arguments (pos_values) in attribute class.
2891         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2892         (GetClsCompliantAttributeValue): New method that gets
2893         CLSCompliantAttribute value.
2894         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2895         if exists else null.
2896         (AttributeTester): New class for CLS-Compliant verification routines.
2897
2898         * class.cs (Emit): Add CLS-Compliant verification.
2899         (Method.GetSignatureForError): Implemented.
2900         (Constructor.GetSignatureForError): Implemented
2901         (Constructor.HasCompliantArgs): Returns if constructor has
2902         CLS-Compliant arguments.
2903         (Constructor.Emit): Override.
2904         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2905         is needed to test only parameters.
2906         (FieldBase.GetSignatureForError): Implemented.
2907         (TypeContainer): New member for storing base interfaces.
2908         (TypeContainer.FindMembers): Search in base interfaces too.
2909
2910         * codegen.cs (GetClsComplianceAttribute): New method that gets
2911         assembly or module CLSCompliantAttribute value.
2912         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2913         for assembly.
2914         (ModuleClass.Emit): Add error 3012 test.
2915
2916         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2917
2918         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2919         state for all decl types.
2920         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2921         if CLS-Compliant tests are required.
2922         (IsClsCompliaceRequired): New method. Analyze whether code
2923         must be CLS-Compliant.
2924         (IsExposedFromAssembly): New method. Returns true when MemberCore
2925         is exposed from assembly.
2926         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2927         value or gets cached value.
2928         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2929         is explicitly marked with CLSCompliantAttribute.
2930         (IsIdentifierClsCompliant): New abstract method. This method is
2931         used to testing error 3005.
2932         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2933         for identifier and parameters CLS-Compliant testing.
2934         (VerifyClsCompliance): New method. The main virtual method for
2935         CLS-Compliant verifications.
2936         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2937         null. I don't know why is null (too many public members !).
2938         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2939         and get value of first CLSCompliantAttribute that found.
2940
2941         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2942         (VerifyClsCompliance): Override and add extra tests.
2943
2944         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2945         clscheck- disable CLS-Compliant verification event if assembly is has
2946         CLSCompliantAttribute(true).
2947
2948         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2949         ApllyAttribute is now called in emit section as in the other cases.
2950         Possible future Emit integration.
2951         (IsIdentifierClsCompliant): New override.
2952         (VerifyClsCompliance): New override.
2953         (GetEnumeratorName): Returns full enum name.
2954
2955         * parameter.cs (GetSignatureForError): Implemented.
2956
2957         * report.cs (WarningData): New struct for Warning message information.
2958         (LocationOfPreviousError): New method.
2959         (Warning): New method. Reports warning based on the warning table.
2960         (Error_T): New method. Reports error based on the error table.
2961
2962         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2963         verifications are done here.
2964
2965         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2966
2967         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2968         CLSCompliantAttribute.
2969         (all_imported_types): New member holds all imported types from other
2970         assemblies.
2971         (LoadAllImportedTypes): New method fills static table with exported types
2972         from all referenced assemblies.
2973         (Modules): New property returns all assembly modules.
2974
2975 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2976
2977         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2978         throwing a parser error.
2979
2980         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2981         which removes the hardcoded get_/set_ prefixes for properties, as
2982         IL allows for the properties to be named something else.  
2983
2984         Bug #56013
2985
2986         * expression.cs: Do not override operand before we know if it is
2987         non-null.  Fix 56207
2988
2989 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2990
2991         * typemanager.cs: support for pinned variables.
2992
2993 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2994
2995         * decl.cs, typemanager.cs: Avoid using an arraylist
2996         as a buffer if there is only one result set.
2997
2998 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2999
3000         * expression.cs: Make sure you cant call a static method
3001         with an instance expression, bug #56174.
3002
3003 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3004
3005         * class.cs (IsDuplicateImplementation): Improve error reporting to
3006         flag 663 (method only differs in parameter modifier).
3007
3008         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3009         in preprocessor directives.
3010
3011         * location.cs (LookupFile): Allow for the empty path.
3012
3013         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3014         better approach for some of that patch, but its failing with the
3015         CharSet enumeration.  For now try/catch will do.
3016
3017         * typemanager.cs: Do not crash if a struct does not have fields.
3018         Fixes 56150.
3019
3020 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3021
3022         * expression.cs: cs0213, cant fix a fixed expression.
3023         fixes 50231.
3024
3025 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3026
3027         * cs-parser.jay: detect invalid embeded statements gracefully.
3028         bug #51113.
3029
3030 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3031
3032         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3033         As a regex:
3034         s/
3035         the invocation type may not be a subclass of the tye of the item/
3036         The type of the item must be a subclass of the invocation item.
3037         /g
3038
3039         Fixes bug #50820.
3040
3041 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3042
3043         * attribute.cs: Added methods to get a string and a bool from an
3044         attribute. Required to information from AssemblyKeyFileAttribute,
3045         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3046         * codegen.cs: Modified AssemblyName creation to include support for
3047         strongnames. Catch additional exceptions to report them as CS1548.
3048         * compiler.csproj: Updated include CryptoConvert.cs.
3049         * compiler.csproj.user: Removed file - user specific configuration.
3050         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3051         Mono.Security assembly. The original class is maintained and tested in
3052         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3053         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3054         like CSC 8.0 (C# v2) supports.
3055         * Makefile: Added CryptoConvert.cs to mcs sources.
3056         * rootcontext.cs: Added new options for strongnames.
3057
3058 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3059
3060         * driver.cs: For --expect-error, report error code `2'
3061         if the program compiled with no errors, error code `1' if
3062         it compiled with an error other than the one expected.
3063
3064 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3065
3066         * compiler.csproj: Updated for Visual Studio .NET 2003.
3067         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3068         * compiler.sln: Updated for Visual Studio .NET 2003.
3069
3070 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3071
3072         * expression.cs: Fix bug #47234. We basically need to apply the
3073         rule that we prefer the conversion of null to a reference type
3074         when faced with a conversion to 'object' (csc behaviour).
3075
3076 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3077
3078         * statement.cs: Shorter form for foreach, eliminates
3079         a local variable. r=Martin.
3080
3081 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3082
3083         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3084         checks if we can use brtrue/brfalse to test for 0.
3085         * expression.cs: use the above in the test for using brtrue/brfalse.
3086         cleanup code a bit.
3087
3088 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3089
3090         * expression.cs: Rewrite string concat stuff. Benefits:
3091
3092         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3093         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3094         rather than a concat chain.
3095
3096         * typemanager.cs: Add lookups for more concat overloads.
3097
3098 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3099
3100         * expression.cs: Emit shorter il code for array init.
3101
3102         newarr
3103         dup
3104         // set 1
3105
3106         // set 2
3107
3108         newarr
3109         stloc.x
3110
3111         ldloc.x
3112         // set 1
3113
3114         ldloc.x
3115         // set 2
3116
3117 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3118
3119         * statement.cs: Before, two switch blocks would be merged if the
3120         total size of the blocks (end_item - begin_item + 1) was less than
3121         two times the combined sizes of the blocks.
3122
3123         Now, it will only merge if after the merge at least half of the
3124         slots are filled.
3125
3126         fixes 55885.
3127
3128 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3129
3130         * class.cs : csc build fix for GetMethods(). See bug #52503.
3131
3132 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3133
3134         * expression.cs: Make sure fp comparisons work with NaN.
3135         This fixes bug #54303. Mig approved this patch a long
3136         time ago, but we were not able to test b/c the runtime
3137         had a related bug.
3138
3139 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3140
3141         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3142
3143 2004-03-19  Martin Baulig  <martin@ximian.com>
3144
3145         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
3146         two overloads may unify for some type parameter substitutions and
3147         report a CS0408 if appropriate.
3148
3149 2004-03-19  Martin Baulig  <martin@ximian.com>
3150
3151         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3152         error here and not in our caller.
3153
3154 2004-03-19  Martin Baulig  <martin@ximian.com>
3155
3156         * interface.cs: Completely killed this file.
3157         (Interface): We're now a TypeContainer and live in class.cs.
3158
3159         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3160         argument; we're now also called for interfaces.
3161         (TypeContainer.DefineMembers): Allow this method being called
3162         multiple times.
3163         (TypeContainer.GetMethods): New public method; formerly known as
3164         Interface.GetMethod().  This is used by PendingImplementation.
3165         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3166         it's now private and non-static.
3167         (Interface): Moved this here; it's now implemented similar to
3168         Class and Struct.
3169         (Method, Property, Event, Indexer): Added `bool is_interface'
3170         argument to their .ctor's.
3171         (MemberBase.IsInterface): New public field.
3172
3173         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3174         instances instead of InterfaceMethod, InterfaceProperty, etc.
3175         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3176         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3177
3178 2004-03-19  Martin Baulig  <martin@ximian.com>
3179
3180         * class.cs (MethodCore.IsDuplicateImplementation): New private
3181         method which does the CS0111 checking.
3182         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3183         Use IsDuplicateImplementation().
3184
3185 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3186
3187         * decl.cs (FindMemberToOverride): New method to find the correct
3188         method or property to override in the base class.
3189         * class.cs
3190             - Make Method/Property use the above method to find the
3191               version in the base class.
3192             - Remove the InheritableMemberSignatureCompare as it is now
3193               dead code.
3194
3195         This patch makes large code bases much faster to compile, as it is
3196         O(n) rather than O(n^2) to do this validation.
3197
3198         Also, it fixes bug 52458 which is that nested classes are not
3199         taken into account when finding the base class member.
3200
3201         Reviewed/Approved by Martin.
3202
3203 2004-03-17  Martin Baulig  <martin@ximian.com>
3204
3205         * expression.cs (MemberAccess.DoResolve): Take the parent's number
3206         of type arguments into account; use the `real_num_type_args'
3207         approach like in DoResolveAsTypeStep().
3208
3209         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
3210         nested types.
3211
3212 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3213
3214         * interface.cs: In all interface classes removed redundant
3215         member initialization.
3216
3217 2004-03-16  Martin Baulig  <martin@ximian.com>
3218
3219         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3220
3221 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3222
3223         * decl.cs (DefineTypeAndParents): New helper method to define a
3224         type's containers before the type itself is defined;  This is a
3225         bug exposed by the recent changes to Windows.Forms when an
3226         implemented interface was defined inside a class that had not been
3227         built yet.   
3228
3229         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3230
3231         (Check): Loop correctly to report errors modifiers
3232         (UNSAFE was not in the loop, since it was the same as TOP).
3233
3234         * interface.cs: Every interface member now takes a ModFlags,
3235         instead of a "is_new" bool, which we set on the base MemberCore. 
3236
3237         Every place where we called "UnsafeOk" in the interface, now we
3238         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3239         the unsafe settings from the member declaration instead of the
3240         container interface. 
3241
3242         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3243
3244         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3245         `set_indexer_name' to the pending bits (one per type).
3246
3247         We fixed a bug today that was picking the wrong method to
3248         override, since for properties the existing InterfaceMethod code
3249         basically ignored the method name.  Now we make sure that the
3250         method name is one of the valid indexer names.
3251
3252 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
3253  
3254         * support.cs (SeekableStreamReader): Keep track of stream byte
3255         positions and don't mix them with character offsets to the buffer.
3256
3257         Patch from Gustavo Giráldez
3258
3259 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
3260
3261         * interface.cs (InterfaceSetGetBase): Removed double member
3262         initialization, base class does it as well.
3263
3264 2004-03-13  Martin Baulig  <martin@ximian.com>
3265
3266         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3267         when compiling corlib.
3268
3269 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3270
3271         * convert.cs (ExplicitConversion): We were reporting an error on
3272         certain conversions (object_type source to a value type, when the
3273         expression was `null') before we had a chance to pass it through
3274         the user defined conversions.
3275
3276         * driver.cs: Replace / and \ in resource specifications to dots.
3277         Fixes 50752
3278
3279         * class.cs: Add check for duplicate operators.  Fixes 52477
3280
3281 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3282
3283         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3284         that are in the middle of the statements, not only at the end.
3285         Fixes #54987
3286
3287         * class.cs (TypeContainer.AddField): No longer set the
3288         `HaveStaticConstructor' flag, now we call it
3289         `UserDefineStaticConstructor' to diferentiate the slightly
3290         semantic difference.
3291
3292         The situation is that we were not adding BeforeFieldInit (from
3293         Modifiers.TypeAttr) to classes that could have it.
3294         BeforeFieldInit should be set to classes that have no static
3295         constructor. 
3296
3297         See:
3298
3299         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3300
3301         And most importantly Zoltan's comment:
3302
3303         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3304
3305         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3306          before its static fields are used', i.e. initialization does not need
3307          to be triggered by the first access to the type. Setting this flag
3308          helps the JIT to compile better code, since it can run the static
3309          constructor at JIT time, and does not need to generate code to call it
3310          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3311          this flag for lots of classes like String. 
3312          
3313          csc sets this flag if the type does not have an explicit static 
3314          constructor. The reasoning seems to be that if there are only static
3315          initalizers for a type, and no static constructor, then the programmer
3316          does not care when this initialization happens, so beforefieldinit
3317          can be used.
3318          
3319          This bug prevents the AOT compiler from being usable, since it 
3320          generates so many calls to mono_runtime_class_init that the AOT code
3321          is much slower than the JITted code. The JITted code is faster, 
3322          because it does not generate these calls if the vtable is type is
3323          already initialized, which is true in the majority of cases. But the
3324          AOT compiler can't do this."
3325
3326 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3327
3328         * class.cs (MethodData.Emit): Refactor the code so symbolic
3329         information is generated for destructors;  For some reasons we
3330         were taking a code path that did not generate symbolic information
3331         before. 
3332
3333 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3334
3335         * class.cs: Create a Constructor.CheckBase method that
3336         takes care of all validation type code. The method
3337         contains some code that was moved from Define.
3338
3339         It also includes new code that checks for duplicate ctors.
3340         This fixes bug #55148.
3341
3342 2004-03-09  Joshua Tauberer <tauberer@for.net>
3343
3344         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3345         a { ... }-style array creation invokes EmitStaticInitializers
3346         which is not good for reference-type arrays.  String, decimal
3347         and now null constants (NullCast) are not counted toward
3348         static initializers.
3349
3350 2004-03-05  Martin Baulig  <martin@ximian.com>
3351
3352         * location.cs (SourceFile.HasLineDirective): New public field;
3353         specifies whether the file contains or is referenced by a "#line"
3354         directive.
3355         (Location.DefineSymbolDocuments): Ignore source files which
3356         either contain or are referenced by a "#line" directive.        
3357
3358 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3359
3360         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3361         direct access to our parent, so check the method inline there.
3362
3363 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3364
3365         * expression.cs (Invocation.EmitCall): Miguel's last commit
3366         caused a regression. If you had:
3367
3368             T t = null;
3369             t.Foo ();
3370
3371         In Foo the implict this would be null.
3372
3373 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3374
3375         * expression.cs (Invocation.EmitCall): If the method is not
3376         virtual, do not emit a CallVirt to it, use Call.
3377
3378         * typemanager.cs (GetFullNameSignature): Improve the method to
3379         cope with ".ctor" and replace it with the type name.
3380
3381         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3382         as an argument the ConstructorBuilder where it is being defined,
3383         to catch the recursive constructor invocations.
3384
3385 2004-03-16  Martin Baulig  <martin@ximian.com>
3386
3387         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
3388         ConstructedType, call ResolveType() on it to get the type rather
3389         than just using `expr.Type'.
3390
3391 2004-03-16  Martin Baulig  <martin@ximian.com>
3392
3393         * generics.cs (ConstructedType.GetMemberAccess): Take the
3394         EmitContext instead on the TypeExpr and use
3395         ec.TypeContainer.CurrentType/ec.ContainerType.
3396
3397 2004-03-16  Martin Baulig  <martin@ximian.com>
3398
3399         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
3400         parameters before aliases.
3401
3402 2004-03-16  Martin Baulig  <martin@ximian.com>
3403
3404         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
3405         New oublic function; checks whether two generic instances may become
3406         equal under some instantiations (26.3.1).
3407
3408         * class.cs (TypeContainer.Define): Call
3409         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
3410         error.
3411
3412 2004-03-16  Martin Baulig  <martin@ximian.com>
3413
3414         * class.cs (TypeContainer.GetClassBases): Moved
3415         Error_TypeParameterAsBase() here and also check whether the base
3416         class is not an attribute.
3417
3418 2004-03-16  Martin Baulig  <martin@ximian.com>
3419
3420         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3421
3422 2004-03-16  Martin Baulig  <martin@ximian.com>
3423
3424         * class.cs (Error_TypeParameterAsBase): Use correct error number
3425         here (CS0689).  
3426
3427 2004-03-16  Martin Baulig  <martin@ximian.com>
3428
3429         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
3430         for generics.
3431
3432         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
3433         error reporting.
3434
3435 2004-03-15  Martin Baulig  <martin@ximian.com>
3436
3437         * typemanager.cs (TypeManager.GetFullName): New public method.
3438         (TypeManager.MemberLookup): Added `int_num_type_arguments'
3439         argument; only return members with the correct number of type
3440         arguments.
3441         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
3442         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
3443         whether the number of type arguments matches.
3444
3445         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
3446         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
3447
3448         * expression.cs (MemberAccess): Added public `NumTypeArguments'
3449         field; it's set by the protected .ctor when we're actually a
3450         GenericMemberAccess.
3451         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
3452         arguments and pass it to MemberLookupFinal ().
3453
3454         * ecore.cs (Expression.MemberLookup): Added `int
3455         num_type_arguments' argument; only return members with the correct
3456         number of type arguments.
3457         (Expression.MemberLookupFailed): Check whether the MemberLookup
3458         failed because we did not have the correct number of type
3459         arguments; report CS0305 in this case.
3460
3461         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
3462         `e.ResolveAsTypeTerminal()' already did so.
3463
3464 2004-03-15  Martin Baulig  <martin@ximian.com>
3465
3466         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
3467         we're a ConstructedType; in this case, the caller must report an
3468         error (for instance CS0131).
3469
3470         * generic.cs (TypeArguments): Added Location argument to the .ctor.
3471         (TypeArguments.Resolve): Actually report errors here.
3472
3473 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3474
3475         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3476         `set_indexer_name' to the pending bits (one per type).
3477
3478         We fixed a bug today that was picking the wrong method to
3479         override, since for properties the existing InterfaceMethod code
3480         basically ignored the method name.  Now we make sure that the
3481         method name is one of the valid indexer names.
3482
3483 2004-03-15  Martin Baulig  <martin@ximian.com>
3484
3485         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
3486         for generic instances.
3487
3488 2004-03-13  Martin Baulig  <martin@ximian.com>
3489
3490         * class.cs (TypeContainer.DefineType): Call
3491         TypeManager.AddUserType() immediately after creating the
3492         TypeBuilder; pass all type parameters when creating the
3493         CurrentType.
3494
3495         * decl.cs (DeclSpace.FindNestedType): New public method.
3496         (DeclSpace.FindType): Added `int num_type_args' argument; only
3497         return types with the correct number of type parameters.
3498         (DeclSpace.CountTypeParams): New public property.
3499
3500         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
3501         the number of type parameters; defaults to zero.
3502
3503         * generic.cs (TypeArguments.Count): New public property.
3504         (ConstructedType.DoResolveAsTypeStep): First call
3505         ds.FindNestedType() to find out whether we're nested in the
3506         current generic type; in this case, we inherit all type parameters
3507         from the current class.
3508
3509         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
3510         num_type_args' argument.
3511         (RootContext.LookupType): Added overloaded version which takes the
3512         number of type arguments; only return types with the correct
3513         number of type arguments.
3514
3515         * typemanager.cs (TypeManager.CheckGeneric): New public function;
3516         checks whether `Type t' has `int num_type_args'.
3517
3518 2004-03-13  Martin Baulig  <martin@ximian.com>
3519
3520         * generic.cs (GenericMethod.DefineType): New method; calls
3521         DefineType() on all the type parameters.
3522
3523         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
3524         (MethodData.Define): If we're a generic method, call
3525         GenericMethod.DefineType() to define the type parameters.       
3526
3527 2004-03-10  Martin Baulig  <martin@ximian.com>
3528
3529         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
3530         instead of IsAssignableFrom.    
3531
3532 2004-03-10  Martin Baulig  <martin@ximian.com>
3533
3534         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
3535
3536         * support.cs (ParameterData.HasArrayParameter): New property.
3537         (ReflectionParameters.ctor): Take a MethodBase instead of a
3538         ParameterInfo[].  If we have any type parameters, get the generic
3539         method definition and ask it whether we have variable arguments.
3540
3541 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3542
3543         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3544         routines to check if a type is an enumerable/enumerator allow
3545         classes that implement the IEnumerable or IEnumerator interfaces.
3546
3547         * class.cs (Property, Operator): Implement IIteratorContainer, and
3548         implement SetYields.
3549
3550         (Property.Define): Do the block swapping for get_methods in the
3551         context of iterators.   We need to check if Properties also
3552         include indexers or not.
3553
3554         (Operator): Assign the Block before invoking the
3555         OperatorMethod.Define, so we can trigger the Iterator code
3556         replacement. 
3557
3558         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3559         Property and Operator classes are not created when we parse the
3560         declarator but until we have the block completed, so we use a
3561         singleton SimpleIteratorContainer.Simple to flag whether the
3562         SetYields has been invoked.
3563
3564         We propagate this setting then to the Property or the Operator to
3565         allow the `yield' to function.
3566
3567 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3568
3569         * codegen.cs: Implemented attribute support for modules.
3570         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3571         Assembly/Module functionality.
3572
3573         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3574         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3575         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3576
3577 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3578
3579         * interface.cs (FindMembers): The operation is performed on all base
3580         interfaces and not only on the first. It is required for future CLS Compliance patch.
3581
3582 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3583
3584         * statement.cs, codegen.cs:
3585         This patch deals with patterns such as:
3586
3587         public class List : IEnumerable {
3588
3589                 public MyEnumerator GetEnumerator () {
3590                         return new MyEnumerator(this);
3591                 }
3592
3593                 IEnumerator IEnumerable.GetEnumerator () {
3594                         ...
3595                 }
3596                 
3597                 public struct MyEnumerator : IEnumerator {
3598                         ...
3599                 }
3600         }
3601
3602         Before, there were a few things we did wrong:
3603         1) we would emit callvirt on a struct, which is illegal
3604         2) we emited ldarg when we needed to emit ldarga
3605         3) we would mistakenly call the interface methods on an enumerator
3606         type that derived from IEnumerator and was in another assembly. For example:
3607
3608         public class MyEnumerator : IEnumerator
3609
3610         Would have the interface methods called, even if there were public impls of the
3611         method. In a struct, this lead to invalid IL code.
3612
3613 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3614
3615         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3616           renamed to Emit.
3617
3618         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3619
3620 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3621
3622         * cs-parser.jay: Fix small regression: we were not testing V2
3623         compiler features correctly.
3624
3625         * interface.cs: If the emit context is null, then create one
3626
3627 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3628
3629         * decl.cs (GetSignatureForError): New virtual method to get full name
3630           for error messages.
3631
3632         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3633           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3634
3635         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3636           Duplicated members and code in these classes has been removed.
3637           Better encapsulation in these classes.
3638
3639 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3640
3641         * assign.cs (Assign.DoResolve): When dealing with compound
3642         assignments, there is a new rule in ECMA C# 2.4 (might have been
3643         there before, but it is documented here) that states that in:
3644
3645         a op= b;
3646
3647         If b is of type int, and the `op' is a shift-operator, then the
3648         above is evaluated as:
3649
3650         a = (int) a op b 
3651
3652         * expression.cs (Binary.ResolveOperator): Instead of testing for
3653         int/uint/long/ulong, try to implicitly convert to any of those
3654         types and use that in pointer arithmetic.
3655
3656         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3657         method to print information for from the type, not from the
3658         null-method we were given.
3659
3660 2004-02-01  Duncan Mak  <duncan@ximian.com>
3661
3662         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3663         parsing for cmd, fixes bug #53694.
3664
3665 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3666
3667         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3668         in the member name duplication tests. Property and operator name duplication
3669         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3670
3671 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3672
3673         * interface.cs (PopulateMethod): Fixed crash when interface method
3674         returns not existing type (error test cs0246-3.cs).
3675
3676 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3677
3678         * cs-parser.jay (interface_accessors): Re-write actions to also
3679         store attributes attached to get and set methods. Fix spelling
3680         while at it.
3681
3682         (inteface_property_declaration): Modify accordingly.
3683
3684         (InterfaceAccessorInfo): New helper class to store information to pass
3685         around between rules that use interface_accessors.
3686
3687         * interface.cs (Emit): Apply attributes on the get and set
3688         accessors of properties and indexers too.
3689
3690         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3691         right MethodBuilder when applying attributes to the get and set accessors.
3692
3693 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3694
3695         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3696
3697 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3698
3699         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3700
3701 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3702
3703         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3704         changes that treat `yield' specially when present before `break'
3705         or `return' tokens.
3706
3707         * cs-tokenizer.cs: yield is no longer a keyword.
3708
3709 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3710
3711         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3712         setting for default constructors.
3713         For default constructors are almost every time set wrong Modifier. The
3714         generated IL code has been alright. But inside mcs this values was
3715         wrong and this was reason why several of my CLS Compliance tests
3716         failed.
3717
3718 2004-02-27  Martin Baulig  <martin@ximian.com>
3719
3720         * generics.cs (ConstructedType.ResolveType): Make the nested type
3721         stuff actually work.
3722
3723 2004-02-25  Martin Baulig  <martin@ximian.com>
3724
3725         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
3726         property; returns the type parameters just from the current type,
3727         ie. with the ones from outer classes.
3728         (DeclSpace.LookupGeneric): First search in the current class, then
3729         in outer classes.
3730         (DeclSpace.initialize_type_params): When hiding a type parameter
3731         from an outer class, put it into the `type_param_list' anyways.
3732
3733         * expression.cs (MemberAccess.expr): Made this field protected.
3734
3735         * class.cs (TypeContainer.Define): The `CurrentType' just contains
3736         the type parameters from the current class.
3737
3738         * generic.cs (ConstructedType.ResolveType): Support nested generic
3739         types by taking the type parameters which we inherit from outer
3740         classes into account.
3741         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
3742         support for nested generic types.
3743
3744 2004-02-23  Martin Baulig  <martin@ximian.com>
3745
3746         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
3747         field and check whether we're nested inside a generic type.
3748         (DeclSpace.ResolveType): If we're resolving to a generic type
3749         definition, create a ConstructedType and return its resolved type.
3750         (DeclSpace.initialize_type_params): New private method;
3751         initializes the `type_param_list' field from the type parameters
3752         from this and all enclosing classes.
3753         (DeclSpace.TypeParameters): Call initialize_type_params() unless
3754         we're already initialized.
3755
3756 2004-02-23  Martin Baulig  <martin@ximian.com>
3757
3758         * class.cs (Method.Define): Create the generic method before
3759         calling DoDefine().
3760         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
3761         the TypeContainer one); we use this for generic methods.
3762
3763         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
3764         parent's TypeBuilder.
3765
3766 2004-02-18  Martin Baulig  <martin@ximian.com>
3767
3768         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
3769         to check for equality.
3770
3771 2004-02-05  Martin Baulig  <martin@ximian.com>
3772
3773         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
3774         `ec.TypeContainer.CurrentType', use it instead of
3775         `ec.ContainerType' to check whether we're in the type's ctor.
3776
3777 2004-01-29  Martin Baulig  <martin@ximian.com>
3778
3779         * expression.cs (Invocation.DoResolve): If we're a
3780         `ConstructedType', then we're actually a generic method, so
3781         rewrite the expr as a GenericMemberAccess.
3782
3783         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
3784         here; manually parse it into a string.
3785
3786 2004-01-28  Martin Baulig  <martin@ximian.com>
3787
3788         * typemanager.cs (TypeManager.IsEqual): New static method.
3789         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
3790         check for equality instead of using `=='.
3791
3792 2004-01-26  Martin Baulig  <martin@ximian.com>
3793
3794         * decl.cs (DeclSpace.CurrentType): New public field.
3795
3796         * expression.cs (This.ResolveBase): If we have an
3797         `ec.TypeContainer.CurrentType', use it instead of
3798         `ec.ContainerType'.
3799
3800         * class.cs (TypeContainer.DefineType): If we're a generic type,
3801         create the `CurrentType' (unresolved).
3802         (TypeContainer.GenericType): New private field.
3803         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
3804         it and store it in `GenericType' before creating the MemberCache.
3805         (TypeContainer.GetMembers): If we have a `GenericType', call
3806         TypeManager.FindMembers() on it.
3807
3808         * interface.cs (Interface.GenericType): New private field.
3809         (Interface.DefineType): If we're a generic type, create the
3810         `CurrentType' (unresolved).
3811         (Interface.DefineMembers): If we have a `CurrentType', resolve it
3812         and store it in `GenericType' before creating the MemberCache.
3813         (Interface.GetMembers): If we have a `GenericType', call
3814         TypeManager.FindMembers() on it.
3815
3816 2004-01-22  Martin Baulig  <martin@ximian.com>
3817
3818         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3819         not a QualifiedIdentifier.  This is what `type_name_expression'
3820         was previously doing.
3821         (type_name_expression): Removed; the code is now in
3822         `namespace_or_type_name'.
3823         (qualified_identifier): Removed, use `namespace_or_type_name'
3824         instead.
3825         (QualifiedIdentifier): Removed this class.      
3826
3827 2004-01-22  Martin Baulig  <martin@ximian.com>
3828
3829         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3830         not a string as alias name.
3831
3832 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3833
3834         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3835         #52730 bug, and instead compute correctly the need to use a
3836         temporary variable when requesting an address based on the
3837         static/instace modified of the field and the constructor.
3838  
3839 2004-01-21  Martin Baulig  <martin@ximian.com>
3840
3841         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3842         class and namespace before looking up aliases.  Fixes #52517.
3843
3844 2004-01-21  Martin Baulig  <martin@ximian.com>
3845
3846         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3847         assinged in a 'try'; fixes exception4.cs.
3848
3849 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3850         * class.cs : Implemented parameter-less constructor for TypeContainer
3851
3852         * decl.cs: Attributes are now stored here. New property OptAttributes
3853
3854         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3855
3856         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3857
3858 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3859
3860         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3861           (CSharpSignature): New method for indexer and property signature.
3862
3863 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3864
3865         * pending.cs (IsVirtualFilter): Faster implementation.
3866
3867 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3868
3869         * typemanager.cs: Avoid inclusion of same assembly more than once.
3870
3871 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3872
3873         * cs-parser.jay: Fixed problem where the last assembly attribute
3874           has been applied also to following declaration (class, struct, etc.)
3875           
3876 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3877
3878         * class.cs: Added error CS0538, CS0539 reporting.
3879         Fixed crash on Microsoft runtime when field type is void.
3880
3881         * cs-parser.jay: Added error CS0537 reporting.
3882
3883         * pending.cs: Added error CS0535 reporting.
3884         Improved error report for errors CS0536, CS0534.
3885
3886 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3887
3888         Merge a few bits from the Anonymous Method MCS tree.
3889
3890         * statement.cs (ToplevelBlock): New class for toplevel methods,
3891         will hold anonymous methods, lifted variables.
3892
3893         * cs-parser.jay: Create toplevel blocks for delegates and for
3894         regular blocks of code. 
3895
3896 2004-01-20  Martin Baulig  <martin@ximian.com>
3897
3898         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3899         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3900         and `NeedExplicitReturn'; added `IsLastStatement'.
3901         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3902         have a `ReturnLabel' or we're not unreachable.
3903
3904         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3905         child's reachability; don't just override ours with it.  Fixes
3906         #58058 (lluis's example).
3907         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3908         InFinally(), InLoop(), InSwitch() and
3909         BreakCrossesTryCatchBoundary() methods.
3910
3911         * statement.cs (Return): Do all error checking in Resolve().
3912         Unless we are the last statement in a top-level block, always
3913         create a return label and jump to it.
3914         (Break, Continue): Do all error checking in Resolve(); also make
3915         sure we aren't leaving a `finally'.
3916         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3917         statement in a top-level block.
3918         (Block.Flags): Added `IsDestructor'.
3919         (Block.IsDestructor): New public property.
3920
3921 2004-01-20  Martin Baulig  <martin@ximian.com>
3922
3923         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3924
3925 2004-01-20  Martin Baulig  <martin@ximian.com>
3926
3927         * statement.cs (Statement.ResolveUnreachable): New public method.
3928         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3929         (Block.Resolve): Resolve unreachable statements.
3930
3931 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3932
3933         * expression.cs: We need to fix the case where we do
3934         not have a temp variable here.
3935
3936         * assign.cs: Only expression compound assignments need
3937         temporary variables.
3938
3939 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3940
3941         * flowanalysis.cs: Reduce memory allocation in a few ways:
3942           - A block with no variables should not allocate a bit
3943             vector for itself.
3944           - A method with no out parameters does not need any tracking
3945             for assignment of the parameters, so we need not allocate
3946             any data for it.
3947           - The arrays:
3948                 public readonly Type[] VariableTypes;
3949                 public readonly string[] VariableNames;
3950             Are redundant. The data is already stored in the variable
3951             map, so we need not allocate another array for it.
3952           - We need to add alot of checks for if (params | locals) == null
3953             due to the first two changes.
3954
3955 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3956
3957         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3958         implement IMemoryLocation, we store a copy on a local variable and
3959         take the address of it.  Patch from Benjamin Jemlich
3960
3961         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3962         to use a special "type_name_expression" rule which reduces the
3963         number of "QualifiedIdentifier" classes created, and instead
3964         directly creates MemberAccess expressions.
3965
3966 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3967
3968         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3969         that fixes #52853.  Null literal assignment to ValueType
3970
3971         * class.cs (MethodData.Emit): Instead of checking the name of the
3972         method to determine if its a destructor, create a new derived
3973         class from Method called Destructor, and test for that.  
3974
3975         * cs-parser.jay: Create a Destructor object instead of a Method.  
3976
3977         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3978
3979         Fixes: 52933
3980
3981 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3982
3983         * expression.cs (Binary.ResolveOperator): Perform an implicit
3984         conversion from MethodGroups to their delegate types on the
3985         Addition operation.
3986
3987         * delegate.cs: Introduce a new class DelegateCreation that is the
3988         base class for `NewDelegate' and `ImplicitDelegateCreation',
3989         factor some code in here.
3990
3991         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3992         conversion from MethodGroups to compatible delegate types. 
3993
3994         * ecore.cs (Expression.Resolve): Do not flag error 654
3995         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3996         we allow conversions from MethodGroups to delegate types now.
3997
3998         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3999         assignments in v2 either.
4000
4001 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4002
4003         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4004         static read-only fields in ctors.
4005
4006         Applied patch from Benjamin Jemlich 
4007
4008         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4009
4010 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4011
4012         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4013         here to return true, as they can be used like this:
4014
4015                 (XXX) int.MEMBER ()
4016
4017         Fixed 49836 and all the other dups
4018
4019 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4020
4021         * driver.cs: Implement /win32res and /win32icon.
4022
4023 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4024
4025         * cs-parser.jay: Add a rule to improve error handling for the
4026         common mistake of placing modifiers after the type.
4027
4028 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4029
4030         * cs-parser.jay (interface_event_declaration): Catch
4031         initialization of events on interfaces, and report cs0068
4032
4033         * cs-parser.jay (interface_event_declaration): Catch
4034         initialization of events. 
4035
4036         * ecore.cs: Better report missing constructors.
4037
4038         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4039         the error reporting done in the wrong place.  Fix.
4040
4041         * expression.cs (Binary.ResolveOperator): Catch the 
4042         operator + (E x, E y) error earlier, and later allow for implicit
4043         conversions in operator +/- (E e, U x) from U to the underlying
4044         type of E.
4045
4046         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4047         52596, if the container class is abstract, the default constructor
4048         is protected otherwise its public (before, we were always public).
4049
4050         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4051         fixed statement.
4052
4053         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4054         Jemlich that fixes bug #52597, MCS was generating invalid code for
4055         idisposable structs.   Thanks to Ben for following up with this
4056         bug as well.
4057
4058 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4059
4060         * driver.cs: Allow assemblies without code to be generated, fixes
4061         52230.
4062
4063 2004-01-07  Nick Drochak <ndrochak@gol.com>
4064
4065         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4066
4067 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4068
4069         * cs-parser.jay: Add rules to improve error reporting if fields or
4070         methods are declared at the namespace level (error 116)
4071
4072         * Add rules to catch event add/remove
4073
4074 2004-01-04  David Sheldon <dave-mono@earth.li>
4075
4076   * expression.cs: Added matching ")" to error message for 
4077   CS0077
4078
4079 2004-01-03 Todd Berman <tberman@gentoo.org>
4080
4081         * ecore.cs, attribute.cs:
4082         Applying fix from #52429.
4083
4084 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4085
4086         * ecore.cs, expression.cs, statement.cs:
4087         Total rewrite of how we handle branching. We
4088         now handle complex boolean expressions with fewer
4089         jumps. As well if (x == 0) no longer emits a ceq.
4090
4091         if (x is Foo) is much faster now, because we generate
4092         better code.
4093
4094         Overall, we get a pretty big improvement on our benchmark
4095         tests. The code we generate is smaller and more readable.
4096
4097         I did a full two-stage bootstrap. The patch was reviewed
4098         by Martin and Miguel.
4099
4100 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4101
4102         * cs-parser.jay: Make primary_expression not take a QI.
4103         we dont need this because the member_access rule covers
4104         us here. So we replace the rule with just IDENTIFIER.
4105
4106         This has two good effects. First, we remove a s/r conflict.
4107         Second, we allocate many fewer QualifiedIdentifier objects.
4108
4109 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4110
4111         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4112         set the correct information via SRE. This prevents
4113         hanging on the MS runtime. Fixes #29374.
4114
4115 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4116
4117         * convert.cs: correctly handle conversions to value types
4118         from Enum and ValueType as unboxing conversions.
4119
4120         Fixes bug #52569. Patch by Benjamin Jemlich.
4121
4122 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4123
4124         * expression.cs (BetterConversion): Prefer int -> uint
4125         over int -> ulong (csc's behaviour). This fixed bug #52046.
4126
4127 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4128
4129         * decl.cs (MemberCache.FindMembers): now returns a
4130         MemberInfo [].
4131
4132         * typemanager.cs: In general, go with with ^^.
4133         (CopyNewMethods): take an IList.
4134         (RealMemberLookup): Only allocate an arraylist
4135         if we copy from two sets of methods.
4136
4137         This change basically does two things:
4138         1) Fewer array lists allocated due to CopyNewMethods.
4139         2) the explicit cast in MemberList costed ALOT.
4140
4141 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4142
4143         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4144         a hashtable to avoid needless string allocations when an identifier is
4145         used more than once (the common case).
4146
4147 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4148
4149         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4150         is broken, it will not return anything. So, we
4151         have to use the information we have in mcs to
4152         do the task.
4153
4154         * typemanager.cs: Add a cache for GetInterfaces,
4155         since this will now be used more often (due to ^^)
4156
4157         (GetExplicitInterfaces) New method that gets the
4158         declared, not effective, interfaces on a type
4159         builder (eg, if you have interface IFoo, interface
4160         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4161         { IBar }.
4162
4163         This patch makes MCS able to bootstrap itself on
4164         Windows again.
4165
4166 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4167
4168         * expression.cs: Remove the Nop's that Miguel put
4169         in by mistake.
4170
4171 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4172
4173         * report.cs, codegen.cs: Give the real stack trace to
4174         the error when an exception is thrown.
4175
4176 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4177
4178         * decl.cs: only allocate hashtables for ifaces if 
4179         it is an iface!
4180
4181 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4182
4183         * expression.cs: fix the error from cs0121-2.cs
4184         (a parent interface has two child interfaces that
4185         have a function with the same name and 0 params
4186         and the function is called through the parent).
4187
4188 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4189
4190         * class.cs, rootcontext.cs, typmanager.cs: do not
4191         leak pointers.
4192
4193 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4194
4195         * codegen.cs: remove stack for the ec flow branching.
4196         It is already a linked list, so no need.
4197
4198 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4199
4200         * Makefile: Allow custom profiler here.
4201
4202 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4203
4204         * typemanager.cs (LookupType):
4205           - Use a static char [], because split takes
4206             a param array for args, so it was allocating
4207             every time.
4208           - Do not store true in a hashtable, it boxes.
4209
4210 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4211
4212         * flowanalysis.cs: bytify common enums.
4213
4214 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4215
4216         * modifiers.cs: Add a new set of flags for the
4217         flags allowed on explicit interface impls.
4218         * cs-parser.jay: catch the use of modifiers in
4219         interfaces correctly.
4220         * class.cs: catch private void IFoo.Blah ().
4221
4222         All related to bug #50572.
4223
4224 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4225
4226         * decl.cs: Rewrite the consistant accessability checking.
4227         Accessability is not linear, it must be implemented in
4228         a tableish way. Fixes #49704.
4229
4230 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4231
4232         * expression.cs: Handle negation in a checked context.
4233         We must use subtraction from zero. Fixes #38674.
4234
4235 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4236
4237         * class.cs: Ignore static void main in DLLs.
4238         * rootcontext.cs: Handle the target type here,
4239         since we are have to access it from class.cs
4240         * driver.cs: account for the above.
4241
4242 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4243
4244         * report.cs: Give line numbers and files if available.
4245
4246 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4247
4248         * driver.cs: Implement /addmodule.
4249
4250         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4251         ModuleBuilders.
4252
4253 2003-12-20  Martin Baulig  <martin@ximian.com>
4254
4255         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4256         (FieldBase.IsAssigned): Removed this field.
4257         (FieldBase.SetAssigned): New public method.
4258         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4259
4260 2003-12-20  Martin Baulig  <martin@ximian.com>
4261
4262         * expression.cs (LocalVariableReference.DoResolve): Don't set
4263         `vi.Used' if we're called from DoResolveLValue().
4264
4265         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4266         returns the usage vector it just merged into the current one -
4267         pass this one to UsageWarning().
4268         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4269         of the `EmitContext', don't call this recursively on our children.
4270
4271 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4272
4273         * driver.cs: Implement /target:module.
4274
4275 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4276
4277         * support.cs (CharArrayHashtable): New helper class.
4278
4279         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4280         char arrays, not strings, so we can avoid creating a string in
4281         consume_identifier if the identifier is a keyword.
4282
4283 2003-12-16  Martin Baulig  <martin@ximian.com>
4284
4285         * statement.cs (LocalInfo.Assigned): Removed this property.
4286         (LocalInfo.Flags): Removed `Assigned'.
4287         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4288         and uses flow analysis.
4289         (Block.UsageWarning): Made this method private.
4290         (Block.Resolve): Call UsageWarning() if appropriate.
4291
4292         * expression.cs (LocalVariableReference.DoResolve): Always set
4293         LocalInfo.Used here.
4294
4295 2003-12-13  Martin Baulig  <martin@ximian.com>
4296
4297         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4298         any value here; we're now using flow analysis to figure out
4299         whether a statement/block returns a value.
4300
4301 2003-12-13  Martin Baulig  <martin@ximian.com>
4302
4303         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4304         working again.
4305         (FlowBranching.MergeFinally): Don't call
4306         `branching.CheckOutParameters()' here, this is called in
4307         MergeTopBlock().
4308         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4309         when adding the `finally' vector.       
4310
4311 2003-12-13  Martin Baulig  <martin@ximian.com>
4312
4313         * flowanalysis.cs
4314         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4315         actually work and also fix #48962.
4316
4317 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4318
4319         * decl.cs: Do not check System.Object for nested types,
4320         since we know it does not have any. Big bang for buck:
4321
4322         BEFORE:
4323            Run 1:   8.35 seconds
4324            Run 2:   8.32 seconds
4325            corlib:  17.99 seconds
4326         AFTER:
4327            Run 1:   8.17 seconds
4328            Run 2:   8.17 seconds
4329            corlib:  17.39 seconds
4330
4331 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4332
4333         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4334         time we are returning 0 members, so we save alot here.
4335
4336 2003-12-11  Martin Baulig  <martin@ximian.com>
4337
4338         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4339         `MergeChild()', also just take the `FlowBranching' as argument;
4340         call Merge() on it and return the result.
4341         (FlowBranching.Merge): We don't need to do anything if we just
4342         have one sibling.
4343
4344 2003-12-11  Martin Baulig  <martin@ximian.com>
4345
4346         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4347         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4348         Maurer for this idea.
4349
4350 2003-12-11  Martin Baulig  <martin@ximian.com>
4351
4352         * flowanalysis.cs (MergeResult): This class is now gone; we now
4353         use the `UsageVector' for this.  The reason for this is that if a
4354         branching just has one sibling, we don't need to "merge" them at
4355         all - that's the next step to do.
4356         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4357         `MergeResult'.
4358
4359 2003-12-11  Martin Baulig  <martin@ximian.com>
4360
4361         Reworked flow analyis and made it more precise and bug-free.  The
4362         most important change is that we're now using a special `Reachability'
4363         class instead of having "magic" meanings of `FlowReturns'.  I'll
4364         do some more cleanups and optimizations and also add some more
4365         documentation this week.
4366
4367         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4368         largely reworked this class.
4369         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4370         the new `Reachability' class instead of having "magic" values here.
4371         (FlowBranching): We're now using an instance of `Reachability'
4372         instead of having separate `Returns', `Breaks' etc. fields.
4373
4374         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4375         based on flow analysis; ignore the return value of block.Emit ().
4376
4377 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4378
4379         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4380         if they are private.
4381
4382 2003-12-09  Martin Baulig  <martin@ximian.com>
4383
4384         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4385         call them directly on the UsageVector.
4386
4387 2003-12-09  Martin Baulig  <martin@ximian.com>
4388
4389         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4390         Changed return type from `FlowReturns' to `Reachability'.
4391
4392 2003-12-09  Martin Baulig  <martin@ximian.com>
4393
4394         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4395         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4396         `Reachable' fields with a single `Reachability' one.
4397
4398 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4399
4400         * class.cs (FindMembers): Remove foreach's.
4401
4402         Bootstrap times:
4403
4404         BEFORE
4405                 Run 1:   8.74 seconds
4406                 Run 2:   8.71 seconds
4407
4408         AFTER
4409                 Run 1:   8.64 seconds
4410                 Run 2:   8.58 seconds
4411
4412
4413 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4414
4415         * cs-parser.jay:
4416         * gen-treedump.cs:
4417         * statement.cs:
4418         This patch does a few things:
4419                 1. EmptyStatement is now a singleton, so it is never reallocated.
4420                 2. All blah is EmptyStatement constructs have been changed to
4421                    blah == EmptyStatement.Value, which is much faster and valid
4422                    now that EmptyStatement is a singleton.
4423                 3. When resolving a block, rather than allocating a new array for
4424                    the non-empty statements, empty statements are replaced with
4425                    EmptyStatement.Value
4426                 4. Some recursive functions have been made non-recursive.
4427         Mainly the performance impact is from (3), however (1) and (2) are needed for
4428         this to work. (4) does not make a big difference in normal situations, however
4429         it makes the profile look saner.
4430
4431         Bootstrap times:
4432
4433         BEFORE
4434         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4435         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4436         Total memory allocated: 56397 KB
4437
4438         AFTER
4439         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4440         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4441         Total memory allocated: 55666 KB
4442
4443 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4444
4445         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4446         than the hashtable in a hashtable version
4447
4448         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4449         we always end up concating a string. This results in a huge perf
4450         loss, because many strings have to be tracked by the GC. In this
4451         patch, we first use a hashtable that works with two keys, so that
4452         the strings do not need to be concat'ed.
4453
4454         Bootstrap times:
4455         BEFORE
4456                 Run 1:   8.74 seconds
4457                 Run 2:   8.71 seconds
4458
4459         AFTER
4460                 Run 1:   8.65 seconds
4461                 Run 2:   8.56 seconds
4462
4463 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4464
4465         * Makefile: Add a new target `do-time' that does a quick and simple
4466         profile, leaving easy to parse output.
4467
4468 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4469
4470         * codegen.cs (Init): Create the dynamic assembly with 
4471         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4472
4473 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4474
4475         * support.cs: Make the PtrHashtable use only one
4476         instance of its comparer.
4477
4478 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4479
4480         * typemanager.cs: Fix lookup of GetNamespaces.
4481
4482 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4483
4484         * expression.cs: Removed redundant line.
4485
4486         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4487         ArrayLists, use for loops with bounds.  
4488
4489         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4490         arraylist.
4491
4492         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4493         arraylists, use for loop with bounds.
4494
4495         The above three changes give us a 0.071 second performance
4496         improvement out of 3.294 seconds down to 3.223.  On my machine
4497         the above changes reduced the memory usage by 1,387 KB during
4498         compiler bootstrap.
4499
4500         * cs-parser.jay (QualifiedIdentifier): New class used to represent
4501         QualifiedIdentifiers.  Before we created a new string through
4502         concatenation, and mostly later on, the result would be
4503         manipulated by DecomposeQI through string manipulation.
4504
4505         This reduced the compiler memory usage for bootstrapping from
4506         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
4507         compile times in 0.05 seconds.
4508
4509 2003-11-28  Dick Porter  <dick@ximian.com>
4510
4511         * support.cs: Do string compares with the Invariant culture.
4512
4513         * rootcontext.cs: 
4514         * gen-treedump.cs: 
4515         * expression.cs: 
4516         * driver.cs: 
4517         * decl.cs: 
4518         * codegen.cs: 
4519         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4520         the comparison is done with the Invariant culture.
4521
4522 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4523
4524         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4525         GetEnumerator method.
4526
4527         (ProbeCollectionType): Iterate starting at the most specific type
4528         upwards looking for a GetEnumerator
4529
4530         * expression.cs: Shift count can be up to 31 for int/uint and 63
4531         for long/ulong.
4532
4533 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4534
4535         * statement.cs (Block.LookupLabel): Also look for the label on the
4536         children blocks.  Use a hash table to keep track of visited
4537         nodes. 
4538
4539         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4540         we actually did transform the other operand, otherwise fall back
4541         to the common codepath that casts to long.
4542
4543         * cs-tokenizer.cs: Use the same code pattern as the int case.
4544         Maybe I should do the parsing myself, and avoid depending on the
4545         Parse routines to get this done.
4546
4547 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4548
4549         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4550         which fixes bug 51347.  This time test it.
4551
4552         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4553         attributes for example can not tell the difference between these.
4554         The difference was only a syntax feature of the language. 
4555
4556         * attribute.cs: Apply attributes to delegates.
4557
4558         * delegate.cs: Call the apply attributes method.
4559
4560 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4561
4562         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4563         comparing 0 vs Byte.MinValue, not the value
4564
4565         (ImplicitConversionRequired): When reporting a conversion error,
4566         use error 31 to print out the constant error instead of the
4567         simpler 29.
4568
4569         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4570         which fixes bug 51347.
4571
4572 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4573
4574         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4575         which fixes the -warnaserror command line option.
4576
4577 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4578
4579         * cfold.cs (DoNumericPromotions): During constant folding of
4580         additions on UIntConstant, special case intconstants with
4581         IntConstants like we do on the expression binary operator. 
4582
4583 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4584
4585         * convert.cs (ImplicitReferenceConversion): We were missing a case
4586         (System.Enum are not value types or class types, so we need to
4587         classify them separatedly).
4588
4589         * driver.cs: We do not support error 2007.
4590
4591 2003-11-12 Jackson Harper <jackson@ximian.com>
4592
4593         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4594         system directory. Also use the full file name so users can
4595         libraries names mscorlib-o-tron.dll in a non system dir.
4596         
4597 2004-01-04  David Sheldon <dave-mono@earth.li>
4598
4599         * expression.cs: Added matching ")" to error message for CS0077.
4600
4601 2003-12-19  Martin Baulig  <martin@ximian.com>
4602
4603         * typemanager.cs (TypeManager.IsEqualGenericType): New public
4604         static method; see documentation in the method.
4605         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
4606
4607         * convert.cs (Convert.ImplicitReferenceConversion,
4608         Convert.ImplicitReferenceConversionExists): Add support for
4609         generic type declarations; see gen-36.cs.
4610
4611 2003-12-19  Martin Baulig  <martin@ximian.com>
4612
4613         * pending.cs (Pending.InterfaceMethod): Use
4614         `Type.IsAssignableFrom()' instead of `=='.
4615
4616 2003-12-18  Martin Baulig  <martin@ximian.com>
4617
4618         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
4619         byref types first.
4620
4621         * convert.cs (Convert.ImplicitStandardConversionExists): Use
4622         `expr_type.Equals (target_type)' instead of `=='.
4623
4624 2003-12-08  Martin Baulig  <martin@ximian.com>
4625
4626         * generics.cs (Constraints.Types): Removed.
4627         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
4628         to Type's.
4629         (Constraints.ResolveTypes): New public method; resolves the
4630         TypeExpr's to Type's.
4631         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
4632         longer takes the constraints.
4633         (TypeParameter.DefineMethod): Likewise.
4634         (TypeParameter.DefineType): New public method.  Calls
4635         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
4636         the constraints.
4637
4638 2003-12-08  Martin Baulig  <martin@ximian.com>
4639
4640         * convert.cs (Convert.ImplicitConversionStandard): Use
4641         `expr_type.Equals (target_type)' instead of `=='.
4642
4643 2003-12-08  Martin Baulig  <martin@ximian.com>
4644
4645         * typemanager.cs (TypeManager.GetReferenceType): Call
4646         `Type.MakeByRefType ()'.
4647
4648 2003-12-08  Martin Baulig  <martin@ximian.com>
4649
4650         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
4651         just has some special meaning in some situations.  For instance,
4652         it is allowed to use `where' as the name of a variable etc.
4653
4654 2003-12-04  Martin Baulig  <martin@ximian.com>
4655
4656         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
4657         `Type.MakeArrayType()' for array types.
4658
4659 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
4660
4661         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
4662         debugging message.
4663
4664         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
4665         corlib to compile.
4666
4667 2003-11-16  Martin Baulig  <martin@ximian.com>
4668
4669         * codegen.cs (EmitContext.IsGeneric): Removed.
4670
4671         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
4672         ResolveGeneric() on the DeclSpace.
4673
4674 2003-11-16  Martin Baulig  <martin@ximian.com>
4675
4676         * generic.cs (TypeArguments.Resolve):
4677         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
4678         `ResolveType()' on it to get the Type.
4679
4680 2003-11-15  Martin Baulig  <martin@ximian.com>
4681
4682         * generic.cs (ConstructedType.GetInterfaces): Override this.
4683
4684 2003-11-14  Martin Baulig  <martin@ximian.com>
4685
4686         * interface.cs (Interface.DefineType): Define all type parameters
4687         before adding the interfaces we inherit.
4688
4689 2003-11-11  Martin Baulig  <martin@ximian.com>
4690
4691         * generic.cs (ConstructedType.ResolveType): Always call
4692         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
4693
4694 2003-11-10  Martin Baulig  <martin@ximian.com>
4695
4696         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4697         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4698         calling `ResolveType()' on them, directly assign their `Type'.
4699
4700 2003-11-08  Martin Baulig  <martin@ximian.com>
4701
4702         * generic.cs (ConstructedType): Override `IsClass' etc.
4703
4704 2003-11-08  Martin Baulig  <martin@ximian.com>
4705
4706         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4707         return value and the `out parent' parameter.
4708         (TypeContainer.DefineType): Moved the CS0644 check into
4709         GetClassBases().  Don't pass the interface types to the
4710         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4711         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4712
4713         * ecore.cs (TypeExpr.IsAttribute): New property.
4714         (TypeExpr.GetInterfaces): New method.
4715
4716         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4717         TypeExpr instead of a Type.
4718         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4719         (Interface.DefineType): Don't pass the interface types to the
4720         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4721         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4722
4723         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4724         instead of a `Type[]'.
4725         (TypeManager.RegisterBuilder): Likewise.
4726         (TypeManager.AddUserInterface): Likewise.
4727         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4728         `Type[]' and also return a `TypeExpr[]'.
4729         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4730
4731 2003-11-08  Martin Baulig  <martin@ximian.com>
4732
4733         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4734         Expression.     
4735
4736 2003-11-08  Martin Baulig  <martin@ximian.com>
4737
4738         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4739         TypeManager.ResolveExpressionTypes().
4740
4741         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4742         instead of an Expression.
4743         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4744         (TypeExpression): New public class; formerly known as `TypeExpr'.
4745
4746         * expression.cs (ComposedCast): Derive from TypeExpr.
4747
4748         * typemanager.cs (TypeManager.system_*_expr): These are now
4749         TypExpr's instead of Expression's.
4750         (TypeManager.ResolveExpressionTypes): New public static function;
4751         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4752         of them.        
4753
4754 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4755
4756         * expression.cs (New.DoResolve): Do not dereference value that
4757         might be a null return.
4758
4759         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4760         sure that the constant value has the right type.  Fixes an
4761         unreported bug, similar to 50425.
4762
4763         * const.cs (Const.LookupConstantValue): Call
4764         ImplicitStandardConversionExists before doing a conversion to
4765         avoid havng the TypeManager.ChangeType do conversions.
4766
4767         Reduced the number of casts used
4768
4769         (Const.ChangeType): New routine to enable reuse of the constant
4770         type changing code from statement.
4771
4772         * typemanager.cs (ChangeType): Move common initialization to
4773         static global variables.
4774
4775         Fixes #50425.
4776
4777         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4778         every value type to go through, even if it was void.  Fix that. 
4779
4780         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4781         character of the define, and the is_identifier_part_character for
4782         the rest of the string.
4783
4784 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4785
4786         * expression.cs (UnaryMutator.EmitCode): When I updated
4787         LocalVariableReference.DoResolve, I overdid it, and dropped an
4788         optimization done on local variable references.
4789
4790 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4791
4792         * ecore.cs: Convert the return from Ldlen into an int.
4793
4794 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4795
4796         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4797         the accessibility, this is a special case for toplevel non-public
4798         classes (internal for instance).
4799
4800 2003-10-20  Nick Drochak <ndrochak@gol.com>
4801
4802         * ecore.cs: Fix typo and build.  Needed another right paren.
4803
4804 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4805
4806         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4807         `internal' case regular and protected, but not allowing protected
4808         to be evaluated later.  Bug 49840
4809
4810 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4811
4812         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4813         to kb.Nlast, and not the kb.nFirst to isolate the switch
4814         statement.
4815
4816         Extract the underlying type, so enumerations of long/ulong are
4817         treated like long/ulong.
4818
4819 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4820
4821         * expression.cs (New): Overload the meaning of RequestedType to
4822         track the possible creation of the NewDelegate type, since
4823         DoResolve is invoked more than once for new constructors on field
4824         initialization.
4825
4826         See bugs: #48800 and #37014
4827
4828         * cs-parser.jay (declare_local_constants): Take an arraylist
4829         instead of a single constant.
4830
4831         (local_constant_declaration): It should take a
4832         constant_declarators, not a constant_declarator.  Fixes 49487
4833
4834         * convert.cs: Fix error report.
4835
4836 2003-10-13 Jackson Harper <jackson@ximian.com>
4837
4838         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4839         bug #49611
4840         
4841 2003-11-03  Martin Baulig  <martin@ximian.com>
4842
4843         * expression.cs (ArrayAccess.GetStoreOpcode): Added
4844         `out bool has_type_arg'; if set, we need to pass the type to
4845         ig.Emit().
4846         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
4847         Stelem_Any/Ldelem_Any for generic parameters.   
4848
4849 2003-11-02  Martin Baulig  <martin@ximian.com>
4850
4851         * expression.cs (Invocation.EmitCall): Use
4852         `TypeManager.IsValueType()' to check whether it's a value type.
4853         Don't set `struct_call' when calling a method on a type parameter.
4854
4855 2003-11-02  Martin Baulig  <martin@ximian.com>
4856
4857         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
4858         and removed the TypeBuilder argument.
4859
4860         * typemanager.cs (TypeManager.IsValueType): Return
4861         `t.IsGenericParameter || t.IsValueType'.
4862
4863 2003-10-25  Martin Baulig  <martin@ximian.com>
4864
4865         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
4866         call ConstructedType.Resolve() on it.
4867
4868         * generic.cs (ConstructedType.Resolve): Set `type' on success.
4869
4870 2003-10-25  Martin Baulig  <martin@ximian.com>
4871
4872         * class.cs (TypeContainer.GetClassBases): Changed
4873         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
4874         CS8214 reporting here.
4875         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
4876         instead of a `Type' for our parent.  In case of a recursive
4877         declaration (see tests/gen-23.cs for an example), our parent is a
4878         ConstructedType and it doesn't have its type set.  So, first
4879         create our own TypeBuilder, then call constructed.Resolve() to get
4880         the parent's type and finally TypeBuilder.SetParent() it.
4881
4882         * ecore.cs (TypeExpr.Name): New public virtual property.
4883
4884         * generic.cs
4885         (ConstructedType): We're now a TypeExpr and not just an Expression.
4886         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
4887         arguments here; this is done later.
4888         (ConstructedType.Resolve): New public method to resolve the type
4889         arguments and bind them.
4890
4891 2003-10-21  Martin Baulig  <martin@ximian.com>
4892
4893         * convert.cs: Use `TypeManager.IsValueType' instead of
4894         'type.IsValueType' everywhere.
4895
4896         * typemanager.cs (TypeManager.IsValueType): Return true for type
4897         parameters.  The reason for this is that we need to box a type
4898         parameter when converting it to a reference type.
4899
4900         * cs-parser.jay: Added support for default value expressions.
4901
4902         * generics.cs (DefaultValueExpression): New public class.       
4903
4904 2003-10-17  Martin Baulig  <martin@ximian.com>
4905
4906         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
4907         TypeContainer so we can also use this for Interfaces.
4908         (TypeParameter.Resolve): Likewise.
4909
4910         * interface.cs (Interface.DefineType): Added support for generic
4911         interfaces.
4912
4913         * cs-parser.jay: Added support for generic structs and interfaces.
4914
4915 2003-10-17  Martin Baulig  <martin@ximian.com>
4916
4917         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
4918         call generic methods :-)
4919
4920 2003-10-16  Martin Baulig  <martin@ximian.com>
4921
4922         * cs-parser.jay (namespace_or_type_name): Only create a
4923         GenericMemberAccess if we actually have type arguments.
4924
4925 2003-10-13  Martin Baulig  <martin@ximian.com>
4926
4927         * class.cs (Method.Define): If we're a generic method, call
4928         TypeBuilder.DefineGenericMethod () before resolving
4929         the parameters.
4930         (MethodData): Added .ctor which takes an additional MethodBuilder
4931         argument; this is used for generic methods.
4932         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
4933         we already have a MethodBuilder.
4934
4935 2003-10-10  Martin Baulig  <martin@ximian.com>
4936
4937         * class.cs (Method): Added .ctor which takes a `GenericMethod'
4938         instead of a `DeclSpace'.  This is used for generic methods.
4939
4940         * cs-parser.jay (method_header): Added support for generic
4941         methods; create a `GenericMethod' instance and pass it to the
4942         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
4943         parameters and locals.
4944
4945         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
4946         since we already have the location.  Check whether we're a generic
4947         type declaration or a generic method and create the correct type
4948         parameter.
4949
4950         * generic.cs (TypeParameter.DefineMethod): New public method.
4951         (GenericMethod): New public class; derives from DeclSpace and is
4952         used for generic methods.       
4953
4954 2003-10-09  Martin Baulig  <martin@ximian.com>
4955
4956         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4957         to the .ctor.
4958         (MethodCore.DoDefineParameters): Removed the TypeContainer
4959         argument; use the DeclSpace which was passed to the .ctor instead.
4960         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4961         TypeContainer; we only need a DeclSpace here.
4962
4963 2003-10-09  Martin Baulig  <martin@ximian.com>
4964
4965         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4966         to the .ctor.
4967         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4968         EmitContext's .ctor.    
4969
4970 2003-10-09  Martin Baulig  <martin@ximian.com>
4971
4972         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4973         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4974         AsAccessible(), moved them as well.
4975
4976         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4977
4978 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4979
4980         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4981         generation for >=, as spotted by Paolo, bug 48679.  
4982         Patch from David Waite.
4983
4984         * cs-tokenizer.cs: Add handling for #pragma.
4985
4986         * cs-parser.jay: Allow for both yield and yield return in the
4987         syntax.  The anti-cobolization of C# fight will go on!
4988
4989         * class.cs (TypeBuilder.DefineType): Catch error condition here
4990         (Parent.DefineType erroring out and returning null).
4991
4992         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4993         coping with enumerations variables, we were mistakenly processing
4994         them as a regular value type instead of built-in types.  Fixes the
4995         bug #48063
4996
4997         * typemanager.cs (IsBuiltinOrEnum): New method.
4998
4999 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5000
5001         * cs-parser.jay: Upgrade: yield now needs the return clause.
5002
5003 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5004
5005         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5006
5007 2003-09-29  Martin Baulig  <martin@ximian.com>
5008
5009         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
5010         inflated generic methods.
5011
5012         * generics.cs (ConstructedType): Distinguish between open and
5013         closed constructed types; correctly resolve the arguments.
5014
5015 2003-09-22  Martin Baulig  <martin@ximian.com>
5016
5017         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
5018         all type arguments meet their constraints.
5019
5020 2003-09-19  Martin Baulig  <martin@ximian.com>
5021
5022         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5023         `MemberCache parent' argument.  Normally, an interface doesn't
5024         have a parent type except System.Object, but we use this in gmcs
5025         for generic type parameters.
5026
5027 2003-09-18  Martin Baulig  <martin@ximian.com>
5028
5029         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5030         on `type.IsInterface'; don't check whether the type has a parent
5031         to determine whether it's an interface.
5032
5033 2003-09-17  Martin Baulig  <martin@ximian.com>
5034
5035         * generic.cs (ConstructedType.ToString): Always use `name' as the
5036         type name.
5037
5038 2003-09-15  Martin Baulig  <martin@ximian.com>
5039
5040         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
5041
5042         * generic.cs (Constraints.Resolve): New public method; this is
5043         called to resolve the constraint types and to check whether all
5044         the constraints are correct.
5045         (Constraints.Types): New public property.
5046         (TypeParameter.Resolve): New public method; resolves all the
5047         type's constraints.
5048
5049         * class.cs (TypeContainer.DefineType): Call
5050         TypeParameter.Resolve() before actually defining the type.
5051
5052 2003-09-15  Martin Baulig  <martin@ximian.com>
5053
5054         * class.cs (TypeContainer.DefineType): Added an error flag to
5055         avoid reporting duplicate CS0146's ("class definition is
5056         circular.").
5057
5058         * driver.cs (Driver.MainDriver): Abort if
5059         RootContext.ResolveTree() reported any errors.
5060
5061 2003-09-07  Martin Baulig  <martin@ximian.com>
5062
5063         * report.cs (Error, Warning): Added overloaded versions which take
5064         a `params object[] args' and call String.Format().
5065
5066 2003-09-07  Martin Baulig  <martin@ximian.com>
5067
5068         * decl.cs (DeclSpace..ctor): Don't call
5069         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5070         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5071         (DeclSpace.RecordDecl): New method.
5072
5073         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5074
5075 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5076
5077         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5078         value attributes to be applied to ParameterBuilders.
5079
5080         * class.cs (MethodCore.LabelParameters): Make static and more
5081         generic so that it can be used from other places - like interface
5082         methods, for instance.
5083
5084         * interface.cs (Interface.Emit): Call LabelParameters before
5085         emitting attributes on the InterfaceMethod.
5086
5087 2003-09-07  Martin Baulig  <martin@ximian.com>
5088
5089         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
5090         if the number of type parameters doesn't match.
5091
5092 2003-09-04  Martin Baulig  <martin@ximian.com>
5093
5094         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
5095         for arrays of generic type params (ie. `!0[]').
5096
5097 2003-09-04  Martin Baulig  <martin@ximian.com>
5098
5099         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
5100         for the moment.
5101
5102 2003-09-04  Martin Baulig  <martin@ximian.com>
5103
5104         * decl.cs (DeclSpace.LookupGeneric): New method.
5105         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
5106         moment.
5107
5108         * generic.cs (TypeParameterExpr): Take a TypeParameter as
5109         argument, not just a string.
5110         (TypeParameter.Define): New public method; this is called to
5111         actually define the generic parameter; after this, you can use the
5112         new `Type' property to get the type.
5113
5114 2003-09-04  Martin Baulig  <martin@ximian.com>
5115
5116         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
5117         is now an ArrayList; initialize the result of the `TypeParameters'
5118         property here.
5119         (DeclSpace.GetGenericData): Removed.
5120         (DeclSpace.LookupGeneric): Temporarily removed; we need to
5121         implement this in a different way.
5122         (DeclSpace.GetTypeParameters): Removed; there's now a
5123         `TypeParameters' property.
5124         (DeclSpace.TypeParameters): New public property.
5125
5126         * generic.cs (Constraints): Make this class public.
5127         (TypeParameter): New public class.
5128
5129 2003-09-04  Martin Baulig  <martin@ximian.com>
5130
5131         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
5132         generic parameters.
5133
5134         * class.cs (TypeContainer.DefineType): Call
5135         TypeBuilder.DefineGenericParameter () on all generic parameters if
5136         this is a generic type.
5137
5138 2003-08-28  Martin Baulig  <martin@ximian.com>
5139
5140         * sample-stack.il: Compile this with ilasm: "ilasm /dll
5141         sample-stack.il".
5142
5143         * sample-hello.cs: Compile this with gmcs: "gmcs
5144         /r:sample-stack.dll sample-hello.cs".
5145
5146 2003-08-28  Martin Baulig  <martin@ximian.com>
5147
5148         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
5149         the parameters to the generic type.
5150
5151 2003-08-28  Martin Baulig  <martin@ximian.com>
5152
5153         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
5154
5155 2003-08-28  Martin Baulig  <martin@ximian.com>
5156
5157         * cs-parser.jay (opt_type_argument_list): Use
5158         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
5159         (primary_expression): Replace `qualified_identifier' with `type_name'.
5160         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
5161
5162         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
5163         parser to check whether it is syntactically a type parameter list;
5164         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
5165         this case.
5166
5167 2003-08-26  Martin Baulig  <martin@ximian.com>
5168
5169         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5170         resolving aliases; fixes #47927.
5171
5172 2003-08-26  Martin Baulig  <martin@ximian.com>
5173
5174         * statement.cs (Using.DoResolve): This is internally emitting a
5175         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5176         do not always return.  Fixes #47681.
5177
5178 2003-08-26  Martin Baulig  <martin@ximian.com>
5179
5180         * decl.cs (MemberCore): Moved WarningNotHiding(),
5181         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5182         into MemberBase.
5183         (AdditionResult): Make this nested in DeclSpace.
5184         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5185         argument; call NamespaceEntry.Define() unless we're nested in a
5186         class or struct.
5187
5188         * namespace.cs (Namespace.DefineName): New public function.  This
5189         is called from DeclSpace's .ctor to add 
5190         (Namespace.Lookup): Include DeclSpaces in the lookup.
5191
5192         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5193
5194         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5195
5196 2003-08-25  Martin Baulig  <martin@ximian.com>
5197
5198         * convert.cs (Convert.ExplicitReferenceConversion): When
5199         converting from an interface type to a class, unbox if the target
5200         type is a struct type.  Fixes #47822.
5201
5202 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5203
5204         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5205         #47854.
5206
5207 2003-08-22  Martin Baulig  <martin@ximian.com>
5208
5209         * class.cs (TypeManager.DefineType): When defining a nested type,
5210         call DefineType() on our parent; fixes #47801.
5211
5212 2003-08-22  Martin Baulig  <martin@ximian.com>
5213
5214         * class.cs (MethodData.Define): While checking if a method is an
5215         interface implementation, improve the test a bit more to fix #47654.
5216
5217 2003-08-22  Martin Baulig  <martin@ximian.com>
5218
5219         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5220         correctly; fixes #47722.
5221
5222 2003-08-22  Martin Baulig  <martin@ximian.com>
5223
5224         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5225         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5226
5227         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5228
5229 2003-08-22  Martin Baulig  <martin@ximian.com>
5230
5231         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5232         can only be assigned in static constructors.  Fixes #47161.
5233
5234 2003-08-22  Martin Baulig  <martin@ximian.com>
5235
5236         Rewrote and improved the flow analysis code.
5237
5238         * flowbranching.cs (FlowBranching): Make this class abstract.
5239         (FlowBranching.CreateBranching): New static function to create a
5240         new flow branching.
5241         (FlowBranchingBlock, FlowBranchingException): New classes.
5242         (FlowBranching.UsageVector.Type): New public readonly field.
5243         (FlowBranching.UsageVector.Breaks): Removed the setter.
5244         (FlowBranching.UsageVector.Returns): Removed the setter.
5245         (FlowBranching.UsageVector): Added Break(), Return(),
5246         NeverReachable() and Throw() methods to modify the reachability.
5247         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5248         done by FlowBranching.Merge().
5249         (FlowBranching.UsageVector.MergeChild): New method; merges the
5250         merge result into the current vector.
5251         (FlowBranching.Merge): New abstract method to merge a branching.
5252
5253 2003-08-12  Martin Baulig  <martin@ximian.com>
5254
5255         * expression.cs (Indirection.CacheTemporaries): Create the
5256         LocalTemporary with the pointer type, not its element type.
5257
5258 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5259
5260         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5261         token was a keyword or not.
5262
5263         Add `error' options where an IDENTIFIER was expected;  Provide
5264         CheckToken and CheckIdentifierToken convenience error reporting
5265         functions. 
5266
5267         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5268
5269         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5270         NameSpaceEntry NameSpaceEntry.
5271
5272         (LookupInterfaceOrClass): Avoid creating a full qualified name
5273         from namespace and name: avoid doing lookups when we know the
5274         namespace is non-existant.   Use new Tree.LookupByNamespace which
5275         looks up DeclSpaces based on their namespace, name pair.
5276
5277         * driver.cs: Provide a new `parser verbose' to display the
5278         exception thrown during parsing.  This is turned off by default
5279         now, so the output of a failure from mcs is more graceful.
5280
5281         * namespace.cs: Track all the namespaces defined in a hashtable
5282         for quick lookup.
5283
5284         (IsNamespace): New method
5285
5286 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5287
5288         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5289         we know that we need to concatenate (full typename can never be
5290         null). 
5291
5292         * class.cs: ditto.
5293
5294         * statement.cs: Use a bitfield;  Do not initialize to null things
5295         which are done by the constructor by default.
5296
5297         * cs-parser.jay: bug fix, parameter was 4, not 3.
5298
5299         * expression.cs: Just use the property;
5300
5301         * statement.cs: No need for GetVariableInfo method.
5302
5303 2003-08-08  Martin Baulig  <martin@ximian.com>
5304
5305         * flowanalysis.cs (FlowReturns): This is now nested in the
5306         `FlowBranching' class.
5307         (MyBitVector): Moved this here from statement.cs.
5308         (FlowBranching.SiblingType): New enum type.
5309         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5310
5311 2003-08-07  Martin Baulig  <martin@ximian.com>
5312
5313         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5314         `FlowBranching' class and called `BranchingType'.
5315
5316 2003-08-07  Martin Baulig  <martin@ximian.com>
5317
5318         * flowanalysis.cs: Moved all the control flow analysis code into
5319         its own file.
5320
5321 2003-08-07  Martin Baulig  <martin@ximian.com>
5322
5323         * assign.cs (Assign.DoResolve): `target' must either be an
5324         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5325         #37319.
5326
5327 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5328
5329         * expression.cs (BinaryMethod): This kind of expression is created by the
5330         Binary class if it determines that the operator has to be handled
5331         by a method.
5332
5333         (BinaryDelegate): This kind of expression is created if we are
5334         dealing with a + or - operator on delegates.
5335
5336         (Binary): remove method, argumetns, and DelegateOperator: when
5337         dealing with methods, 
5338
5339         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5340
5341         * statement.cs (Block): use bitfields for the three extra booleans
5342         we had in use.   Remove unused topblock parameter.
5343
5344         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5345
5346         * assign.cs: Drop extra unneeded tests.
5347
5348 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5349
5350         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5351
5352         * statement.cs (Foreach): Use VariableStorage instead of
5353         LocalBuilders.   
5354
5355         * codegen.cs (VariableStorage): New class used by clients that
5356         require a variable stored: locals or fields for variables that
5357         need to live across yield.
5358
5359         Maybe provide a convenience api for EmitThis+EmitLoad?
5360
5361         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5362         these bad boys.
5363
5364 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5365
5366         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5367         RemapParameterLValue): New methods that are used to turn a
5368         precomputed FieldInfo into an expression like this:
5369
5370                 instance.FieldInfo
5371
5372         The idea is to use this instead of making LocalVariableReference
5373         have more than one meaning.
5374
5375         * cs-parser.jay: Add error production to BASE.
5376
5377         * ecore.cs: Deal with TypeManager.GetField returning null, which
5378         is now a valid return value.
5379
5380         (FieldExprNoAddress): New expression for Fields whose address can
5381         not be taken.
5382
5383         * expression.cs (LocalVariableReference): During the resolve
5384         phases, create new expressions if we are in a remapping context.
5385         Remove code that dealt with remapping here.
5386
5387         (ParameterReference): same.
5388
5389         (ProxyInstance): New expression, like the `This' expression, but
5390         it is born fully resolved.  We know what we are doing, so remove
5391         the errors that are targeted to user-provided uses of `this'.
5392
5393         * statement.cs (Foreach): our variable is now stored as an
5394         Expression;  During resolution, follow the protocol, dont just
5395         assume it will return this.
5396
5397 2003-08-06  Martin Baulig  <martin@ximian.com>
5398
5399         * support.cs (SeekableStreamReader.cs): New public class.
5400
5401         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5402         SeekableStreamReader instead of the normal StreamReader.
5403
5404 2003-08-04  Martin Baulig  <martin@ximian.com>
5405
5406         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5407         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5408         deambiguate casts and delegate invocations.
5409         (parenthesized_expression): Use the new tokens to ensure this is
5410         not a cast of method invocation.
5411
5412         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5413         when reading a `)' and Deambiguate_CloseParens () was previously
5414         called.
5415
5416         * expression.cs (ParenthesizedExpression): New class.  This is
5417         just used for the CS0075 test.
5418         (Binary.DoResolve): Check for CS0075.   
5419
5420 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5421
5422         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5423         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5424         reference comparison.
5425
5426         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5427         examine the ReturnType for equality - this is necessary in the
5428         cases of implicit and explicit operators whose signature also
5429         includes the return type.
5430
5431 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5432
5433         * namespace.cs: Cache the result of the namespace computation,
5434         instead of computing it every time.
5435
5436 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5437
5438         * decl.cs: Use a global arraylist that we reuse over invocations
5439         to avoid excesive memory consumption.  Reduces memory usage on an
5440         mcs compile by one meg (45 average).
5441
5442         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5443         private, work around that.
5444
5445 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5446
5447         * literal.cs (IntLiteral): Define Zero and One static literals. 
5448
5449         * cs-parser.jay (integer_literal): use static literals to reduce
5450         memory usage for the most used literals (0, 1 and -1).  211kb
5451         reduced in memory usage.
5452
5453         Replace all calls to `new ArrayList' with `new
5454         ArrayList(4)' which is a good average number for most allocations,
5455         and also requires only 16 bytes of memory for its buffer by
5456         default. 
5457
5458         This reduced MCS memory usage in seven megabytes for the RSS after
5459         bootstrapping.
5460
5461 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5462
5463         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5464         handle params methods the correct way by forming only one
5465         applicable set with params and normal methods in them. Earlier we
5466         were looking at params methods only if we found no normal methods
5467         which was not the correct thing to do.
5468
5469         (Invocation.BetterFunction): Take separate arguments indicating
5470         when candidate and the best method are params methods in their
5471         expanded form.
5472
5473         This fixes bugs #43367 and #46199.
5474
5475         * attribute.cs: Documentation updates.
5476
5477         (CheckAttribute): Rename to CheckAttributeTarget.
5478         (GetValidPlaces): Rename to GetValidTargets.
5479
5480         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5481         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5482
5483         Fixes bug #44468.
5484
5485 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
5486
5487         * codegen.cs: Compute IsGeneric correctly.
5488
5489         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
5490         resolution. 
5491
5492         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
5493         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
5494         regressions, and I was chasing more bugs than I required.
5495
5496         * interface.cs: Use expressions for base type names (like classes
5497         and structs have been doing for a while now), and resolve that.
5498         This patch should probably go into head as well.
5499
5500         This makes it one less user of FindType.
5501
5502 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5503
5504         This compiler can not self host currently.  Need to fix that.
5505         
5506         * Makefile: compile to `gmcs.exe'
5507
5508         * driver.cs: Turn on v2 by default on gmcs.
5509
5510         * generic.cs (ConstructedType): Does no longer take a container
5511         type argument;  That will be taken care of later.
5512
5513         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
5514         Use SimpleName to resolve for now, so we can continue the work on
5515         the parser, until we get Type.GetType that understands generics.
5516
5517         (ConstructedType.ToString): Implement
5518
5519         (TypeArguments.Resolve): Resolve the child expressions as types. 
5520         
5521         * cs-parser.jay: Rename interface_constraints to
5522         type_parameter_constraints
5523
5524         (namespace_or_type_name): Only use constructed types for the basic
5525         construction, we will deal with identifier<...> later.
5526
5527         (type/type_name): No longer call DecomposeQI, as
5528         namespace_or_type_name is always decoded now.
5529         
5530 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5531
5532         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5533         closely: we eliminate methods in base types when we have an
5534         applicable method in a top-level type.
5535
5536         Please see section 14.5.5.1 for an exact description of what goes
5537         on. 
5538
5539         This fixes bug #45127 and a host of other related to corlib compilation.
5540
5541         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5542         array is the method corresponding to the top-level type (this is
5543         because of the changes made to icall.c) so we change this
5544         accordingly.
5545
5546         (MethodGroupExpr.Name): This too.
5547
5548         * typemanager.cs (GetElementType): New method which does the right
5549         thing when compiling corlib. 
5550
5551         * everywhere: Make use of the above in the relevant places.
5552
5553 2003-07-22  Martin Baulig  <martin@ximian.com>
5554
5555         * cs-parser.jay (invocation_expression): Moved
5556         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5557         `cast_expression', but create a InvocationOrCast which later
5558         resolves to either an Invocation or a Cast.
5559
5560         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5561         method; call this before EmitStatement() to make sure that this
5562         expression can be used as a statement.
5563
5564         * expression.cs (InvocationOrCast): New class; resolves to either
5565         an Invocation or a Cast.
5566
5567         * statement.cs (StatementExpression): Call ResolveStatement() on
5568         the ExpressionStatement before emitting it.
5569
5570 2003-07-21  Martin Baulig  <martin@ximian.com>
5571
5572         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5573         `ref' and `out' attributes match; fixes #46220.
5574         (MemberAccess.ResolveMemberAccess): You can't reference a type
5575         through an expression; fixes #33180.
5576         (Indexers.GetIndexersForType): Don't return the indexers from
5577         interfaces the class implements; fixes #46502.
5578
5579 2003-07-21  Martin Baulig  <martin@ximian.com>
5580
5581         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5582         CS0661 checks; fixes bug #30442.
5583
5584 2003-07-21  Martin Baulig  <martin@ximian.com>
5585
5586         * decl.cs (AdditionResult): Added `Error'.
5587
5588         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5589
5590         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
5591         cs0031.cs actually work.
5592
5593  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5594  
5595         * cs-parser.jay (namespace_name): do not use
5596         namespace_or_type_name, use qualified_identifier, because
5597         namespace_or_type_name will soon return a composed expression
5598         instead of a string.
5599  
5600         (namespace_or_type_name): Instead of returning a string, now this
5601         production returns an expression.
5602  
5603         * codegen.cs (EmitContext): Setup IsGeneric property based on
5604         whether our DeclSpace is generic, our the method is generic.
5605  
5606         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
5607         the method is generic.
5608  
5609         * cs-parser.jay (type_arguments, opt_type_argument_list,
5610         type_parameters, type_parameter_list, opt_type_parameter_list,
5611         type_parameter,, opt_type_parameter_constraints_clauses,
5612         type_parameter_constraints_clauses,
5613         type_parameter_constraint_clause, type_parameter_constraint,
5614         interface_constraints): Add new production
5615  
5616         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
5617         DeclSpace is generic or not.
5618  
5619         (DeclSpace.SetParameterInfo): New routine, used to set the
5620         parameter info for a type.
5621  
5622         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
5623         returns a GenericTypeExpr
5624  
5625         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
5626         generic, lookup the generic argument.
5627  
5628         * attribute.cs: Do not allow TypeParameterExpressions in
5629         Attributes.
5630  
5631         * class.cs: Do not allow the Main method to be defined in a
5632         Generic container.
5633  
5634         * expression.cs (SizeOf): Do not allow generic types to be used as
5635         arguments to sizeof.
5636  
5637         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
5638         it: whether a type is generic or not.  Only works for types we are
5639         currently building for now.
5640         
5641 2003-07-20  Martin Baulig  <martin@ximian.com>
5642
5643         * namespace.cs: Fixed that bug which caused a crash when compiling
5644         the debugger's GUI.
5645
5646 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5647
5648         * typemanager.cs (LookupTypeReflection): Never expose types which
5649         are NotPublic, NestedPrivate, NestedAssembly, or
5650         NestedFamANDAssem.  We used to return these, and later do a check
5651         that would report a meaningful error, but the problem is that we
5652         would not get the real match, if there was a name override.
5653
5654 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5655
5656         * namespace.cs (Namespace, Name): Do not compute the namespace
5657         name dynamically, compute it in the constructor.  This reduced
5658         memory usage by 1697 KB.
5659
5660         * driver.cs: Use --pause to pause at the end.
5661
5662 2003-07-17  Peter Williams  <peter@newton.cx>
5663
5664         * Makefile: Change the name of the test target so that it doesn't
5665         conflict with the recursive test target.
5666
5667 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5668
5669         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5670         AddressOf): Do not use EmitThis, that was wrong, use the actual
5671         this pointer.
5672
5673 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5674
5675         * class.cs (MethodData.Define): While checking if a method is an
5676         interface implementation, improve the test: If we are not public
5677         (use new test here: use the computed MethodAttributes directly,
5678         instead of the parsed modifier flags) check if the `implementing'
5679         method comes from an interface or not.
5680
5681         * pending.cs (VerifyPendingMethods): Slightly better error
5682         message.
5683
5684         * makefile: add test target that does the mcs bootstrap.
5685
5686 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5687
5688         * interface.cs (Define): Do nothing here since there are no
5689         members to populate etc. Move the attribute emission out of here
5690         since this was just totally the wrong place to put it. Attribute
5691         application happens during the 'Emit' phase, not in the 'Define'
5692         phase.
5693
5694         (Emit): Add this method and move the attribute emission here
5695
5696         * rootcontext.cs (EmitCode): Call the Emit method on interface
5697         types too.
5698
5699 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5700
5701         * expression.cs (OverloadResolve): Report error only if Location
5702         is not 'Null' which means that there was a probe going on.
5703
5704 2003-07-14  Martin Baulig  <martin@ximian.com>
5705
5706         * expression.cs (ConditionalLogicalOperator): New public class to
5707         implement user defined conditional logical operators.
5708         This is section 14.11.2 in the spec and bug #40505.
5709
5710 2003-07-14  Martin Baulig  <martin@ximian.com>
5711
5712         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5713
5714 2003-07-14  Martin Baulig  <martin@ximian.com>
5715
5716         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5717
5718         * ecore.cs (IVariable.VerifyFixed): New interface method.
5719
5720         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5721         operator, check whether the variable is actually fixed.  Fixes bug
5722         #36055.  Set a variable definitely assigned when taking its
5723         address as required by the spec.
5724
5725         * statement.cs (LocalInfo.IsFixed): New field.
5726         (LocalInfo.MakePinned): Set `IsFixed' to true.
5727
5728 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5729
5730         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5731         for .ctors, ensure that we only ask for members declared in the
5732         attribute type (BindingFlags.DeclaredOnly).
5733
5734         Fixes bug #43632.
5735
5736         * expression.cs (Error_WrongNumArguments): Report error 1501
5737         correctly the way CSC does.
5738
5739 2003-07-13  Martin Baulig  <martin@ximian.com>
5740
5741         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5742         lookup on the fully qualified name, to make things like "X.X" work
5743         where "X.X" is a fully qualified type name, but we also have a
5744         namespace "X" in the using list.  Fixes #41975.
5745
5746 2003-07-13  Martin Baulig  <martin@ximian.com>
5747
5748         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5749         function. If we're a CompoundAssign, we need to create an embedded
5750         CompoundAssign, not an embedded Assign.
5751         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5752         Fixes #45854.
5753
5754 2003-07-13  Martin Baulig  <martin@ximian.com>
5755
5756         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5757         work to fix bug #46088.
5758
5759 2003-07-13  Ravi Pratap <ravi@ximian.com>
5760
5761         * class.cs (Operator.Emit): Do not emit attributes here - it is
5762         taken care of by the Method class that we delegate too. This takes
5763         care of bug #45876.
5764
5765 2003-07-10  Martin Baulig  <martin@ximian.com>
5766
5767         * expression.cs (TypeOfVoid): New class.
5768         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5769
5770 2003-07-10  Martin Baulig  <martin@ximian.com>
5771
5772         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5773         bug #35957.
5774
5775 2003-07-10  Martin Baulig  <martin@ximian.com>
5776
5777         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5778         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5779
5780         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5781
5782         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5783
5784 2003-07-10  Martin Baulig  <martin@ximian.com>
5785
5786         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5787         of decimal.  Fixes #42850.
5788
5789         NOTE: I also fixed the created byte blob, but this doesn't work on
5790         the MS runtime and csc never produces any byte blobs for decimal
5791         arrays.
5792
5793 2003-07-10  Martin Baulig  <martin@ximian.com>
5794
5795         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5796         structs; fixes #32068.
5797         (Block.AddChildVariableNames): Fixed #44302.
5798
5799 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5800
5801         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5802
5803 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5804
5805         * attribute.cs: And this test is onger needed.
5806
5807 2003-07-08  Martin Baulig  <martin@ximian.com>
5808
5809         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5810         inaccessible types.  Fixes #36313.
5811
5812         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5813
5814         * namespace.cs (NamespaceEntry): Create implicit entries for all
5815         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5816         implicit entries for N1.N2 and N1.
5817
5818 2003-07-08  Martin Baulig  <martin@ximian.com>
5819
5820         Rewrote the handling of namespaces to fix a lot of the issues
5821         wrt. `using' aliases etc.
5822
5823         * namespace.cs (Namespace): Splitted this class into a
5824         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5825
5826         * typemanager.cs (TypeManager.IsNamespace): Removed.
5827         (TypeManager.ComputeNamespaces): Only compute namespaces from
5828         loaded assemblies here, not the namespaces from the assembly we're
5829         currently compiling.
5830
5831 2003-07-08  Martin Baulig  <martin@ximian.com>
5832
5833         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
5834
5835 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5836
5837         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
5838         already fixed it.  
5839
5840         I thought about the memory savings here, but LookupTypeReflection
5841         is used under already very constrained scenarios.  Compiling
5842         corlib or mcs only exposes one hit, so it would not really reduce
5843         any memory consumption.
5844
5845 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5846
5847         * typemanager.cs: fixes bug #45889 by only adding public types from
5848         other assemblies to the list of known types.
5849
5850 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5851
5852         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
5853         on the type we resolved.
5854
5855 2003-07-05  Martin Baulig  <martin@ximian.com>
5856
5857         * pending.cs (PendingImplementation.ParentImplements): Don't
5858         create the proxy if the parent is abstract.
5859
5860         * class.cs (TypeContainer.DefineIndexers): Process explicit
5861         interface implementations first.  Fixes #37714.
5862
5863 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5864
5865         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5866         defined recursively;  but since we modify the input parameters
5867         (left is set to `this' temporarily), we reset this value if the
5868         left_is_explicit is false, which gives the original semantics to
5869         the code.  
5870
5871         * literal.cs (NullPointer): new class used to represent a null
5872         literal in a pointer context.
5873
5874         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5875         type is a pointer, use a NullPointer object instead of a
5876         NullLiteral.   Closes 43687
5877
5878         (ExplicitConversion): Convert pointer values using
5879         the conv opcode to the proper type.
5880
5881         * ecore.cs (New): change ValueTypeVariable property into a method,
5882         that returns whether the valuetype is suitable for being used.
5883
5884         * expression.cs (Binary.DoNumericPromotions): Only return if we
5885         the int constant was a valid uint, and we can return both left and
5886         right as uints.  If not, we continue processing, to trigger the
5887         type conversion.  This fixes 39018.
5888
5889         * statement.cs (Block.EmitMeta): During constant resolution, set
5890         the CurrentBlock property on the emitcontext, so that we resolve
5891         constants propertly.
5892
5893 2003-07-02  Martin Baulig  <martin@ximian.com>
5894
5895         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5896         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5897
5898         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5899         than emitting it here.
5900
5901         * statement.cs: Fixed some more flow analysis bugs.
5902
5903 2003-07-02  Martin Baulig  <martin@ximian.com>
5904
5905         * class.cs (MethodData.Define): When implementing interface
5906         methods, set Final unless we're Virtual.
5907
5908         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5909         check work for interface methods.
5910
5911 2003-07-01  Martin Baulig  <martin@ximian.com>
5912
5913         * ecore.cs (EmitContext.This): Replaced this property with a
5914         GetThis() method which takes a Location argument.  This ensures
5915         that we get the correct error location for a CS0188.
5916
5917 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5918
5919         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5920         ImplicitStandardConversion.
5921
5922         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5923
5924 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5925
5926         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5927         optimization.
5928
5929 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5930
5931         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5932         constructors.
5933
5934         (MethodData.Define): Turn off initlocals for unsafe methods.
5935
5936 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5937
5938         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5939         complete;  Fixes #37521.
5940
5941         * delegate.cs: Use Modifiers.TypeAttr to compute the
5942         TypeAttributes, instead of rolling our own.  This makes the flags
5943         correct for the delegates.
5944
5945 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5946
5947         * class.cs (Constructor.Define): Set the private flag for static
5948         constructors as well.
5949
5950         * cs-parser.jay (statement_expression): Set the return value to
5951         null, to avoid a crash when we catch an error.
5952
5953 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5954
5955         * cs-parser.jay: Applied patch from Jackson that adds support for
5956         extern and unsafe modifiers to destructor declarations.
5957
5958         * expression.cs: Report error 21 if the user is trying to index a
5959         System.Array.
5960
5961         * driver.cs: Add an error message, suggested by the bug report.
5962
5963         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5964         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5965
5966 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5967
5968         * namespace.cs: Add some information to reduce FAQs.
5969
5970 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5971
5972         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5973         underlying enumeration types.  Fixes #43915.
5974
5975         * expression.cs: Treat ushort/short as legal values to be used in
5976         bitwise operations.
5977
5978 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5979
5980         * delegate.cs: transfer custom attributes for paramenters from
5981         the delegate declaration to Invoke and BeginInvoke.
5982
5983 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5984
5985         * attribute.cs: handle custom marshalers and emit marshal info
5986         for fields, too.
5987
5988 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5989
5990         * makefile.gnu: Added anonymous.cs to the compiler sources.
5991
5992 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
5993
5994         * iterators.cs: Change the name of the proxy class to include two
5995         underscores.
5996
5997         * cs-parser.jay: Update grammar to include anonymous methods.
5998
5999         * anonymous.cs: new file.
6000
6001 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6002
6003         * class.cs (Field.Define): Add missing test for pointers and
6004         safety. 
6005
6006 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6007
6008         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6009         we use the stobj opcode.
6010
6011         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6012         since it wasn't the correct fix. 
6013
6014         It still is puzzling that we are required to use stobj for IntPtr
6015         which seems to be a ValueType.
6016
6017 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6018
6019         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6020         during regular simple name resolution.   Now, the trick is that
6021         instead of returning for processing the simplename, we do a
6022         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6023         contextual lookup type).   If a match is found, return that, if
6024         not, return for further composition.
6025
6026         This fixes long-standing 30485.
6027
6028         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6029         using the address to initialize an object, do an Stobj instead of
6030         using the regular Stelem.
6031
6032         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6033         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6034         Because if we are a BaseIndexerAccess that value will be true.
6035         Fixes 43643.
6036
6037         * statement.cs (GotoCase.Resolve): Return after reporting an
6038         error, do not attempt to continue. 
6039
6040         * expression.cs (PointerArithmetic.Emit): If our operand is a
6041         long, convert our constants to match the operand before
6042         multiplying.  Convert to I type before adding.   Fixes 43670.
6043
6044 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6045
6046         * enum.cs (ImplicitConversionExists) : Rename to
6047         ImplicitEnumConversionExists to remove ambiguity. 
6048
6049         * ecore.cs (NullCast): New type of cast expression class which
6050         basically is very similar to EmptyCast with the difference being
6051         it still is a constant since it is used only to cast a null to
6052         something else
6053         (eg. (string) null)
6054
6055         * convert.cs (ImplicitReferenceConversion): When casting a null
6056         literal, we return a NullCast.
6057
6058         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6059         should be around anymore.
6060
6061         The renaming (reported was slightly wrong). Corrections:
6062
6063         ConvertImplicitStandard -> ImplicitConversionStandard
6064         ConvertExplicitStandard -> ExplicitConversionStandard
6065
6066         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6067         before passing them in !
6068
6069         * convert.cs (ImplicitConversionStandard): When comparing for
6070         equal expr and target types, ensure that expr is not a
6071         NullLiteral.
6072
6073         In general, we must not be checking (expr_type ==
6074         target_type) in the top level conversion methods
6075         (ImplicitConversion, ExplicitConversion etc). This checking is
6076         done in the methods that they delegate to.
6077
6078 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6079
6080         * convert.cs: Move Error_CannotConvertType,
6081         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6082         ImplicitNumericConversion, ImplicitConversionExists,
6083         ImplicitUserConversionExists, StandardConversionExists,
6084         FindMostEncompassedType, FindMostSpecificSource,
6085         FindMostSpecificTarget, ImplicitUserConversion,
6086         ExplicitUserConversion, GetConversionOperators,
6087         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6088         TryImplicitIntConversion, Error_CannotConvertImplicit,
6089         ConvertImplicitRequired, ConvertNumericExplicit,
6090         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6091         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6092         its own file.
6093
6094         Perform the following renames:
6095
6096         StandardConversionExists -> ImplicitStandardConversionExists
6097         ConvertImplicit -> ImplicitConversion
6098         ConvertImplicitStandard -> ImplicitStandardConversion
6099         TryImplicitIntConversion -> ImplicitIntConversion
6100         ConvertImplicitRequired -> ImplicitConversionRequired
6101         ConvertNumericExplicit -> ExplicitNumericConversion
6102         ConvertReferenceExplicit -> ExplicitReferenceConversion
6103         ConvertExplicit -> ExplicitConversion
6104         ConvertExplicitStandard -> ExplicitStandardConversion
6105
6106 2003-05-19  Martin Baulig  <martin@ximian.com>
6107
6108         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6109         (TypeInfo): Added support for structs having structs as fields.
6110
6111         * ecore.cs (FieldExpr): Implement IVariable.
6112         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6113         VariableInfo for the field.
6114
6115 2003-05-18  Martin Baulig  <martin@ximian.com>
6116
6117         * expression.cs (This.DoResolve): Report a CS0027 if we're
6118         emitting a field initializer.
6119
6120 2003-05-18  Martin Baulig  <martin@ximian.com>
6121
6122         * expression.cs (This.ResolveBase): New public function.
6123         (This.DoResolve): Check for CS0188.
6124
6125         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6126         This.Resolve().
6127
6128         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6129         `instance_expression' to null if we don't have any non-static
6130         methods.
6131
6132 2003-05-18  Martin Baulig  <martin@ximian.com>
6133
6134         Reworked the way how local variables and parameters are handled by
6135         the flow analysis code.
6136
6137         * statement.cs (TypeInfo, VariableMap): New public classes.
6138         (VariableInfo): New public class.  This is now responsible for
6139         checking whether a variable has been assigned.  It is used for
6140         parameters and local variables.
6141         (Block.EmitMeta): Take the InternalParameters as argument; compute
6142         the layout of the flow vectors here.
6143         (Block.LocalMap, Block.ParameterMap): New public properties.
6144         (FlowBranching): The .ctor doesn't get the InternalParameters
6145         anymore since Block.EmitMeta() now computes the layout of the flow
6146         vector.
6147         (MyStructInfo): This class is now known as `StructInfo' and nested
6148         in `TypeInfo'; we don't access this directly anymore.
6149
6150         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6151         property and removed IsAssigned(), IsFieldAssigned(),
6152         SetAssigned() and SetFieldAssigned(); we now call them on the
6153         VariableInfo so we don't need to duplicate this code everywhere.
6154
6155         * expression.cs (ParameterReference): Added `Block block' argument
6156         to the .ctor.
6157         (LocalVariableReference, ParameterReference, This): The new
6158         VariableInfo class is now responsible for all the definite
6159         assignment stuff.
6160
6161         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6162         IsParameterAssigned, SetParameterAssigned): Removed.
6163
6164 2003-05-18  Martin Baulig  <martin@ximian.com>
6165
6166         * typemanager.cs (InitCoreTypes): Try calling
6167         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6168         the 3-args-version.  Corlib now also needs our `void_type'.
6169         (GetMethod): Added overloaded version which takes an optional
6170         `bool report_errors' to allow lookups of optional methods.
6171
6172 2003-05-12  Martin Baulig  <martin@ximian.com>
6173
6174         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6175         only used for locals and not for parameters.
6176
6177 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6178
6179         * support.cs (InternalParameters.ParameterType): Return the
6180         ExternalType of the parameter.
6181
6182         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6183         they were unused.
6184
6185 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6186
6187         * class.cs (MethodData.Define): Do not set the `newslot' on
6188         interface members, if they are also flagged as "override".
6189
6190         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6191         better code for ++i and i++.  This only works for static fields
6192         and local variables.
6193
6194         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6195         want to pull the DeclSpace out of the builder_to_declspace instead
6196         of the TypeBuilder (like in TypeContainer.FindMembers).
6197
6198         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6199         instead of LookupTypeContainer.  Fixes the crash on .NET for
6200         looking up interface members.
6201
6202         * const.cs: Create our own emit context during the Definition
6203         stage, so that constants are evaluated in the proper context, when
6204         a recursive definition happens.
6205
6206 2003-05-11  Martin Baulig  <martin@ximian.com>
6207
6208         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6209         new block for a switch section.
6210         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6211         the adding/lookup in the switch block.  Fixes #39828.
6212
6213 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6214
6215         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6216         functionality: I needed to convert the data after I had performed
6217         the add/sub operation into the operands type size.
6218
6219         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6220         pass the type for the box operation, otherwise the resulting
6221         object would have been of type object.
6222
6223         (BoxedCast): Add constructor to specify the type to box as.
6224
6225 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6226
6227         * iterators.cs: I was reusing the `count' variable inadvertently,
6228         take steps to not allow this to happen.
6229
6230 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6231
6232         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6233         by creating an array at the point where the params starts and
6234         putting all those arguments there, then adjusting the size of the
6235         array.
6236
6237 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6238
6239         * expression.cs (New.AddressOf): Implement interface
6240         IMemoryLocation.  This is used when the `new' operator is used in
6241         the context of an invocation to a method on a value type.
6242
6243         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6244         example. 
6245
6246         * namespace.cs: Also check the using aliases here.
6247
6248         * driver.cs: Move the test for using validity after the types have
6249         been entered, so we do a single pass that also includes the using
6250         aliases. 
6251
6252         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6253         in the regular case.   CreateSiblingForFinally is doing extra
6254         error checking.
6255
6256         * attribute.cs (GetAttributeArgumentExpression): Store the result
6257         on an out value, and use the return value to indicate failure
6258         instead of using null (which is a valid return for Constant.GetValue).
6259
6260         * statement.cs: Perform the analysis flow for the increment
6261         portion after the statement, because this will be the real flow of
6262         execution.  Fixes #42385
6263
6264         * codegen.cs (EmitContext.EmitArgument,
6265         EmitContext.EmitStoreArgument): New helper functions when the
6266         RemapToProxy flag is set.
6267
6268         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6269         function.
6270
6271         Add support for remapping parameters. 
6272
6273         * iterators.cs: Propagate parameter values;  Store parameter
6274         values in the proxy classes.
6275
6276 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6277
6278         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6279         need a proxy reference;  I do not know what I was thinking
6280
6281         * cs-parser.jay (constructor_initializer): catch another error,
6282         and display nice message.
6283
6284         (field_declaration): catch void field declaration
6285         to flag a better error. 
6286
6287         * class.cs (MemberBase.CheckBase): Report an error instead of a
6288         warning if a new protected member is declared in a struct. 
6289         (Field.Define): catch the error of readonly/volatile.
6290
6291         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6292
6293         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6294         volatile variable is taken
6295
6296 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6297
6298         * statement.cs (Fixed.Resolve): Report an error if we are not in
6299         an unsafe context.
6300
6301 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6302
6303         * typemanager.cs: reuse the code that handles type clashes for
6304         delegates and enumerations.
6305
6306         * class.cs (Report28): Always report.
6307
6308         * expression.cs (EncodeAsAttribute): Allow nulls here.
6309
6310 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6311
6312         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6313         the functionality for testing whether an expression is valid for
6314         an attribute here.  Also handle the case of arrays of elements
6315         being stored. 
6316
6317         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6318         encoding a linear array into an array of objects that are suitable
6319         to be passed to an CustomAttributeBuilder.
6320
6321         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6322
6323         * ecore.cs: (FieldExpr): Handle field remapping here.
6324
6325         * iteratators.cs: Pass the instance variable (if the method is an
6326         instance method) to the constructors, so we can access the field
6327         variables on the class.
6328
6329         TODO: Test this with structs.  I think the THIS variable on
6330         structs might have to be a pointer, and not a refenrece
6331
6332 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6333
6334         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6335         local variables to fields in a proxy class.
6336
6337         * iterators.cs (PopulateProxy): Rename our internal fields to
6338         <XXX>.  
6339         Create a <THIS> field if we are an instance method, so we can
6340         reference our parent container variables.
6341         (MapVariable): Called back from the EmitContext code to enter a
6342         new variable to field mapping into the proxy class (we just create
6343         a FieldBuilder).
6344
6345         * expression.cs
6346         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6347         for using the remapped locals to fields.
6348
6349         I placed the code here, because that gives the same semantics to
6350         local variables, and only changes the Emit code.
6351
6352         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6353         statements inside iterators.
6354         (VariableInfo): Add a FieldBuilder for the cases when we are
6355         remapping local variables to fields in a proxy class
6356
6357         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6358         current_block != null.
6359
6360         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6361         not cope with strings, as it has been moved to the
6362         TableSwitchEmit.  Fixed bug in switch generation.
6363
6364         * expression.cs (New.DoResolve): Provide more context for the user
6365         when reporting an error.
6366
6367         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6368         pointers. 
6369
6370         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6371         check the permissions for it.  Note than in a type-resolution
6372         context the check was already present in DeclSpace.ResolveType,
6373         but was missing from the MemberAccess.
6374
6375         (ArrayCreation.CheckIndices): warn if the user has
6376         more nested levels of expressions, but there are no more
6377         dimensions specified.  Avoids crash on bug 41906.
6378
6379 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6380
6381         * statement.cs (Block): replace Implicit bool, for a generic
6382         flags.   
6383         New flag: `Unchecked'.  This is used during the EmitMeta phase
6384         (which is out-of-line with the regular Resolve/Emit process for a
6385         statement, as this is done ahead of time, but still gets a chance
6386         to call constant resolve).
6387
6388         (Block.Flags): new enum for adding a new flag.
6389
6390         (Block.EmitMeta): track the state of unchecked.
6391
6392         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6393         to enable constant resolution to work there as well.
6394
6395 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6396
6397         * typemanager.cs (ienumerable_type): Also look up
6398         System.Collections.IEnumerable. 
6399
6400 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6401
6402         TODO: Test more than one conditional per method.
6403
6404         * class.cs (Indexer.Define): Report the location where the user is
6405         referencing the unsupported feature.
6406
6407         (MethodData): Overload the use of `conditionals' to
6408         minimize the creation of needless ArrayLists.   This saves roughly
6409         212kb on my machine.
6410
6411         (Method): Implement the new IIteratorContainer interface.
6412         (Method.SetYields): Implement the method by setting the ModFlags
6413         to contain METHOD_YIELDS.
6414
6415         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6416         which just got set to null.
6417
6418         * iterators.cs: New file.
6419
6420         (Yield, YieldBreak): New statements.
6421
6422         * statement.cs (Return.Resolve): Flag an error if we are used in
6423         an iterator method.
6424
6425         * codegen.cs (InIterator): New flag set if the code is being
6426         compiled in an iterator method.
6427
6428         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6429         internal modifier, and we just use it to avoid adding extra
6430         fields, as this is seldom used.  
6431
6432         * cs-parser.jay: Add yield_statement (yield and yield break).
6433
6434         * driver.cs: New flag -v2 to turn on version 2 features. 
6435
6436         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6437         hashtable when v2 is enabled.
6438
6439 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6440
6441         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6442         there is already a namespace defined with this name.
6443
6444         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6445         people upgraded their corlibs.
6446
6447         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6448         always use fully qualified types, no need to use the compiler
6449         front end.
6450
6451         (TypeManager.IsNamespace): Use binarysearch.
6452
6453         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6454         AddDelegate): I did not quite use the new IsValid API properly: I
6455         have to pass the short-name and the fullname.  I was passing only
6456         the basename instead of the fullname sometimes. 
6457
6458         (TypeContainer.DefineType): call NamespaceClash.
6459
6460         * interface.cs (Interface.DefineType): use NamespaceClash before
6461         defining the type.
6462
6463         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6464         defining the type.
6465
6466         * enum.cs: (Enum.DefineType): use NamespaceClash before
6467         defining the type.
6468
6469         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6470         speed increase.  First, use the negative_hits cache when we get a
6471         negative.  Second, add the type with its full original name
6472         instead of the new . and + encoded name (reflection uses + to
6473         separate type from a nested type).  Use LookupTypeReflection
6474         directly which bypasses the type->name hashtable (that we already
6475         know does not contain the type.
6476
6477         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6478         location/container type. 
6479
6480         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6481
6482 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6483
6484         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6485
6486         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6487         method is being referenced in the method group from a static
6488         context, and report error 120 if so.
6489
6490         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6491         Error118. 
6492
6493         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6494         is created, we create the A namespace).
6495
6496         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6497         Fixes #41591
6498
6499 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6500
6501         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6502         invocation to ModuleBuilder.GetType with the same values will
6503         return a new type instance, so we need to cache its return
6504         values. 
6505
6506         * expression.cs (Binary.ResolveOperator): Only allow the compare
6507         operators on enums if they are of the same type.
6508
6509         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6510         types of ValueType on their own case.  Before we were giving them
6511         the same treatment as objects.
6512
6513         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6514         fullname.  Short name is used to compare against container name.
6515         Fullname is used to check against defined namespace names.
6516
6517         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6518         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6519
6520         (Method.CheckBase): Call parent.
6521         (MemberBase.CheckBase): Check for protected members on sealed
6522         classes.
6523         (PropertyBase.CheckBase): Call parent.
6524         (Field.Define): Call parent.
6525
6526         * report.cs: Negative error codes are now mapped to 8000 - code,
6527         so that the display is render more nicely.
6528
6529         * typemanager.cs: Do not use try/catch, instead report a regular
6530         error. 
6531
6532         (GetPointerType, GetReferenceType): These methods provide
6533         mechanisms to obtain the T* and T& from a T.  We had the code
6534         previously scattered around the code base, and it also used
6535         TypeManager.LookupType that would go through plenty of caches.
6536         This one goes directly to the type source.
6537
6538         In some places we did the Type.GetType followed by
6539         ModuleBuilder.GetType, but not in others, so this unifies the
6540         processing as well.
6541
6542         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6543         statements now that we have namespace information.
6544
6545         * typemanager.cs (IsNamespace): New method, returns whether the
6546         string presented is a namespace or not.
6547
6548         (ComputeNamespaces): New public entry point, computes the list of
6549         available namespaces, using the GetNamespaces API call in Mono, or
6550         the slower version in MS.NET.   
6551
6552         Now before we start the semantic analysis phase, we have a
6553         complete list of namespaces including everything that the user has
6554         provided.
6555
6556         Deleted old code to cache namespaces in .nsc files.
6557
6558 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6559
6560         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6561         class/struct location definition Location for the implicit
6562         constructor location.
6563
6564         (Operator.Define): Use the location of the operator for the
6565         implicit Method definition.
6566
6567         (Constructor.Emit): use the constructor location for the implicit
6568         base initializer constructor.
6569
6570         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6571         and the Expression class now contains two new methods:
6572
6573         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6574         isolate type lookup from the rest of the resolution process.
6575
6576         Since we use Expressions to hold type definitions due to the way
6577         we parse the input we have historically overloaded Resolve to
6578         perform the Type lookups if a special flag is passed.  Now this is
6579         eliminated and two methods take their place. 
6580
6581         The differences in the two methods between xStep and xTerminal is
6582         that xStep is involved in our current lookup system that uses
6583         SimpleNames to compose a name, while xTerminal is used just to
6584         catch the case where the simplename lookup failed.
6585
6586 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6587
6588         * expression.cs (ResolveMemberAccess): Remove redundant code.
6589         TypeExpr expressions are always born fully resolved.
6590
6591         * interface.cs (PopulateMethod): Do not lookup the types twice.
6592         We were doing it once during SemanticAnalysis and once during
6593         PopulateMethod.
6594
6595         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6596         in local variable type definitions, were being returned as a
6597         SimpleName (we decomposed everything into a string), that is
6598         because primary_expression was being used instead of a type in the
6599         grammar (reduce/reduce conflicts).
6600
6601         The part that was wrong is that we converted the expression into a
6602         string (an oversimplification in one hand, compounded with primary
6603         expressions doing string concatenation).
6604
6605         So things like:
6606
6607         A.B.C [] x;
6608
6609         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6610         using clauses from working on this particular context.  And a type
6611         was being matched directly against "A.B.C[]".
6612
6613         We now use the correct approach, and allow for ComposedCast to be
6614         part of the unary expression.  So the "A.B.C []" become a composed
6615         cast of "A.B.C" (as a nested group of MemberAccess with a
6616         SimpleName at the end) plus the rank composition "[]". 
6617
6618         Also fixes 35567
6619
6620 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6621
6622         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6623         for the access level checking.
6624
6625         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6626         `TypeContainer container', because I kept getting confused when I
6627         was debugging this code.
6628
6629         * expression.cs (Indexers): Instead of tracking getters/setters,
6630         we now track them in parallel.  We create one arraylist less, but
6631         most importantly it is possible now for the LValue code to find a
6632         matching get for a set.
6633
6634         (IndexerAccess.DoResolveLValue): Update the code.
6635         GetIndexersForType has been modified already to extract all the
6636         indexers from a type.  The code assumed it did not.
6637
6638         Also make the code set the correct return type for the indexer.
6639         This was fixed a long time ago for properties, but was missing for
6640         indexers.  It used to be void_type.
6641
6642         (Binary.Emit): Test first for doubles instead of
6643         floats, as they are more common.
6644
6645         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6646         when dealing with floats and the <=, >= operators.  This fixes bug
6647         #39314 
6648
6649         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6650         to load the array value by emitting a load on the foreach variable
6651         type.  This was incorrect.  
6652
6653         We now emit the code to load an element using the the array
6654         variable type, and then we emit the conversion operator.
6655
6656         Fixed #40176
6657
6658 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6659
6660         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6661
6662 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6663
6664         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6665         test for protection before we test for signatures. 
6666
6667         (MethodSignature.ToString): implement.
6668
6669         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6670         to the case where we reduced into a LongConstant.
6671
6672         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6673         depend on whether the information is acurrate, because the
6674         Microsoft runtime will always claim that the array type is public,
6675         regardless of the real state.
6676
6677         If the type is a pointer, another problem happens: the type is
6678         reported as non-public in Microsoft.  
6679
6680         In both cases we have to call CheckAccessLevel recursively with
6681         the underlying type as the argument to be tested.
6682
6683 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6684
6685         * assign.cs (Assign.Emit): If we are dealing with a compound
6686         assignment expression, we should use the code path that stores the
6687         intermediate result in a temporary value.  This fixes #40903.
6688
6689         *expression.cs (Indirection.ToString): Provide ToString method for
6690         debugging. 
6691
6692 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6693
6694         * class.cs: Null out fields holding references to Block objects so
6695         they can be garbage collected.
6696
6697         * expression.cs (OverloadResolve): Remove unused local.
6698
6699 2003-04-07  Martin Baulig  <martin@ximian.com>
6700
6701         * codegen.cs (EmitContext.CurrentFile): New public field.
6702         (EmitContext.Mark): Use the CurrentFile to check whether the
6703         location is in the correct file.
6704         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6705
6706 2003-04-07  Martin Baulig  <martin@ximian.com>
6707
6708         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6709
6710         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6711         location.  [FIXME: The location argument which gets passed to this
6712         method is sometimes wrong!]
6713
6714 2003-04-07  Nick Drochak <ndrochak@gol.com>
6715
6716         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6717
6718 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6719
6720         * expression.cs (Indirection.EmitAssign): We were using the
6721         temporary, but returning immediately instead of continuing the
6722         EmitAssing flow.
6723
6724 2003-04-06  Martin Baulig  <martin@ximian.com>
6725
6726         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6727         if it's a nested child, but also deriving from the outer class.
6728         See test 190.cs.
6729
6730         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6731         nested child, but also deriving from the outer class.  See
6732         test-190.cs.
6733         (FilterWithClosure): We may access private members of the outer
6734         class if we're a nested child and deriving from the outer class.
6735         (RealMemberLookup): Only set `closure_private_ok' if the
6736         `original_bf' contained BindingFlags.NonPublic.
6737
6738 2003-04-05  Martin Baulig  <martin@ximian.com>
6739
6740         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
6741         probe if its a type parameter, and if so, flag an error.
6742
6743         * decl.cs: Move here the SetParameterInfo code from class.cs.
6744         Handle IsGeneric here.
6745
6746         Handle a variety of errors in the parameter info definition.
6747
6748         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
6749         type parameters here.
6750
6751         * cs-parser.jay (class_declaration): report errors for parameters
6752         here as well.
6753
6754 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
6755
6756         * generic.cs: New file, contains support code for generics.
6757
6758         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
6759         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
6760
6761         Update parser for the above removals.
6762
6763         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
6764         now taken care of in the parser.
6765
6766 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6767
6768         * class.cs (Event.Define): Do not allow abstract events to have
6769         initializers. 
6770
6771 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6772
6773         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6774         block in event declarations.
6775
6776         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6777         value type, get its address.
6778
6779         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6780         leaving a class on the stack instead of a boolean value (int
6781         0/1).  Change the code so we compare against null, and then the
6782         result against zero.
6783
6784         * class.cs (TypeContainer.GetClassBases): We were checking for the
6785         parent class being sealed too late.
6786
6787         * expression.cs (Binary.Emit): For <= and >= when dealing with
6788         floating point values, use cgt.un and clt.un instead of cgt and
6789         clt alone.
6790
6791 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6792
6793         * statement.cs: Apply the same optimization as MS: skip the 
6794         GetEnumerator returning an IEnumerator, and use the one returning a 
6795         CharEnumerator instead. This allows us to avoid the try-finally block 
6796         and the boxing.
6797
6798 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6799
6800         * cs-parser.jay: Attributes cannot be applied to
6801                          namespaces. Fixes #40473
6802
6803 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6804
6805         * class.cs:
6806         (Add*): check if the name is valid using the full name for constants,
6807         fields, properties and events.
6808
6809 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6810
6811         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6812         char constants to be part of the enumeration.
6813
6814         * expression.cs (Conditional.DoResolve): Add support for operator
6815         true. Implements the missing functionality from 14.12
6816
6817         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6818         operator true/false as required by the spec.
6819
6820         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6821         implicit conversion to boolean.
6822
6823         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6824         also one where the type implements `operator true'. 
6825
6826         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6827         get an expression that will invoke operator true based on an
6828         expression.  
6829
6830         (GetConversionOperators): Removed the hack that called op_True
6831         here.  
6832
6833         (Expression.ResolveBoolean): Move this from Statement.
6834
6835 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6836
6837         * ecore.cs (FieldExpr): do not allow initialization of initonly
6838         fields on derived classes
6839
6840 2003-03-13  Martin Baulig  <martin@ximian.com>
6841
6842         * statement.cs (Block.Emit): Call ig.BeginScope() and
6843         ig.EndScope() when compiling with debugging info; call
6844         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6845
6846 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6847
6848         * expression.cs (Indexers): Do not construct immediately, allow
6849         for new members to be appended as we go.  Fixes 38143
6850
6851 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6852
6853         * expression.cs: save/restore context when resolving an unchecked
6854         expression.
6855
6856 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6857
6858         * cfold.cs: Catch division by zero in modulus operator during
6859         constant folding.
6860
6861 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
6862
6863         * interface.cs (Interface.DefineMembers): Avoid defining members
6864         twice. 
6865
6866 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
6867
6868         * driver.cs: handle the +/- options for -noconfig
6869
6870         * statement.cs (Unckeched.Resolve): Also track the state of
6871         unchecked in the Resolve phase.
6872
6873 2003-02-27  Martin Baulig  <martin@ximian.com>
6874
6875         * ecore.cs (Expression.MemberLookup): Don't create a
6876         MethodGroupExpr for something which is not a method.  Fixes #38291.
6877
6878 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6879
6880         * class.cs (MemberBase.CheckParameters): Also check that the type
6881         is unmanaged if it is a pointer.
6882
6883         * expression.cs (SizeOf.Resolve): Add location information.
6884
6885         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6886         a managed type is declared.
6887
6888         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6889         parameter modifiers as well.  Fixes bug 38606
6890
6891         * class.cs: Very sad.  Am backing out the speed up changes
6892         introduced by the ArrayList -> Array in the TypeContainer, as they
6893         were not actually that much faster, and introduced a bug (no error
6894         reports on duplicated methods).
6895
6896         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6897         source first, this will guarantee that we have a valid expression
6898         before calling in lower levels functions that will require a
6899         resolved object.  Then use this original_source in the
6900         target.ResolveLValue instead of the original source that was
6901         passed to us.
6902
6903         Another change.  Use target.Resolve instead of LValueResolve.
6904         Although we are resolving for LValues, we will let the Assign code
6905         take care of that (it will be called again from Resolve).  This
6906         basically allows code like this:
6907
6908         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6909         class Y { void A (X x) { x [0] += o; }
6910
6911         The problem was that the indexer was trying to resolve for
6912         set_Item (idx, object o) and never finding one.  The real set_Item
6913         was set_Item (idx, X).  By delaying the process we get the right
6914         semantics. 
6915
6916         Fixes bug 36505
6917
6918 2003-02-23  Martin Baulig  <martin@ximian.com>
6919
6920         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6921         while calling DoEmit ().
6922
6923         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6924         source files; if you use the #line directive inside a method, the
6925         compiler stops emitting line numbers for the debugger until it
6926         reaches the end of the method or another #line directive which
6927         restores the original file.
6928
6929 2003-02-23  Martin Baulig  <martin@ximian.com>
6930
6931         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6932
6933 2003-02-23  Martin Baulig  <martin@ximian.com>
6934
6935         * statement.cs (Block.AddChildVariableNames): We need to call this
6936         recursively, not just for our immediate children.
6937
6938 2003-02-23  Martin Baulig  <martin@ximian.com>
6939
6940         * class.cs (Event.Define): Always make the field private, like csc does.
6941
6942         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6943         actually work, fixes bug #37521.
6944
6945 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6946
6947         * delegate.cs: When creating the various temporary "Parameters"
6948         classes, make sure that we call the ComputeAndDefineParameterTypes
6949         on those new parameters (just like we do with the formal ones), to
6950         allow them to be resolved in the context of the DeclSpace.
6951
6952         This fixes the bug that Dick observed in Bugzilla #38530.
6953
6954 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6955
6956         * expression.cs (ResolveMemberAccess): When resolving a constant,
6957         do not attempt to pull a constant if the value was not able to
6958         generate a valid constant.
6959
6960         * const.cs (LookupConstantValue): Do not report more errors than required.
6961
6962 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6963
6964         * expression.cs: fixes bug #38328.
6965
6966 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6967
6968         * class.cs: Changed all the various members that can be part of a
6969         class from being an ArrayList to be an Array of the right type.
6970         During the DefineType type_list, interface_list, delegate_list and
6971         enum_list are turned into types, interfaces, delegates and enums
6972         arrays.  
6973
6974         And during the member population, indexer_list, event_list,
6975         constant_list, field_list, instance_constructor_list, method_list,
6976         operator_list and property_list are turned into their real arrays.
6977
6978         Although we could probably perform this operation earlier, for
6979         good error reporting we need to keep the lists and remove the
6980         lists for longer than required.
6981
6982         This optimization was triggered by Paolo profiling the compiler
6983         speed on the output of `gen-sample-program.pl' perl script. 
6984
6985         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6986         not crash in methods like MemberLookupFailed that use this field.  
6987
6988         This problem arises when the compiler fails to resolve a type
6989         during interface type definition for example.
6990
6991 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6992
6993         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
6994         inherit from System.Object, so we have to stop at null, not only
6995         when reaching System.Object.
6996
6997 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
6998
6999         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7000         DeclaredOnly because the parent indexer might have had a different
7001         name, but did not loop until the top of the hierarchy was reached.
7002
7003         The problem this one fixes is 35492: when a class implemented an
7004         indexer from an interface, we were getting the interface method
7005         (which was abstract) and we were flagging an error (can not invoke
7006         abstract method).
7007
7008         This also keeps bug 33089 functioning, and test-148 functioning.
7009
7010         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7011         out if a method is special is to see if it is declared in a
7012         property or event, or whether it is one of the predefined operator
7013         names.   This should fix correctly #36804.
7014
7015 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7016
7017         The goal here is to remove the dependency on EmptyCast.Peel ().
7018         Killing it completely.
7019
7020         The problem is that currently in a number of places where
7021         constants are expected, we have to "probe" for an EmptyCast, and
7022         Peel, which is not the correct thing to do, as this will be
7023         repetitive and will likely lead to errors. 
7024
7025         The idea is to remove any EmptyCasts that are used in casts that
7026         can be reduced to constants, so we only have to cope with
7027         constants. 
7028
7029         This bug hunt was triggered by Bug 37363 and the desire to remove
7030         the duplicate pattern where we were "peeling" emptycasts to check
7031         whether they were constants.  Now constants will always be
7032         constants.
7033
7034         * ecore.cs: Use an enumconstant here instead of wrapping with
7035         EmptyCast.  
7036
7037         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7038         throwing me off.  By handling this we can get rid of a few hacks.
7039
7040         * statement.cs (Switch): Removed Peel() code.
7041
7042 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7043
7044         * class.cs: Location information for error 508
7045
7046         * expression.cs (New.DoResolve): Add a guard against double
7047         resolution of an expression.  
7048
7049         The New DoResolve might be called twice when initializing field
7050         expressions (see EmitFieldInitializers, the call to
7051         GetInitializerExpression will perform a resolve on the expression,
7052         and later the assign will trigger another resolution
7053
7054         This leads to bugs (#37014)
7055
7056         * delegate.cs: The signature for EndInvoke should contain any ref
7057         or out parameters as well.  We were not doing this in the past. 
7058
7059         * class.cs (Field.Define): Do not overwrite the type definition
7060         inside the `volatile' group.  Turns out that volatile enumerations
7061         were changing the type here to perform a validity test, which
7062         broke conversions. 
7063
7064 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7065
7066         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7067         and structs, we do not want to load the instance variable
7068
7069         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7070         enum_type has to be handled like an object reference (implicit
7071         conversions exists from this to object), but the regular IsClass
7072         and IsValueType tests will never return true for this one.
7073
7074         Also we use TypeManager.IsValueType instead of type.IsValueType,
7075         just for consistency with the rest of the code (this is only
7076         needed if we ever use the construct exposed by test-180.cs inside
7077         corlib, which we dont today).
7078
7079 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7080
7081         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7082         just InternalCall.
7083
7084 2003-02-09  Martin Baulig  <martin@ximian.com>
7085
7086         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7087         (Namespace.DefineNamespaces): New static public method; this is
7088         called when we're compiling with debugging to add all namespaces
7089         to the symbol file.
7090
7091         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7092         pass it to the Namespace's .ctor.
7093
7094         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7095         and MethodBase arguments; pass the namespace ID to the symwriter;
7096         pass the MethodBase instead of the token to the symwriter.
7097         (SymbolWriter.DefineNamespace): New method to add a namespace to
7098         the symbol file.
7099
7100 2003-02-09  Martin Baulig  <martin@ximian.com>
7101
7102         * symbolwriter.cs: New file.  This is a wrapper around
7103         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7104         methods here in near future.
7105
7106 2003-02-09  Martin Baulig  <martin@ximian.com>
7107
7108         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7109         ILGenerator.MarkSequencePoint() which are actually used by the
7110         symbol writer.
7111
7112 2003-02-09  Martin Baulig  <martin@ximian.com>
7113
7114         * location.cs (SourceFile): New public sealed class.  This
7115         contains the name and an index which is used in the location's token.
7116         (Location): Reserve an appropriate number of bits in the token for
7117         the source file instead of walking over that list, this gives us a
7118         really huge performance improvement when compiling with debugging.
7119
7120         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7121         `SourceFile' argument instead of a string.
7122         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7123         but don't parse/tokenize here, we need to generate the list of all
7124         source files before we do that.
7125         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7126         the files.
7127
7128         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7129         instead of a string.
7130
7131         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7132         of a string.
7133
7134 2003-02-09  Martin Baulig  <martin@ximian.com>
7135
7136         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7137         filename on `#line default'.
7138
7139 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7140
7141         * statement.cs: don't clear the pinned var when the fixed statement
7142         returns from the method (fixes bug#37752).
7143
7144 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7145
7146         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7147         to IsValueType.
7148
7149 2003-02-07  Martin Baulig  <martin@ximian.com>
7150
7151         * driver.cs: Removed the `--debug-args' command line argument.
7152
7153         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7154         automatically by the AsssemblyBuilder.
7155         (CodeGen.InitializeSymbolWriter): We don't need to call any
7156         initialization function on the symbol writer anymore.  This method
7157         doesn't take any arguments.
7158
7159 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7160
7161         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7162         from referenced assemblies as well.
7163
7164 2003-02-02  Martin Baulig  <martin@ximian.com>
7165
7166         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7167
7168 2003-02-02  Martin Baulig  <martin@ximian.com>
7169
7170         * class.cs (Constructor.Emit): Open the symbol writer before
7171         emitting the constructor initializer.
7172         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7173         single-stepping through constructor initializers.
7174
7175 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7176
7177         * class.cs: Handle error 549: do not allow virtual methods in
7178         sealed classes. 
7179
7180 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7181
7182         * decl.cs: Check access levels when resolving types
7183
7184 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7185
7186         * statement.cs: Add parameters and locals set in catch blocks that might 
7187         return to set vector
7188
7189 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7190
7191         * class.cs (Operator): Set the SpecialName flags for operators.
7192
7193         * expression.cs (Invocation.DoResolve): Only block calls to
7194         accessors and operators on SpecialName methods.
7195
7196         (Cast.TryReduce): Handle conversions from char constants.
7197
7198
7199 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7200
7201         * statement.cs: small memory and time optimization in FlowBranching.
7202
7203 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7204
7205         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7206         problem that the last fix but in the other sid (Set).
7207
7208         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7209         access when there is no indexer in the hierarchy.
7210
7211 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7212
7213         * class.cs: Combine some if statements.
7214
7215 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7216
7217         * driver.cs: fixed bug #37187.
7218
7219 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7220
7221         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7222         any indexer, it's needed to build a list with all the indexers in the
7223         hierarchy (AllGetters), else we have problems. Fixes #35653.
7224
7225 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7226
7227         * class.cs (MethodData.Define): It is wrong for an interface
7228         implementation to be static in both cases: explicit and implicit.
7229         We were only handling this in one case.
7230
7231         Improve the if situation there to not have negations.
7232
7233         * class.cs (Field.Define): Turns out that we do not need to check
7234         the unsafe bit on field definition, only on usage.  Remove the test.
7235
7236 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7237
7238         * driver.cs: use assembly.Location instead of Codebase (the latest
7239         patch made mcs fail when using MS assemblies).
7240
7241 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7242
7243         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7244         get the path to *corlib.dll.
7245
7246 2003-01-21  Nick Drochak <ndrochak@gol.com>
7247
7248         * cs-tokenizer.cs:
7249         * pending.cs:
7250         * typemanager.cs: Remove compiler warnings
7251
7252 2003-01-20  Duncan Mak  <duncan@ximian.com>
7253
7254         * AssemblyInfo.cs: Bump the version number to 0.19.
7255
7256 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7257
7258         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7259
7260 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7261
7262         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7263
7264 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7265
7266         * cs-parser.jay: Small fix: we were not comparing the constructor
7267         name correctly.   Thanks to Zoltan for the initial pointer.
7268
7269 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7270
7271         * cs-tokenizer.cs: Set file name when specified with #line
7272
7273 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7274
7275         * cs-parser.jay: Only perform the constructor checks here if we
7276         are named like the class;  This will help provider a better
7277         error.  The constructor path is taken when a type definition is
7278         not found, but most likely the user forgot to add the type, so
7279         report that rather than the constructor error.
7280
7281 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7282
7283         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7284         allocations.
7285
7286 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7287
7288         * cs-parser.jay: Add cleanup call.
7289
7290 2003-01-13  Duncan Mak  <duncan@ximian.com>
7291
7292         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7293         consistent with other methods.
7294
7295 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7296
7297         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7298
7299 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7300
7301         * attribute.cs: only set GuidAttr to true when we have a
7302         GuidAttribute.
7303
7304 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7305
7306         * ecore.cs:
7307         * expression.cs:
7308         * typemanager.cs: fixes to allow mcs compile corlib with the new
7309         Type.IsSubclassOf fix.
7310
7311 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7312
7313         * expression.cs (LocalVariableReference.DoResolve): Classify a
7314         constant as a value, not as a variable.   Also, set the type for
7315         the variable.
7316
7317         * cs-parser.jay (fixed_statement): take a type instead of a
7318         pointer_type, so we can produce a better error message later.
7319
7320         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7321         as an error.  
7322
7323         (For.DoEmit): Make inifinite loops have a
7324         non-conditional branch back.
7325
7326         (Fixed.DoEmit): First populate the pinned variables, then emit the
7327         statement, then clear the variables.  Before I was emitting the
7328         code once for each fixed piece.
7329
7330
7331 2003-01-08  Martin Baulig  <martin@ximian.com>
7332
7333         * statement.cs (FlowBranching.MergeChild): A break in a
7334         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7335
7336 2003-01-08  Martin Baulig  <martin@ximian.com>
7337
7338         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7339         lives in the same number space than `param_map'.  Fixes #36154.
7340
7341 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7342
7343         * cs-parser.jay (constructor_declaration): Set the
7344         Constructor.ModFlags before probing for it.  This makes the
7345         compiler report 514, 515 and 132 (the code was there, but got
7346         broken). 
7347
7348         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7349         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7350         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7351
7352 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7353
7354         * enum.cs: create the enum static fields using the enum type.
7355
7356 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7357
7358         * class.cs: don't try to create the ParamBuilder for the return
7359         type if it's not needed (and handle it breaking for the ms runtime
7360         anyway).
7361
7362 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7363
7364         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7365
7366 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7367
7368         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7369         the command.   This showed up while compiling the JANET source
7370         code, which used \r as its only newline separator.
7371
7372 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7373
7374         * class.cs (Method.Define): If we are an operator (because it
7375         reuses our code), then set the SpecialName and HideBySig.  #36128
7376
7377 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7378
7379         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7380         exception, report error 120 `object reference required'.
7381
7382         * driver.cs: Add --pause option, used during to measure the size
7383         of the process as it goes with --timestamp.
7384
7385         * expression.cs (Invocation.DoResolve): Do not allow methods with
7386         SpecialName to be invoked.
7387
7388 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7389
7390         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7391         number before adding it.
7392
7393 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7394
7395         * ecore.cs (StandardImplicitConversion): When in an unsafe
7396         context, we allow conversion between void * to any other pointer
7397         type. This fixes bug #35973.
7398
7399 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7400
7401         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7402         is not thrown when extensionless outputs are used 
7403
7404 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7405
7406         * rootcontext.cs: fixed compilation of corlib.
7407
7408 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7409
7410         * attribute.cs (Attributes.Contains): Add new method.
7411
7412         * class.cs (MethodCore.LabelParameters): if the parameter is an
7413         `out' parameter, check that no attribute `[In]' has been passed.
7414
7415         * enum.cs: Handle the `value__' name in an enumeration.
7416
7417 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7418
7419         * decl.cs: Added special case to allow overrides on "protected
7420         internal" methods
7421
7422 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7423
7424         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7425         since it makes much more sense.
7426
7427         (Attributes.ctor): Don't require a Location parameter.
7428
7429         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7430
7431         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7432         since we already have that information per attribute.
7433
7434         * everywhere : make appropriate changes.
7435
7436         * class.cs (LabelParameters): Write the code which actually
7437         applies attributes to the return type. We can't do this on the MS
7438         .NET runtime so we flag a warning in the case an exception is
7439         thrown.
7440
7441 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7442
7443         * const.cs: Handle implicit null conversions here too.
7444
7445 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7446
7447         * class.cs (MethodCore.LabelParameters): Remove the extra
7448         Type [] parameter since it is completely unnecessary. Instead
7449         pass in the method's attributes so that we can extract
7450         the "return" attribute.
7451
7452 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7453
7454         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7455         of ignoring it and letting the compile continue.
7456
7457         * typemanager.cs (ChangeType): use an extra argument to return an
7458         error condition instead of throwing an exception.
7459
7460 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7461
7462         * expression.cs (Unary.TryReduce): mimic the code for the regular
7463         code path.  Perform an implicit cast in the cases where we can
7464         implicitly convert to one of the integral types, and then reduce
7465         based on that constant.   This fixes bug #35483.
7466
7467 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7468
7469         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7470
7471 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7472
7473         * namespace.cs: fixed bug #35489.
7474
7475 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7476
7477         * class.cs: Remove some dead code.
7478
7479         * cs-parser.jay: Estimate the number of methods needed
7480         (RootContext.MethodCount);
7481
7482         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7483         numbers instead of StringBuilders.
7484
7485         * support.cs (PtrHashtable): Add constructor with initial size;
7486         We can now reduce reallocations of the method table.
7487
7488 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7489
7490         * attribute.cs (ApplyAttributes): Keep track of the emitted
7491         attributes on a per-target basis. This fixes bug #35413.
7492
7493 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7494
7495         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7496         default to the Windows 1252 encoding.
7497
7498         (UnixParseOption): Support version, thanks to Alp for the missing
7499         pointer. 
7500
7501         * AssemblyInfo.cs: Add nice assembly information.
7502
7503         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7504         (bug 35169).
7505
7506         * cs-parser.jay: Allow a trailing comma before the close bracked
7507         in the attribute_section production.
7508
7509         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7510         address of the instance was being taken, I will take this out,
7511         because we take the address of the object immediately here.
7512
7513 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7514
7515         * typemanager.cs (AreMultipleAllowed): Take care of the most
7516         obvious case where attribute type is not in the current assembly -
7517         stupid me ;-)
7518
7519 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7520
7521         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7522         definitions, instead of doing that afterwards.  
7523
7524         Also we use a nice little hack, depending on the constructor, we
7525         know if we are a "composed" name or a simple name.  Hence, we
7526         avoid the IndexOf test, and we avoid 
7527
7528         * codegen.cs: Add code to assist in a bug reporter to track down
7529         the source of a compiler crash. 
7530
7531 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7532
7533         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7534         types have been emitted for a given element and flag an error
7535         if something which does not have AllowMultiple set is used more
7536         than once.
7537
7538         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7539         attribute types and their corresponding AllowMultiple properties
7540
7541         (AreMultipleAllowed): Check the property for a given type.
7542
7543         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7544         property in the case we have a TypeContainer.
7545
7546         (Attributes.AddAttribute): Detect duplicates and just skip on
7547         adding them. This trivial fix catches a pretty gross error in our
7548         attribute emission - global attributes were being emitted twice!
7549
7550         Bugzilla bug #33187 is now fixed.
7551
7552 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7553
7554         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7555         instead of pp_and).
7556
7557         * expression.cs (Binary.ResolveOperator): I can only use the
7558         Concat (string, string, string) and Concat (string, string,
7559         string, string) if the child is actually a concatenation of
7560         strings. 
7561
7562 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7563
7564         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7565         context where we need a 2-character lookahead.
7566
7567         * pending.cs (PendingImplementation): Rework so we can keep track
7568         of interface types all the time, and flag those which were
7569         implemented by parents as optional.
7570
7571 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7572
7573         * expression.cs (Binary.ResolveOperator): Use
7574         String.Concat(string,string,string) or
7575         String.Concat(string,string,string,string) when possible. 
7576
7577         * typemanager: More helper methods.
7578
7579
7580 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7581
7582         * pending.cs: remove the bogus return from GetMissingInterfaces()
7583         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7584
7585 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7586
7587         * namespace.cs: avoid duplicated 'using xxx' being added to
7588         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7589         when we get more than one 'using' statement for the same namespace.
7590         Report a CS0105 warning for it.
7591
7592 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7593
7594         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7595         of calling getChar/putback, uses internal knowledge of it.    
7596
7597         (xtoken): Reorder tokenizer so most common patterns are checked
7598         first.  This reduces the compilation time in another 5% (from 8.11s
7599         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7600
7601         The parsing time is 22% of the compilation in mcs, and from that
7602         64% is spent on the tokenization process.  
7603
7604         I tried using a binary search for keywords, but this is slower
7605         than the hashtable.  Another option would be to do a couple of
7606         things:
7607
7608                 * Not use a StringBuilder, instead use an array of chars,
7609                   with a set value.  Notice that this way we could catch
7610                   the 645 error without having to do it *afterwards*.
7611
7612                 * We could write a hand-parser to avoid the hashtable
7613                   compares altogether.
7614
7615         The identifier consumption process takes 37% of the tokenization
7616         time.  Another 15% is spent on is_number.  56% of the time spent
7617         on is_number is spent on Int64.Parse:
7618
7619                 * We could probably choose based on the string length to
7620                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7621                   computations. 
7622
7623         Another 3% is spend on wrapping `xtoken' in the `token' function.
7624
7625         Handle 0xa0 as whitespace (#34752)
7626
7627 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7628
7629         * typemanager.cs (IsCLRType): New routine to tell whether a type
7630         is one of the builtin types.  
7631
7632         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7633         typecode in more places instead of doing pointer comparissions.
7634         We could leverage some knowledge about the way the typecodes are
7635         laid out.
7636
7637         New code to cache namespaces in assemblies, it is currently not
7638         invoked, to be used soon.
7639
7640         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7641
7642         * expression.cs (Binary.ResolveOperator): specially handle
7643         strings, and do not perform user-defined operator overloading for
7644         built-in types.
7645
7646 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7647
7648         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7649         internalcall as it is a pretty simple operation;  Avoid whenever
7650         possible to call Char.IsLetter.
7651
7652         (consume_identifier): Cut by half the number of
7653         hashtable calls by merging the is_keyword and GetKeyword behavior.
7654
7655         Do not short-circuit, because if we do, we
7656         report errors (ie, #if false && true would produce an invalid
7657         directive error);
7658
7659
7660 2002-11-24  Martin Baulig  <martin@ximian.com>
7661
7662         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7663         check constant ranges and report a CS0221.  Fixes #33186.
7664
7665 2002-11-24  Martin Baulig  <martin@ximian.com>
7666
7667         * cs-parser.jay: Make this work for uninitialized variable
7668         declarations in the `for' initializer.  Fixes #32416.
7669
7670 2002-11-24  Martin Baulig  <martin@ximian.com>
7671
7672         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7673         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7674
7675 2002-11-24  Martin Baulig  <martin@ximian.com>
7676
7677         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7678         argument; if true, we also check for user-defined conversions.
7679         This is only needed if both arguments are of a user-defined type.
7680         Fixes #30443, added test-175.cs.
7681         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7682
7683         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7684
7685 2002-11-24  Martin Baulig  <martin@ximian.com>
7686
7687         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7688         function to get the store opcode.
7689         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7690         only emit the Ldelema if the store opcode is Stobj.  You must run
7691         both test-34 and test-167 to test this.  Fixes #34529.
7692
7693 2002-11-23  Martin Baulig  <martin@ximian.com>
7694
7695         * ecore.cs (Expression.MemberLookup): Added additional
7696         `qualifier_type' argument which is used when we're being called
7697         from MemberAccess.DoResolve() and null if we're called from a
7698         SimpleName lookup.
7699         (Expression.MemberLookupFailed): New method to report errors; this
7700         does the CS1540 check and reports the correct error message.
7701
7702         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7703         argument for the CS1540 check and redone the way how we're dealing
7704         with private members.  See the comment in the source code for details.
7705         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7706         `closure_start_type' to `closure_qualifier_type' and check whether
7707         it's not null.  It was not this filter being broken, it was just
7708         being called with the wrong arguments.
7709
7710         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7711         and pass it the correct `qualifier_type'; this also does the error
7712         handling for us.
7713
7714 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7715
7716         * expression.cs (Invocation.EmitParams): If the we are dealing
7717         with a non-built-in value type, load its address as well.
7718
7719         (ArrayCreation): Use a a pretty constant instead
7720         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7721         static initializers.  
7722
7723         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7724         because they are not really value types, just glorified integers. 
7725
7726         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7727
7728         * ecore.cs: Remove redundant code for enumerations, make them use
7729         the same code path as everything else, fixes the casting issue
7730         with enumerations in Windows.Forms.
7731
7732         * attribute.cs: Do only cast to string if it is a string, the
7733         validation happens later.
7734
7735         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7736         people upgrade their corlibs.
7737
7738         * ecore.cs: Oops, enumerations were not following the entire code path
7739
7740 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7741
7742         * typemanager.cs (FilterWithClosure): Commented out the test for
7743         1540 in typemanager.cs, as it has problems when accessing
7744         protected methods from a parent class (see test-174.cs). 
7745
7746         * attribute.cs (Attribute.ValidateGuid): new method.
7747         (Attribute.Resolve): Use above.
7748
7749 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7750
7751         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7752
7753         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7754         handling for enumerations, as we only needed the TypeContainer
7755         functionality to begin with (this is required for the fix below to
7756         work for enums that reference constants in a container class for
7757         example). 
7758
7759         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7760
7761         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7762         a valid TypeBuilder to perform lookups on.o
7763
7764         * class.cs (InheritableMemberSignatureCompare): Use true in the
7765         call to GetGetMethod and GetSetMethod, because we are comparing
7766         the signature, and we need to get the methods *even* if they are
7767         private. 
7768
7769         (PropertyBase.CheckBase): ditto.
7770
7771         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7772         GotoCase.Resolve): Use Peel on EmpytCasts.
7773
7774         * ecore.cs (EmptyCast): drop child, add Peel method.
7775
7776 2002-11-17  Martin Baulig  <martin@ximian.com>
7777
7778         * ecore.cs (EmptyCast.Child): New public property.
7779
7780         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7781         label resolved to an EmptyCast.  Fixes #34162.
7782         (GotoCase.Resolve): Likewise.
7783         (Block.EmitMeta): Likewise.
7784
7785 2002-11-17  Martin Baulig  <martin@ximian.com>
7786
7787         * expression.cs (Invocation.BetterConversion): Prefer int over
7788         uint; short over ushort; long over ulong for integer literals.
7789         Use ImplicitConversionExists instead of StandardConversionExists
7790         since we also need to check for user-defined implicit conversions.
7791         Fixes #34165.  Added test-173.cs.
7792
7793 2002-11-16  Martin Baulig  <martin@ximian.com>
7794
7795         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7796         with the `true' and `false' literals.  Fixes #33151.
7797
7798 2002-11-16  Martin Baulig  <martin@ximian.com>
7799
7800         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7801         October 22nd; don't do the cs1540 check for static members.
7802
7803         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7804         now using our own filter here and doing the cs1540 check again.
7805
7806 2002-11-16  Martin Baulig  <martin@ximian.com>
7807
7808         * support.cs (InternalParameters): Don't crash if we don't have
7809         any fixed parameters.  Fixes #33532.
7810
7811 2002-11-16  Martin Baulig  <martin@ximian.com>
7812
7813         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7814         when looking up static methods to make this work on Windows.
7815         Fixes #33773.
7816
7817 2002-11-16  Martin Baulig  <martin@ximian.com>
7818
7819         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7820         a setter rather than using PropertyInfo.CanWrite.
7821
7822 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7823
7824         * class.cs: Allow acces to block member by subclasses. Fixes build
7825         breaker.
7826
7827 2002-11-14  Martin Baulig  <martin@ximian.com>
7828
7829         * class.cs (Constructor.Emit): Added the extern/block check.
7830         Fixes bug #33678.
7831
7832 2002-11-14  Martin Baulig  <martin@ximian.com>
7833
7834         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7835         iteration while looking for indexers, this is needed because the
7836         indexer may have a different name in our base classes.  Fixed the
7837         error reporting (no indexers at all, not get accessor, no
7838         overloaded match).  Fixes bug #33089.
7839         (IndexerAccess.DoResolveLValue): Likewise.
7840
7841 2002-11-14  Martin Baulig  <martin@ximian.com>
7842
7843         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7844         indexers.  Fixes the first part of bug #33089.
7845         (MethodSignature.InheritableMemberSignatureCompare): Added support
7846         for properties.
7847
7848 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7849
7850         * attribute.cs (Attribute.Resolve): Catch the
7851         NullReferenceException and report it since it isn't supposed to
7852         happen. 
7853
7854 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7855
7856         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7857         LogicalOr and LogicalAnd that can benefit from recursively
7858         handling EmitBranchable.  The code now should be nice for Paolo.
7859
7860 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
7861
7862         * typemanager.cs (LookupType): Added a negative-hit hashtable for
7863         the Type lookups, as we perform quite a number of lookups on
7864         non-Types.  This can be removed once we can deterministically tell
7865         whether we have a type or a namespace in advance.
7866
7867         But this might require special hacks from our corlib.
7868
7869         * TODO: updated.
7870
7871         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
7872         and double which avoids a conversion from an integer to a double.
7873
7874         * expression.cs: tiny optimization, avoid calling IsConstant,
7875         because it effectively performs the lookup twice.
7876
7877 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
7878
7879         But a bogus return here to keep the semantics of the old code
7880         until the Mono runtime is fixed.
7881
7882         * pending.cs (GetMissingInterfaces): New method used to remove all
7883         the interfaces that are already implemented by our parent
7884         classes from the list of pending methods. 
7885
7886         * interface.cs: Add checks for calls after ResolveTypeExpr.
7887
7888 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7889
7890         * class.cs (Class.Emit): Report warning 67: event not used if the
7891         warning level is beyond 3.
7892
7893         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7894         being a NullLiteral.
7895
7896         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7897         specifiers. 
7898
7899         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7900         path that might fail if a type can not be resolved.
7901
7902         * expression.cs (Binary.Emit): Emit unsigned versions of the
7903         operators. 
7904
7905         * driver.cs: use error 5.
7906
7907 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7908
7909         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7910
7911 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7912
7913         * cs-parser.jay (switch_section): A beautiful patch from Martin
7914         Baulig that fixed 33094.
7915
7916 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7917
7918         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7919         Check whether the base is abstract and report an error if so.
7920
7921         * expression.cs (IndexerAccess.DoResolveLValue,
7922         IndexerAccess.DoResolve): ditto. 
7923
7924         (Invocation.DoResolve): ditto.
7925
7926         (Invocation.FullMethodDesc): Improve the report string.
7927
7928         * statement.cs (Block): Eliminate IsVariableDefined as it is
7929         basically just a wrapper for GetVariableInfo.
7930
7931         * ecore.cs (SimpleName): Use new 
7932
7933         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7934         type, as we return the actual parameter ref/unref state on a
7935         different call.
7936
7937 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7938
7939         * support.cs: Return proper flags REF/OUT fixing the previous
7940         commit.  
7941
7942         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7943         not used to mean `ref' but `ref or out' in ParameterReference
7944
7945         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7946         full type signature instead of calling TypeManger.CSharpName
7947         ourselves. 
7948
7949         * support.cs (InternalParameters.ParameterDesc): Do not compare
7950         directly to the modflags, because REF/OUT will actually be bitsets
7951         if set. 
7952
7953         * delegate.cs (VerifyMethod): Check also the modifiers.
7954
7955         * cs-tokenizer.cs: Fix bug where floating point values with an
7956         exponent where a sign was missing was ignored.
7957
7958         * driver.cs: Allow multiple assemblies to be specified in a single
7959         /r: argument
7960
7961 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7962
7963         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7964         because identifiers after a parenthesis would end up in this kind
7965         of production, and we needed to desamiguate it for having casts
7966         like:
7967
7968                 (UserDefinedType *) xxx
7969
7970 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7971
7972         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7973         we should set on the Bindingflags.NonPublic, but not turn on
7974         private_ok.  private_ok controls whether a Private member is
7975         returned (this is chekced on the filter routine), while the
7976         BindingFlags.NonPublic just controls whether private/protected
7977         will be allowed.   This fixes the problem part of the problem of
7978         private properties being allowed to be used in derived classes.
7979
7980         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7981         so we can call the children DoResolveLValue method (this will
7982         properly signal errors on lvalue assignments to base properties)
7983
7984         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7985         getter are null, and we have a property info, we know that this
7986         happened because the lookup failed, so we report an error 122 for
7987         protection level violation.
7988
7989         We also silently return if setter and getter are null in the
7990         resolve functions, this condition only happens if we have flagged
7991         the error before.  This is the other half of the problem. 
7992
7993         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
7994         not have accessibility information, that is why we were returning
7995         true in the filter function in typemanager.cs.
7996
7997         To properly report 122 (property is inaccessible because of its
7998         protection level) correctly, we report this error in ResolveAccess
7999         by failing if both the setter and the getter are lacking (ie, the
8000         lookup failed). 
8001
8002         DoResolve and DoLResolve have been modified to check for both
8003         setter/getter being null and returning silently, the reason being
8004         that I did not want to put the knowledge about this error in upper
8005         layers, like:
8006
8007         int old = Report.Errors;
8008         x = new PropertyExpr (...);
8009         if (old != Report.Errors)
8010                 return null;
8011         else
8012                 return x;
8013
8014         So the property expr is returned, but it is invalid, so the error
8015         will be flagged during the resolve process. 
8016
8017         * class.cs: Remove InheritablePropertySignatureCompare from the
8018         class, as we no longer depend on the property signature to compute
8019         whether it is possible to implement a method or not.
8020
8021         The reason is that calling PropertyInfo.GetGetMethod will return
8022         null (in .NET, in Mono it works, and we should change this), in
8023         cases where the Get Method does not exist in that particular
8024         class.
8025
8026         So this code:
8027
8028         class X { public virtual int A { get { return 1; } } }
8029         class Y : X { }
8030         class Z : Y { public override int A { get { return 2; } } }
8031
8032         Would fail in Z because the parent (Y) would not have the property
8033         defined.  So we avoid this completely now (because the alternative
8034         fix was ugly and slow), and we now depend exclusively on the
8035         method names.
8036
8037         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8038         reference method, instead of using the property.
8039
8040         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8041         routines are gone now.
8042
8043         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8044         names, they were incorrectly named.
8045
8046         * cs-tokenizer.cs: Return are more gentle token on failure. 
8047
8048         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8049         had an out-of-sync index variable, which caused it to remove from
8050         the list of pending methods the wrong method sometimes.
8051
8052 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8053
8054         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8055         CanWrite, because those refer to this particular instance of the
8056         property, and do not take into account the fact that we can
8057         override single members of a property.
8058
8059         Constructor requires an EmitContext.  The resolution process does
8060         not happen here, but we need to compute the accessors before,
8061         because the resolution does not always happen for properties.
8062
8063         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8064         subclass, before we did not update this flag, but we did update
8065         bindingflags. 
8066
8067         (GetAccessors): Drop this routine, as it did not work in the
8068         presence of partially overwritten set/get methods. 
8069
8070         Notice that this broke the cs1540 detection, but that will require
8071         more thinking. 
8072
8073 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8074
8075         * class.cs:
8076         * codegen.cs:
8077         * driver.cs: issue a warning instead of an error if we don't support
8078         debugging for the platform. Also ignore a couple of errors that may
8079         arise when trying to write the symbols. Undo my previous patch.
8080
8081 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8082
8083         * driver.cs: ignore /debug switch except for Unix platforms.
8084
8085 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8086
8087         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8088
8089 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8090
8091         * driver.cs: Do not make mcs-debug conditional, so we do not break
8092         builds that use it.
8093
8094         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8095         review this patch.  But basically after all the children variables
8096         have been merged, the value of "Breaks" was not being set to
8097         new_breaks for Switch blocks.  I think that it should be set after
8098         it has executed.  Currently I set this to the value of new_breaks,
8099         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8100         conservative, but I do not understand this code very well.
8101
8102         I did not break anything in the build, so that is good ;-)
8103
8104         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8105
8106 2002-10-20  Mark Crichton  <crichton@gimp.org>
8107
8108         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8109
8110 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8111
8112         * cfold.cs: Fixed compile blocker.
8113
8114 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8115
8116         * driver.cs: I was chekcing the key, not the file.
8117
8118 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8119
8120         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8121         message that we were generating - we just need to silently return
8122         a null.
8123
8124 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8125
8126         * class.cs (Event.Define): Change my previous commit, as this
8127         breaks the debugger.  This is a temporary hack, as it seems like
8128         the compiler is generating events incorrectly to begin with.
8129
8130         * expression.cs (Binary.ResolveOperator): Added support for 
8131         "U operator - (E x, E y)"
8132
8133         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8134         y)".
8135
8136         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8137         init-only variables, but this path did not take into account that
8138         there might be also instance readonly variables.  Correct this
8139         problem. 
8140
8141         This fixes bug 32253
8142
8143         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8144         delegates as well.
8145
8146         * driver.cs: Change the extension for modules to `netmodule'
8147
8148         * cs-parser.jay: Improved slightly the location tracking for
8149         the debugger symbols.
8150
8151         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8152         modifiers that were specified instead of the hardcoded value
8153         (FamAndAssem).  This was basically ignoring the static modifier,
8154         and others.  Fixes 32429.
8155
8156         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8157         fixed a bug in the process (32476)
8158
8159         * expression.cs (ArrayAccess.EmitAssign): Patch from
8160         hwang_rob@yahoo.ca that fixes bug 31834.3
8161
8162 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8163
8164         * driver.cs: Make the module extension .netmodule.
8165
8166 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8167
8168         * driver.cs: Report an error if the resource file is not found
8169         instead of crashing.
8170
8171         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8172         false, like Emit does.
8173
8174 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8175
8176         * typemanager.cs: Remove unused private member.  Also reported mcs
8177         bug to report this as a warning like csc.
8178
8179 2002-10-15  Martin Baulig  <martin@gnome.org>
8180
8181         * statement.cs (Statement.Emit): Made this a virtual method; emits
8182         the line number info and calls DoEmit().
8183         (Statement.DoEmit): New protected abstract method, formerly knows
8184         as Statement.Emit().
8185
8186         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8187
8188 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8189
8190         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8191         have fixed a remaining problem: not every AddXXXX was adding a
8192         fully qualified name.  
8193
8194         Now everyone registers a fully qualified name in the DeclSpace as
8195         being defined instead of the partial name.  
8196
8197         Downsides: we are slower than we need to be due to the excess
8198         copies and the names being registered this way.  
8199
8200         The reason for this is that we currently depend (on the corlib
8201         bootstrap for instance) that types are fully qualified, because
8202         we dump all the types in the namespace, and we should really have
8203         types inserted into the proper namespace, so we can only store the
8204         basenames in the defined_names array.
8205
8206 2002-10-10  Martin Baulig  <martin@gnome.org>
8207
8208         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8209         from bug #31834, see the bug report for a testcase which is
8210         miscompiled.
8211
8212 2002-10-10  Martin Baulig  <martin@gnome.org>
8213
8214         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8215         flow analysis code for this.
8216
8217         * statement.cs (Do, While, For): Tell the flow analysis code about
8218         infinite loops.
8219         (FlowBranching.UsageVector): Added support for infinite loops.
8220         (Block.Resolve): Moved the dead code elimination here and use flow
8221         analysis to do it.
8222
8223 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8224
8225         * class.cs (Field.Define): Catch cycles on struct type
8226         definitions. 
8227
8228         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8229         fields if the fields are static.  We only need to check instance
8230         fields. 
8231
8232         * expression.cs (As.DoResolve): Test for reference type.
8233
8234         * statement.cs (Using.ResolveExpression): Use
8235         ConvertImplicitRequired, not ConvertImplicit which reports an
8236         error on failture
8237         (Using.ResolveLocalVariableDecls): ditto.
8238
8239         * expression.cs (Binary.ResolveOperator): Report errors in a few
8240         places where we had to.
8241
8242         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8243
8244 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8245
8246         * expression.cs: Use StoreFromPtr instead of extracting the type
8247         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8248
8249         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8250         an enumeration value to a System.Enum, but System.Enum is not a
8251         value type, but an class type, so we need to box.
8252
8253         (Expression.ConvertExplicit): One codepath could return
8254         errors but not flag them.  Fix this.  Fixes #31853
8255
8256         * parameter.cs (Resolve): Do not allow void as a parameter type.
8257
8258 2002-10-06  Martin Baulig  <martin@gnome.org>
8259
8260         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8261         if it's a class type and not a struct.  Fixes #31815.
8262
8263 2002-10-06  Martin Baulig  <martin@gnome.org>
8264
8265         * statement.cs: Reworked the flow analysis code a bit to make it
8266         usable for dead code elimination.
8267
8268 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8269
8270         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8271
8272 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8273
8274         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8275         to fix the test 165, will investigate deeper.
8276
8277 2002-10-04  Martin Baulig  <martin@gnome.org>
8278
8279         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8280         finally blocks actually work.
8281         (Try.Resolve): We don't need to create a sibling for `finally' if
8282         there is no finally block.
8283
8284 2002-10-04  Martin Baulig  <martin@gnome.org>
8285
8286         * class.cs (Constructor.Define): The default accessibility for a
8287         non-default constructor is private, not public.
8288
8289 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8290
8291         * class.cs (Constructor): Make AllowedModifiers public, add
8292         EXTERN.
8293
8294         * cs-parser.jay: Perform the modifiers test here, as the
8295         constructor for the Constructor class usually receives a zero
8296         because of the way we create it (first we create, later we
8297         customize, and we were never checking the modifiers).
8298
8299         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8300         is a version of LookupTypeReflection that includes the type-name
8301         cache.  This can be used as a fast path for functions that know
8302         the fully qualified name and are only calling into *.GetType() to
8303         obtain a composed type.
8304
8305         This is also used by TypeManager.LookupType during its type
8306         composition.
8307
8308         (LookupType): We now also track the real type name, as sometimes
8309         we can get a quey for the real type name from things like
8310         ComposedCast.  This fixes bug 31422.
8311
8312         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8313         complete type fullname, it does not have to go through the type
8314         resolution system to obtain the composed version of the type (for
8315         obtaining arrays or pointers).
8316
8317         (Conditional.Emit): Use the EmitBoolExpression to
8318         generate nicer code, as requested by Paolo.
8319
8320         (ArrayCreation.CheckIndices): Use the patch from
8321         hwang_rob@yahoo.ca to validate the array initializers. 
8322
8323 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8324
8325         * class.cs (ConstructorInitializer.Emit): simplify code by using
8326         Invocation.EmitCall, and at the same time, fix the bugs in calling
8327         parent constructors that took variable arguments. 
8328
8329         * ecore.cs (Expression.ConvertNumericExplicit,
8330         Expression.ImplicitNumericConversion): Remove the code that
8331         manually wrapped decimal (InternalTypeConstructor call is now gone
8332         as well).
8333
8334         * expression.cs (Cast.TryReduce): Also handle decimal types when
8335         trying to perform a constant fold on the type.
8336
8337         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8338
8339         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8340         that only turned off an error report, and did nothing else. 
8341
8342 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8343
8344         * driver.cs: Handle and ignore /fullpaths
8345
8346 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8347
8348         * expression.cs (Binary.ResolveOperator): Catch the case where
8349         DoNumericPromotions returns true, 
8350
8351         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8352
8353 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8354
8355         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8356         report error 70.
8357
8358 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8359
8360         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8361         conversion exists, but it is also required that the conversion be
8362         performed.  This manifested in "(Type64Enum) 2".  
8363
8364         * class.cs (TypeManager.AddMethod): The fix is not to change
8365         AddEnum, because that one was using a fully qualified name (every
8366         DeclSpace derivative does), but to change the AddMethod routine
8367         that was using an un-namespaced name.  This now correctly reports
8368         the duplicated name.
8369
8370         Revert patch until I can properly fix it.  The issue
8371         is that we have a shared Type space across all namespaces
8372         currently, which is wrong.
8373
8374         Options include making the Namespace a DeclSpace, and merge
8375         current_namespace/current_container in the parser.
8376
8377 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8378
8379         * cs-parser.jay: Improve error reporting when we get a different
8380         kind of expression in local_variable_type and
8381         local_variable_pointer_type. 
8382
8383         Propagate this to avoid missleading errors being reported.
8384
8385         * ecore.cs (ImplicitReferenceConversion): treat
8386         TypeManager.value_type as a target just like object_type.   As
8387         code like this:
8388
8389         ValueType v = 1;
8390
8391         Is valid, and needs to result in the int 1 being boxed before it
8392         is assigned to the value type v.
8393
8394         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8395         to validate the enumeration name.
8396
8397         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8398         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8399         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8400
8401         * ecore.cs (TryImplicitIntConversion): When doing an
8402         implicit-enumeration-conversion, check if the type is 64-bits and
8403         perform a conversion before passing to EnumConstant.
8404
8405 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8406
8407         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8408         report ambiguous type references.  Unlike the MS version, we
8409         report what the ambiguity is.   Innovation at work ;-)
8410
8411         (DeclSpace.FindType): Require a location argument to
8412         display when we display an ambiguous error.
8413
8414         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8415
8416         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8417
8418         * expression.cs (EmitDynamicInitializers): Apply patch from
8419         hwang_rob@yahoo.ca that fixes the order in which we emit our
8420         initializers. 
8421
8422 2002-09-21  Martin Baulig  <martin@gnome.org>
8423
8424         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8425         delegate takes no arguments.
8426
8427 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8428
8429         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8430         from integers.
8431
8432         * expression.cs: Extract the underlying type.
8433
8434         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8435
8436         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8437
8438 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8439
8440         * class.cs (TypeContainer.DefineType): We can not use the nice
8441         PackingSize with the size set to 1 DefineType method, because it
8442         will not allow us to define the interfaces that the struct
8443         implements.
8444
8445         This completes the fixing of bug 27287
8446
8447         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8448         means also structs.  This fixes part of the problem. 
8449         (Expresion.ImplicitReferenceConversionExists): ditto.
8450
8451         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8452         error if there were no errors reported during the type lookup
8453         process, to avoid duplicates or redundant errors.  Without this
8454         you would get an ambiguous errors plus a type not found.  We have
8455         beaten the user enough with the first error.  
8456
8457         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8458         reference. 
8459
8460         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8461         during the resolution process, stop the lookup, this avoids
8462         repeated error reports (same error twice).
8463
8464         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8465
8466         * typemanager.cs (LookupType): Redo the type lookup code to match
8467         the needs of System.Reflection.  
8468
8469         The issue is that System.Reflection requires references to nested
8470         types to begin with a "+" sign instead of a dot.  So toplevel
8471         types look like: "NameSpace.TopLevelClass", and nested ones look
8472         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8473         levels. 
8474
8475 2002-09-19  Martin Baulig  <martin@gnome.org>
8476
8477         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8478         says that a method always returns or always throws an exception,
8479         don't report the CS0161.
8480
8481         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8482         set `Returns = new_returns'.
8483
8484 2002-09-19  Martin Baulig  <martin@gnome.org>
8485
8486         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8487         to an enum constant, check for a CS0176.
8488
8489 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8490
8491         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8492         for operators that must be in pairs and report errors.
8493
8494         * ecore.cs (SimpleName.DoResolveType): During the initial type
8495         resolution process, when we define types recursively, we must
8496         check first for types in our current scope before we perform
8497         lookups in the enclosing scopes.
8498
8499         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8500
8501         (Invocation.VerifyArgumentsCompat): Call
8502         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8503         I thought we were supposed to always call this, but there are a
8504         few places in the code where we dont do it.
8505
8506 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8507
8508         * driver.cs: Add support in -linkres and -resource to specify the
8509         name of the identifier.
8510
8511 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8512
8513         * ecore.cs (StandardConversionExists): Sync with the conversion
8514         code: allow anything-* to void* conversions.
8515
8516         (FindMostSpecificSource): Use an Expression argument
8517         instead of a Type, because we might be handed over a Literal which
8518         gets a few more implicit conversions that plain types do not.  So
8519         this information was being lost.
8520
8521         Also, we drop the temporary type-holder expression when not
8522         required.
8523
8524 2002-09-17  Martin Baulig  <martin@gnome.org>
8525
8526         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8527         this is an explicit interface implementation.
8528
8529 2002-09-17  Martin Baulig  <martin@gnome.org>
8530
8531         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8532         different `IndexerName' attributes.
8533
8534         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8535         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8536         virtual CommonResolve().
8537
8538 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8539
8540         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8541         and convert that to the UnderlyingType.
8542
8543         * statement.cs (Foreach.Resolve): Indexers are just like variables
8544         or PropertyAccesses.
8545
8546         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8547         inside quoted strings, we were not doing this before.
8548
8549 2002-09-16  Martin Baulig  <martin@gnome.org>
8550
8551         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8552         resolve it.  This is needed for the definite assignment check of the
8553         instance expression, fixes bug #29846.
8554         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8555
8556 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8557
8558         * parameter.cs: Fix compile error.  Cannot reference static member
8559         from an instance object.  Is this an mcs bug?
8560
8561 2002-09-14  Martin Baulig  <martin@gnome.org>
8562
8563         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8564         multiple times.  Fixes bug #30295, added test-166.cs.
8565
8566 2002-09-14  Martin Baulig  <martin@gnome.org>
8567
8568         * statement.cs (Block.Emit): Don't emit unreachable code.
8569         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8570         `break' statements.
8571         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8572
8573 2002-09-14  Martin Baulig  <martin@gnome.org>
8574
8575         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8576         is set.
8577
8578 2002-09-14  Martin Baulig  <martin@gnome.org>
8579
8580         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8581         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8582         be false on the ms runtime.
8583
8584 2002-09-13  Martin Baulig  <martin@gnome.org>
8585
8586         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8587         the CS0038 error message.
8588
8589 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8590
8591         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8592         constant inside, return it.
8593
8594 2002-09-12  Martin Baulig  <martin@gnome.org>
8595
8596         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8597         implicit conversion can be done between enum types.
8598
8599         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8600         check whether an implicit conversion to the current enum's UnderlyingType
8601         exists and report an error if not.
8602
8603         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8604         without debugging support.
8605
8606         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8607         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8608
8609 2002-09-12  Martin Baulig  <martin@gnome.org>
8610
8611         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8612
8613         * ecore.cs (IMemberExpr.DeclaringType): New property.
8614         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8615         nonstatic member of an outer type (CS0038).
8616
8617 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8618
8619         * driver.cs: Activate the using-error detector at warning level
8620         4 (at least for MS-compatible APIs).
8621
8622         * namespace.cs (VerifyUsing): Small buglett fix.
8623
8624         * pending.cs (PendingImplementation): pass the container pointer. 
8625
8626         * interface.cs (GetMethods): Allow for recursive definition.  Long
8627         term, I would like to move every type to support recursive
8628         definitions, not the current ordering mechanism that we have right
8629         now.
8630
8631         The situation is this: Attributes are handled before interfaces,
8632         so we can apply attributes to interfaces.  But some attributes
8633         implement interfaces, we will now handle the simple cases
8634         (recursive definitions will just get an error).  
8635
8636         * parameter.cs: Only invalidate types at the end if we fail to
8637         lookup all types.  
8638
8639 2002-09-09  Martin Baulig  <martin@gnome.org>
8640
8641         * ecore.cs (PropertyExpr.Emit): Also check for
8642         TypeManager.system_int_array_get_length so this'll also work when
8643         compiling corlib.  Fixes #30003.
8644
8645 2002-09-09  Martin Baulig  <martin@gnome.org>
8646
8647         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8648         and throw an exception if we can't get the type's size.  Fixed #30040,
8649         added test-165.cs.
8650
8651 2002-09-09  Martin Baulig  <martin@gnome.org>
8652
8653         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8654
8655         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8656         context.  Fixes bug #30027.
8657
8658         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8659         virtual functions.  Fixes bug #30043, added test-164.cs.
8660
8661 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8662
8663         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8664
8665 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8666
8667         * driver.cs: Use an object to get the windows codepage since it's not a
8668         static property.
8669
8670 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8671
8672         * statement.cs (For.Emit): for infinite loops (test == null)
8673         return whether there is a break inside, not always "true".
8674
8675         * namespace.cs (UsingEntry): New struct to hold the name of the
8676         using definition, the location where it is defined, and whether it
8677         has been used in a successful type lookup.
8678
8679         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8680         strings.
8681
8682         * decl.cs: ditto.
8683
8684 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8685
8686         * attribute.cs : Fix incorrect code which relied on catching
8687         a NullReferenceException to detect a null being passed in
8688         where an object was expected.
8689
8690 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8691
8692         * statement.cs (Try): flag the catch variable as assigned
8693
8694         * expression.cs (Cast): Simplified by using ResolveType instead of
8695         manually resolving.
8696
8697         * statement.cs (Catch): Fix bug by using ResolveType.
8698
8699 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8700
8701         * expression.cs (BetterConversion): Special case for when we have
8702         a NullLiteral as the argument and we have to choose between string
8703         and object types - we choose string the way csc does.
8704
8705         * attribute.cs (Attribute.Resolve): Catch the
8706         NullReferenceException and report error #182 since the Mono
8707         runtime no more has the bug and having this exception raised means
8708         we tried to select a constructor which takes an object and is
8709         passed a null.
8710
8711 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8712
8713         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8714         message (1502, 1503) when we can't locate a method after overload
8715         resolution. This is much more informative and closes the bug
8716         Miguel reported.
8717
8718         * interface.cs (PopulateMethod): Return if there are no argument
8719         types. Fixes a NullReferenceException bug.
8720
8721         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8722         expressions too. Previously we were checking only in one place for
8723         positional arguments leaving out named arguments.
8724
8725         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8726         type to the enum type is not allowed. Remove code corresponding to
8727         that.
8728
8729         (ConvertNumericExplicit): Allow explicit conversions from
8730         the underlying type to enum type. This precisely follows the spec
8731         and closes a bug filed by Gonzalo.
8732
8733 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8734
8735         * compiler.csproj:
8736         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8737
8738 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8739
8740         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8741         it was important that we stored the right value after the
8742         reduction in `converted'.
8743
8744 2002-09-04  Martin Baulig  <martin@gnome.org>
8745
8746         * location.cs (Location.SymbolDocument): Use full pathnames for the
8747         source files.
8748
8749 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8750
8751         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8752         of the expression resolve mechanism, because that will catch the
8753         SimpleName error failures.
8754
8755         (Conditional): If we can not resolve the
8756         expression, return, do not crash.
8757
8758 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8759
8760         * cs-tokenizer.cs:
8761         (location): display token name instead of its number.
8762
8763 2002-08-28  Martin Baulig  <martin@gnome.org>
8764
8765         * expression.cs (Binary.ResolveOperator): Don't silently return
8766         but return an error if an operator cannot be applied between two
8767         enum types.
8768
8769 2002-08-28  Martin Baulig  <martin@gnome.org>
8770
8771         * class.cs (Constructor.Define): Set the permission attributes
8772         correctly instead of making all constructors public.
8773
8774 2002-08-28  Martin Baulig  <martin@gnome.org>
8775
8776         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8777         for private members before reporting a CS0103; if we find anything,
8778         it's a CS0122.
8779
8780 2002-08-28  Martin Baulig  <martin@gnome.org>
8781
8782         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8783         to check whether `closure_start_type == closure_invocation_type',
8784         we also need to check whether `m.DeclaringType == closure_invocation_type'
8785         before bypassing the permission checks.  We might be accessing
8786         protected/private members from the base class.
8787         (TypeManager.RealMemberLookup): Only set private_ok if private
8788         members were requested via BindingFlags.NonPublic.
8789
8790         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8791
8792         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8793         MethodGroupExpr.IsExplicitImpl if appropriate.
8794         (Invocation.DoResolve): Don't report the CS0120 for explicit
8795         interface implementations.
8796
8797 2002-08-27  Martin Baulig  <martin@gnome.org>
8798
8799         * expression.cs (Invocation.DoResolve): If this is a static
8800         method and we don't have an InstanceExpression, we must report
8801         a CS0120.
8802
8803 2002-08-25  Martin Baulig  <martin@gnome.org>
8804
8805         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8806         `==' between a valuetype and an object.
8807
8808 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8809
8810         * ecore.cs (TypeExpr): Provide a ToString method.
8811
8812 2002-08-24  Martin Baulig  <martin@gnome.org>
8813
8814         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8815         now called proggie.dbg and it's a binary file.
8816
8817 2002-08-23  Martin Baulig  <martin@gnome.org>
8818
8819         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8820
8821 2002-08-23  Martin Baulig  <martin@gnome.org>
8822
8823         * struct.cs (MyStructInfo.ctor): Make this work with empty
8824         structs; it's not allowed to use foreach() on null.
8825
8826 2002-08-23  Martin Baulig  <martin@gnome.org>
8827
8828         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8829         writer the full pathname of the generated assembly.
8830
8831 2002-08-23  Martin Baulig  <martin@gnome.org>
8832
8833         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8834         A `finally' block never returns or breaks; improved handling of
8835         unreachable code.
8836
8837 2002-08-23  Martin Baulig  <martin@gnome.org>
8838
8839         * statement.cs (Throw.Resolve): Allow `throw null'.
8840
8841 2002-08-23  Martin Baulig  <martin@gnome.org>
8842
8843         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8844         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8845         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8846         MemberLookup would return a wrong event if this is an explicit
8847         interface implementation and the class has an event with the same
8848         name.
8849
8850 2002-08-23  Martin Baulig  <martin@gnome.org>
8851
8852         * statement.cs (Block.AddChildVariableNames): New public method.
8853         (Block.AddChildVariableName): Likewise.
8854         (Block.IsVariableNameUsedInChildBlock): Likewise.
8855         (Block.AddVariable): Check whether a variable name has already
8856         been used in a child block.
8857
8858         * cs-parser.jay (declare_local_variables): Mark all variable names
8859         from the current block as being used in a child block in the
8860         implicit block.
8861
8862 2002-08-23  Martin Baulig  <martin@gnome.org>
8863
8864         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
8865         find the symbol writer.
8866
8867         * driver.cs: csc also allows the arguments to /define being
8868         separated by commas, not only by semicolons.
8869
8870 2002-08-23  Martin Baulig  <martin@gnome.org>
8871
8872         * interface.cs (Interface.GetMembers): Added static check for events.
8873
8874 2002-08-15  Martin Baulig  <martin@gnome.org>
8875
8876         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
8877         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
8878
8879         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8880         why the MethodData.EmitDestructor() change was necessary.
8881
8882 2002-08-20  Martin Baulig  <martin@gnome.org>
8883
8884         * class.cs (TypeContainer.FindMembers): Added static check for events.
8885
8886         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8887
8888         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8889         use Type.GetEvents(), not Type.FindMembers().
8890
8891 2002-08-20  Martin Baulig  <martin@gnome.org>
8892
8893         * decl.cs (MemberCache): Added a special method cache which will
8894         be used for method-only searched.  This ensures that a method
8895         search will return a MethodInfo with the correct ReflectedType for
8896         inherited methods.      
8897
8898 2002-08-20  Martin Baulig  <martin@gnome.org>
8899
8900         * decl.cs (DeclSpace.FindMembers): Made this public.
8901
8902 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8903
8904         * delegate.cs: fixed build on windows.
8905         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8906
8907 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8908
8909         * ecore.cs (StandardConversionExists): Return a false
8910         if we are trying to convert the void type to anything else
8911         since that is not allowed.
8912
8913         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8914         we flag error 70 in the event an event is trying to be accessed
8915         directly from outside the declaring type.
8916
8917 2002-08-20  Martin Baulig  <martin@gnome.org>
8918
8919         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8920         MemberCache from typemanager.cs to decl.cs.
8921
8922 2002-08-19  Martin Baulig  <martin@gnome.org>
8923
8924         * class.cs (TypeContainer): Implement IMemberContainer.
8925         (TypeContainer.DefineMembers): Create the MemberCache.
8926         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8927         return public members if BindingFlags.Public was given, check
8928         whether members are static.
8929
8930 2002-08-16  Martin Baulig  <martin@gnome.org>
8931
8932         * decl.cs (DeclSpace.Define): Splitted this in Define and
8933         DefineMembers.  DefineMembers is called first and initializes the
8934         MemberCache.
8935
8936         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8937         DefineMembers() on all our DeclSpaces.
8938
8939         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8940         but call DefineMembers() on all nested interfaces.  We call their
8941         Define() in our new Define() function.
8942
8943         * interface.cs (Interface): Implement IMemberContainer.
8944         (Interface.Define): Moved all code except the attribute stuf to
8945         DefineMembers().
8946         (Interface.DefineMembers): Initialize the member cache.
8947
8948         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8949         need this anymore since we can use MemberCache.FindMembers directly.
8950
8951 2002-08-19  Martin Baulig  <martin@gnome.org>
8952
8953         * typemanager.cs (MemberCache): When creating the cache for an
8954         interface type, add all inherited members.
8955         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8956         to `out bool used_cache' and documented it.
8957         (TypeManager.MemberLookup): If we already used the cache in the first
8958         iteration, we don't need to do the interfaces check.
8959
8960 2002-08-19  Martin Baulig  <martin@gnome.org>
8961
8962         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8963         here from IMemberFinder and don't implement this interface anymore.
8964         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8965
8966         * typemanager.cs (IMemberFinder): This interface is now only used by
8967         classes which actually support the member cache.
8968         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8969         since we only put DeclSpaces into this Hashtable.
8970         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8971         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8972
8973 2002-08-16  Martin Baulig  <martin@gnome.org>
8974
8975         * typemanager.cs (ICachingMemberFinder): Removed.
8976         (IMemberFinder.MemberCache): New property.
8977         (TypeManager.FindMembers): Merged this with RealFindMembers().
8978         This function will never be called from TypeManager.MemberLookup()
8979         so we can't use the cache here, just the IMemberFinder.
8980         (TypeManager.MemberLookup_FindMembers): Check whether the
8981         IMemberFinder has a MemberCache and call the cache's FindMembers
8982         function.
8983         (MemberCache): Rewrote larger parts of this yet another time and
8984         cleaned it up a bit.
8985
8986 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8987
8988         * driver.cs (LoadArgs): Support quoting.
8989
8990         (Usage): Show the CSC-like command line arguments.
8991
8992         Improved a few error messages.
8993
8994 2002-08-15  Martin Baulig  <martin@gnome.org>
8995
8996         * typemanager.cs (IMemberContainer.Type): New property.
8997         (IMemberContainer.IsInterface): New property.
8998
8999         The following changes are conditional to BROKEN_RUNTIME, which is
9000         defined at the top of the file.
9001
9002         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9003         class'es members, but add all members from TypeHandle.ObjectType
9004         if we're an interface.
9005         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9006         is the current type.
9007         (MemberCache.CacheEntry.Container): Removed this field.
9008         (TypeHandle.GetMembers): Include inherited members.
9009
9010 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9011
9012         * typemanager.cs: fixed compilation and added a comment on a field that
9013         is never used.
9014
9015 2002-08-15  Martin Baulig  <martin@gnome.org>
9016
9017         * class.cs (ConstructorInitializer.Resolve): In the
9018         Expression.MemberLookup call, use the queried_type as
9019         invocation_type.
9020
9021         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9022         declared' attribute, it's always true.
9023         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9024         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9025         temporary wrapper for FindMembers which tells MemberLookup whether
9026         members from the base classes are included in the return value.
9027         This will go away soon.
9028         (TypeManager.MemberLookup): Use this temporary hack here; once the
9029         new MemberCache is completed, we don't need to do the DeclaredOnly
9030         looping here anymore since the MemberCache will take care of this.
9031         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9032         (MemberCache): When creating the MemberCache for a class, get
9033         members from the current class and all its base classes.
9034         (MemberCache.CacheEntry.Container): New field.  This is a
9035         temporary hack until the Mono runtime is fixed to distinguish
9036         between ReflectedType and DeclaringType.  It allows us to use MCS
9037         with both the MS runtime and the unfixed Mono runtime without
9038         problems and without accecting performance.
9039         (MemberCache.SearchMembers): The DeclaredOnly looping from
9040         TypeManager.MemberLookup is now done here.      
9041
9042 2002-08-14  Martin Baulig  <martin@gnome.org>
9043
9044         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9045         Type.GetFields on dynamic types but get the fields from the
9046         corresponding TypeContainer.
9047         (MyStructInfo.GetStructInfo): Added check for enum types.
9048
9049         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9050         (MemberList.SyncRoot): Implemented.
9051         (TypeManager.FilterWithClosure): No need to check permissions if
9052         closure_start_type == closure_invocation_type, don't crash if
9053         closure_invocation_type is null.
9054
9055 2002-08-13  Martin Baulig  <martin@gnome.org>
9056
9057         Rewrote TypeContainer.FindMembers to use a member cache.  This
9058         gives us a speed increase of about 35% for the self-hosting MCS
9059         build and of about 15-20% for the class libs (both on GNU/Linux).
9060
9061         * report.cs (Timer): New class to get enhanced profiling.  This
9062         whole class is "TIMER" conditional since it remarkably slows down
9063         compilation speed.
9064
9065         * class.cs (MemberList): New class.  This is an IList wrapper
9066         which we're now using instead of passing MemberInfo[]'s around to
9067         avoid copying this array unnecessarily.
9068         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9069         (ICachingMemberFinder, IMemberContainer): New interface.
9070         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9071         has already been checked, otherwise use it for the name comparision.
9072         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9073         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9074         if possible.  Returns a MemberList, not a MemberInfo [].
9075         (TypeHandle): New class, implements IMemberContainer.  We create
9076         one instance of this class per type, it contains a MemberCache
9077         which is used to do the member lookups.
9078         (MemberCache): New class.  Each instance of this class contains
9079         all members of a type and a name-based hash table.
9080         (MemberCache.FindMembers): This is our new member lookup
9081         function.  First, it looks up all members of the requested name in
9082         the hash table.  Then, it walks this list and sorts out all
9083         applicable members and returns them.
9084
9085 2002-08-13  Martin Baulig  <martin@gnome.org>
9086
9087         In addition to a nice code cleanup, this gives us a performance
9088         increase of about 1.4% on GNU/Linux - not much, but it's already
9089         half a second for the self-hosting MCS compilation.
9090
9091         * typemanager.cs (IMemberFinder): New interface.  It is used by
9092         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9093         Enum, Delegate or Interface.
9094         (TypeManager.finder_to_member_finder): New PtrHashtable.
9095         (TypeManager.finder_to_container): Removed.
9096         (TypeManager.finder_to_delegate): Removed.
9097         (TypeManager.finder_to_interface): Removed.
9098         (TypeManager.finder_to_enum): Removed.
9099
9100         * interface.cs (Interface): Implement IMemberFinder.
9101
9102         * delegate.cs (Delegate): Implement IMemberFinder.
9103
9104         * enum.cs (Enum): Implement IMemberFinder.
9105
9106         * class.cs (TypeContainer): Implement IMemberFinder.
9107
9108 2002-08-12  Martin Baulig  <martin@gnome.org>
9109
9110         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9111
9112 2002-08-12  Martin Baulig  <martin@gnome.org>
9113
9114         * ecore.cs (ITypeExpression): New interface for expressions which
9115         resolve to a type.
9116         (TypeExpression): Renamed to TypeLookupExpression.
9117         (Expression.DoResolve): If we're doing a types-only lookup, the
9118         expression must implement the ITypeExpression interface and we
9119         call DoResolveType() on it.
9120         (SimpleName): Implement the new ITypeExpression interface.
9121         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9122         hack, the situation that we're only looking up types can't happen
9123         anymore when this method is called.  Moved the type lookup code to
9124         DoResolveType() and call it.
9125         (SimpleName.DoResolveType): This ITypeExpression interface method
9126         is now doing the types-only lookup.
9127         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9128         (ResolveFlags): Added MaskExprClass.
9129
9130         * expression.cs (MemberAccess): Implement the ITypeExpression
9131         interface.
9132         (MemberAccess.DoResolve): Added support for a types-only lookup
9133         when we're called via ITypeExpression.DoResolveType().
9134         (ComposedCast): Implement the ITypeExpression interface.
9135
9136         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9137         Expression.Resolve() with ResolveFlags.Type instead.
9138
9139 2002-08-12  Martin Baulig  <martin@gnome.org>
9140
9141         * interface.cs (Interface.Define): Apply attributes.
9142
9143         * attribute.cs (Attribute.ApplyAttributes): Added support for
9144         interface attributes.
9145
9146 2002-08-11  Martin Baulig  <martin@gnome.org>
9147
9148         * statement.cs (Block.Emit): Only check the "this" variable if we
9149         do not always throw an exception.
9150
9151         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9152         whether the property has a set accessor.
9153
9154 2002-08-11  Martin Baulig  <martin@gnome.org>
9155
9156         Added control flow analysis support for structs.
9157
9158         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9159         with control flow analysis turned off.
9160         (IVariable): New interface.
9161         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9162         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9163         (FieldExpr.DoResolve): Resolve the instance expression with flow
9164         analysis turned off and do the definite assignment check after the
9165         resolving when we know what the expression will resolve to.
9166
9167         * expression.cs (LocalVariableReference, ParameterReference):
9168         Implement the new IVariable interface, only call the flow analysis
9169         code if ec.DoFlowAnalysis is true.
9170         (This): Added constructor which takes a Block argument.  Implement
9171         the new IVariable interface.
9172         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9173         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9174         This does the definite assignment checks for struct members.
9175
9176         * class.cs (Constructor.Emit): If this is a non-static `struct'
9177         constructor which doesn't have any initializer, call
9178         Block.AddThisVariable() to tell the flow analysis code that all
9179         struct elements must be initialized before control returns from
9180         the constructor.
9181
9182         * statement.cs (MyStructInfo): New public class.
9183         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9184         argument to this indexer.  If non-zero, check an individual struct
9185         member, not the whole struct.
9186         (FlowBranching.CheckOutParameters): Check struct members.
9187         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9188         overloaded versions of these methods which take an additional
9189         `int field_idx' argument to check struct members.
9190         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9191         overloaded versions of these methods which take an additional
9192         `string field_name' argument to check struct member.s
9193         (VariableInfo): Implement the IVariable interface.
9194         (VariableInfo.StructInfo): New public property.  Returns the
9195         MyStructInfo instance of the variable if it's a struct or null.
9196         (Block.AddThisVariable): New public method.  This is called from
9197         Constructor.Emit() for non-static `struct' constructor which do
9198         not have any initializer.  It creates a special variable for the
9199         "this" instance variable which will be checked by the flow
9200         analysis code to ensure that all of the struct's fields are
9201         initialized before control returns from the constructor.
9202         (UsageVector): Added support for struct members.  If a
9203         variable/parameter is a struct with N members, we reserve a slot
9204         in the usage vector for each member.  A struct is considered fully
9205         initialized if either the struct itself (slot 0) or all its
9206         members are initialized.
9207
9208 2002-08-08  Martin Baulig  <martin@gnome.org>
9209
9210         * driver.cs (Driver.MainDriver): Only report an error CS5001
9211         if there were no compilation errors.
9212
9213         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9214         `UnsafeContext' property to determine whether the parent is in
9215         unsafe context rather than checking the parent's ModFlags:
9216         classes nested in an unsafe class are unsafe as well.
9217
9218 2002-08-08  Martin Baulig  <martin@gnome.org>
9219
9220         * statement.cs (UsageVector.MergeChildren): Distinguish between
9221         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9222         we return.  Added test17() and test18() to test-154.cs.
9223
9224 2002-08-08  Martin Baulig  <martin@gnome.org>
9225
9226         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9227         Family access, make sure the invoking type isn't a subclass of the
9228         queried type (that'd be a CS1540).
9229
9230         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9231         this method which takes an additional `Type invocation_type'.
9232
9233         * expression.cs (BaseAccess.DoResolve): Use the base type as
9234         invocation and query type.
9235         (MemberAccess.DoResolve): If the lookup failed and we're about to
9236         report a CS0122, try a lookup with the ec.ContainerType - if this
9237         succeeds, we must report a CS1540.
9238
9239 2002-08-08  Martin Baulig  <martin@gnome.org>
9240
9241         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9242         (MethodGroupExpr): Implement the IMemberExpr interface.
9243
9244         * expression (MemberAccess.ResolveMemberAccess): No need to have
9245         any special code for MethodGroupExprs anymore, they're now
9246         IMemberExprs.   
9247
9248 2002-08-08  Martin Baulig  <martin@gnome.org>
9249
9250         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9251         Family, FamANDAssem and FamORAssem permissions.
9252         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9253
9254 2002-08-08  Martin Baulig  <martin@gnome.org>
9255
9256         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9257         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9258         or loop block.
9259
9260 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9261
9262         * driver.cs: implemented /resource option to embed managed resources.
9263
9264 2002-08-07  Martin Baulig  <martin@gnome.org>
9265
9266         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9267         (FieldBase.HasFieldInitializer): New public property.
9268         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9269         returns the field initializer and makes sure it is only resolved once.
9270         (TypeContainer.EmitFieldInitializers): Call
9271         FieldBase.GetInitializerExpression to get the initializer, this ensures
9272         that it isn't resolved multiple times.
9273
9274         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9275         the resolving process (SimpleName/MemberLookup) that we're currently
9276         emitting a field initializer (which must not access any instance members,
9277         this is an error CS0236).
9278
9279         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9280         argument, if the `IsFieldInitializer' flag is set, we must report and
9281         error CS0236 and not an error CS0120.   
9282
9283 2002-08-07  Martin Baulig  <martin@gnome.org>
9284
9285         * ecore.cs (IMemberExpr): New public interface.
9286         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9287         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9288         if the expression is an IMemberExpr.
9289
9290         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9291         to be null, implicitly default to `this' if we're non-static in
9292         this case.  Simplified the code a lot by using the new IMemberExpr
9293         interface.  Also fixed bug #28176 here.
9294
9295 2002-08-06  Martin Baulig  <martin@gnome.org>
9296
9297         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9298         ParameterReferences during semantic analysis so that we can do a
9299         type-only search when resolving Cast, TypeOf and SizeOf.
9300         (block): Pass the `current_local_parameters' to the Block's
9301         constructor.
9302
9303         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9304         argument to the constructor.
9305         (ConstructorInitializer.Resolve): Create a temporary implicit
9306         block with the parameters.
9307
9308         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9309         references here if we aren't doing a type-only search.
9310
9311         * statement.cs (Block): Added constructor which takes a
9312         `Parameters parameters' argument.
9313         (Block.Parameters): New public property.
9314
9315         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9316         to `Parameters' and made it public readonly.
9317
9318 2002-08-06  Martin Baulig  <martin@gnome.org>
9319
9320         * ecore.cs (Expression.Warning): Made this public as well.
9321
9322         * report.cs (Report.Debug): Print the contents of collections.
9323
9324 2002-08-06  Martin Baulig  <martin@gnome.org>
9325
9326         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9327         used to tell Resolve() which kinds of expressions it may return.
9328         (Expression.Resolve): Added overloaded version of this method which
9329         takes a `ResolveFlags flags' argument.  This can be used to tell
9330         Resolve() which kinds of expressions it may return.  Reports a
9331         CS0118 on error.
9332         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9333         ResolveFlags.SimpleName.
9334         (Expression.Error118): Added overloaded version of this method which
9335         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9336         which kinds of expressions are allowed.
9337
9338         * expression.cs (Argument.ResolveMethodGroup): New public method.
9339         Resolves an argument, but allows a MethodGroup to be returned.
9340         This is used when invoking a delegate.
9341
9342         * TODO: Updated a bit.
9343
9344 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9345
9346         Fixed compilation with csc.
9347
9348         * ecore.cs: Expression.Error made public. Is this correct? Should
9349         Warning be made public too?
9350
9351         * expression.cs: use ea.Location instead of ea.loc.
9352         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9353
9354 2002-08-06  Martin Baulig  <martin@gnome.org>
9355
9356         * ecore.cs (Expression.loc): Moved the location here instead of
9357         duplicating it in all derived classes.
9358         (Expression.Location): New public property.
9359         (Expression.Error, Expression.Warning): Made them non-static and
9360         removed the location argument.
9361         (Expression.Warning): Added overloaded version which takes an
9362         `int level' argument.
9363         (Expression.Error118): Make this non-static and removed the
9364         expression and location arguments.
9365         (TypeExpr): Added location argument to the constructor.
9366
9367         * expression.cs (StaticCallExpr): Added location argument to
9368         the constructor.
9369         (Indirection, PointerArithmetic): Likewise.
9370         (CheckedExpr, UnCheckedExpr): Likewise.
9371         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9372         (StringPtr): Likewise.
9373
9374
9375 2002-08-05  Martin Baulig  <martin@gnome.org>
9376
9377         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9378
9379         * assign.cs (Assign.DoResolve): Check whether the source
9380         expression is a value or variable.
9381
9382         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9383         while resolving the corresponding blocks.
9384
9385         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9386         an error, don't silently return null.
9387
9388         * statement.cs (Block.AddVariable): Do the error reporting here
9389         and distinguish between CS0128 and CS0136.
9390         (Block.DoResolve): Report all unused labels (warning CS0164).
9391         (LabeledStatement): Pass the location to the constructor.
9392         (LabeledStatement.HasBeenReferenced): New property.
9393         (LabeledStatement.Resolve): Set it to true here.
9394
9395         * statement.cs (Return.Emit): Return success even after reporting
9396         a type mismatch error (CS0126 or CS0127), this is what csc does and
9397         it avoids confusing the users with any consecutive errors.
9398
9399 2002-08-05  Martin Baulig  <martin@gnome.org>
9400
9401         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9402
9403         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9404
9405         * expression.cs (MemberAccess.DoResolve): Silently return if an
9406         error has already been reported.
9407
9408         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9409         error has already been reported.
9410
9411 2002-08-05  Martin Baulig  <martin@gnome.org>
9412
9413         * statement.cs (UsageVector): Only initialize the `parameters'
9414         vector if we actually have any "out" parameters.
9415
9416 2002-08-05  Martin Baulig  <martin@gnome.org>
9417
9418         * expression.cs (Binary.ResolveOperator): When combining delegates,
9419         they must have the same type.
9420
9421 2002-08-05  Martin Baulig  <martin@gnome.org>
9422
9423         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9424         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9425         work with the ms runtime and we also don't need it: if we're a
9426         PropertyBuilder and not in the `indexer_arguments' hash, then we
9427         are a property and not an indexer.
9428
9429         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9430         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9431         since the latter one doesn't work with the ms runtime.
9432
9433 2002-08-03  Martin Baulig  <martin@gnome.org>
9434
9435         Fixed bugs #27998 and #22735.
9436
9437         * class.cs (Method.IsOperator): New public field.
9438         (Method.CheckBase): Report CS0111 if there's already a method
9439         with the same parameters in the current class.  Report CS0508 when
9440         attempting to change the return type of an inherited method.
9441         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9442         and it's not marked abstract or extern.
9443         (PropertyBase): New abstract base class for Property and Indexer.
9444         (PropertyBase.CheckBase): Moved here from Property and made it work
9445         for indexers.
9446         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9447         the same so we can reuse it there.
9448         (Property, Indexer): Derive from PropertyBase.
9449         (MethodSignature.inheritable_property_signature_filter): New delegate
9450         to find properties and indexers.
9451
9452         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9453         argument and improved error reporting.
9454
9455         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9456         EmptyReadOnlyParameters and made it a property.
9457
9458         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9459         version of this method which takes a `PropertyInfo indexer'.
9460         (TypeManager.RegisterIndexer): New method.
9461
9462         * class.cs: Added myself as author of this file :-)
9463
9464 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9465
9466         * class.cs: fixed compilation on windoze.
9467
9468 2002-08-03  Martin Baulig  <martin@gnome.org>
9469
9470         * interface.cs (Interface.GetInterfaceBases): Check whether all
9471         base interfaces are at least as accessible than the current one.
9472
9473         * class.cs (TypeContainer.GetClassBases): Check whether base types
9474         are at least as accessible than the current type.
9475         (TypeContainer.AsAccessible): Implemented and made non-static.
9476         (MemberBase.CheckParameters): Report errors if the accessibility
9477         checks fail.
9478
9479         * delegate.cs (Delegate.Delegate): The default visibility is
9480         internal for top-level types and private for nested types.
9481         (Delegate.Define): Report errors if the accessibility checks fail.
9482
9483         * enum.cs (Enum.Enum): The default visibility is internal for
9484         top-level types and private for nested types.
9485         (Enum.DefineType): Compute the correct visibility.
9486
9487         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9488         function which takes a `bool is_toplevel' instead of a TypeContainer.
9489
9490         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9491         builtin type.
9492
9493 2002-08-02  Martin Baulig  <martin@gnome.org>
9494
9495         * expression.cs (LocalVariableReferenc): Added constructor which
9496         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9497         (LocalVariableReference.IsReadOnly): New property.
9498         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9499         variable is readonly, use our own readonly flag to do this; you can
9500         use the new constructor to get a writable reference to a read-only
9501         variable.
9502
9503         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9504         reference to the local variable.
9505
9506 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9507
9508         * rootcontext.cs (ResolveCore): Also include System.Exception
9509
9510         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9511         we reach an EmptyStatement.
9512
9513         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9514         is also fine.
9515
9516         * expression.cs (Binary.ResolveOperator): Check error result in
9517         two places.
9518
9519         use brtrue/brfalse directly and avoid compares to null.
9520
9521 2002-08-02  Martin Baulig  <martin@gnome.org>
9522
9523         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9524         Fixes bug #28407, added test-155.cs.
9525
9526 2002-08-01  Martin Baulig  <martin@gnome.org>
9527
9528         * class.cs (Event.EmitDefaultMethod): Make this work with static
9529         events.  Fixes #28311, added verify-3.cs.
9530
9531 2002-08-01  Martin Baulig  <martin@gnome.org>
9532
9533         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9534         `is_disposable' fields.
9535         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9536         `hm.is_disposable' if we're using the collection pattern.
9537         (Foreach.EmitCollectionForeach): Use the correct type for the
9538         enumerator's local variable, only emit the try/finally block if
9539         necessary (fixes #27713).
9540
9541 2002-08-01  Martin Baulig  <martin@gnome.org>
9542
9543         * ecore.cs (Expression.report118): Renamed to Error118 and made
9544         it public static.
9545
9546         * statement.cs (Throw.Resolve): Check whether the expression is of
9547         the correct type (CS0118) and whether the type derives from
9548         System.Exception (CS0155).
9549         (Catch.Resolve): New method.  Do the type lookup here and check
9550         whether it derives from System.Exception (CS0155).
9551         (Catch.CatchType, Catch.IsGeneral): New public properties.
9552
9553         * typemanager.cs (TypeManager.exception_type): Added.
9554
9555 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9556
9557         * driver.cs: Updated About function.
9558
9559 2002-07-31  Martin Baulig  <martin@gnome.org>
9560
9561         Implemented Control Flow Analysis.
9562
9563         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9564         (EmitContext.CurrentBranching): Added.
9565         (EmitContext.StartFlowBranching): Added.
9566         (EmitContext.EndFlowBranching): Added.
9567         (EmitContext.KillFlowBranching): Added.
9568         (EmitContext.IsVariableAssigned): Added.
9569         (EmitContext.SetVariableAssigned): Added.
9570         (EmitContext.IsParameterAssigned): Added.
9571         (EmitContext.SetParameterAssigned): Added.
9572         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9573         Added control flow analysis stuff here.
9574
9575         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9576         resolve the expression as lvalue.
9577         (LocalVariableReference.DoResolve): Check whether the variable has
9578         already been assigned.
9579         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9580         the parameter as assigned here.
9581         (ParameterReference.DoResolve): Check whether the parameter has already
9582         been assigned.
9583         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9584         expression as lvalue.
9585
9586         * statement.cs (FlowBranching): New class for the flow analysis code.
9587         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9588         (LabeledStatement.IsDefined): New public property.
9589         (LabeledStatement.AddUsageVector): New public method to tell flow
9590         analyis that the label may be reached via a forward jump.
9591         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9592         flow analysis.
9593         (VariableInfo.Number): New public field.  This is used by flow analysis
9594         to number all locals of a block.
9595         (Block.CountVariables): New public property.  This is the number of
9596         local variables in this block (including the locals from all parent
9597         blocks).
9598         (Block.EmitMeta): Number all the variables.
9599
9600         * statement.cs: Added flow analysis support to all classes.
9601
9602 2002-07-31  Martin Baulig  <martin@gnome.org>
9603
9604         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9605         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9606         then use this argument.
9607
9608         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9609
9610         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9611         use this to specify /define options.
9612
9613 2002-07-29  Martin Baulig  <martin@gnome.org>
9614
9615         * statement.cs (Fixed): Moved all code that does variable lookups
9616         and resolvings from Emit to Resolve.
9617
9618         * statement.cs (For): Moved all code that does variable lookups
9619         and resolvings from Emit to Resolve.
9620
9621         * statement.cs (Using): Moved all code that does variable lookups
9622         and resolvings from Emit to Resolve.
9623
9624 2002-07-29  Martin Baulig  <martin@gnome.org>
9625
9626         * attribute.cs (Attribute.Resolve): Explicitly catch a
9627         System.NullReferenceException when creating the
9628         CustromAttributeBuilder and report a different warning message.
9629
9630 2002-07-29  Martin Baulig  <martin@gnome.org>
9631
9632         * support.cs (ParameterData.ParameterName): Added method to
9633         get the name of a parameter.
9634
9635         * typemanager.cs (TypeManager.IsValueType): New public method.
9636
9637 2002-07-29  Martin Baulig  <martin@gnome.org>
9638
9639         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9640         is a flag which specifies that it's either ref or out.
9641         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9642         the out parameter to `out Parameter.Modifier mod', also set the
9643         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9644
9645         * support.cs (InternalParameters.ParameterModifier): Distinguish
9646         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9647         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9648
9649         * expression.cs (Argument.GetParameterModifier): Distinguish
9650         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9651         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9652
9653 2002-07-29  Martin Baulig  <martin@gnome.org>
9654
9655         * expression.cs (ParameterReference.ParameterReference): Added
9656         `Location loc' argument to the constructor.
9657
9658         * cs-parser.jay: Pass location to ParameterReference.
9659
9660 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9661
9662         * statement.cs (Try): Initialize the location.
9663
9664         * cs-parser.jay: pass location to Try.
9665
9666         * expression.cs (Unary.Reduce): Change the prototype to return
9667         whether a constant fold could be performed or not.  The result is
9668         returned in an out parameters.  In the case of Indirection and
9669         AddressOf, we want to perform the full tests.
9670
9671 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9672
9673         * statement.cs (Statement.Emit): Flag dead code.
9674
9675 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9676
9677         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9678
9679 2002-07-27  Martin Baulig  <martin@gnome.org>
9680
9681         * class.cs (MethodData.Define): Put back call to
9682         TypeManager.AddMethod(), accidentally commented this out.
9683
9684         * report.cs (Debug): New public method to print debugging information,
9685         this is `[Conditional ("DEBUG")]'.
9686
9687 2002-07-26  Martin Baulig  <martin@gnome.org>
9688
9689         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9690         (switch_statement): Push the current_block to the switch_stack and
9691         pop it again when we're done with the switch.
9692         (switch_section): The new block is a child of the current_block.
9693         Fixes bug #24007, added test-152.cs.
9694
9695 2002-07-27  Martin Baulig  <martin@gnome.org>
9696
9697         * expression.cs (Invocation.EmitArguments): When calling a varargs
9698         function with only its fixed arguments, we need to pass an empty
9699         array.
9700
9701 2002-07-27  Martin Baulig  <martin@gnome.org>
9702
9703         Mono 0.13 has been released.
9704
9705 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9706
9707         * driver.cs: Rename --resource to --linkres, because that is what
9708         we do currently, we dont support --resource yet.
9709
9710         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9711
9712 2002-07-25  Martin Baulig  <martin@gnome.org>
9713
9714         * class.cs (MethodData): New public class.  This is a `method builder'
9715         class for a method or one accessor of a Property/Indexer/Event.
9716         (MethodData.GetMethodFlags): Moved here from MemberBase.
9717         (MethodData.ApplyAttributes): Likewise.
9718         (MethodData.ApplyObsoleteAttribute): Likewise.
9719         (MethodData.ApplyConditionalAttribute): Likewise.
9720         (MethodData.ApplyDllImportAttribute): Likewise.
9721         (MethodData.CheckAbstractAndExternal): Likewise.
9722         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9723         (MethodData.Emit): Formerly known as Method.Emit().
9724         (MemberBase): Moved everything which was specific to a single
9725         accessor/method to MethodData.
9726         (Method): Create a new MethodData and call Define() and Emit() on it.
9727         (Property, Indexer, Event): Create a new MethodData objects for each
9728         accessor and call Define() and Emit() on them.
9729
9730 2002-07-25  Martin Baulig  <martin@gnome.org>
9731
9732         Made MethodCore derive from MemberBase to reuse the code from there.
9733         MemberBase now also checks for attributes.
9734
9735         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9736         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9737         as virtual.
9738         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9739         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9740         (MemberBase.ApplyAttributes): New virtual method; applies the
9741         attributes to a method or accessor.
9742         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9743         (MemberBase.ApplyConditionalAttribute): Likewise.
9744         (MemberBase.ApplyDllImportAttribute): Likewise.
9745         (MemberBase.CheckAbstractAndExternal): Likewise.
9746         (MethodCore.ParameterTypes): This is now a property instead of a
9747         method, it's initialized from DoDefineParameters().
9748         (MethodCore.ParameterInfo): Removed the set accessor.
9749         (MethodCore.DoDefineParameters): New protected virtual method to
9750         initialize ParameterTypes and ParameterInfo.
9751         (Method.GetReturnType): We can now simply return the MemberType.
9752         (Method.GetMethodFlags): Override the MemberBase version and add
9753         the conditional flags.
9754         (Method.CheckBase): Moved some code from Define() here, call
9755         DoDefineParameters() here.
9756         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9757         here to avoid some larger code duplication.
9758         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9759         ensure that abstract and external accessors don't declare a body.
9760
9761         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9762         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9763         lookup in the attribute's parent classes, so we need to abort as soon
9764         as we found the first match.
9765         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9766         the attribute has no arguments.
9767
9768         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9769         of a Method.
9770
9771 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9772
9773         * cs-parser.jay: reverted previous patch.
9774
9775 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9776
9777         * cs-parser.jay: fixed bug #22119.
9778
9779 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9780
9781         * attribute.cs: fixed compilation. The error was:
9782         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9783         be assigned to before control leaves the current method."
9784         [FIXME:  Filed as bug #28186: MCS must report this error.]
9785
9786 2002-07-25  Martin Baulig  <martin@gnome.org>
9787
9788         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9789         method to pull the condition name ouf of a Conditional attribute.
9790         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9791         the obsolete message and error flag out of an Obsolete attribute.
9792
9793         * class.cs (Method.GetMethodFlags): New public method to get the
9794         TypeManager.MethodFlags for this method.
9795         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9796         private methods.
9797         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9798         if we're overriding a virtual function, set the new private variable
9799         `parent_method'; call the new TypeManager.AddMethod().
9800
9801         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9802         the MethodBuilder and the Method in a PtrHashtable.
9803         (TypeManager.builder_to_method): Added for this purpose.
9804         (TypeManager.MethodFlags): Added IsObsoleteError.
9805         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9806         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9807         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9808         the message from the attribute.
9809
9810 2002-07-24  Martin Baulig  <martin@gnome.org>
9811
9812         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9813         preprocessor directives, ensure that the argument to #define/#undef is
9814         exactly one identifier and that it's actually an identifier.
9815
9816         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9817         did not work ....
9818
9819 2002-07-24  Martin Baulig  <martin@gnome.org>
9820
9821         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9822         initialize it to TypeManager.object_type in the constructor.
9823         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9824         of the `hm.get_current' method if we're using the collection pattern.
9825         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9826         for the explicit conversion to make it work when we're using the collection
9827         pattern and the `Current' property has a different return type than `object'.
9828         Fixes #27713.
9829
9830 2002-07-24  Martin Baulig  <martin@gnome.org>
9831
9832         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9833         does not match, but don't report any errors.  This method is called in
9834         order for all methods in a MethodGroupExpr until a matching method is
9835         found, so we don't want to bail out if the first method doesn't match.
9836         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9837         matches, report the 123.  Fixes #28070.
9838
9839 2002-07-24  Martin Baulig  <martin@gnome.org>
9840
9841         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9842         TypeManager.TypeToCoreType() to the top of the method so the
9843         following equality checks will work.  Fixes #28107.
9844
9845 2002-07-24  Martin Baulig  <martin@gnome.org>
9846
9847         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9848         operand is of type uint, and the other operand is of type sbyte,
9849         short or int, the operands are converted to type long." -
9850         Actually do what this comment already told us.  Fixes bug #28106,
9851         added test-150.cs.
9852
9853 2002-07-24  Martin Baulig  <martin@gnome.org>
9854
9855         * class.cs (MethodBase): New abstract class.  This is now a base
9856         class for Property, Indexer and Event to avoid some code duplication
9857         in their Define() and DefineMethods() methods.
9858         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
9859         generic methods for Define() and DefineMethods().
9860         (FieldBase): Derive from MemberBase, not MemberCore.
9861         (Property): Derive from MemberBase, not MemberCore.
9862         (Property.DefineMethod): Moved all the code from this method to the
9863         new MethodBase.DefineAccessor(), just call it with appropriate
9864         argumetnts.
9865         (Property.Define): Call the new Property.DoDefine(), this does some
9866         sanity checks and we don't need to duplicate the code everywhere.
9867         (Event): Derive from MemberBase, not MemberCore.
9868         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
9869         accessors, this will also make them work with interface events.
9870         (Indexer): Derive from MemberBase, not MemberCore.
9871         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
9872         (Indexer.Define): Use the new MethodBase functions.
9873
9874         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
9875         argument to the constructor.
9876         (Interface.FindMembers): Added support for interface events.
9877         (Interface.PopluateEvent): Implemented.
9878
9879         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9880
9881 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9882
9883         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9884         but this is required to check for a method name being the same as
9885         the containing class.  
9886
9887         Handle this now.
9888
9889 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9890
9891         * interface.cs: initialize variable.
9892
9893 2002-07-23  Martin Baulig  <martin@gnome.org>
9894
9895         Implemented the IndexerName attribute in interfaces.
9896
9897         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9898         name if this is an explicit interface implementation.
9899         (Indexer.InterfaceIndexerName): New public variable.  If we're
9900         implementing an interface indexer, this is the IndexerName in that
9901         interface.  Otherwise, it's the IndexerName.
9902         (Indexer.DefineMethod): If we're implementing interface indexer,
9903         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9904         and Pending.ImplementIndexer methods.
9905         (Indexer.Define): Also define the PropertyBuilder if we're
9906         implementing an interface indexer and this is neither an explicit
9907         interface implementation nor do the IndexerName match the one in
9908         the interface.
9909
9910         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9911         If a method is defined here, then we always need to create a proxy
9912         for it.  This is used when implementing interface indexers.
9913         (Pending.IsInterfaceIndexer): New public method.
9914         (Pending.ImplementIndexer): New public method.
9915         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9916         This is used when implementing interface indexers to define a proxy
9917         if necessary.
9918         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9919         define a proxy if necessary.
9920
9921         * interface.cs (Interface.IndexerName): New public variable.
9922         (Interface.PopulateIndexer): Set the IndexerName.
9923         (Interface.DefineIndexers): New private method.  Populate all the
9924         indexers and make sure their IndexerNames match.
9925
9926         * typemanager.cs (IndexerPropertyName): Added support for interface
9927         indexers.
9928
9929 2002-07-22  Martin Baulig  <martin@gnome.org>
9930
9931         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9932         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9933         ret if HasReturnLabel.
9934         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9935         variables.
9936
9937         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9938         and set the ec.LoopBeginTryCatchLevel.
9939         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9940         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9941         the current ec.TryCatchLevel, the branch goes out of an exception
9942         block.  In this case, we need to use Leave and not Br.
9943
9944 2002-07-22  Martin Baulig  <martin@gnome.org>
9945
9946         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9947         block unless the block does not always return or it is contained in
9948         another try { ... } catch { ... } block.  Fixes bug #26506.
9949         Added verify-1.cs to the test suite.
9950
9951 2002-07-22  Martin Baulig  <martin@gnome.org>
9952
9953         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9954         then we do not always return.  Fixes bug #24985.
9955
9956 2002-07-22  Martin Baulig  <martin@gnome.org>
9957
9958         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9959         lookup on a per-class level; ie. walk up the class hierarchy until we
9960         found at least one applicable method, then choose the best among them.
9961         Fixes bug #24463 and test-29.cs.
9962
9963 2002-07-22  Martin Baulig  <martin@gnome.org>
9964
9965         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9966         return types of the methods.  The return type is not part of the
9967         signature and we must not check it to make the `new' modifier work.
9968         Fixes bug #27999, also added test-147.cs.
9969         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9970
9971         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9972         on the method's return type.
9973
9974 2002-07-21  Martin Baulig  <martin@gnome.org>
9975
9976         * assign.cs: Make this work if the rightmost source is a constant and
9977         we need to do an implicit type conversion.  Also adding a few more tests
9978         to test-38.cs which should have caught this.
9979
9980         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9981         target in the makefile for this.  The makefile.gnu is primarily intended
9982         for end-users who don't want to debug the compiler.
9983
9984 2002-07-21  Martin Baulig  <martin@gnome.org>
9985
9986         * assign.cs: Improved the Assign class so it can now handle embedded
9987         assignments (X = Y = Z = something).  As a side-effect this'll now also
9988         consume less local variables.  test-38.cs now passes with MCS, added
9989         a few new test cases to that test.
9990
9991 2002-07-20  Martin Baulig  <martin@gnome.org>
9992
9993         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
9994         instructions.  Fixes bug #27977, also added test-146.cs.
9995
9996 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9997
9998         * cs-tokenizer.cs: fixed getHex ().
9999
10000 2002-07-19  Martin Baulig  <martin@gnome.org>
10001
10002         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10003         not Type.GetType() to lookup the array type.  This is needed when
10004         we're constructing an array of a user-defined type.
10005         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10006         single-dimensional arrays, but also for single-dimensial arrays of
10007         type decimal.
10008
10009 2002-07-19  Martin Baulig  <martin@gnome.org>
10010
10011         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10012         this function is called, it's not allowed to share LocalBuilders
10013         among ILGenerators.
10014
10015 2002-07-19  Martin Baulig  <martin@gnome.org>
10016
10017         * expression.cs (Argument.Resolve): Report an error 118 when trying
10018         to pass a type as argument.
10019
10020 2002-07-18  Martin Baulig  <martin@gnome.org>
10021
10022         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10023         Conv_R_Un for the signed `long' type.
10024
10025 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10026
10027         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10028         `expr' for the temporary result, as that will fail if we do
10029         multiple resolves on the same expression.
10030
10031 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10032
10033         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10034         ec.TypeContainer for looking up aliases. 
10035
10036         * class.cs (TypeContainer): Remove LookupAlias from here.
10037
10038         * decl.cs (DeclSpace); Move here.
10039
10040 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10041
10042         * class.cs (FindMembers): Only call filter if the constructor
10043         bulider is not null.
10044
10045         Also handle delegates in `NestedTypes' now.  Now we will perform
10046         type lookups using the standard resolution process.  This also
10047         fixes a bug.
10048
10049         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10050         This uses Expressions (the limited kind that can be parsed by the
10051         tree) instead of strings.
10052
10053         * expression.cs (ComposedCast.ToString): Implement, used to flag
10054         errors since now we have to render expressions.
10055
10056         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10057         FormArrayType. 
10058
10059         * ecore.cs (SimpleName.ToString): ditto.
10060
10061         * cs-parser.jay: Instead of using strings to assemble types, use
10062         Expressions to assemble the type (using SimpleName, ComposedCast,
10063         MemberAccess).  This should fix the type lookups in declarations,
10064         because we were using a different code path for this.
10065
10066         * statement.cs (Block.Resolve): Continue processing statements
10067         even when there is an error.
10068
10069 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10070
10071         * class.cs (Event.Define): Also remove the `remove' method from
10072         the list of pending items.
10073
10074         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10075         generate more compact code. 
10076
10077 2002-07-17  Martin Baulig  <martin@gnome.org>
10078
10079         * const.cs (Const.LookupConstantValue): Add support for constant
10080         `unchecked' and `checked' expressions.
10081         Also adding test case test-140.cs for this.
10082
10083 2002-07-17  Martin Baulig  <martin@gnome.org>
10084
10085         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10086         check whether mi.ReturnType implements the IEnumerator interface; the
10087         `==' and the IsAssignableFrom() will fail in this situation.
10088
10089 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10090
10091         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10092         here too.
10093
10094 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10095
10096         * expression.cs: fixed bug #27811.
10097
10098 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10099
10100         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10101         Molaro: when we are a ref, the value already contains a pointer
10102         value, do not take the address of it.
10103
10104 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10105         * removed mb-parser.jay and mb-tokenizer.cs
10106
10107 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10108
10109         * expression.cs: check against the building corlib void type.
10110
10111 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10112
10113         * ecore.cs: fix for valuetype static readonly fields: when 
10114         initializing them, we need their address, not the address of a copy.
10115
10116 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10117
10118         * typemanager.cs: register also enum_type in corlib.
10119
10120 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10121
10122         * class.cs: allow calling this (but not base) initializers in structs.
10123
10124 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10125
10126         * ecore.cs: make sure we compare against the building base types
10127         in GetTypeSize ().
10128
10129 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10130
10131         * typemanager.cs: fix TypeToCoreType() to handle void and object
10132         (corlib gets no more typerefs after this change).
10133
10134 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10135
10136         * expression.cs (ArrayCreation.EmitArrayArguments): use
10137         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10138
10139         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10140         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10141         array indexes, the runtime actually forbids them.
10142
10143         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10144         for array arguments here.
10145
10146         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10147         instead of the default for ValueTypes.
10148
10149         (New.DoEmit): Use IsValueType instead of
10150         IsSubclassOf (value_type)
10151         (New.DoResolve): ditto.
10152         (Invocation.EmitCall): ditto.
10153
10154         * assign.cs (Assign): ditto.
10155
10156         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10157         Statements *are* currently doing part of their resolution during
10158         Emit.  
10159
10160         Expressions do always resolve during resolve, but statements are
10161         only required to propagate resolution to their children.
10162
10163 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10164
10165         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10166
10167         (LoadAssembly): Do not add the dll if it is already specified
10168
10169         (MainDriver): Add the System directory to the link path at the end,
10170         after all the other -L arguments. 
10171
10172         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10173         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10174         ldelem.u1) and using the opposite for sbytes.
10175
10176         This fixes Digger, and we can finally run it.
10177
10178         * driver.cs (UnixParseOption): Move the option parsing here.  
10179         (CSCParseOption): Implement CSC-like parsing of options.
10180
10181         We now support both modes of operation, the old Unix way, and the
10182         new CSC-like way.  This should help those who wanted to make cross
10183         platform makefiles.
10184
10185         The only thing broken is that /r:, /reference: and /lib: are not
10186         implemented, because I want to make those have the same semantics
10187         as the CSC compiler has, and kill once and for all the confussion
10188         around this.   Will be doing this tomorrow.
10189
10190         * statement.cs (Unsafe.Resolve): The state is checked during
10191         resolve, not emit, so we have to set the flags for IsUnsfe here.
10192
10193 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10194
10195         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10196         not catch the Error_ObjectRefRequired in SimpleName (as it is
10197         possible to have a class/instance variable name that later gets
10198         deambiguated), we have to check this here.      
10199
10200 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10201
10202         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10203         make static and put into Expression.
10204
10205         (Event.Define): Register the private field of the event with the 
10206         TypeManager so that GetFieldFromEvent can get at it.
10207
10208         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10209         keep track of the private field associated with an event which
10210         has no accessors.
10211
10212         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10213         private field.
10214
10215         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10216
10217 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10218
10219         * expression.cs (Binary.EmitBranchable): this routine emits the
10220         Binary expression in a branchable context.  This basically means:
10221         we need to branch somewhere, not just get the value on the stack.
10222
10223         This works together with Statement.EmitBoolExpression.
10224
10225         * statement.cs (Statement.EmitBoolExpression): Use
10226         EmitBranchable. 
10227
10228 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10229
10230         * statement.cs (For): Reduce the number of jumps in loops.
10231
10232         (For): Implement loop inversion for the For statement.
10233
10234         (Break): We can be breaking out of a Try/Catch controlled section
10235         (foreach might have an implicit try/catch clause), so we need to
10236         use Leave instead of Br.
10237
10238         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10239         now).  If the instace expression supports IMemoryLocation, we use
10240         the AddressOf method from the IMemoryLocation to extract the
10241         address instead of emitting the instance.
10242
10243         This showed up with `This', as we were emitting the instance
10244         always (Emit) instead of the Address of This.  Particularly
10245         interesting when This is a value type, as we dont want the Emit
10246         effect (which was to load the object).
10247
10248 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10249
10250         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10251
10252         * statement.cs (Checked): Set the CheckedState during the resolve
10253         process too, as the ConvCast operations track the checked state on
10254         the resolve process, and not emit.
10255
10256         * cs-parser.jay (namespace_member_declaration): Flag that we have
10257         found a declaration when we do.  This is used to flag error 1529
10258
10259         * driver.cs: Report ok when we display the help only.
10260
10261 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10262
10263         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10264
10265 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10266
10267         * cs-tokenizer.cs (define): We also have to track locally the
10268         defines.  AllDefines is just used for the Conditional Attribute,
10269         but we also need the local defines for the current source code. 
10270
10271 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10272
10273         * statement.cs (While, For, Do): These loops can exit through a
10274         Break statement, use this information to tell whether the
10275         statement is the last piece of code.
10276
10277         (Break): Flag that we break.
10278
10279         * codegen.cs (EmitContexts): New `Breaks' state variable.
10280
10281 2002-07-03  Martin Baulig  <martin@gnome.org>
10282
10283         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10284         modifiers in method declarations in structs.  Otherwise, you won't
10285         be able to override things like Object.Equals().
10286
10287 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10288
10289         * class.cs (Method, Property, Indexer): Do not allow the public
10290         modifier to be used in explicit interface implementations.
10291
10292         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10293         override modifiers in method declarations in structs
10294
10295 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10296
10297         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10298         integer or real overflow, report an error
10299
10300 2002-07-02  Martin Baulig  <martin@gnome.org>
10301
10302         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10303         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10304         to tell the runtime about our newly created System.Object and
10305         System.ValueType types.
10306
10307 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10308
10309         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10310         struct instead of Ldarg/Starg.
10311
10312 2002-07-02  Martin Baulig  <martin@gnome.org>
10313
10314         * expression.cs (Indirection.Indirection): Call
10315         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10316
10317 2002-07-02  Martin Baulig  <martin@gnome.org>
10318
10319         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10320         ValueType, call TypeManager.TypeToCoreType() on it.
10321         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10322         the OpCodes.Newarr argument.
10323
10324 2002-07-02  Martin Baulig  <martin@gnome.org>
10325
10326         * expression.cs (Invocation.EmitCall): When compiling corlib,
10327         replace all calls to the system's System.Array type to calls to
10328         the newly created one.
10329
10330         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10331         System.Array methods.
10332         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10333         from the system's System.Array type which must be replaced.
10334
10335 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10336
10337         * typemanager.cs: load unverifiable_code_ctor so we can build
10338         corlib using the correct type. Avoid using GetTypeCode() with
10339         TypeBuilders.
10340         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10341         TypeManager.object_type to allow building corlib.
10342
10343 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10344
10345         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10346
10347 2002-07-01  Martin Baulig  <martin@gnome.org>
10348
10349         * class.cs: Make the last change actually work, we need to check
10350         whether `ifaces != null' to avoid a crash.
10351
10352 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10353
10354         * class.cs: when we build structs without fields that implement
10355         interfaces, we need to add the interfaces separately, since there is
10356         no API to both set the size and add the interfaces at type creation
10357         time.
10358
10359 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10360
10361         * expression.cs: the dimension arguments to the array constructors
10362         need to be converted if they are a long.
10363
10364 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10365
10366         * class.cs: don't emit ldarg.0 if there is no parent constructor
10367         (fixes showstopper for corlib).
10368
10369 2002-06-29  Martin Baulig  <martin@gnome.org>
10370
10371         MCS now compiles corlib on GNU/Linux :-)
10372
10373         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10374         ie. check for MethodImplOptions.InternalCall.
10375
10376         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10377         and TypeManager.attribute_type are null, so we must explicitly check
10378         whether parent is not null to find out whether it's an attribute type.
10379         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10380         and SetBuilder, not only if the property is neither abstract nor external.
10381         This is necessary to set the MethodImplOptions on the accessor methods.
10382         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10383         SetBuilder, see Property.Emit().
10384
10385         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10386         populate "System.Object", "System.ValueType" and "System.Attribute" since
10387         they've already been populated from BootCorlib_PopulateCoreTypes().
10388
10389 2002-06-29  Martin Baulig  <martin@gnome.org>
10390
10391         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10392         is the NullLiteral, we also need to make sure that target_type is not
10393         an enum type.   
10394
10395 2002-06-29  Martin Baulig  <martin@gnome.org>
10396
10397         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10398         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10399         before calling BootstrapCorlib_ResolveDelegate ().
10400
10401 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10402
10403         * statement.cs: fixed build-breaker. All tests passed ok.
10404
10405 2002-06-27  Martin Baulig  <martin@gnome.org>
10406
10407         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10408         for System.Decimal when compiling corlib.
10409
10410 2002-06-27  Martin Baulig  <martin@gnome.org>
10411
10412         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10413         switch blocks which contain nothing but a default clause.
10414
10415 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10416
10417        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10418
10419 2002-06-27  Martin Baulig  <martin@gnome.org>
10420
10421         * ecore.cs (PropertyExpr.PropertyExpr): Call
10422         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10423
10424         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10425         is already a TypeBuilder.
10426
10427 2002-06-27  Martin Baulig  <martin@gnome.org>
10428
10429         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10430         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10431         the "from an array-type to System.Array" case.  This makes it work
10432         when compiling corlib.
10433
10434 2002-06-27  Martin Baulig  <martin@gnome.org>
10435
10436         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10437         non-static PropertyExpr, set its InstanceExpression.  This makes
10438         the `ICollection.Count' property work in System/Array.cs.
10439
10440 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10441
10442         * driver.cs: Made error handling more consistent.  Errors now
10443         tracked by Report class, so many methods which used to return int
10444         now return void.  Main() now prints success/failure and 
10445         errors/warnings message.
10446
10447         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10448         the magic number return values (123 and 124).  Now, if the
10449         expected error occurs, the compiler exits with success (exit value
10450         0).  If the compilation completes without seeing that particular
10451         error, the compiler exits with failure (exit value 1).  The
10452         makefile in mcs/errors has been changed to handle the new behaviour.
10453
10454         * report.cs: Made 'expected error' number a property and renamed
10455         it from 'Probe' to 'ExpectedError'.
10456
10457         * genericparser.cs: Removed error handling support, since it is
10458         now all done by Report class.
10459
10460         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10461         class, so parse() no longer returns an int.
10462
10463         * namespace.cs: Use Report.Error instead of GenericParser.error
10464
10465 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10466
10467         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10468         TypeContainer.AddOperator): At the front of the list put the
10469         explicit implementations, so they get resolved/defined first. 
10470
10471 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10472
10473         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10474         interface type is implemented by this TypeContainer.  Used during
10475         explicit interface implementation.
10476
10477         (Property.Define, Indexer.Define, Method.Define): Validate that
10478         the given interface in the explicit implementation is one of the
10479         base classes for the containing type.
10480
10481         Also if we are explicitly implementing an interface, but there is
10482         no match in the pending implementation table, report an error.
10483
10484         (Property.Define): Only define the property if we are
10485         not explicitly implementing a property from an interface.  Use the
10486         correct name also for those properties (the same CSC uses,
10487         although that is really not needed).
10488
10489         (Property.Emit): Do not emit attributes for explicitly implemented
10490         properties, as there is no TypeBuilder.
10491
10492         (Indexer.Emit): ditto.
10493
10494         Hiding then means that we do not really *implement* a pending
10495         implementation, which makes code fail.
10496
10497 2002-06-22  Martin Baulig  <martin@gnome.org>
10498
10499         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10500         the return value of Object.GetType().  [FIXME: we need to do this whenever
10501         we get a type back from the reflection library].
10502
10503 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10504
10505         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10506
10507 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10508
10509         * attribute.cs: Return null if we can not look up the type.
10510
10511         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10512         the interface types found.
10513
10514         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10515         interface types found.
10516
10517         * typemanager.cs (GetInterfaces): Make this routine returns alll
10518         the interfaces and work around the lame differences between
10519         System.Type and System.Reflection.Emit.TypeBuilder in the results
10520         result for GetInterfaces.
10521
10522         (ExpandInterfaces): Given an array of interface types, expand and
10523         eliminate repeated ocurrences of an interface.  This expands in
10524         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10525         be IA, IB, IC.
10526
10527 2002-06-21  Martin Baulig  <martin@gnome.org>
10528
10529         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10530         on System.Enum.
10531
10532 2002-06-21  Martin Baulig  <martin@gnome.org>
10533
10534         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10535         and called with one of the core types, return the corresponding typebuilder for
10536         that type.
10537
10538         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10539         element type.
10540
10541 2002-06-21  Martin Baulig  <martin@gnome.org>
10542
10543         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10544         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10545         (Expression.ConvertReferenceExplicit): Likewise.
10546
10547         * expression.cs (ElementAccess.DoResolve): Likewise.
10548         (ElementAccess.DoResolveLValue): Likewise.
10549
10550 2002-06-10  Martin Baulig  <martin@gnome.org>
10551
10552         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10553         add the "value" parameter to the parameter list.
10554
10555         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10556         to our caller.
10557
10558 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10559
10560         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10561         the argument to an int, uint, long or ulong, per the spec.  Also
10562         catch negative constants in array creation.
10563
10564 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10565
10566         * class.cs: do not allow the same interface to appear twice in
10567         the definition list.
10568
10569 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10570
10571         * ecore.cs: don't use ldlen with System.Array.
10572
10573 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10574
10575         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10576
10577 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10578
10579         * modifiers.cs: produce correct field attributes for protected
10580         internal. Easy fix so miguel can work on ther harder stuff:-)
10581
10582 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10583
10584         * pending.cs: New file.  Move the code from class.cs here.
10585         Support clearning the pending flag for all methods (when not doing
10586         explicit interface implementation).
10587
10588 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10589
10590         * rootcontext.cs: added a couple more types needed to bootstrap.
10591
10592 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10593
10594         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10595         constructor in the type, instead of any constructor in the type
10596         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10597         a bug in the Mono runtime when applying the params attribute). 
10598
10599 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10600         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10601
10602 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10603
10604         * expression.cs (Unary.ResolveOperator): Use TypeManager
10605         to resolve the type.
10606
10607 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10608
10609         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10610         attached.
10611
10612         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10613         with each member too.
10614
10615         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10616         field builders too - this takes care of the enum member case.
10617
10618 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10619
10620         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10621         address-of operator on both value types and pointers.
10622
10623 2002-06-10  Martin Baulig  <martin@gnome.org>
10624
10625         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10626         PropertyBuilder to the `property_builders' list.
10627
10628         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10629         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10630         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10631         find any indexers which are inherited from an interface.
10632
10633 2002-06-09  Martin Baulig  <martin@gnome.org>
10634
10635         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10636         the same type as the constant if necessary.  There's also a test-130.cs
10637         for this.
10638
10639         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10640
10641         * typemanager.cs (TypeManager.ChangeType): Previously known as
10642         Enum.ChangeEnumType().
10643
10644 2002-06-09  Martin Baulig  <martin@gnome.org>
10645
10646         * expression.cs (Cast.TryReduce): Added support for consts.
10647
10648 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10649
10650         * class.cs (Accessor): Hold attributes information so we can pass
10651         it along.
10652
10653         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10654         Modify to pass in attributes attached to the methods.
10655
10656         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10657
10658         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10659         to handle the Accessor kind :-)
10660
10661         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10662
10663 2002-06-08  Martin Baulig  <martin@gnome.org>
10664
10665         * expression.cs (Unary.TryReduceNegative): Added support for
10666         ULongConstants.
10667
10668 2002-06-08  Martin Baulig  <martin@gnome.org>
10669
10670         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10671         name can't be found in the `defined_names' - the caller will do a
10672         MemberLookup in this case and thus find methods in System.Enum
10673         such as Enum.IsDefined().
10674
10675 2002-06-08  Martin Baulig  <martin@gnome.org>
10676
10677         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10678         Convert.ChangeType() which works with TypeBuilder created types.
10679         (Enum.LookupEnumValue, Enum.Define): Use it here.
10680
10681         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10682         `TypeBuilder.BaseType != null' check.
10683         (TypeContainer.FindMembers): Only lookup parent members if we
10684         actually have a parent.
10685         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10686         (ConstructorInitializer.Resolve): Likewise.
10687
10688         * interface.cs (Interface.FindMembers): Added
10689         `TypeBuilder.BaseType != null' check.
10690
10691         * rootcontext.cs (RootContext.ResolveCore): Added
10692         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10693         classes_second_stage.
10694
10695         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10696         debug_type and trace_type when compiling with --nostdlib.       
10697
10698 2002-06-07  Martin Baulig  <martin@gnome.org>
10699
10700         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10701         (AddField): Set it to true when adding a non-static field.
10702         (DefineType): Use `have_nonstatic_fields' to find out whether we
10703         have non-static fields, not `Fields != null'.
10704
10705 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10706
10707         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10708         dereferencing a null on the static-field code path)
10709
10710 2002-05-30  Martin Baulig  <martin@gnome.org>
10711
10712         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10713         to take command line arguments.  Use reflection to call the new
10714         custom `Initialize' function on the symbol writer and pass it the
10715         command line arguments.
10716
10717         * driver.cs (--debug-args): New command line argument to pass command
10718         line arguments to the symbol writer.
10719
10720 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10721
10722         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10723         the target type for indexers and properties.  Thanks to Joe for
10724         catching this.
10725
10726 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10727
10728         * typemanager.cs (MethodFlags): returns the method flags
10729         (Obsolete/ShouldIgnore) that control warning emission and whether
10730         the invocation should be made, or ignored. 
10731
10732         * expression.cs (Invocation.Emit): Remove previous hack, we should
10733         not do this on matching a base type, we should do this based on an attribute
10734
10735         Only emit calls to System.Diagnostics.Debug and
10736         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10737         on the command line.
10738
10739         * rootcontext.cs: Global settings for tracing and debugging.
10740
10741         * cs-tokenizer.cs (define): New utility function to track
10742         defines.   Set the global settings for TRACE and DEBUG if found.
10743
10744 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10745
10746         * interface.cs (Populate*): Pass in the TypeContainer as well as
10747         the DeclSpace as parameters so that we can create EmitContexts and
10748         then use that to apply attributes etc.
10749
10750         (PopulateMethod, PopulateEvent, PopulateProperty)
10751         (PopulateIndexer): Apply attributes everywhere.
10752
10753         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10754         etc.
10755
10756         (ApplyAttributes): Update accordingly.
10757
10758         We now apply interface attributes for all members too.
10759
10760 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10761
10762         * class.cs (Indexer.Define); Correctly check if we are explicit
10763         implementation (instead of checking the Name for a ".", we
10764         directly look up if the InterfaceType was specified).
10765
10766         Delay the creation of the PropertyBuilder.
10767
10768         Only create the PropertyBuilder if we are not an explicit
10769         interface implementation.   This means that explicit interface
10770         implementation members do not participate in regular function
10771         lookups, and hence fixes another major ambiguity problem in
10772         overload resolution (that was the visible effect).
10773
10774         (DefineMethod): Return whether we are doing an interface
10775         implementation. 
10776
10777         * typemanager.cs: Temporary hack until we get attributes in
10778         interfaces (Ravi is working on that) and we get IndexerName
10779         support in interfaces.
10780
10781         * interface.cs: Register the indexers as properties.
10782
10783         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10784         warning, I have verified that this is a bug in the .NET runtime
10785         (JavaScript suffers of the same problem).
10786
10787         * typemanager.cs (MemberLookup): When looking up members for
10788         interfaces, the parent of an interface is the implicit
10789         System.Object (so we succeed in searches of Object methods in an
10790         interface method invocation.  Example:  IEnumerable x;  x.ToString
10791         ()) 
10792
10793 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10794
10795         * class.cs (Event): Events should also register if they do
10796         implement the methods that an interface requires.
10797
10798         * typemanager.cs (MemberLookup); use the new GetInterfaces
10799         method. 
10800
10801         (GetInterfaces): The code used to lookup interfaces for a type is
10802         used in more than one place, factor it here. 
10803
10804         * driver.cs: Track the errors at the bottom of the file, we kept
10805         on going.
10806
10807         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10808         instance if the method we are calling is static!
10809
10810 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10811
10812         * attribute.cs (ApplyAttributes): Make this function filter out
10813         the IndexerName attribute (as that attribute in reality is never
10814         applied) and return the string constant for the IndexerName
10815         attribute. 
10816
10817         * class.cs (TypeContainer.Emit): Validate that all the indexers
10818         have the same IndexerName attribute, and if so, set the
10819         DefaultName attribute on the class. 
10820
10821         * typemanager.cs: The return value might contain other stuff (not
10822         only methods).  For instance, consider a method with an "Item"
10823         property and an Item method.
10824
10825         * class.cs: If there is a problem with the parameter types,
10826         return. 
10827
10828 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10829
10830         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10831         looks at user defined conversion after making a call to 
10832         StandardConversionExists - we need this for overload resolution.
10833
10834         * expression.cs : Update accordingly the various method calls.
10835
10836         This fixes 2 bugs filed against implicit user defined conversions 
10837
10838 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10839
10840         * statement.cs: Track the result of the assignment.
10841
10842 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10843
10844         * expression.cs (MemberAccess): Improved error reporting for
10845         inaccessible members.
10846
10847 2002-05-22  Martin Baulig  <martin@gnome.org>
10848
10849         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10850         itself with debugging support.
10851
10852 2002-05-22  Martin Baulig  <martin@gnome.org>
10853
10854         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10855         Removed, this isn't needed anymore.
10856
10857 2002-05-20  Martin Baulig  <martin@gnome.org>
10858
10859         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
10860         be underlying type for an enum.
10861
10862 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
10863
10864         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
10865         that splits out the loading of just the core types.
10866
10867         * rootcontext.cs (ResolveCore): Split the struct resolution in
10868         two, so we can load the enumeration underlying types before any
10869         enums are used.
10870
10871         * expression.cs (Is): Bandaid until we fix properly Switch (see
10872         bug #24985 for details).
10873
10874         * typemanager.cs (ImplementsInterface): The hashtable will contain
10875         a null if there are no interfaces implemented.
10876
10877 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
10878
10879         * cs-parser.jay (indexer_declarator): It is fine to have array
10880         parameters
10881
10882 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10883
10884         * typemanager.cs: (RegisterBuilder): New function used to register
10885         TypeBuilders that implement interfaces.  Since
10886         TypeBuilder.GetInterfaces (as usual) does not work with lame
10887         Reflection.Emit. 
10888         (AddUserType): register interfaces.
10889
10890         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10891         dealing with TypeBuilder.  Also, arrays are showing up as
10892         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10893         methods can not be invoked on them!
10894
10895         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10896         (ImplicitReferenceConversionExists): Split out from
10897         StandardConversionExists. 
10898
10899         * expression.cs (As): We were only implementing one of the three
10900         cases for the as operator.  We now implement them all.
10901         (Is): Implement the various other cases for Is as well.
10902
10903         * typemanager.cs (CACHE): New define used to control if we want or
10904         not the FindMembers cache.  Seems to have a negative impact on
10905         performance currently
10906
10907         (MemberLookup): Nested types have full acess to
10908         enclosing type members
10909
10910         Remove code that coped with instance/static returns for events, we
10911         now catch this in RealFindMembers.
10912
10913         (RealFindMembers): only perform static lookup if the instance
10914         lookup did not return a type or an event.  
10915
10916 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10917
10918         * assign.cs (CompoundAssign): We pass more semantic information
10919         now to Compound Assignments than we did before: now we have all
10920         the information at hand, and now we resolve the target *before* we
10921         do the expression expansion, which allows the "CacheValue" method
10922         to have the effect we intended (before, a [x] += 1 would generate
10923         two differen ArrayAccess expressions from the ElementAccess,
10924         during the resolution process).
10925
10926         (CompoundAssign.DoResolve): Resolve target and original_source here.
10927
10928 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10929
10930         * expression.cs (ArrayAccess): dropped debugging information. 
10931
10932         * typemanager.cs: Small bug fix: I was always returning i_members,
10933         instead of one of i_members or s_members (depending on which had
10934         the content).
10935
10936         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10937         method is invoked before any code generation takes place, and it
10938         is a mechanism to inform that the expression will be invoked more
10939         than once, and that the method should use temporary values to
10940         avoid having side effects
10941
10942         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10943
10944         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10945         implementation.
10946
10947         * expression.cs (Indirection, ArrayAccess): Add support for
10948         CacheTemporaries in these two bad boys. 
10949
10950         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10951         ldobj or ldind_ref.  
10952         (StoreFromPtr): Handle stobj as well.
10953
10954         * expression.cs (UnaryMutator): Share more code.
10955
10956         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10957         down: I was not tracking the Filter function as well, which
10958         was affecting the results of the cache.
10959
10960 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10961
10962         * attribute.cs: Remove the hack to handle the CharSet property on
10963         StructLayouts. 
10964
10965 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10966
10967         * attribute.cs (DoResolve): More uglyness, we now only try to
10968         resolve the attribute partially, to extract the CharSet
10969         information (only if we are a StructLayout attribute).  Otherwise 
10970
10971         (GetExtraTypeInfo): Add some code to conditionally kill in the
10972         future this.   I am more and more convinced that the .NET
10973         framework has special code to handle the attribute setting on
10974         certain elements.
10975
10976         * expression.cs (IsParamsMethodApplicable): Revert my previous
10977         foreach change here, it was wrong.
10978
10979 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10980
10981         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10982         (pp_expr): do not abort on unknown input, just return.
10983         (eval): abort if there are pending chars.
10984
10985         * attribute.cs (Attribute.Resolve): Positional parameters are
10986         optional.  Deal with that case.
10987
10988         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10989         the Ansi/Unicode/Auto information for the type.
10990
10991         (TypeContainer.DefineType): instantiate the EmitContext here, as
10992         we will be using it during the type definition (to resolve
10993         attributes) and during the emit phase.
10994
10995         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
10996         to pull type information out of the attributes
10997
10998         (Attribute.Resolve): track the constructor builder, and allow for
10999         multiple invocations (structs and classes will use this).
11000
11001         * ecore.cs (MemberLookupFinal): new version with all the
11002         parameters customizable.
11003
11004         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11005         constructors.  Return if the result value is null (as the error
11006         would have been flagged already by MemberLookupFinal)
11007
11008         Do not allow instances of abstract classes or interfaces to be
11009         created.
11010
11011         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11012         We have to compare the assembly property here when dealing with
11013         FamANDAssem and Assembly access modifiers, because we might be
11014         creating an assembly from *modules* (that means that we are not
11015         getting TypeBuilders for types defined in other modules that are
11016         part of this assembly).
11017
11018         (Method.Emit): If the method is marked abstract and has a body,
11019         emit an error. 
11020
11021         (TypeContainer.DefineMembers): If both the defined member and the
11022         parent name match are methods, then do not emit any warnings: let
11023         the Method.Define routine take care of flagging warnings.  But if
11024         there is a mismatch (method overrides something else, or method is
11025         overriwritten by something, then emit warning).
11026
11027         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11028         set to null, this means `do not check for the return type on the
11029         signature'. 
11030
11031         (Method.Define): set the return type for the method signature to
11032         null, so that we get methods with the same name and parameters and
11033         different return types.  This is used to flag warning 114 (you are
11034         hiding a method, and you probably want to use the new/override
11035         keywords instead).
11036
11037         * typemanager.cs (MemberLookup): Implemented proper access
11038         control, closing a long standing set of bug reports.  The problem
11039         was that the Framework only has two bits: Public and NonPublic,
11040         and NonPublic includes private and protected methods, but we need
11041         to enforce the FamANDAssem, FamOrAssem and Family. 
11042
11043 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11044
11045         * statement.cs (GotoCase): Return true: Ammounts to giving up
11046         knowledge on whether we return or not, and letting the other case
11047         be responsible for it.
11048
11049 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11050
11051         * driver.cs: Do not load directories for each file processed, only
11052         do it if there is a pattern.
11053
11054         * ecore.cs: Report readonly assigns here as well, as we might have
11055         been resolved only by MemberAccess.
11056
11057         (SimpleName.SimpleNameResolve): Also be useful for LValue
11058         resolution.   We need this to propagate assign to local readonly variables
11059
11060         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11061         do not want to reuse potential criteria memory.
11062
11063         * class.cs (MyEventBuilder): Set reflected_type;
11064
11065         * ecore.cs (Constantify): Added support for constifying bools.
11066
11067         (RootContext.LookupType): Added a cache for values looked up in
11068         the declaration space.
11069
11070         * typemanager.cs (FindMembers): Now is a front-end to
11071         RealFindMembers, and provides a two-level hashtable-based cache to
11072         the request.  
11073
11074         15% performance improvement: from 22.5 to 19.2 seconds.
11075
11076         * expression.cs (IsParamsMethodApplicable): use foreach.
11077         (Invocation.DoResolve): ditto.
11078         (New.DoResolve): ditto.
11079         (ArrayCreation.DoResolve): ditto.
11080
11081         * ecore.cs (FindMostEncompassingType): use foreach.
11082
11083         * delegate.cs (NewDelegate.DoResolve): Use foreach
11084
11085         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11086         (RemoveMethods): use foreach.
11087
11088         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11089         nested foreach statements instead of for, and also break out of
11090         the inner loop once a match is found.
11091
11092         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11093
11094 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11095
11096         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11097         we actually unwrap the expression to allow for extra information
11098         to be extracted. 
11099
11100         * expression.cs: Use Shr_Un on unsigned operations. 
11101
11102 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11103
11104         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11105         applicable operators was not being considered correctly. This closes
11106         the bug Miguel reported.
11107
11108 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11109
11110         * attribute.cs: check that the type derives from System.Attribute
11111         and report the correct error in that case (moved the duplicate code to
11112         its own method, too).
11113
11114 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11115
11116         * attribute.cs: lookup attribute type name as the spec says: first the
11117         bare attribute name and then name + "Attribute" (nant compiles with
11118         mcs after this fix).
11119
11120 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11121
11122         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11123         Because of the way we parse things, we should try to see if a
11124         UIntConstant can fit in an integer.
11125
11126 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11127
11128         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11129         when we are in an explicit context.
11130
11131         (ConvertReferenceExplicit): When converting from Iface type S to Class
11132         T make sure the rules are implemented as an OR.
11133
11134         * parameter.cs (ParameterType): Make it a property for now although the
11135         purpose really isn't anything immediate.
11136
11137         * expression.cs (Is*Applicable): Do better checking on the parameter type
11138         of a ref/out parameter. The ones from the system assemblies are already 
11139         marked with the correct type so we don't need to do any correction.
11140
11141         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11142         the object type is standard too so include that.
11143
11144 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11145
11146         * ecore.cs (StandardConversionExists): Augment with missing code:
11147         deal with IntConstant, LongConstants and Enumerations.
11148
11149         * assign.cs: Report the error, instead of failing silently
11150
11151         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11152         typecontainer that they are declared, because the
11153         typecontainer/namespace will have the list of using clauses that
11154         need to be applied.
11155
11156         Assembly Attributes were escaping the normal registration
11157         mechanism. 
11158
11159         (EmitCode): Apply attributes within an EmitContext that represents
11160         the container they were declared on.
11161
11162         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11163
11164 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11165
11166         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11167         Revamp completely - make much cleaner as we now operate only
11168         on a set of Types.
11169
11170         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11171         to implement the logic detailed in the spec more correctly.
11172
11173         (UserDefinedConversion): Update accordingly.
11174
11175 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11176
11177         * statement.cs: Return flow analysis information up.
11178
11179         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11180         and the default.
11181
11182         (token): Do not consume an extra character before calling
11183         decimal_digits.
11184
11185 2002-05-06  Piers Haken <piersh@friskit.com>
11186
11187         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11188
11189 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11190
11191         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11192         EmitContext during the instance constructor initializer
11193         resolution, to stop access to instance variables.
11194
11195         This is mandated by the spec, last paragraph of the `constructor
11196         initializers' section. 
11197
11198 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11199
11200         * cs-parser.jay, class.cs (Accessor): new class used to represent
11201         an accessor (get or set).  In the past we used `null' to represent
11202         a missing accessor.  But this is ambiguous because there was no
11203         way to tell in abstract indexers/properties if one of them was
11204         specified.
11205
11206         Now there is a way of addressing that.
11207
11208         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11209         instead of FindMembers.
11210
11211         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11212         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11213
11214         * attribute.cs: Treat indexers and properties as the same in terms
11215         of applying attributes
11216
11217         * ecore.cs (FindMostEncompassedType): Use statically initialized
11218         EmptyExpressions()s like we do elsewhere to avoid creating useless
11219         objects (and we take this out of the tight loop).
11220
11221         (GetConversionOperators): Move the code to extract the actual
11222         operators to a separate routine to clean things up.
11223
11224 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11225
11226         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11227         events are always registered FieldBuilders.
11228
11229         * class.cs (FieldBase): New class shared by Fields 
11230
11231         * delegate.cs: If we are a toplevel delegate, use our full name.
11232         If we are a nested delegate, then only use our tail name.
11233
11234 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11235
11236         * expression.cs (IsApplicable): Ensure that we add the "&" to
11237         ref/out types before comparing it with the type of the argument.
11238
11239         (IsParamsMethodApplicable): Ditto.
11240
11241         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11242         silly me ;-)
11243
11244         * delegate.cs : Handle the case when we have more than one applicable
11245         method. Flag an error only when we finish checking all.
11246
11247 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11248
11249         * expression.cs: Add support for boolean static initializers.
11250
11251 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11252
11253         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11254
11255         * parameter.cs (ComputeParameterTypes,
11256         ComputeAndDefineParameterTypes): Better error handling: now we
11257         clear the `types' cache if we fail during any of the type lookups.
11258         We also return the status code correctly to our caller
11259
11260         * delegate.cs: If we fail to define a delegate, abort the extra
11261         steps. 
11262
11263         * expression.cs (Binary.ResolveOperator): for
11264         operator==(object,object) and operator !=(object, object) we also
11265         have to verify that there is an implicit conversion from one to
11266         the other.
11267
11268         (ArrayAccess.DoResolve): Array Access can operate on
11269         non-variables. 
11270
11271 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11272
11273         * assign.cs (CompoundAssign): A new class used as a "flag" that
11274         the assignment actually is happening as part of a compound
11275         assignment operator.
11276
11277         During compound assignment, a few new rules exist to enable things
11278         like:
11279
11280         byte b |= 1 + 2
11281
11282         From the spec:
11283
11284         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11285         to the type of x) if y is implicitly convertible to the type of x,
11286         and the operator is a builtin operator and the return type of the
11287         operator is explicitly convertible to the type of x. 
11288
11289         * rootcontext.cs: Reset warning level to 2.  4 catches various
11290         "interesting" features in mcs, we must clean this up at some
11291         point, but currently am trying to kill other bugs ;-)
11292
11293         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11294         in container classes as well.  
11295
11296         * expression.cs (Binary.ResolveOperator): Handle string case
11297         before anything else (as operator overloading does emit an error
11298         before doing anything else).
11299
11300         This code could go away when we move to a table driven model, but
11301         i could not come up with a good plan last night.
11302
11303 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11304
11305         * typemanager.cs (CSharpName): reimplementation using regex.
11306         * class.cs: added null check for fields in Emit
11307         * rootcontext.cs: set warninglevel to 4
11308
11309 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11310
11311         * typemanager.cs (CSharpName): reimplemented with Lupus
11312         suggestion.
11313
11314 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11315
11316         * statement.cs (If): correclty implement Resolve, because we were
11317         not catching sem errors in there.  The same process is needed
11318         everywhere else. 
11319         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11320
11321
11322         (Statement.Warning_DeadCodeFound): Factorize code.
11323         (While): Report dead code here too.
11324
11325         (Statement): Added Resolve virtual method to allow
11326         for resolution split from the emit code.
11327
11328 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11329
11330         * statement.cs (EmitBoolExpression): No longer try to resolve the
11331         expression here.    
11332         (MakeBoolean): New utility function that resolve, implicitly
11333         converts to boolean and tags the expression. 
11334
11335
11336         (If, Do): Implement dead code elimination.
11337         (While): Implement loop inversion
11338
11339         (Do, While, For, If): Resolve the expression prior to calling our
11340         code generation.
11341
11342 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11343
11344         * class.cs:
11345           - added method Report28 (warning: program has more than one entry point)
11346           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11347           - modified method Method.Define, the part at the end of the method
11348
11349         * rootcontext.cs: added static public Location EntryPointLocation;
11350           
11351         * ../errors/cs0028.cs : Add test case for the above warning.              
11352
11353         * typemanager.cs:
11354           - modified method CSharpName to allow arrays of primitive type to
11355             be printed nicely (e.g. instead of System.Int32[][] it now prints
11356             int[][])
11357           - added method CSharpSignature: returns the signature of a method
11358             in string format to be used in reporting errors, warnings, etc.
11359
11360         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11361         with String.Empty.
11362
11363 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11364
11365         * delegate.cs (Define): Fix extremely silly bug where I was
11366         setting the type of the 'object' parameter of the BeginInvoke
11367         method to System.IAsyncResult instead of System.Object ;-)
11368
11369 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11370
11371         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11372         here. 
11373
11374         (Constructor.Emit): return if we fail to initialize the
11375         constructor.  Another door closed!  
11376
11377         * expression.cs (New.DoResolve): Improve error message (from -6 to
11378         1501).  Use DeclaredOnly lookup to find the exact constructor.
11379
11380         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11381         loop.  This is useful.
11382
11383         * cs-parser.jay: Adjust the default parameters so that destructors
11384         have the proper signature.
11385
11386 2002-04-26  Martin Baulig  <martin@gnome.org>
11387
11388         * driver.cs (LoadAssembly): If `assembly' contains any characters
11389         which are only valid in path names and not in assembly names
11390         (currently slash, backslash and point), use Assembly.LoadFrom ()
11391         instead of Assembly.Load () on the `assembly' (before iteration
11392         over the link_paths).
11393
11394 2002-04-26  Martin Baulig  <martin@gnome.org>
11395
11396         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11397
11398 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11399
11400         * class.cs (Property): use the new typemanager.MemberLookup
11401
11402         (TypeContainer.MemberLookup): Implement using the
11403         TypeManager.MemberLookup now. 
11404
11405         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11406         and return MemberInfos, so that these can be used without an
11407         EmitContext (what we had before).
11408
11409 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11410
11411         * expression.cs: Fix the case where the argument to params if the
11412         type of the params.  I omitted handling this before.   Fixed
11413
11414 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11415
11416         * driver.cs: Call BootCorlib_PopulateCoreType
11417
11418         * class.cs (Property.CheckBase): Check for properties only, not
11419         for all members. 
11420
11421         * interface.cs: Temporary hack: try/catch around the
11422         CustomAttributeBuilder, because I am getting an exception that I
11423         do not understand.
11424
11425         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11426         types whose definitions are required to be there (attributes are
11427         defined before standard types).
11428
11429         Compute definitions as we boot the various types, as they are used
11430         immediately (value_type class will need object_type, but if we do
11431         not initialize object_type, we will pass a null, which will let
11432         the runtime pick the System.Object from the existing corlib, which
11433         is not what we want).
11434
11435 2002-04-22  Patrik Torstensson <totte@labs2.com>
11436
11437         * cs-tokenizer.cs: fixed a number of trim() issues.
11438
11439 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11440
11441         * expression.cs (Argument.Type): Ensure that we return the correct
11442         type when we have out or ref parameters [in which case we 
11443         append a "&"].
11444
11445 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11446
11447         * class.cs (Property, Indexer): Allow extern modifier in there. 
11448
11449         * typemanager.cs (InitBaseTypes): Initializes object_type and
11450         value_type, since those will be used early on during the bootstrap
11451         process to compile corlib.
11452
11453         (InitCoreTypes): Move code from here to InitBaseTypes.
11454
11455 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11456
11457         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11458         single-dimension arrays as using the ldlen opcode.  
11459
11460         Daniel Lewis discovered this optimization.  
11461
11462         * typemanager.cs: Add signature for System.Array::get_Length
11463
11464 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11465
11466         * statement.cs: report the error when the foreach does not apply to an
11467         array nor a collection.
11468
11469 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11470
11471         * expression.cs: Add implicit conversions to the operator ~.
11472
11473         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11474
11475         * typemanager.cs: Locate the decimal constructor.
11476
11477 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11478
11479         * attribute.cs: use the new property of TypeOf.
11480         * expression.cs: added 'get' property around typearg.
11481
11482         These changes fix a build breaker reported by NickD. Is this the
11483         correct way to fix?  If not, please, revert my changes and make it
11484         work :-).
11485
11486 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11487
11488         * attribute.cs: Add support for typeof in attribute invocations.
11489         I am not sure that this is right though.
11490
11491 2002-04-14  Duncan Mak  <duncan@ximian.com>
11492
11493         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11494         Binary.Operator.Division case.
11495
11496 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11497
11498         * class.cs (DefineType): Ensure that we do a proper check on
11499         attribute types and also register it with the TypeManager.
11500
11501         (TypeContainer.Targets): The default for attribute types is
11502         AttributeTargets.All.
11503
11504         * attribute.cs (ApplyAttributes): Registering the attribute type
11505         is done elsewhere, not when we discover we have a Usage attribute.
11506
11507 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11508
11509         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11510         and get rid of is_delegate parameter.
11511
11512         * everywhere : update.
11513
11514 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11515
11516         * cs-parser.jay (compilation_unit): Revamp completely to use
11517         some new ideas that I got from Rhys' grammar to solve the problems
11518         with assembly level attributes.
11519
11520         (outer_declaration): New grammar production.
11521
11522         (attribute_sections): Add.
11523
11524         (opt_attributes): Base on attribute_sections
11525
11526         (namespace_declaration): Allow opt_attributes to tackle the case
11527         when we have assembly level attributes - we are clever in this
11528         regard now ;-)
11529
11530         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11531         attributes in the non-global context.
11532
11533         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11534         instead of SetGlobalAttributes.
11535
11536         * class.cs, rootcontext.cs : Ensure we define and generate 
11537         attribute types before anything else.
11538
11539         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11540         and flag the new error -20 for the case when the attribute type
11541         does not have valid targets specified. csc does not catch this.
11542
11543         * ../errors/errors.txt : update for error # -20
11544
11545 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11546
11547         * support.cs (InternalParameters.ParameterModifier): Do some null
11548         checking and return sane values.
11549
11550         * class.cs (Method.Define): If we are a PInvoke method, ensure
11551         that we are static and extern. Report error # 601
11552
11553         * ../errors/cs0601.cs : Add test case for the above error.
11554
11555 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11556
11557         * rootcontext.cs (attribute_types): We need to keep type of
11558         all attribute types separately and emit code for them first.
11559
11560         (RegisterAttribute) : Implement.
11561
11562         * class.cs (DefineType): Check if the current Type is a custom
11563         attribute type and register it accordingly.
11564
11565         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11566         adding the first attribute twice and rename to
11567
11568         (SetGlobalAttributes): this.
11569
11570         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11571         lookups.
11572
11573         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11574         if we are processing global arguments. Hmm, I am unsure of this.
11575
11576 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11577
11578         * expression.cs: added static array of strings to avoid calling
11579         Enum.ToString () for Operator in Binary. Significant recover of
11580         performance.
11581
11582 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11583
11584         * class.cs (FindMembers): Allow the Builders of the various
11585         members to be null.  If they are skip them.  This only happens
11586         during the PInvoke declaration.
11587
11588 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11589
11590         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11591         failure, so we do not keep going afterwards.
11592
11593         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11594         wanted to pass `false' as the `is_delegate' argument.  If this is
11595         the case, why not use delegate_type == null to mean `is_delegate =
11596         false' and anything else as is_delegate = true.
11597
11598 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11599
11600         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11601         code for the section, not the beginning of the tests.
11602
11603 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11604
11605         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11606
11607         * expression.cs (Binary): same.  Warn about errors where we have
11608         Enum/Enum in operator + as well.
11609
11610 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11611
11612         * statement.cs:
11613                 - added support for switch(bool)
11614                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11615                 - add TableSwitchEmit() to handle table-based switch statements
11616
11617 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11618
11619         * expression.cs (Invocation.OverloadResolve): Factor out code which
11620         does parameter compatibility checking with arguments so that we can 
11621         re-use the code even from Delegate.VerifyApplicability
11622
11623         (VerifyArgumentsCompat): Move above code here.
11624
11625         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11626         and instead make a call to the above method.
11627
11628 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11629
11630         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11631         We use it to keep track of classes which are attribute types.
11632
11633 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11634
11635         * delegate.cs (Delegate.Define): Correctly define the types in the
11636         presence of fixed and array parameters.
11637
11638         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11639         doing FindMembers.
11640
11641         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11642         include NonPublic after the first iteration.
11643
11644         * class.cs (Indexer.CheckBase): Only check if both parents are
11645         non-null. 
11646
11647         * cs-parser.jay (accessor_body): If empty, set to null.
11648
11649         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11650         same code path here to resolve constants names that we did have in
11651         MemberAccess.DoResolve.  There is too much code duplicated here.
11652
11653 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11654
11655         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11656
11657         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11658         to MakeUnionSet.
11659
11660         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11661         tokens, numbers and strings.
11662
11663         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11664         parenthesis.
11665
11666         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11667         asyncronous parameters and the regular parameters.  
11668
11669         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11670         specify the target directory.
11671
11672         * expression.cs: (This.DoResolve): Simplify
11673         (As.Emit): Optimize, do not generate IsInst if the expression is
11674         always of the given type.
11675
11676         (Is.DoResolve): Bug fix, we were reporting both always/never for
11677         the is expression.
11678
11679         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11680         creating too many unnecessary arrays.
11681
11682 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11683
11684         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11685         fields instead of rolling our own initializer.   Takes care of all
11686         implicit conversions, and drops unnecessary static checks/argument.
11687
11688 2002-03-31  Dick Porter  <dick@ximian.com>
11689
11690         * driver.cs: use the GetDirectories() return values properly, and
11691         use "/" as path separator.
11692
11693 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11694
11695         * expression.cs (Unary): Optimize - - expr into expr.
11696         (Binary): Optimize a + (-b) into a -b.
11697
11698         * codegen.cs (CodeGen): Made all methods static.
11699
11700 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11701
11702         * rootcontext.cs: 
11703
11704         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11705         TypeBuilder property.
11706
11707         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11708         instead. 
11709
11710         * tree.cs: Removed the various RecordXXXX, and replaced with a
11711         single RecordDecl.  Removed all the accessor methods, and just
11712         left a single access point Type 
11713
11714         * enum.cs: Rename DefineEnum to DefineType.
11715
11716         * decl.cs: New abstract method `DefineType' used to unify the
11717         Defines for Enumerations, Interfaces, TypeContainers and
11718         Delegates.
11719
11720         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11721         LookupBaseClasses method that used to live in class.cs and
11722         interface.cs here, and renamed to FindType.
11723
11724         * delegate.cs: Implement DefineType.  Take advantage of the
11725         refactored pattern for locating the parent builder without taking
11726         the parent_builder argument (which we know does not work if we are
11727         nested, and triggering a toplevel definition).
11728
11729 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11730
11731         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11732         accessibility of a member has changed during override and report
11733         an error if so.
11734
11735         * class.cs (Method.Define, Property.Define): Only complain on
11736         overrides if the method is private, any other accessibility is
11737         fine (and since we just checked the permission is the same, we are
11738         good to go).
11739
11740         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11741         and elif are processed always.  The other pre-processing
11742         directives are only processed if we are "taking" the path
11743
11744 2002-03-29  Martin Baulig  <martin@gnome.org>
11745
11746         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11747         current location is not Null.
11748
11749         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11750         a separate method so we can profile it.
11751
11752         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11753         `span.Seconds' are just seconds, but no minutes or hours.
11754         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11755
11756 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11757
11758         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11759         Remove the gratuitous set of Final:
11760
11761                                 // If an interface implementation, then we can set Final.
11762                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11763                                     implementing.DeclaringType.IsInterface)
11764                                         flags |= MethodAttributes.Final;
11765
11766         I do not know what I was smoking when I used that.
11767
11768
11769         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11770         step into fixing the name resolution issues for delegates and
11771         unifying the toplevel name resolution.
11772
11773 2002-03-28  Martin Baulig  <martin@gnome.org>
11774
11775         * class.cs (Method.Emit): If we have a symbol writer, call its
11776         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11777         tell it about the current method.
11778
11779         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11780         writer that we're going to emit the first byte of IL code for a new
11781         statement (a new source line).
11782         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11783         EmitContext.Mark() before emitting any code.
11784
11785         * location.cs (SymbolDocument): Return null when we're Null.
11786
11787         * statement.cs (Statement): Moved the `Location loc' variable here.
11788         (Statement.EmitBoolExpression): If we have a symbol writer, call
11789         ec.Mark() before emitting any code to tell it that we're at the
11790         beginning of a new statement.
11791         (StatementExpression): Added `Location' argument to the constructor.
11792         (Block): Added public readonly variable `StartLocation' and public
11793         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11794         (Block): Added constructor which takes a start and end location.
11795         (Block.SetEndLocation): New method. This sets the end location.
11796         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11797         local variables we create.
11798         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11799         each statement and do also mark the begin and end of the block.
11800
11801         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11802         tell it the current lexer.Location, use Location.Null for the end of the
11803         block.
11804         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11805         current block, set its end location using SetEndLocation().
11806         (statement_expression): StatementExpression constructor now takes the
11807         lexer.Location as additional argument.
11808         (for_statement, declare_local_variables): Likewise.
11809         (declare_local_variables): When creating a new implicit block, use the
11810         new Block constructor and pass it the lexer.Location.
11811
11812 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11813
11814         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11815         members also on the parent interfaces recursively.
11816
11817 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11818
11819         * report.cs: Use new formats, since Gonzalo finished the missing
11820         bits. 
11821
11822         * expression.cs (Binary.ResolveOperator): added missing operator|
11823         operator& and operator^ for bool/bool.
11824
11825         * cs-parser.jay: CheckDef now takes a Location argument that is
11826         used to report errors more precisly (instead of reporting the end
11827         of a definition, we try to track something which is a lot closer
11828         to the source of the problem).
11829
11830         * cs-tokenizer.cs: Track global token use, so we can properly flag
11831         the use of #define/#undef after the first token has been seen.
11832
11833         Also, rename the reportXXXX to Error_DescriptiveName
11834
11835         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11836         TypeContainer, so that Enum and Interface can use this too.
11837
11838         * class.cs (TypeContainer.LookupInterfaceOrClass,
11839         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11840         `builder' argument.  Typically this was used to pass the parent
11841         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11842         the definition).  
11843
11844         The problem is that a nested class could trigger the definition of
11845         a toplevel class, and the builder would be obviously wrong in that
11846         case. 
11847
11848         So we drop this argument, and we compute dynamically the
11849         TypeBuilder/ModuleBuilder (the correct information was available
11850         to us anyways from DeclSpace.Parent)
11851
11852         * interface.cs (Interface.DefineInterface): Drop builder
11853         parameter cleanup like class.cs
11854
11855         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11856         like class.cs
11857
11858         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
11859         values. 
11860
11861         (Try.Emit): Propagate the returns value from the statement.
11862
11863         (Return.Emit): Even if we are leavning 
11864
11865         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
11866
11867         * modifiers.cs: Fix the computation of MethodAttributes flags.
11868
11869 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
11870
11871         * driver.cs: allow compilation of files that start with '/'.
11872         Add a default case when checking the argument of --target.
11873
11874 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
11875
11876         * interface.cs: Implement the same search algorithm for types in
11877         the interface code.
11878
11879         * delegate.cs: Do not allow multiple definition.
11880
11881         * Recovered ChangeLog that got accidentally amputated
11882
11883         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11884
11885         * rootcontext.cs: Load manually enum to allow core classes to
11886         contain enumerations.
11887
11888         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11889         Update to new static methods in TypeManager.
11890
11891         * typemanager.cs (GetMethod, GetConstructor): Use our
11892         implementation of FindMembers to find the members, since during
11893         corlib compilation, the types are TypeBuilders and GetMethod and
11894         GetConstructor do not work.
11895
11896         Make all methods in TypeManager static.
11897
11898         (InitCodeHelpers): Split the functionality from
11899         the InitCodeTypes function.
11900
11901         * driver.cs: Call InitCodeHelpers after we have populated the
11902         types. 
11903
11904         * cs-parser.jay (delegate_declaration): we did not used to compute
11905         the delegate name correctly for void delegates.
11906
11907 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11908
11909         * rootcontext.cs (RootContext): Init the interface_resolve_order
11910         and type_container_resolve_order always.
11911
11912         (ResolveCore, BootstrapCorlib_ResolveClass,
11913         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11914         compiler when compiling with --nostdlib
11915
11916         * class.cs (TypeContainer.DefineType): Check that our parent is
11917         not null.  This test is most important when we are bootstraping
11918         the core types.
11919
11920         * codegen.cs: Split out the symbol writing code.
11921
11922 2002-03-25  Martin Baulig  <martin@gnome.org>
11923
11924         * driver.cs (-g): Made -g an alias for --debug.
11925
11926 2002-03-24  Martin Baulig  <martin@gnome.org>
11927
11928         * codegen.cs (SymbolWriter): New public variable. Returns the
11929         current symbol writer.
11930         (CodeGen): Added `bool want_debugging_support' argument to the
11931          constructor. If true, tell the ModuleBuild that we want debugging
11932         support and ask it for the ISymbolWriter.
11933         (Save): If we have a symbol writer, call it's Close() method after
11934         saving the assembly.
11935
11936         * driver.c (--debug): New command line argument to create a
11937         debugger information file.
11938
11939         * location.cs (SymbolDocument): New public property. Returns an
11940         ISymbolDocumentWriter object for the current source file or null
11941         if we don't have a symbol writer.
11942
11943 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11944
11945         * driver.cs (LoadAssembly): Correctly return when all the paths
11946         have been tried and not before.
11947
11948         * statement.cs (Switch.Emit): return the actual coverage for this
11949         statement (returns/not-returns)
11950
11951         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11952         switch of the statement if we are the last switch section.  That
11953         kills two problems: try/catch problems (we used to emit an empty
11954         nop at the end) and switch statements where all branches would
11955         return. 
11956
11957 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11958
11959         * driver.cs: Add default assemblies (the equivalent to the
11960         Microsoft CSC.RSP file)
11961
11962         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11963         also update tokens_seen and set it to false.
11964
11965         * driver.cs: Implement --recurse for Mike.
11966
11967         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11968         correctly splitting out the paths.
11969
11970 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11971
11972         * interface.cs (Interface.PopulateProperty): Instead of using
11973         `parent' as the declaration space for the set parameters, use
11974         `this' 
11975
11976         * support.cs (InternalParameters): InternalParameters constructor
11977         takes a DeclSpace instead of a TypeContainer.
11978
11979         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11980         types are being initialized, load the address of it before calling
11981         the function.  
11982
11983         (New): Provide a mechanism to disable the generation of local
11984         value type temporaries when the caller will be providing us with
11985         an address to store it.
11986
11987         (ArrayCreation.EmitDynamicInitializers): Use it.
11988
11989 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11990
11991         * expression.cs (Invocation.EmitArguments): Only probe for array
11992         property if there is more than one argument.  Sorry about that.
11993
11994         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
11995         empty param arrays.
11996
11997         * class.cs (Method.LabelParameters): Fix incorrect code path that
11998         prevented the `ParamArrayAttribute' from being applied to the
11999         params attribute.
12000
12001 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12002
12003         * support.cs (ReflectionParameters): Correctly compute whether the
12004         last argument is a params array.  Fixes the problem with
12005         string.Split ('a')
12006
12007         * typemanager.cs: Make the assemblies array always be non-null
12008         (empty, but non-null)
12009
12010         * tree.cs (RecordDecl): New function that abstracts the recording
12011         of names.  This reports error 101, and provides a pointer to the
12012         previous declaration.  Fixes a crash in the compiler.
12013
12014         * cs-parser.jay (constructor_declaration): Update to new grammar,
12015         and provide a constructor_body that can be empty.
12016
12017 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12018
12019         * driver.cs: Add support for --resources.
12020
12021         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12022         Make all types for the various array helper methods be integer.
12023
12024         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12025         CheckState to ConvCast.
12026
12027         (ConvCast): Now it takes a `checked' state argument, to avoid
12028         depending on the emit context for the conversion, and just using
12029         the resolve time setting.
12030
12031         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12032         instead of Invocation.EmitArguments.  We do not emit the original
12033         arguments, instead we emit those which have been converted to
12034         unsigned int expressions.
12035
12036         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12037
12038         * codegen.cs: ditto.
12039
12040         * expression.cs (LocalVariableReference): Drop the use of the
12041         Store function that depended on the variable index.
12042
12043         * statement.cs (VariableInfo): Drop the `Idx' property from this
12044         class, as this is not taking into account the indexes for
12045         temporaries tat we generate during the execution, getting the
12046         indexes wrong.
12047
12048         * class.cs: First emit class initializers, then call the parent
12049         constructor. 
12050
12051         * expression.cs (Binary): Fix opcode emision.
12052         (UnaryMutator.EmitCode): Support checked code generation
12053
12054         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12055         matches for events for both the Static and Instance scans,
12056         pointing to the same element.   Fix that.
12057
12058 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12059
12060         * rootcontext.cs (ResolveTree): Always set the
12061         interface_resolve_order, because nested interfaces will be calling
12062         into us.
12063
12064         * class.cs (GetInterfaceOrClass): Track the same resolution
12065         process used by TypeManager.LookupType.  This fixes the nested
12066         type lookups in class declarations (separate path from
12067         LookupType). 
12068
12069         (TypeContainer.DefineType): Also define nested interfaces.
12070         (TypeContainer.RegisterOrder): New public function used to
12071         register the order in which child interfaces need to be closed.
12072
12073         Nested interfaces need to be closed after their parents have been
12074         created. 
12075
12076         * interface.cs (InterfaceAttr): Put all the logic for computing
12077         the interface attribute here. 
12078
12079         (DefineInterface): Register our interface order with the
12080         RootContext or with the TypeContainer depending on the case.
12081
12082 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12083
12084         * cs-parser.jay: rework foreach statement to work with the new
12085         changes to the policy on SimpleNames.
12086
12087         * report.cs: support Stacktrace on warnings as well.
12088
12089         * makefile: drop --unsafe and /unsafe from the compile.
12090
12091 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12092
12093         * ecore.cs (StandardConversionExists): Modify to take an Expression
12094         as the first parameter. Ensure we do null -> reference type conversion
12095         checking.
12096
12097         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12098         temporary Expression objects.
12099
12100 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12101
12102         * interface.cs: workaround bug in method overloading resolution
12103         (there is already a bugzilla bug for it).
12104
12105 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12106
12107         We could also solve this problem by having a separate path for
12108         performing type lookups, instead of DoResolve, we could have a
12109         ResolveType entry point, and only participating pieces of the
12110         production (simplename, deref, array) would implement this. 
12111
12112         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12113         signal SimpleName to only resolve type names and not attempt to
12114         resolve anything else.
12115
12116         * expression.cs (Cast): Set the flag.
12117
12118         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12119
12120         * class.cs: Only report 108 if there is no `new' modifier.
12121
12122         * cs-parser.jay: rework foreach statement to work with the new
12123         changes to the policy on SimpleNames.
12124         
12125         * report.cs: support Stacktrace on warnings as well.
12126
12127         * makefile: drop --unsafe and /unsafe from the compile.
12128
12129 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12130
12131         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12132         lookups here, instead of doing that at parse time.  This means
12133         that our grammar will not introduce `LocalVariableReferences' as
12134         expressions at this point.  That solves the problem of code like
12135         this:
12136
12137         class X {
12138            static void Main ()
12139            { int X = 1;
12140             { X x = null }}}
12141
12142         This is only half the fix.  The full fix requires parameters to
12143         also be handled in this way.
12144
12145         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12146         makes the use more obvious of the DeclSpace.  The
12147         ec.TypeContainer.TypeBuilder is now only used to pull the
12148         TypeBuilder for it.
12149
12150         My theory is that I can get rid of the TypeBuilder completely from
12151         the EmitContext, and have typecasts where it is used (from
12152         DeclSpace to where it matters).  
12153
12154         The only pending problem is that the code that implements Aliases
12155         is on TypeContainer, and probably should go in DeclSpace.
12156
12157         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12158         lookups here, instead of doing that at parse time.  This means
12159         that our grammar will not introduce `LocalVariableReferences' as
12160         expressions at this point.  That solves the problem of code like
12161         this:
12162
12163         class X {
12164            static void Main ()
12165            { int X = 1;
12166             { X x = null }}}
12167
12168         This is only half the fix.  The full fix requires parameters to
12169         also be handled in this way.
12170
12171         * class.cs (Property.DefineMethod): When implementing an interface
12172         method, set newslot, when implementing an abstract method, do not
12173         set the flag (before we tried never setting it, or always setting
12174         it, which is the difference).
12175         (Indexer.DefineMethod): same.
12176         (Method.DefineMethod): same.
12177
12178         * ecore.cs: Only set the status used flag if we get back a Field.
12179
12180         * attribute.cs: Temporary hack, so Paolo can keep working.
12181
12182 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12183
12184         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12185         the unmanaged type in the case we have a MarshalAs attribute.
12186
12187         (Resolve): Handle the case when we are parsing the special MarshalAs
12188         attribute [we need to store the unmanaged type to use later]
12189
12190         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12191         MarshalAs Attribute.
12192
12193         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12194         on parameters and accordingly set the marshalling info.
12195
12196 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12197
12198         * class.cs: Optimizing slightly by removing redundant code after
12199         we switched to the `NoTypes' return value.
12200         (Property.DefineMethod): use NoTypes here too.
12201
12202         This fixes the bug I introduced in my last batch of changes.
12203
12204 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12205
12206         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12207
12208         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12209         Enums since those are types too. 
12210
12211         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12212
12213         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12214         thanks to a call during the lookup process.
12215
12216 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12217
12218         * statement.cs (Foreach): Lots of work to accomodate a particular
12219         kind of foreach statement that I had not kept in mind.  It is
12220         possible to have foreachs on classes that provide a GetEnumerator
12221         method that return objects that implement the "pattern" for using
12222         a foreach, there is no need to support GetEnumerator
12223         specifically. 
12224
12225         This is needed to compile nant.
12226
12227         * decl.cs: Only report 114 if the member is not `Finalize' and if
12228         the warning level is at least 2.
12229
12230         * class.cs: Moved the compare function from Method to
12231         MethodSignature. 
12232
12233         (MethodSignature.InheritableMemberSignatureCompare): Add new
12234         filter function that is used to extract inheritable methods from a
12235         class. 
12236
12237         (Method.Define): Use the new `inheritable_method_signature_filter'
12238         delegate
12239
12240         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12241         command. 
12242
12243 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12244
12245         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12246
12247         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12248
12249         * expression.cs: Pass location information to
12250         ConvertImplicitStandard. 
12251
12252         * class.cs: Added debugging code to track return values from
12253         interfaces. 
12254
12255 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12256
12257         * expression.cs (Is.DoResolve): If either side of the `is' is an
12258         interface, do not flag the warning.
12259
12260         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12261         for interfaces
12262
12263         * report.cs: Allow for --fatal to be used with --probe.
12264
12265         * typemanager.cs (NoTypes): Move the definition for the empty Type
12266         array here. 
12267
12268         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12269         properties. 
12270         (TypeContainer.DefineProxy): New function used to proxy to parent
12271         implementations when implementing interfaces.
12272         (TypeContainer.ParentImplements): used to lookup if our parent
12273         implements a public function that is required by an interface.
12274         (TypeContainer.VerifyPendingMethods): Hook this up.
12275
12276         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12277         `modules' and `assemblies' arraylists into arrays.  We only grow
12278         these are the very early start up of the program, so this improves
12279         the speedof LookupType (nicely measured).
12280
12281         * expression.cs (MakeByteBlob): Replaced unsafe code with
12282         BitConverter, as suggested by Paolo.
12283
12284         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12285         folding of string concatenation, but if either side is a string,
12286         and the other is not, then return null, and let the runtime use
12287         the concatenation on the string plus the object (using
12288         `Object.ToString'). 
12289
12290 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12291
12292         Constant Folding has been implemented now.
12293
12294         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12295         the error instead on types that are not supported in one's
12296         complement. 
12297
12298         * constant.cs (Constant and all children): New set of functions to
12299         perform implict and explicit conversions.
12300
12301         * ecore.cs (EnumConstant): Implement the new functions to perform
12302         conversion by proxying to the child expression.
12303
12304         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12305         own separate setting that can not be turned off from the command
12306         line using --unchecked or --checked and is only controlled using
12307         the checked/unchecked statements and expressions.  This setting is
12308         used by the constant folder to flag errors.
12309
12310         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12311         ConstantCheckState as well.   
12312
12313         During Resolve, they also have to flag the state, because the
12314         constant folder runs completely in the Resolve phase.
12315
12316         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12317         well.
12318
12319 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12320
12321         * cfold.cs: New file, this file contains the constant folder.
12322
12323         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12324         argument to track whether we are using the resulting address to
12325         load or store a value and provide better error messages. 
12326
12327         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12328         new AddressOf arguments.
12329
12330         * statement.cs (Foreach.EmitCollectionForeach): Update
12331
12332         * expression.cs (Argument.Emit): Call AddressOf with proper
12333         arguments to track usage.
12334
12335         (New.DoEmit): Call AddressOf with new arguments.
12336
12337         (Unary.Emit): Adjust AddressOf call.
12338
12339 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12340
12341         * cs-parser.jay (member_access): Change the case for pre-defined types
12342         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12343         this suggestion.
12344
12345         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12346         a method body.
12347
12348         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12349         essentially like methods and apply attributes like MethodImplOptions to them too.
12350
12351         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12352         not being null.
12353
12354         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12355         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12356         is the DeclSpace.
12357
12358         * Update code everywhere accordingly.
12359
12360         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12361
12362         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12363
12364 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12365
12366         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12367         try performing lookups against those instead of jumping straight into using
12368         the 'using' clauses.
12369
12370         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12371
12372         (LookupType): Perform lookups in implicit parents too.
12373
12374         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12375         sequence as RootContext.LookupType. 
12376
12377         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12378         the various cases of namespace lookups into this method.
12379
12380 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12381
12382         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12383         in positional arguments)
12384
12385         * class.cs (Operator): Update the AllowedModifiers to contain
12386         extern. 
12387
12388         * cs-parser.jay: Update operator declaration to allow for the
12389         operator body to be empty.
12390
12391         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12392         values. 
12393
12394 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12395
12396         * class.cs (Method.Emit): Label parameters.
12397
12398         * driver.cs: Return 1 or 0 as the program exit code.
12399
12400 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12401
12402         * expression.cs: Special case the `null' object when trying to
12403         auto-compute the type, as anything can be explicitly converted to
12404         that. 
12405
12406         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12407         spotting this Paolo.
12408
12409         (Expression.ImplicitNumericConversion): Perform comparissions of
12410         the type using the underlying type in the case of an enumeration
12411         rather than using the enumeration type for the compare.
12412
12413         Cope with the underlying == type case, which is not possible to
12414         catch before. 
12415
12416         (Expression.ConvertNumericExplicit): Perform comparissions of
12417         the type using the underlying type in the case of an enumeration
12418         rather than using the enumeration type for the compare.
12419
12420         * driver.cs: If the user does not supply an extension, assume .exe
12421
12422         * cs-parser.jay (if_statement): Rewrote so that we can track the
12423         location for the if statement.
12424
12425         * expression.cs (Binary.ConstantFold): Only concat strings when
12426         the operation is "+", not everything ;-)
12427
12428         * statement.cs (Statement.EmitBoolExpression): Take a location
12429         argument. 
12430         (If, While, Do): Track location.
12431
12432         * expression.cs (Binary.ResolveOperator): In the object + string
12433         case, I was missing a call to ConvertImplicit
12434
12435 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12436
12437         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12438         Location arguments. Ensure we use RootContext.LookupType to do our work
12439         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12440
12441         * interface.cs (PopulateMethod): Handle the type of the parameter being
12442         null gracefully.
12443
12444         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12445         have a params method with no fixed arguments and a call is made with no
12446         arguments.
12447
12448 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12449
12450         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12451         the verbatim-string-literal
12452
12453         * support.cs (InternalParameters.ParameterModifier): handle null
12454         fixed parameters.
12455         (InternalParameters.ParameterType): ditto.
12456
12457         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12458         duplicating the name of the variable parameter.
12459         (GetParameterByName): Fix bug where we were not looking up array
12460         paramters if they were the only present (thanks Paolo!).
12461         (GetParameterInfo): We only have an empty set of types if both
12462         fixed and array are set to null.
12463         (GetParameterInfo-idx): Handle FixedParameter == null
12464
12465         * cs-parser.jay: Handle the case where there is no catch
12466         statements (missing null test).
12467
12468 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12469
12470         * driver.cs (MainDriver): Be conservative on our command line
12471         handling.
12472
12473         Catch DirectoryNotFoundException when calling GetFiles.
12474
12475         (SplitPathAndPattern): Used to split the input specification into
12476         a path and a pattern that we can feed to Directory.GetFiles.
12477
12478 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12479
12480         * statement.cs (Fixed): Implement the last case of the Fixed
12481         statement (string handling).
12482
12483         * expression.cs (StringPtr): New class used to return a char * to
12484         a string;  Used by the Fixed statement.
12485
12486         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12487
12488         * expression.cs (Binary.ResolveOperator): Remove redundant
12489         MemberLookup pn parent type.
12490         Optimize union call, we do not need a union if the types are the same.
12491         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12492         type.
12493
12494         Specialize the use of MemberLookup everywhere, instead of using
12495         the default settings. 
12496
12497         (StackAlloc): Implement stackalloc keyword.
12498
12499         * cs-parser.jay: Add rule to parse stackalloc.
12500
12501         * driver.cs: Handle /h, /help, /?
12502
12503         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12504         before we supported unsafe code.
12505
12506         * makefile: add --unsafe to the self compilation of mcs.
12507
12508 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12509
12510         * expression.cs (PointerArithmetic): New class that is used to
12511         perform pointer arithmetic.
12512         (Binary.Resolve): Handle pointer arithmetic
12513         Handle pointer comparission.
12514         (ArrayPtr): Utility expression class that is used to take the
12515         address of an array.
12516
12517         (ElementAccess): Implement array access for pointers
12518
12519         * statement.cs (Fixed): Implement fixed statement for arrays, we
12520         are missing one more case before we are done.
12521
12522         * expression.cs (Indirection): Implement EmitAssign and set the
12523         ExprClass to Variable.  This allows pointer dereferences to be
12524         treated as variables, and to have values assigned to them.
12525
12526         * ecore.cs (Expression.StoreFromPtr): New utility function to
12527         store values dereferencing.
12528
12529 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12530
12531         * expression.cs (Binary.ResolveOperator): Ensure that we are
12532         not trying to operate on a void type - this fixes the reported
12533         bug.
12534
12535         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12536         the parent implementation is sealed.
12537
12538         * ../errors/cs0239.cs : Add.
12539
12540         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12541
12542         * typemanager.cs (unverifiable_code_type): Corresponds to 
12543         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12544         which have unsafe code in them.
12545
12546         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12547         unsafe context.
12548
12549 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12550
12551         * cs-tokenizer.cs: Add support for @"litreal strings"
12552
12553         Make tokenizer accept pre-processor directives
12554         on any column (remove the old C-like limitation). 
12555
12556         * rootcontext.cs (EmitCode): Emit any global attributes.
12557         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12558
12559         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12560
12561         * cs-parser.jay: Add support for global attributes.  
12562
12563 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12564
12565         * expression.cs (Indirection): New helper class.  Unary will
12566         create Indirection classes to be able to implement the
12567         IMemoryLocation interface on it.
12568
12569 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12570
12571         * cs-parser.jay (fixed_statement): reference the right statement.
12572
12573         * statement.cs (Fixed.Emit): Finish implementing the fixed
12574         statement for the &x case.
12575
12576 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12577
12578         * class.cs (Property.Define, Method.Define): Remove newslot when
12579         `implementing'.  
12580
12581         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12582         wrong.  NewSlot should only be used if the `new' keyword is present.
12583
12584         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12585         locating our system dir.  Sorry about this.
12586
12587 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12588
12589         * driver.cs (GetSystemDir): Compute correctly the location of our
12590         system assemblies.  I was using the compiler directory instead of
12591         the library directory.
12592
12593 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12594
12595         * expression.cs (BetterFunction): Put back in what Miguel commented out
12596         since it is the correct fix. The problem is elsewhere ;-)
12597
12598         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12599         parameters of the parms method are themselves compatible or not !
12600
12601         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12602         to check that a class implements an interface before saying that an implicit
12603         conversion was allowed. Use ImplementsInterface to do the checking.
12604
12605 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12606
12607         * class.cs (Method.Define): Track whether we are an explicit
12608         implementation or not.  And only call DefineMethodOverride if we
12609         are an explicit implementation.
12610
12611         (Property.DefineMethod): Ditto.
12612
12613 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12614
12615         * expression.cs (BetterFunction): Catch hideous bug which was
12616          preventing us from detecting ambiguous calls due to implicit casts i.e
12617         cs0121.
12618
12619 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12620
12621         * support.cs (Pair): Remove un-needed method.  I figured why I was
12622         getting the error in cs-parser.jay, the variable in a foreach loop
12623         is readonly, and the compiler does not really treat this as a variable.
12624
12625         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12626         instead of EQUALS in grammar.  
12627
12628         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12629
12630         * expression.cs (Unary.DoResolve): Check whether the argument is
12631         managed or not.
12632
12633 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12634
12635         * support.cs: Api for Pair to set a value.  Despite the fact that
12636         the variables are public the MS C# compiler refuses to compile
12637         code that accesses the field if the variable is part of a foreach
12638         statement. 
12639
12640         * statement.cs (Fixed): Begin implementation of the fixed
12641         statement.
12642
12643         (Block.AddVariable): Return the VariableInfo on success and null
12644         on failure instead of true/false. 
12645
12646         * cs-parser.jay (foreach): Catch errors on variables already
12647         defined (we were ignoring this value before) and properly unwind
12648         the block hierarchy
12649
12650         (fixed_statement): grammar for the fixed statement.
12651
12652 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12653
12654         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12655         pointer types to be incretemented.
12656
12657         (SizeOf): Implement.
12658
12659         * cs-parser.jay (pointer_member_access): Implement
12660         expr->IDENTIFIER production.
12661
12662         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12663         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12664         on safe contexts.
12665
12666         (Unary): Implement indirection.
12667
12668         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12669         use in non-unsafe context).
12670
12671         (SimpleName.DoResolve): Check for pointers in field access on safe
12672         contexts. 
12673
12674         (Expression.LoadFromPtr): Factor the load-indirect code in this
12675         function.  This was duplicated in UnboxCast and ParameterReference
12676
12677 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12678
12679         * expression.cs (ComposedCast): report an error if a pointer cast
12680         is used in a safe region.
12681
12682         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12683         pointer type casts in unsafe context.
12684
12685         * codegen.cs (EmitContext): Set up IsUnsafe.
12686
12687         * cs-parser.jay (non_expression_type): Add productions for pointer
12688         casts. 
12689
12690         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12691         code.  We should not use force into static mode if the method is
12692         not virtual.  Fixes bug in MIS
12693
12694         * statement.cs (Do.Emit, While.Emit, For.Emit,
12695         Statement.EmitBoolExpression): Add support to Do and While to
12696         propagate infinite loop as `I do return' semantics.
12697
12698         Improve the For case to also test for boolean constants.
12699
12700         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12701         to the list of attributes we can add.
12702
12703         Remove `EmitContext' argument.
12704
12705         * class.cs (Method.Define): Apply parameter attributes.
12706         (Constructor.Define): Apply parameter attributes.
12707         (MethodCore.LabelParameters): Move here the core of labeling
12708         parameters. 
12709
12710         * support.cs (ReflectionParameters.ParameterModifier,
12711         InternalParameters.ParameterModifier): Use IsByRef on the type and
12712         only return the OUT bit for these parameters instead of in/out/ref
12713         flags.
12714
12715         This is because I miss-understood things.  The ParameterInfo.IsIn
12716         and IsOut represent whether the parameter has the [In] and [Out]
12717         attributes set.  
12718
12719 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12720
12721         * ecore.cs (FieldExpr.Emit): Release temporaries.
12722
12723         * assign.cs (LocalTemporary.Release): new function.
12724
12725         * codegen.cs (EmitContext.GetTemporaryStorage,
12726         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12727         temporary storage.  Now we can "put back" localbuilders when we
12728         are done with them
12729
12730 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12731
12732         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12733         need to make a copy of the variable to generate verifiable code.
12734
12735 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12736
12737         * driver.cs: Compute dynamically the system directory.
12738
12739         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12740         Slower, but more generally useful.  Used by the abstract
12741         registering implementation. 
12742
12743         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12744         the rules for the special rule on Type/instances.  First check if
12745         we have the same name, and if so, try that special static path
12746         rather than the instance path.
12747
12748 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12749
12750         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12751         for, while and if.
12752
12753         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12754         Enum, ValueType, Delegate or Array for non-corlib compiles.
12755
12756         * cs-tokenizer.cs: Catch long identifiers (645)
12757
12758         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12759         piece of code.
12760
12761         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12762         fix, we were returning too early, so we were not registering
12763         pending methods from abstract classes.
12764
12765         Do not register pending methods if the class is abstract.
12766
12767         * expression.cs (Conditional.DoResolve): Report circular implicit
12768         conversions when we neecd to compute it for conditional
12769         expressions. 
12770
12771         (Is.DoResolve): If the expression is always of the provided type,
12772         flag warning 183.  If the expression can not ever be of the
12773         provided type flag warning 184.
12774
12775         * class.cs: Catch 169 as well.
12776
12777         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12778         read. 
12779
12780 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12781
12782         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12783
12784 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12785
12786         * interface.cs: (PopulateMethod): Check for pointers being defined
12787         only if the unsafe context is active.
12788         (PopulateProperty): ditto.
12789         (PopulateIndexer): ditto.
12790
12791         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12792         specified.  If pointers are present, make sure that they are
12793         present in an unsafe context.
12794         (Constructor, Constructor.Define): ditto.
12795         (Field, Field.Define): ditto.
12796         (Property, Property.Define): ditto.
12797         (Event, Event.Define): ditto.
12798
12799         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12800         hashtable if there are classes or structs defined.
12801
12802         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12803         code, as the constant resolution moved.
12804
12805         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12806         the metadata, so we can flag error 133. 
12807
12808         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12809         pointer is being declared in an unsafe context.
12810
12811 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12812
12813         * modifiers.cs (Modifiers.Check): Require a Location argument.
12814         Report error 227 for Unsafe use.
12815
12816         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12817
12818         * statement.cs (For.Emit): If the test is null, then report that
12819         we do `return', as we wont reach anything afterwards.
12820
12821         (Switch.SwitchGoverningType): Track the expression that matched
12822         the conversion.
12823
12824         * driver.cs: Allow negative numbers as an error code to flag.
12825
12826         * cs-parser.jay: Handle 1551.
12827
12828         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12829
12830 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12831
12832         * cs-parser.jay: Report 1518 (type declaration can only contain
12833         class, struct, interface, enum or delegate)
12834
12835         (switch_label): Report 1523 (keywords `case' or `default' must
12836         preced code)
12837
12838         (opt_switch_sections): Report 1522 (empty switch)
12839
12840         * driver.cs: Report 1515 (response file specified multiple times)
12841         Report 1516 (Source file specified multiple times).
12842
12843         * expression.cs (Argument.Resolve): Signal 1510
12844
12845         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12846         access not allowed in static code)
12847
12848 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12849
12850         * typemanager.cs (IsPointerType): Utility method which we are going
12851         to need a lot.
12852
12853         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12854         the object type, so we take care of that.
12855
12856         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12857
12858         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
12859         added to non-params parameters :-)
12860
12861         * typemanager.cs (CSharpName): Include 'void' type too. 
12862
12863         (void_ptr_type): Include in the set of core types.
12864
12865         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
12866         duplicating code.
12867
12868         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
12869         an unsafe context.
12870
12871         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
12872         completely forgotten about it.
12873
12874 2002-01-10  Ravi Pratap  <ravi@ximian.com>
12875
12876         * cs-parser.jay (pointer_type): Add. This begins our implementation
12877         of parsing rules for unsafe code.
12878
12879         (unsafe_statement): Implement.
12880
12881         (embedded_statement): Modify to include the above.
12882
12883         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12884
12885         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12886         if the current context is an unsafe one.
12887
12888         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12889         are handled differently, we need separate rules for them.
12890
12891         (local_variable_declaration): Update to use local_variable_pointer_type
12892         to allow variable declarations of unmanaged pointer types.
12893
12894         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12895         in unsafe contexts.
12896
12897         * ../errors/cs0214.cs : Add.
12898
12899 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12900
12901         * makefile: remove 'response' file when cleaning.
12902
12903 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12904
12905         * cs-parser.jay: Report 1524.
12906
12907 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12908
12909         * typemanager.cs (RegisterMethod): drop checking if we have
12910         registered this from here
12911
12912 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12913
12914         * class.cs (Method.EmitDestructor): Implement calling our base
12915         destructor. 
12916
12917         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12918         value of InFinally.
12919
12920         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12921         this routine and will wrap the call in a try/catch block.  Deal
12922         with the case.
12923
12924 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12925
12926         * ecore.cs (Expression.MemberLookup): instead of taking a
12927         parameter `same_type' that was used to tell whether we could
12928         access private members we compute our containing type from the
12929         EmitContext.
12930
12931         (FieldExpr): Added partial support for volatile fields.  This does
12932         not work for volatile fields exposed from assemblies, as I can not
12933         figure out how to extract the modreq from it.
12934
12935         Updated all the source files to use this.
12936
12937         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12938         because it is referenced by MemberLookup very often. 
12939
12940 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12941
12942         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12943         TypeBuilder.GetCustomAttributes to retrieve what we need.
12944
12945         Get rid of redundant default_member_attr_type as this is the same as
12946         default_member_type which already exists.
12947
12948         * interface.cs, attribute.cs : Update accordingly.
12949
12950 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12951
12952         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12953         work for TYpeBuilders though.  Ravi, can you please fix this?
12954
12955         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12956
12957         * expression.cs (Argument.Emit): Handle the case of ref objects
12958         being passed to ref functions;  
12959
12960         (ParameterReference.EmitLoad): Loads the content of the pointer
12961         without dereferencing.
12962
12963 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12964
12965         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12966
12967 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12968
12969         * class.cs (Indexer.DefineMethod): Incorporate the interface
12970         type in the name of the method if we are doing explicit interface
12971         implementation.
12972
12973         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12974
12975         (BetterConversion): Fix extremely trivial bug where we were referring to
12976         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12977         again !
12978
12979         * ../errors/bug16.cs : Add although we have fixed it.
12980
12981 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12982
12983         * expression.cs (BaseIndexer): Begin implementation.
12984
12985         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12986
12987         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12988         production directly to remove a shift/reduce, and implement
12989         explicit interface implementation.
12990
12991         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
12992         after a floating point suffix.
12993
12994         * expression.cs (DoNumericPromotions): Improved the conversion for
12995         uint/uint.  If we have a constant, we avoid doing a typecast to a
12996         larger type.
12997
12998         * class.cs (Indexer): Implement explicit interface implementation
12999         for indexers.
13000
13001 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13002
13003         * class.cs: make the default instance constructor public and hidebysig.
13004
13005 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13006
13007         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13008         so we can call it from elsewhere.
13009
13010         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13011         we emit it internally if the class has a defined indexer; otherwise the user
13012         emits it by decorating the class definition with the DefaultMemberAttribute.
13013
13014         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13015         attribute is not used on a type which defines an indexer.
13016
13017         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13018         character when we skip whitespace.
13019
13020         * ../errors/cs0646.cs : Add.
13021
13022 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13023
13024         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13025         again. 
13026
13027         * makefile: Add practical target `mcs3.exe' which builds the third
13028         generation compiler. 
13029
13030         * expression.cs (New): Fix structures constructor calling.
13031
13032         * class.cs (Property, Method, Indexer): Emit Final flag on the
13033         method if we are an interface implementation and we are not
13034         abstract. 
13035
13036         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13037         whether this property is referencing a `base' method.
13038
13039         * expression.cs (Invocation.EmitCall): take an extra argument:
13040         is_base, this is used to determine whether the `call' or
13041         `callvirt' opcode should be used.
13042
13043
13044         * delegate.cs: update EmitCall.
13045
13046         * class.cs (Method.Define): Set NewSlot for the cases where we are
13047         not implementing an interface method.
13048
13049         (Property.Define): ditto.
13050
13051 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13052
13053         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13054         'r'.  Allows mcs to parse itself fully.
13055
13056 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13057
13058         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13059         of the number of initializers that require the InitializeArray method.
13060
13061         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13062         update the above field where necessary.
13063
13064         (MakeByteBlob): Update accordingly.
13065
13066         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13067         greater than 2.
13068
13069         (EmitDynamicInitializers): Update in accordance with the new optimization.
13070
13071         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13072         same OpCode applies.
13073
13074         * cs-parser.jay : Fix some glaring errors I introduced.
13075
13076 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13077
13078         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13079         so that we can check for name clashes there too.
13080
13081         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13082         for interface indexers.
13083
13084         * interfaces.cs (Define): Emit the default member attribute.
13085
13086         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13087         variable was being referred to while setting the value ;-)
13088
13089 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13090
13091         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13092         byte-by-byte information when we know the data is zero.
13093
13094         Make the block always a multiple of 4, because
13095         DefineInitializedData has a bug.
13096
13097         * assign.cs: Fix, we should assign from the temporary, not from
13098         the source. 
13099
13100         * expression.cs (MakeByteBlob): Fix my incorrect code.
13101
13102 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13103
13104         * typemanager.cs (EnumToUnderlying): This function is used to get
13105         the underlying type from an enumeration, because it does not
13106         always work. 
13107
13108         * constant.cs: Use the I4_S form for values between -128 and 127.
13109
13110         * statement.cs (Block.LookupLabel): Looks up a label.
13111         (Block): Drop support for labeled blocks.
13112
13113         (LabeledStatement): New kind of statement that represents a label
13114         only.
13115
13116         (Goto): Finally implement this bad boy.
13117
13118         * cs-parser.jay: Update to reflect new mechanism to implement
13119         labels.
13120
13121 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13122
13123         * codegen.cs (EmitContext.This): a codegen property that keeps the
13124         a single instance of this instead of creating many different this
13125         instances. 
13126
13127         * delegate.cs (Delegate.DoResolve): Update to use the property;
13128
13129         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13130
13131         * expression.cs (BaseAccess.DoResolve): Ditto.
13132
13133 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13134
13135         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13136         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13137
13138         (InitCoreTypes): Update accordingly.
13139
13140         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13141         so we can quickly store the state.
13142
13143         (ApplyAttributes): Set the correct implementation flags
13144         for InternalCall methods.
13145
13146 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13147
13148         * expression.cs (EmitCall): if a method is not virtual, then do
13149         not use callvirt on it.
13150
13151         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13152         user defined stuff) requires the use of stobj, which takes an
13153         address on the stack instead of an array and an index.  So emit
13154         the Ldelema operation for it.
13155
13156         (EmitStoreOpcode): Use stobj for valuetypes.
13157
13158         (UnaryMutator.EmitCode): Use the right 1 value depending on
13159         whether we are dealing with int64/uint64, float or doubles.
13160
13161         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13162         constructors that I implemented last night.
13163
13164         (Constructor.IsDefault): Fix to work properly for static
13165         constructors.
13166
13167         * cs-parser.jay (CheckDef): report method signature errors.
13168         Update error number 103 to be 132.
13169
13170         * decl.cs: New AdditionResult enumeration value: MethodExists.
13171         Although we do this check for methods later on in the semantic
13172         analysis, catching repeated default constructors is so easy that
13173         we catch these here. 
13174
13175         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13176         promotions code.
13177
13178         (ParameterReference.EmitAssign, Emit): handle
13179         bools as bytes.
13180
13181         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13182         (ArrayAccess.EmitStoreOpcode): ditto.
13183
13184         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13185
13186         * expression.cs (MakeByteBlob): Complete all the missing types
13187         (uint, short, ushort, byte, sbyte)
13188
13189         * class.cs: Only init instance field initializers on instance
13190         constructors. 
13191
13192         Rename `constructors' to instance_constructors. 
13193
13194         (TypeContainer.AddConstructor): Only add constructors to the list
13195         if it is not static.
13196
13197         Make sure that we handle default_static_constructor independently
13198         everywhere where we handle instance_constructors
13199
13200 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13201
13202         * class.cs: Do not lookup or create a base initializer for a
13203         static constructor.
13204
13205         (ConstructorInitializer.Resolve): use the proper type to lookup
13206         for constructors.
13207
13208         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13209
13210         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13211         in DeclSpace. 
13212
13213         * decl.cs: CloseType is now an virtual method, the default
13214         implementation just closes this type.
13215
13216 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13217
13218         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13219         to PreserveSig by default. Also emit HideBySig on such methods.
13220
13221         Basically, set the defaults to standard values.
13222
13223         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13224         argument, if candidate is better, it can't be worse than the best !
13225
13226         (Invocation): Re-write bits to differentiate between methods being
13227         applicable in their expanded form and their normal form - for params
13228         methods of course.
13229
13230         Get rid of use_standard everywhere as only standard conversions are allowed
13231         in overload resolution. 
13232
13233         More spec conformance.
13234
13235 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13236
13237         * driver.cs: Add --timestamp, to see where the compiler spends
13238         most of its time.
13239
13240         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13241         `this' in static code.
13242
13243         (SimpleName.DoResolve): Implement in terms of a helper function
13244         that allows static-references to be passed upstream to
13245         MemberAccess.
13246
13247         (Expression.ResolveWithSimpleName): Resolve specially simple
13248         names when called by MemberAccess to implement the special
13249         semantics. 
13250
13251         (Expression.ImplicitReferenceConversion): Handle conversions from
13252         Null to reference types before others, as Null's type is
13253         System.Object. 
13254
13255         * expression.cs (Invocation.EmitCall): Handle the special case of
13256         calling methods declared on a reference type from a ValueType
13257         (Base classes System.Object and System.Enum)
13258
13259         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13260         the left hand side is a TypeExpr, not on every enumeration. 
13261
13262         (Binary.Resolve): If types are reference types, then do a cast to
13263         object on operators != and == of both arguments.
13264
13265         * typemanager.cs (FindMembers): Extract instance and static
13266         members if requested.
13267
13268         * interface.cs (PopulateProperty): Use void_type instead of null
13269         as the return type for the setter method.
13270
13271         (PopulateIndexer): ditto.
13272
13273 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13274
13275         * support.cs (ReflectionParameters): Fix minor bug where we
13276         were examining the wrong parameter for the ParamArray attribute.
13277
13278         Cope with requests for the type of the parameter at position
13279         greater than the params parameter's. We now return the element
13280         type of the params array as that makes more sense.
13281
13282         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13283         accordingly as we no longer have to extract the element type
13284         ourselves.
13285
13286         (Invocation.OverloadResolve): Update.
13287
13288 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13289
13290         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13291         against IEnumerator, test whether the return value is a descendant
13292         of the IEnumerator interface.
13293
13294         * class.cs (Indexer.Define): Use an auxiliary method to implement
13295         the other bits of the method definition.  Begin support for
13296         explicit interface implementation.
13297
13298         (Property.DefineMethod): Use TypeManager.void_type instead of null
13299         for an empty return value.
13300
13301 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13302
13303         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13304         dealing with a FieldExpr which is composed of a FieldBuilder, in
13305         the code path we did extract the constant, but we should have
13306         obtained the underlying value to be able to cast it (otherwise we
13307         end up in an infinite loop, this is what Ravi was running into).
13308
13309         (ArrayCreation.UpdateIndices): Arrays might be empty.
13310
13311         (MemberAccess.ResolveMemberAccess): Add support for section
13312         14.5.4.1 that deals with the special case of E.I when E is a type
13313         and something else, that I can be a reference to a static member.
13314
13315         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13316         handle a particular array type to create byte blobs, it is just
13317         something we dont generate byteblobs for.
13318
13319         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13320         arguments. 
13321
13322         * location.cs (Push): remove the key from the hashtable that we
13323         are about to add.   This happens for empty files.
13324
13325         * driver.cs: Dispose files after we have parsed them.
13326
13327         (tokenize): new function that only runs the tokenizer on its
13328         input, for speed testing.
13329
13330 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13331
13332         * class.cs (Event.Define): Define the private field only if there
13333         are no accessors defined.
13334
13335         * expression.cs (ResolveMemberAccess): If there is no associated
13336         field with the event, that means we have an event defined with its
13337         own accessors and we should flag error cs0070 since transforming
13338         ourselves into a field is not valid in that case.
13339
13340         * ecore.cs (SimpleName.DoResolve): Same as above.
13341
13342         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13343         and charset to sane values.
13344
13345 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13346
13347         * assign.cs (DoResolve): Perform check on events only if they 
13348         are being accessed outside the declaring type.
13349
13350         * cs-parser.jay (event_declarations): Update rules to correctly
13351         set the type of the implicit parameter etc.
13352
13353         (add_accessor, remove_accessor): Set current local parameters.
13354
13355         * expression.cs (Binary): For delegate addition and subtraction,
13356         cast the return value from the method into the appropriate delegate
13357         type.
13358
13359 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13360
13361         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13362         of these as the workaround is unnecessary.
13363
13364         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13365         delegate data - none of that is needed at all.
13366
13367         Re-write bits to extract the instance expression and the delegate method
13368         correctly.
13369
13370         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13371         on delegates too.
13372
13373         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13374         of attaching attributes instead of duplicating code everywhere.
13375
13376         * everywhere : Update code to do attribute emission using the above method.
13377
13378 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13379
13380         * expression.cs (IsParamsMethodApplicable): if there are not
13381         parameters, return immediately.
13382
13383         * ecore.cs: The 0 literal can be implicity converted to an enum
13384         type. 
13385
13386         (SimpleName.DoResolve): First lookup the type, then lookup the
13387         members. 
13388
13389         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13390         want to get its address.  If the InstanceExpression is not
13391         addressable, store the result in a temporary variable, then get
13392         the address of it.
13393
13394         * codegen.cs: Only display 219 errors on warning level or above. 
13395
13396         * expression.cs (ArrayAccess): Make it implement the
13397         IMemoryLocation interface.
13398
13399         (Binary.DoResolve): handle the operator == (object a, object b)
13400         and operator != (object a, object b) without incurring into a
13401         BoxedCast (because 5 != o should never be performed).
13402
13403         Handle binary enumerator operators.
13404
13405         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13406         value type, otherwise use Ldelem_ref.
13407
13408         Use precomputed names;
13409
13410         (AddressOf): Implement address of
13411
13412         * cs-parser.jay (labeled_statement): Fix recursive block
13413         addition by reworking the production.
13414
13415         * expression.cs (New.DoEmit): New has a special case:
13416                 
13417                  If we are dealing with a ValueType, we have a few
13418                  situations to deal with:
13419                 
13420                     * The target of New is a ValueType variable, that is
13421                       easy, we just pass this as the variable reference
13422                 
13423                     * The target of New is being passed as an argument,
13424                       to a boxing operation or a function that takes a
13425                       ValueType.
13426                 
13427                       In this case, we need to create a temporary variable
13428                       that is the argument of New.
13429
13430
13431 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13432
13433         * rootcontext.cs (LookupType): Check that current_type is not null before
13434         going about looking at nested types.
13435
13436         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13437         not implement the IAssignMethod interface any more.
13438
13439         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13440         where we tranform them into FieldExprs if they are being resolved from within
13441         the declaring type.
13442
13443         * ecore.cs (SimpleName.DoResolve): Do the same here.
13444
13445         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13446
13447         * ../errors/bug10.cs : Add.
13448
13449         * ../errors/cs0070.cs : Add.
13450
13451         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13452
13453         * assign.cs : Get rid of EventIsLocal everywhere.
13454
13455 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13456
13457         * ecore.cs (ConvertIntLiteral): finished the implementation.
13458
13459         * statement.cs (SwitchLabel): Convert the value we are using as a
13460         key before looking up the table.
13461
13462 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13463
13464         * codegen.cs (EmitTopBlock): Require a Location argument now.
13465
13466         * cs-parser.jay (constructor_declarator): We need to setup
13467         current_local_parameters before we parse the
13468         opt_constructor_initializer, to allow the variables to be bound
13469         to the constructor arguments.
13470
13471         * rootcontext.cs (LookupType): First lookup nested classes in our
13472         class and our parents before we go looking outside our class.
13473
13474         * expression.cs (ConstantFold): Extract/debox the values at the
13475         beginnning. 
13476
13477         * rootcontext.cs (EmitCode): Resolve the constants first before we
13478         resolve the types.  This is not really needed, but it helps debugging.
13479
13480         * statement.cs: report location.
13481
13482         * cs-parser.jay: pass location to throw statement.
13483
13484         * driver.cs: Small bug fix.
13485
13486         * report.cs: Updated format to be 4-zero filled digits.
13487
13488 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13489
13490         * expression.cs (CheckIndices): Fix minor bug where the wrong
13491         variable was being referred to ;-)
13492
13493         (DoEmit): Do not call EmitStaticInitializers when the 
13494         underlying type is System.Object.
13495
13496 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13497
13498         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13499         and do the usual workaround for SRE.
13500
13501         * class.cs (MyEventBuilder.EventType): New member to get at the type
13502         of the event, quickly.
13503
13504         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13505
13506         * assign.cs (Assign.DoResolve): Handle the case when the target
13507         is an EventExpr and perform the necessary checks.
13508
13509         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13510         interface.
13511
13512         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13513
13514         (EventExpr): Set the type in the constructor itself since we 
13515         are meant to be born fully resolved.
13516
13517         (EventExpr.Define): Revert code I wrote earlier.
13518                 
13519         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13520         instance expression is null. The instance expression is a This in that case
13521         or a null, depending on whether it is a static method or not.
13522
13523         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13524         refers to more than one method.
13525
13526         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13527         and accordingly flag errors.
13528
13529 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13530
13531         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13532
13533 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13534
13535         * location.cs (ToString): Provide useful rutine.
13536
13537 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13538
13539         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13540         objects, return the actual integral boxed.
13541
13542         * statement.cs (SwitchLabel): define an ILLabel for each
13543         SwitchLabel. 
13544
13545         (Switch.CheckSwitch): If the value is a Literal, extract
13546         the underlying literal.
13547
13548         Also in the unused hashtable we had, add the SwitchLabel so we can
13549         quickly look this value up.
13550
13551         * constant.cs: Implement a bunch of new constants.  Rewrite
13552         Literal based on this.  Made changes everywhere to adapt to this.
13553
13554         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13555         dereferencing array only once, and also copes with enumrations.
13556
13557         bytes are two bytes wide, not one.
13558
13559         (Cast): Perform constant conversions.
13560
13561         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13562         wrappers to the literals here.
13563
13564         * expression.cs (DoNumericPromotions): long literals can converted
13565         to ulong implicity (this is taken care of elsewhere, but I was
13566         missing this spot).
13567
13568         * ecore.cs (Expression.Literalize): Make the return type Literal,
13569         to improve type checking.
13570
13571         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13572
13573 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13574
13575         * literal.cs: Revert code from ravi that checked the bounds.  The
13576         bounds are sane by the definition of the type itself. 
13577
13578         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13579         need to actually look up in our parent hierarchy for interfaces
13580         implemented. 
13581
13582         * const.cs: Use the underlying type for enumerations
13583
13584         * delegate.cs: Compute the basename for the delegate creation,
13585         that should fix the delegate test case, and restore the correct
13586         Type Lookup semantics in rootcontext
13587
13588         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13589         referencing a nested type with the Reflection API is using the "+"
13590         sign. 
13591
13592         * cs-parser.jay: Do not require EOF token at the end.
13593
13594 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13595
13596         * rootcontext.cs (LookupType): Concatenate type names with
13597         a '.' instead of a '+' The test suite passes again.
13598
13599         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13600         field of the enumeration.
13601
13602         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13603         the case when the member is an EventExpr.
13604
13605         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13606         static has an associated instance expression.
13607
13608         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13609
13610         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13611
13612         * class.cs (Event.Define): Register event and perform appropriate checks
13613         for error #111.
13614
13615         We define the Add and Remove methods even if the use provides none because
13616         in that case, we provide default implementations ourselves.
13617
13618         Define a private field of the type of the event. This is done by the CSC compiler
13619         and we should be doing it too ;-)
13620
13621         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13622         More methods we use in code we generate.
13623
13624         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13625         is important.
13626
13627         (InitCoreTypes): Update accordingly for the above.
13628
13629         * class.cs (Event.Emit): Generate code for default accessors that we provide
13630
13631         (EmitDefaultMethod): Do the job in the above.
13632
13633         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13634         appropriate place.
13635
13636 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13637
13638         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13639         builders even if we were missing one.
13640
13641         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13642         pass the Basename as our class name instead of the Name.  The
13643         basename will be correctly composed for us.
13644
13645         * parameter.cs (Paramters): Now takes a Location argument.
13646
13647         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13648         make all the code call directly LookupType in RootContext and take
13649         this chance to pass the Location information everywhere.
13650
13651         * Everywhere: pass Location information.
13652
13653 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13654
13655         * class.cs (Constructor.Define): Updated way of detecting the
13656         length of the parameters.
13657
13658         (TypeContainer.DefineType): Use basename as the type name for
13659         nested types.
13660
13661         (TypeContainer.Define): Do not recursively define types here, as
13662         definition is taken care in order by the RootContext.
13663
13664         * tree.cs: Keep track of namespaces in a per-file basis.
13665
13666         * parameter.cs (Parameter.ComputeSignature): Update to use
13667         DeclSpace. 
13668
13669         (Parameters.GetSignature): ditto.
13670
13671         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13672         instead of a TypeContainer.
13673
13674         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13675         resolve names.  Because we need to be resolve in our context, not
13676         our parents.
13677
13678         * driver.cs: Implement response files.
13679
13680         * class.cs (TypeContainer.DefineType): If we are defined, do not
13681         redefine ourselves.
13682
13683         (Event.Emit): Emit the code for add/remove handlers.
13684         (Event.Define): Save the MethodBuilders for add/remove.
13685
13686         * typemanager.cs: Use pair here too.
13687
13688         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13689         DictionaryEntry requires the first argument to be non-null.  
13690
13691         (enum_declaration): Compute full name for registering the
13692         enumeration.
13693
13694         (delegate_declaration): Instead of using
13695         formal_parameter_list, use opt_formal_parameter_list as the list
13696         can be empty.
13697
13698         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13699         (EventParsing): New property that controls whether `add' and
13700         `remove' are returned as tokens or identifiers (for events);
13701
13702 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13703
13704         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13705         use MyEventBuilder only and let it wrap the real builder for us.
13706
13707         (MyEventBuilder): Revamp constructor etc.
13708
13709         Implement all operations that we perform on EventBuilder in precisely the same
13710         way here too.
13711
13712         (FindMembers): Update to use the EventBuilder member.
13713
13714         (Event.Emit): Update accordingly.
13715
13716 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13717
13718         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13719         by calling the appropriate methods.
13720
13721         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13722         useful.
13723
13724         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13725
13726 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13727
13728         * delegate.cs (Delegate.Populate): Check that the return type
13729         and various parameters types are indeed accessible.
13730
13731         * class.cs (Constructor.Define): Same here.
13732
13733         (Field.Define): Ditto.
13734
13735         (Event.Define): Ditto.
13736
13737         (Operator.Define): Check that the underlying Method defined itself
13738         correctly - so it's MethodBuilder should not be null.
13739
13740         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13741         expression happens to be null.
13742
13743         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13744         members but as of now we don't seem to be able to do anything really useful with it.
13745
13746         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13747         not the EventBuilder.
13748
13749 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13750
13751         * cs-tokenizer.cs: Add support for defines.
13752         Add support for #if, #elif, #else, #endif
13753
13754         (eval_var): evaluates a variable.
13755         (eval): stubbed for evaluating functions.
13756
13757         * cs-parser.jay: Pass the defines information
13758
13759         * driver.cs: Add --define command line option.
13760
13761         * decl.cs: Move MemberCore here.
13762
13763         Make it the base class for DeclSpace.  This allows us to catch and
13764         report 108 and 109 for everything now.
13765
13766         * class.cs (TypeContainer.Define): Extract all the members
13767         before populating and emit the warning 108 (new keyword required
13768         to override) instead of having each member implement this.
13769
13770         (MemberCore.Define): New abstract method, we will be using this in
13771         the warning reporting engine in Populate.
13772
13773         (Operator.Define): Adjust to new MemberCore protocol. 
13774
13775         * const.cs (Const): This does not derive from Expression, it is a
13776         temporary object we use to create fields, it is a MemberCore. 
13777
13778         * class.cs (Method.Define): Allow the entry point to be in a
13779         specific class.
13780
13781         * driver.cs: Rewrite the argument handler to clean it up a bit.
13782
13783         * rootcontext.cs: Made it just an auxiliary namespace feature by
13784         making everything static.
13785
13786         * driver.cs: Adapt code to use RootContext type name instead of
13787         instance variable.
13788
13789         * delegate.cs: Remove RootContext argument.
13790
13791         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13792         argument. 
13793
13794         * class.cs (Event.Define): The lookup can fail.
13795
13796         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13797
13798         * expression.cs: Resolve the this instance before invoking the code.
13799
13800 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13801
13802         * cs-parser.jay: Add a production in element_access that allows
13803         the thing to become a "type" reference.  This way we can parse
13804         things like "(string [])" as a type.
13805
13806         Note that this still does not handle the more complex rules of
13807         casts. 
13808
13809
13810         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13811
13812         * ecore.cs: (CopyNewMethods): new utility function used to
13813         assemble the list of methods from running FindMembers.
13814
13815         (MemberLookup): Rework FindMembers so that 
13816
13817 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13818
13819         * class.cs (TypeContainer): Remove Delegates who fail to be
13820         defined.
13821
13822         * delegate.cs (Populate): Verify that we dont get null return
13823         values.   TODO: Check for AsAccessible.
13824
13825         * cs-parser.jay: Use basename to emit error 574 (destructor should
13826         have the same name as container class), not the full name.
13827
13828         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13829         possible representation.  
13830
13831         Also implements integer type suffixes U and L.
13832
13833 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13834
13835         * expression.cs (ArrayCreation.DoResolve): We need to do the
13836         argument resolution *always*.
13837
13838         * decl.cs: Make this hold the namespace.  Hold the root context as
13839         well.
13840         (LookupType): Move here.
13841
13842         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13843
13844         * location.cs (Row, Name): Fixed the code, it was always returning
13845         references to the first file.
13846
13847         * interface.cs: Register properties defined through interfaces.
13848
13849         * driver.cs: Add support for globbing on the command line
13850
13851         * class.cs (Field): Make it derive from MemberCore as well.
13852         (Event): ditto.
13853
13854 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13855
13856         * class.cs (Event::Define): Check that the type of the event is a delegate
13857         type else flag error #66.
13858
13859         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
13860         same.
13861
13862         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
13863         values of EntryPoint, CharSet etc etc.
13864
13865         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
13866
13867         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
13868         be null and we should ignore this. I am not sure if this is really clean. Apparently,
13869         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
13870         which needs this to do its work.
13871
13872         * ../errors/cs0066.cs : Add.
13873
13874 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
13875
13876         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
13877         helper functions.
13878
13879         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13880         clears out the parameters field.
13881         (MemberSignatureCompare): Cleanup
13882
13883         (MemberCore): New base class used to share code between MethodCore
13884         and Property.
13885
13886         (RegisterRequiredImplementations) BindingFlags.Public requires
13887         either BindingFlags.Instace or Static.  Use instance here.
13888
13889         (Property): Refactored code to cope better with the full spec.
13890
13891         * parameter.cs (GetParameterInfo): Return an empty array instead
13892         of null on error.
13893
13894         * class.cs (Property): Abstract or extern properties have no bodies.
13895
13896         * parameter.cs (GetParameterInfo): return a zero-sized array.
13897
13898         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13899         method modifier validation to the typecontainer so we can reuse
13900         this on properties.
13901
13902         (MethodCore.ParameterTypes): return an empty sized array of types.
13903
13904         (Property.Define): Test property modifier validity.
13905
13906         Add tests for sealed/override too.
13907
13908         (Method.Emit): abstract or extern methods have no bodies.
13909
13910 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13911
13912         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13913         thing.
13914
13915         (Method::Define, ::Emit): Modify accordingly.
13916
13917         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13918
13919         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13920
13921         * makefile: Pass in /unsafe.
13922
13923 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13924
13925         * class.cs (MakeKey): Kill routine.
13926
13927         * class.cs (TypeContainer.Define): Correctly define explicit
13928         method implementations (they require the full interface name plus
13929         the method name).
13930
13931         * typemanager.cs: Deply the PtrHashtable here and stop using the
13932         lame keys.  Things work so much better.
13933
13934         This of course broke everyone who depended on `RegisterMethod' to
13935         do the `test for existance' test.  This has to be done elsewhere.
13936
13937         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13938         the object stupid Equals method (because, that like fails all over
13939         the place).  We still do not use it.
13940
13941         * class.cs (TypeContainer.SetRequiredInterface,
13942         TypeContainer.RequireMethods): Killed these two routines and moved
13943         all the functionality to RegisterRequiredImplementations.
13944
13945         (TypeContainer.RegisterRequiredImplementations): This routine now
13946         registers all the implementations required in an array for the
13947         interfaces and abstract methods.  We use an array of structures
13948         which can be computed ahead of time to reduce memory usage and we
13949         also assume that lookups are cheap as most classes will not
13950         implement too many interfaces.
13951
13952         We also avoid creating too many MethodSignatures.
13953
13954         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13955         clear the "pending" bit if we find that there are problems with
13956         the declaration.
13957
13958         (TypeContainer.VerifyPendingMethods): Update to report errors of
13959         methods that look like implementations but are not.
13960
13961         (TypeContainer.Define): Add support for explicit interface method
13962         implementation. 
13963
13964 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13965
13966         * typemanager.cs: Keep track of the parameters here instead of
13967         being a feature of the TypeContainer.
13968
13969         * class.cs: Drop the registration of parameters here, as
13970         InterfaceMethods are also interface declarations.
13971
13972         * delegate.cs: Register methods with the TypeManager not only with
13973         the TypeContainer.  This code was buggy.
13974
13975         * interface.cs: Full registation here.
13976
13977 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13978
13979         * expression.cs: Remove reducer for binary expressions, it can not
13980         be done this way.
13981
13982         * const.cs: Put here the code that used to go into constant.cs
13983
13984         * constant.cs: Put here the code for constants, this is a new base
13985         class for Literals.
13986
13987         * literal.cs: Make Literal derive from Constant.
13988
13989 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13990
13991         * statement.cs (Return.Emit): Report error 157 if the user
13992         attempts to return from a finally block.
13993
13994         (Return.Emit): Instead of emitting a return, jump to the end of
13995         the function.
13996
13997         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
13998         LocalBuilder to store the result of the function.  ReturnLabel is
13999         the target where we jump.
14000
14001
14002 2001-12-09  Radek Doulik  <rodo@ximian.com>
14003
14004         * cs-parser.jay: remember alias in current namespace
14005
14006         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14007         namespaces
14008
14009         * class.cs (LookupAlias): lookup alias in my_namespace
14010
14011         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14012         aliases hashtable
14013         (LookupAlias): lookup alias in this and if needed in parent
14014         namespaces
14015
14016 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14017
14018         * support.cs: 
14019
14020         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14021         making things static.  I need this to avoid passing the
14022         TypeContainer when calling ParameterType.
14023
14024         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14025         that did string manipulation to compute the type and then call
14026         GetType.  Use Parameter.ParameterType instead.
14027
14028         * cs-tokenizer.cs: Consume the suffix for floating values.
14029
14030         * expression.cs (ParameterReference): figure out whether this is a
14031         reference parameter or not.  Kill an extra variable by computing
14032         the arg_idx during emission.
14033
14034         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14035         function that returns whether a parameter is an out/ref value or not.
14036
14037         (Parameter.ParameterType): The type of the parameter (base,
14038         without ref/out applied).
14039
14040         (Parameter.Resolve): Perform resolution here.
14041         (Parameter.ExternalType): The full type (with ref/out applied).
14042
14043         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14044         support for expressions on the using statement.
14045
14046 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14047
14048         * statement.cs (Using.EmitLocalVariableDecls): Split the
14049         localvariable handling of the using statement.
14050
14051         (Block.EmitMeta): Keep track of variable count across blocks.  We
14052         were reusing slots on separate branches of blocks.
14053
14054         (Try.Emit): Emit the general code block, we were not emitting it. 
14055
14056         Check the type of the declaration to be an IDisposable or
14057         something that can be implicity converted to it. 
14058
14059         Emit conversions if required.
14060
14061         * ecore.cs (EmptyExpression): New utility class.
14062         (Expression.ImplicitConversionExists): New utility function.
14063
14064 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14065
14066         * statement.cs (Using): Implement.
14067
14068         * expression.cs (LocalVariableReference): Support read only variables.
14069
14070         * statement.cs: Remove the explicit emit for the Leave opcode.
14071         (VariableInfo): Add a readonly field.
14072
14073 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14074
14075         * ecore.cs (ConvCast): new class used to encapsulate the various
14076         explicit integer conversions that works in both checked and
14077         unchecked contexts.
14078
14079         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14080         properly generate the overflow opcodes.
14081
14082 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14083
14084         * statement.cs: The correct type for the EmptyExpression is the
14085         element_type, not the variable type.  Ravi pointed this out.
14086
14087 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14088
14089         * class.cs (Method::Define): Handle PInvoke methods specially
14090         by using DefinePInvokeMethod instead of the usual one.
14091
14092         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14093         above to do the task of extracting information and defining the method.
14094
14095 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14096
14097         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14098         of the condition for string type.
14099
14100         (Emit): Move that here. 
14101
14102         (ArrayCreation::CheckIndices): Keep string literals in their expression
14103         form.
14104
14105         (EmitDynamicInitializers): Handle strings appropriately.
14106
14107 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14108
14109         * codegen.cs (EmitContext): Replace multiple variables with a
14110         single pointer to the current Switch statement.
14111
14112         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14113         EmitContext.
14114
14115 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14116
14117         * statement.cs 
14118
14119         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14120         default'.
14121
14122         (Foreach.Emit): Foreach on arrays was not setting
14123         up the loop variables (for break/continue).
14124
14125         (GotoCase): Semi-implented.
14126
14127 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14128
14129         * attribute.cs (CheckAttribute): Handle system attributes by using
14130         Attribute.GetAttributes to examine information we need.
14131
14132         (GetValidPlaces): Same here.
14133
14134         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14135
14136         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14137
14138         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14139
14140         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14141
14142         (Method::Emit): Handle the case when we are a PInvoke method.
14143
14144 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14145
14146         * expression.cs: Use ResolveWithSimpleName on compound names.
14147
14148 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14149
14150         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14151         before trying to reduce it.
14152
14153         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14154
14155         * constant.cs (LookupConstantValue): Implement.
14156
14157         (EmitConstant): Use the above in emitting the constant.
14158
14159         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14160         that are user-defined by doing a LookupConstantValue on them.
14161
14162         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14163         too, like above.
14164
14165 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14166
14167         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14168
14169         (BaseAccess.DoResolve): Implement.
14170
14171         (MemberAccess.DoResolve): Split this routine into a
14172         ResolveMemberAccess routine that can be used independently
14173
14174 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14175
14176         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14177         As that share bits of the implementation.  Is returns a boolean,
14178         while As returns the Type that is being probed.
14179
14180 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14181
14182         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14183         instead of a Literal - much easier.
14184
14185         (EnumInTransit): Remove - utterly useless :-)
14186
14187         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14188
14189         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14190
14191         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14192         chain when we have no associated expression.
14193
14194 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14195
14196         * constant.cs (Define): Use Location while reporting the errror.
14197
14198         Also emit a warning when 'new' is used and there is no inherited
14199         member to hide.
14200
14201         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14202         populated.
14203
14204         (LookupEnumValue): Implement to lookup an enum member's value and define it
14205         if necessary.
14206
14207         (Populate): Re-write accordingly to use the above routine.
14208
14209 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14210
14211         * expression.cs (This): Fix prototype for DoResolveLValue to
14212         override the base class DoResolveLValue.
14213
14214         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14215         declarations) 
14216
14217         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14218         (we need to load the address of the field here).  This fixes
14219         test-22. 
14220
14221         (FieldExpr.DoResolveLValue): Call the DoResolve
14222         function to initialize the Instance expression.
14223
14224         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14225         correctly the GetEnumerator operation on a value type.
14226
14227         * cs-parser.jay: Add more simple parsing error catches.
14228
14229         * statement.cs (Switch): Add support for string switches.
14230         Handle null specially.
14231
14232         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14233
14234 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14235
14236         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14237
14238         (declare_local_constant): New helper function.
14239
14240         * statement.cs (AddConstant): Keep a separate record of constants
14241
14242         (IsConstant): Implement to determine if a variable is a constant.
14243
14244         (GetConstantExpression): Implement.
14245
14246         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14247
14248         * statement.cs (IsVariableDefined): Re-write.
14249
14250 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14251
14252         * class.cs (TypeContainer::FindMembers): Look for constants
14253         in the case when we are looking for MemberTypes.Field
14254
14255         * expression.cs (MemberAccess::DoResolve): Check that in the
14256         case we are a FieldExpr and a Literal, we are not being accessed
14257         by an instance reference.
14258
14259         * cs-parser.jay (local_constant_declaration): Implement.
14260
14261         (declaration_statement): Implement for constant declarations.
14262
14263 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14264
14265         * statement.cs (Switch): Catch double defaults.
14266
14267         (Switch): More work on the switch() statement
14268         implementation.  It works for integral values now, need to finish
14269         string support.
14270
14271
14272 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14273
14274         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14275         integer literals into other integer literals.  To be used by
14276         switch. 
14277
14278 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14279
14280         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14281         some memory.
14282
14283         (EmitDynamicInitializers): Cope with the above since we extract data
14284         directly from ArrayData now.
14285
14286         (ExpectInitializers): Keep track of whether initializers are mandatory
14287         or not.
14288
14289         (Bounds): Make it a hashtable to prevent the same dimension being 
14290         recorded for every element in that dimension.
14291
14292         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14293         from being found.
14294
14295         Also fix bug which was causing the indices to be emitted in the reverse
14296         order.
14297
14298 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14299
14300         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14301         unfinished.  They do not work, because the underlying code is
14302         sloppy.
14303
14304 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14305
14306         * cs-parser.jay: Remove bogus fixme.
14307
14308         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14309         on Switch statement.
14310
14311 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14312
14313         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14314         the same. 
14315
14316         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14317         parameter. Apparently, any expression is allowed. 
14318
14319         (ValidateInitializers): Update accordingly.
14320
14321         (CheckIndices): Fix some tricky bugs thanks to recursion.
14322
14323         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14324         I was being completely brain-dead.
14325
14326         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14327         and re-write acordingly.
14328
14329         (DelegateInvocation): Re-write accordingly.
14330
14331         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14332
14333         (MakeByteBlob): Handle types more correctly.
14334
14335         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14336         initialization from expressions but it is incomplete because I am a complete
14337         Dodo :-|
14338
14339 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14340
14341         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14342         on If.  Basically, we have to return `true' (ie, we do return to
14343         our caller) only if both branches of the if return.
14344
14345         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14346         short-circuit operators, handle them as short circuit operators. 
14347
14348         (Cast.DoResolve): Resolve type.
14349         (Cast.Cast): Take an expression as the target type.
14350
14351         * cs-parser.jay (cast_expression): Remove old hack that only
14352         allowed a limited set of types to be handled.  Now we take a
14353         unary_expression and we resolve to a type during semantic
14354         analysis.
14355
14356         Use the grammar productions from Rhys to handle casts (this is
14357         not complete like Rhys syntax yet, we fail to handle that corner
14358         case that C# has regarding (-x), but we will get there.
14359
14360 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14361
14362         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14363         field which is an array type.
14364
14365         * cs-parser.jay (declare_local_variables): Support array initialization too.
14366
14367         * typemanager.cs (MakeKey): Implement.
14368
14369         (everywhere): Use the above appropriately.
14370
14371         * cs-parser.jay (for_statement): Update for array initialization while
14372         declaring variables.
14373
14374         * ecore.cs : The error message was correct, it's the variable's names that
14375         were misleading ;-) Make the code more readable.
14376
14377         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14378         the correct type etc.
14379
14380         (ConvertExplicit): Handle Enum types by examining the underlying type.
14381
14382 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14383
14384         * parameter.cs (GetCallingConvention): Always return
14385         CallingConventions.Standard for now.
14386
14387 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14388
14389         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14390         and `r' after calling DoNumericPromotions.
14391
14392         * ecore.cs: Fix error message (the types were in the wrong order).
14393
14394         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14395         BindingFlags.Instance as well 
14396
14397         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14398         implicit int literal conversion in an empty cast so that we
14399         propagate the right type upstream.
14400
14401         (UnboxCast): new class used to unbox value types.
14402         (Expression.ConvertExplicit): Add explicit type conversions done
14403         by unboxing.
14404
14405         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14406         the target type before applying the implicit LongLiterals to ULong
14407         literal cast.
14408
14409 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14410
14411         * cs-parser.jay (for_statement): Reworked the way For works: now
14412         we declare manually any variables that are introduced in
14413         for_initializer to solve the problem of having out-of-band code
14414         emition (that is what got for broken).
14415
14416         (declaration_statement): Perform the actual variable declaration
14417         that used to be done in local_variable_declaration here.
14418
14419         (local_variable_declaration): Do not declare anything, just pass
14420         the information on a DictionaryEntry
14421
14422 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14423
14424         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14425         re-write of the logic to now make it recursive.
14426
14427         (UpdateIndices): Re-write accordingly.
14428
14429         Store element data in a separate ArrayData list in the above methods.
14430
14431         (MakeByteBlob): Implement to dump the array data into a byte array.
14432
14433 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14434
14435         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14436         into CheckIndices.
14437
14438         * constant.cs (Define): Implement.
14439
14440         (EmitConstant): Re-write fully.
14441
14442         Pass in location info.
14443
14444         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14445         respectively.
14446
14447         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14448         DictionaryEntry since we need location info too.
14449
14450         (constant_declaration): Update accordingly.
14451
14452         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14453         code into another method : UpdateIndices.
14454
14455 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14456
14457         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14458         some type checking etc.
14459
14460 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14461
14462         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14463         bits to provide dimension info if the user skips doing that.
14464
14465         Update second constructor to store the rank correctly.
14466
14467 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14468
14469         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14470         and try to implement.
14471
14472         * ../errors/cs0150.cs : Add.
14473
14474         * ../errors/cs0178.cs : Add.
14475
14476 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14477
14478         * statement.cs: Implement foreach on multi-dimensional arrays. 
14479
14480         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14481         name of the params argument.
14482
14483         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14484         initializing the array.
14485
14486         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14487         we can use this elsewhere.
14488
14489         * statement.cs: Finish implementation of foreach for single
14490         dimension arrays.
14491
14492         * cs-parser.jay: Use an out-of-band stack to pass information
14493         around, I wonder why I need this.
14494
14495         foreach_block: Make the new foreach_block the current_block.
14496
14497         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14498         function used to return a static Parameters structure.  Used for
14499         empty parameters, as those are created very frequently.
14500
14501         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14502
14503 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14504
14505         * interface.cs : Default modifier is private, not public. The
14506         make verify test passes again.
14507
14508 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14509
14510         * support.cs (ReflectionParameters): Fix logic to determine
14511         whether the last parameter is a params one. Test 9 passes again.
14512
14513         * delegate.cs (Populate): Register the builders we define with
14514         RegisterParameterForBuilder. Test 19 passes again.
14515
14516         * cs-parser.jay (property_declaration): Reference $6 instead
14517         of $$ to get at the location.
14518
14519         (indexer_declaration): Similar stuff.
14520
14521         (attribute): Ditto.
14522
14523         * class.cs (Property): Register parameters for the Get and Set methods
14524         if they exist. Test 23 passes again.
14525
14526         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14527         call to EmitArguments as we are sure there aren't any params arguments. 
14528         Test 32 passes again.
14529
14530         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14531         IndexOutOfRangeException. 
14532
14533         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14534         Test 33 now passes again.
14535
14536 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14537
14538         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14539         broke a bunch of things.  Will have to come up with a better way
14540         of tracking locations.
14541
14542         * statement.cs: Implemented foreach for single dimension arrays.
14543
14544 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14545
14546         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14547         an error.  This removes the lookup from the critical path.
14548
14549         * cs-parser.jay: Removed use of temporary_loc, which is completely
14550         broken. 
14551
14552 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14553
14554         * support.cs (ReflectionParameters.ParameterModifier): Report
14555         whether the argument is a PARAMS argument or not.
14556
14557         * class.cs: Set the attribute `ParamArrayAttribute' on the
14558         parameter argument.
14559
14560         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14561         and cons_param_array_attribute (ConstructorInfo for
14562         ParamArrayAttribute)., 
14563
14564         * codegen.cs: Emit the return using the `Return' statement, that
14565         way we can report the error correctly for missing return values. 
14566
14567         * class.cs (Method.Emit): Clean up.
14568
14569         * expression.cs (Argument.Resolve): Take another argument: the
14570         location where this argument is used.  Notice that this is not
14571         part of the "Argument" class as to reduce the size of the
14572         structure (we know the approximate location anyways).
14573
14574         Test if the argument is a variable-reference, if not, then
14575         complain with a 206.
14576
14577         (Argument.Emit): Emit addresses of variables.
14578
14579         (Argument.FullDesc): Simplify.
14580
14581         (Invocation.DoResolve): Update for Argument.Resolve.
14582
14583         (ElementAccess.DoResolve): ditto.
14584
14585         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14586         method should be virtual, as this method is always virtual.
14587
14588         (NewDelegate.DoResolve): Update for Argument.Resolve.
14589
14590         * class.cs (ConstructorInitializer.DoResolve): ditto.
14591
14592         * attribute.cs (Attribute.Resolve): ditto.
14593
14594 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14595
14596         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14597
14598         * expression.cs (ParameterReference): Drop IStackStorage and implement
14599         IAssignMethod instead. 
14600
14601         (LocalVariableReference): ditto.
14602
14603         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14604         IAssignMethod instead. 
14605
14606 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14607
14608         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14609         enumerations that are used in heavily used structures derive from
14610         byte in a laughable and pathetic attempt to reduce memory usage.
14611         This is the kind of pre-optimzations that you should not do at
14612         home without adult supervision.
14613
14614         * expression.cs (UnaryMutator): New class, used to handle ++ and
14615         -- separatedly from the other unary operators.  Cleans up the
14616         code, and kills the ExpressionStatement dependency in Unary.
14617
14618         (Unary): Removed `method' and `Arguments' from this class, making
14619         it smaller, and moving it all to SimpleCall, so I can reuse this
14620         code in other locations and avoid creating a lot of transient data
14621         strucutres when not required.
14622
14623         * cs-parser.jay: Adjust for new changes.
14624
14625 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14626
14627         * enum.cs (Enum.Populate): If there is a failure during
14628         definition, return
14629
14630         * cs-parser.jay (opt_enum_base): we used to catch type errors
14631         here, but this is really incorrect.  The type error should be
14632         catched during semantic analysis.
14633
14634 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14635
14636         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14637         current_local_parameters as expected since I, in my stupidity, had forgotten
14638         to do this :-)
14639
14640         * attribute.cs (GetValidPlaces): Fix stupid bug.
14641
14642         * class.cs (Method::Emit): Perform check on applicability of attributes.
14643
14644         (Constructor::Emit): Ditto.
14645
14646         (Field::Emit): Ditto.
14647
14648         (Field.Location): Store location information.
14649
14650         (Property, Event, Indexer, Operator): Ditto.
14651
14652         * cs-parser.jay (field_declaration): Pass in location for each field.
14653
14654         * ../errors/cs0592.cs : Add.
14655
14656 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14657
14658         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14659
14660         (InitCoreTypes): Update accordingly.
14661
14662         (RegisterAttrType, LookupAttr): Implement.
14663
14664         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14665         info about the same.
14666
14667         (Resolve): Update to populate the above as necessary.
14668
14669         (Error592): Helper.
14670
14671         (GetValidPlaces): Helper to the above.
14672
14673         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14674
14675         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14676
14677 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14678
14679         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14680
14681         * ../errors/cs0617.cs : Add.
14682
14683 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14684
14685         * enum.cs (Emit): Rename to Populate to be more consistent with what
14686         we expect it to do and when exactly it is called.
14687
14688         * class.cs, rootcontext.cs : Update accordingly.
14689
14690         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14691         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14692
14693         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14694
14695         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14696         of a fieldinfo using the above, when dealing with a FieldBuilder.
14697
14698 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14699
14700         * ../errors/cs0031.cs : Add.
14701
14702         * ../errors/cs1008.cs : Add.
14703
14704         * ../errrors/cs0543.cs : Add.
14705
14706         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14707         enum type.
14708
14709         (FindMembers): Implement.
14710
14711         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14712         enums and delegates too.
14713
14714         (enum_types): Rename to builder_to_enum.
14715
14716         (delegate_types): Rename to builder_to_delegate.
14717
14718         * delegate.cs (FindMembers): Implement.
14719
14720 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14721
14722         * typemanager.cs (IsEnumType): Implement.
14723
14724         * enum.cs (Emit): Re-write parts to account for the underlying type
14725         better and perform checking etc.
14726
14727         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14728         of the underlying type.
14729
14730         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14731         value
14732
14733         * enum.cs (error31): Helper to report error #31.
14734
14735         * cs-parser.jay (enum_declaration): Store location of each member too.
14736
14737         * enum.cs (member_to_location): New hashtable. 
14738
14739         (AddEnumMember): Update location hashtable.
14740
14741         (Emit): Use the location of each member while reporting errors.
14742
14743 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14744
14745         * cs-parser.jay: A for_initializer if is a
14746         local_variable_declaration really ammount to have an implicit
14747         block with the variable declaration and no initializer for for.
14748
14749         * statement.cs (For.Emit): Cope with null initializers.
14750
14751         This fixes the infinite loop on for initializers.
14752
14753 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14754
14755         * enum.cs: More cleanup.
14756
14757         * ecore.cs: Remove dead code.
14758
14759         * class.cs (Property.Emit): More simplification.
14760         (Event.Emit): ditto.
14761
14762         Reworked to have less levels of indentation.
14763
14764 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14765
14766         * class.cs (Property): Emit attributes.
14767
14768         (Field): Ditto.
14769
14770         (Event): Ditto.
14771
14772         (Indexer): Ditto.
14773
14774         (Operator): Ditto.
14775
14776         * enum.cs (Emit): Ditto.
14777
14778         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14779         Enums too.
14780
14781         * class.cs (Field, Event, etc.): Move attribute generation into the
14782         Emit method everywhere.
14783
14784         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14785         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14786         as we had no way of defining nested enums !
14787
14788         * rootcontext.cs : Adjust code accordingly.
14789
14790         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14791
14792 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14793
14794         * expression.cs (EvalConstantExpression): Move into ecore.cs
14795
14796         * enum.cs (Enum): Rename some members and make them public and readonly
14797         according to our convention.
14798
14799         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14800         nothing else.
14801
14802         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14803
14804         (Enum::Emit): Write a simple version for now which doesn't try to compute
14805         expressions. I shall modify this to be more robust in just a while.
14806
14807         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14808
14809         (TypeContainer::CloseType): Create the Enum types too.
14810
14811         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14812
14813         * expression.cs (EvalConstantExpression): Get rid of completely.
14814
14815         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14816         user-defined values and other cases.
14817
14818         (IsValidEnumLiteral): Helper function.
14819
14820         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14821         out there in the case we had a literal FieldExpr.
14822
14823         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14824
14825         (Literalize): Revamp a bit to take two arguments.
14826
14827         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14828
14829 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14830
14831         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14832
14833         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14834
14835         (Resolve): Use the above to ensure we have proper initializers.
14836
14837 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14838
14839         * expression.cs (Expression::EvalConstantExpression): New method to 
14840         evaluate constant expressions.
14841
14842         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14843
14844 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14845
14846         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14847         in an array.
14848
14849         (Binary.ResolveOperator): Handle operator != (object a, object b)
14850         and operator == (object a, object b);
14851
14852         (Binary.DoNumericPromotions): Indicate whether the numeric
14853         promotion was possible.
14854
14855         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14856         Implement.  
14857
14858         Made the ArrayAccess implement interface IAssignMethod instead of
14859         IStackStore as the order in which arguments are passed reflects
14860         this.
14861
14862         * assign.cs: Instead of using expr.ExprClass to select the way of
14863         assinging, probe for the IStackStore/IAssignMethod interfaces.
14864
14865         * typemanager.cs: Load InitializeArray definition.
14866
14867         * rootcontext.cs (RootContext.MakeStaticData): Used to define
14868         static data that can be used to initialize arrays. 
14869
14870 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
14871
14872         * expression.cs: Handle operator== and operator!= for booleans.
14873
14874         (Conditioal.Reduce): Implement reducer for the ?: operator.
14875
14876         (Conditional.Resolve): Implement dead code elimination.
14877
14878         (Binary.Resolve): Catch string literals and return a new
14879         concatenated string.
14880
14881         (Unary.Reduce): Implement reduction of unary expressions.
14882
14883         * ecore.cs: Split out the expression core handling here.
14884
14885         (Expression.Reduce): New method used to perform constant folding
14886         and CSE.  This is needed to support constant-expressions. 
14887
14888         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14889         targets, and optimize for !x.
14890
14891 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14892
14893         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14894         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14895         set custom atttributes.
14896
14897         * literal.cs (Literal::GetValue): New abstract method to return the actual
14898         value of the literal, cast as an object.
14899
14900         (*Literal): Implement GetValue method.
14901
14902         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14903         expressions to the arraylist but objects of type Argument.
14904
14905         * class.cs (TypeContainer::Emit): Emit our attributes too.
14906
14907         (Method::Emit, Constructor::Emit): Ditto.
14908
14909         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14910         to be ignoring earlier.
14911
14912 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14913
14914         * attribute.cs (AttributeSection::Define): Implement to do the business
14915         of constructing a CustomAttributeBuilder.
14916
14917         (Attribute): New trivial class. Increases readability of code.  
14918
14919         * cs-parser.jay : Update accordingly.
14920
14921         (positional_argument_list, named_argument_list, named_argument): New rules
14922
14923         (attribute_arguments): Use the above so that we are more correct.
14924
14925 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14926
14927         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14928         to perform all checks for a method with a params parameter.
14929
14930         (Invocation::OverloadResolve): Update to use the above method and therefore
14931         cope correctly with params method invocations.
14932
14933         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14934         params too.
14935
14936         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14937         constructors in our parent too because we can't afford to miss out on 
14938         protected ones ;-)
14939
14940         * attribute.cs (AttributeSection): New name for the class Attribute
14941
14942         Other trivial changes to improve readability.
14943
14944         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14945         use the new class names.
14946
14947 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14948
14949         * class.cs (Method::Define): Complete definition for params types too
14950
14951         (Indexer::Define): Ditto.
14952
14953         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14954         Cope everywhere with a request for info about the array parameter.
14955
14956 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14957
14958         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14959
14960         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14961         local_variable_type to extract the string corresponding to the type.
14962
14963         (local_variable_type): Fixup the action to use the new helper method.
14964
14965         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14966         go.
14967
14968         * expression.cs : Clean out code which uses the above.
14969
14970 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14971
14972         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14973         and bale out if necessary by returning a false.
14974
14975         (RegisterProperty): Ditto.
14976
14977         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14978         and print out appropriate error messages.
14979
14980         * interface.cs (everywhere): Ditto.
14981
14982         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14983         location to constructor.
14984
14985         * class.cs (Property, Event, Indexer): Update accordingly.
14986
14987         * ../errors/cs111.cs : Added.
14988
14989         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14990         of a method, as laid down by the spec.
14991
14992         (Invocation::OverloadResolve): Use the above method.
14993
14994 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14995
14996         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
14997         now take a TypeContainer and a Parameters object.
14998
14999         (ParameterData): Modify return type of ParameterModifier method to be 
15000         Parameter.Modifier and not a string.
15001
15002         (ReflectionParameters, InternalParameters): Update accordingly.
15003
15004         * expression.cs (Argument::GetParameterModifier): Same here.
15005
15006         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15007         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15008         symbol in it at all so maybe this is only for now.
15009
15010 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15011
15012         * support.cs (InternalParameters): Constructor now takes an extra argument 
15013         which is the actual Parameters class.
15014
15015         (ParameterDesc): Update to provide info on ref/out modifiers.
15016
15017         * class.cs (everywhere): Update call to InternalParameters to pass in
15018         the second argument too.
15019
15020         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15021         to return the modifier info [ref/out etc]
15022
15023         (InternalParameters, ReflectionParameters): Implement the above.
15024
15025         * expression.cs (Argument::ParameterModifier): Similar function to return
15026         info about the argument's modifiers.
15027
15028         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15029         too.
15030
15031         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15032         a new SetFormalParameters object which we pass to InternalParameters.
15033
15034 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15035
15036         * expression.cs (NewArray): Merge into the ArrayCreation class.
15037
15038 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15039
15040         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15041         NewUserdefinedArray into one as there wasn't much of a use in having
15042         two separate ones.
15043
15044         * expression.cs (Argument): Change field's name to ArgType from Type.
15045
15046         (Type): New readonly property which returns the proper type, taking into 
15047         account ref/out modifiers.
15048
15049         (everywhere): Adjust code accordingly for the above.
15050
15051         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15052         whether we are emitting for a ref or out parameter.
15053
15054         * expression.cs (Argument::Emit): Use the above field to set the state.
15055
15056         (LocalVariableReference::Emit): Update to honour the flag and emit the
15057         right stuff.
15058
15059         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15060
15061         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15062
15063         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15064
15065         (ReflectionParameters, InternalParameters): Implement the above method.
15066
15067         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15068         reporting errors.
15069
15070         (Invocation::FullMethodDesc): Ditto. 
15071
15072 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15073
15074         * cs-parser.jay: Add extra production for the second form of array
15075         creation. 
15076
15077         * expression.cs (ArrayCreation): Update to reflect the above
15078         change. 
15079
15080         * Small changes to prepare for Array initialization.
15081
15082 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15083
15084         * typemanager.cs (ImplementsInterface): interface might be null;
15085         Deal with this problem;
15086
15087         Also, we do store negative hits on the cache (null values), so use
15088         this instead of calling t.GetInterfaces on the type everytime.
15089
15090 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15091
15092         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15093
15094         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15095         split functionality out into different classes.
15096
15097         (New::FormArrayType): Move into NewBuiltinArray.
15098
15099         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15100         quite useless.
15101
15102         (NewBuiltinArray): New class to handle creation of built-in arrays.
15103
15104         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15105         account creation of one-dimensional arrays.
15106
15107         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15108
15109         (NewUserdefinedArray::DoResolve): Implement.
15110
15111         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15112
15113         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15114         we maintain inside the TypeManager. This is necessary to perform lookups on the
15115         module builder.
15116
15117         (LookupType): Update to perform GetType on the module builders too.     
15118
15119         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15120
15121         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15122
15123 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15124
15125         * expression.cs (New::DoResolve): Implement guts of array creation.
15126
15127         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15128
15129 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15130
15131         * expression.cs: Fix bug I introduced lsat night that broke
15132         Delegates. 
15133
15134         (Expression.Resolve): Report a 246 error (can not resolve name)
15135         if we find a SimpleName in the stream.
15136
15137         (Expression.ResolveLValue): Ditto.
15138
15139         (Expression.ResolveWithSimpleName): This function is a variant of
15140         ResolveName, this one allows SimpleNames to be returned without a
15141         warning.  The only consumer of SimpleNames is MemberAccess
15142
15143 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15144
15145         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15146         might arrive here.  I have my doubts that this is correct.
15147
15148         * statement.cs (Lock): Implement lock statement.
15149
15150         * cs-parser.jay: Small fixes to support `lock' and `using'
15151
15152         * cs-tokenizer.cs: Remove extra space
15153
15154         * driver.cs: New flag --checked, allows to turn on integer math
15155         checking. 
15156
15157         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15158         Threading.Monitor.Exit 
15159
15160 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15161
15162         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15163         Expression Class to be IndexerAccess.
15164
15165         Notice that Indexer::DoResolve sets the eclass to Value.
15166
15167 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15168
15169         * class.cs (TypeContainer::Emit): Emit code for indexers.
15170
15171         * assign.cs (IAssignMethod): New interface implemented by Indexers
15172         and Properties for handling assignment.
15173
15174         (Assign::Emit): Simplify and reuse code. 
15175
15176         * expression.cs (IndexerAccess, PropertyExpr): Implement
15177         IAssignMethod, clean up old code. 
15178
15179 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15180
15181         * typemanager.cs (ImplementsInterface): New method to determine if a type
15182         implements a given interface. Provides a nice cache too.
15183
15184         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15185         method.
15186
15187         (ConvertReferenceExplicit): Ditto.
15188
15189         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15190         various methods, with correct names etc.
15191
15192         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15193         Operator.UnaryNegation.
15194
15195         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15196         we have a unary plus or minus operator.
15197
15198         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15199         UnaryMinus.
15200
15201         * everywhere : update accordingly.
15202
15203         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15204         respectively.
15205
15206         * class.cs (Method::Define): For the case where we are implementing a method
15207         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15208         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15209
15210 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15211
15212         * interface.cs (FindMembers): Implement to work around S.R.E
15213         lameness.
15214
15215         * typemanager.cs (IsInterfaceType): Implement.
15216
15217         (FindMembers): Update to handle interface types too.
15218
15219         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15220         use IsAssignableFrom as that is not correct - it doesn't work.
15221
15222         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15223         and accordingly override EmitStatement.
15224
15225         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15226         using the correct logic :-)
15227
15228 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15229
15230         * ../errors/cs-11.cs : Add to demonstrate error -11 
15231
15232 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15233
15234         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15235         then pass this as a hint to ResolveLValue.
15236
15237         * expression.cs (FieldExpr): Add Location information
15238
15239         (FieldExpr::LValueResolve): Report assignment to readonly
15240         variable. 
15241
15242         (Expression::ExprClassFromMemberInfo): Pass location information.
15243
15244         (Expression::ResolveLValue): Add new method that resolves an
15245         LValue. 
15246
15247         (Expression::DoResolveLValue): Default invocation calls
15248         DoResolve. 
15249
15250         (Indexers): New class used to keep track of indexers in a given
15251         Type. 
15252
15253         (IStackStore): Renamed from LValue, as it did not really describe
15254         what this did.  Also ResolveLValue is gone from this interface and
15255         now is part of Expression.
15256
15257         (ElementAccess): Depending on the element access type
15258
15259         * typemanager.cs: Add `indexer_name_type' as a Core type
15260         (System.Runtime.CompilerServices.IndexerNameAttribute)
15261
15262         * statement.cs (Goto): Take a location.
15263
15264 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15265
15266         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15267         if two delegates are compatible.
15268
15269         (NewDelegate::DoResolve): Update to take care of the case when
15270         we instantiate a delegate from another delegate.
15271
15272         * typemanager.cs (FindMembers): Don't even try to look up members
15273         of Delegate types for now.
15274
15275 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15276
15277         * delegate.cs (NewDelegate): New class to take care of delegate
15278         instantiation.
15279
15280         * expression.cs (New): Split the delegate related code out into 
15281         the NewDelegate class.
15282
15283         * delegate.cs (DelegateInvocation): New class to handle delegate 
15284         invocation.
15285
15286         * expression.cs (Invocation): Split out delegate related code into
15287         the DelegateInvocation class.
15288
15289 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15290
15291         * expression.cs (New::DoResolve): Implement delegate creation fully
15292         and according to the spec.
15293
15294         (New::DoEmit): Update to handle delegates differently.
15295
15296         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15297         because of which we were printing out arguments in reverse order !
15298
15299         * delegate.cs (VerifyMethod): Implement to check if the given method
15300         matches the delegate.
15301
15302         (FullDelegateDesc): Implement.
15303
15304         (VerifyApplicability): Implement.
15305
15306         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15307         delegate invocations too.
15308
15309         (Invocation::Emit): Ditto.
15310
15311         * ../errors/cs1593.cs : Added.
15312
15313         * ../errors/cs1594.cs : Added.
15314
15315         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15316
15317 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15318
15319         * typemanager.cs (intptr_type): Core type for System.IntPtr
15320
15321         (InitCoreTypes): Update for the same.
15322
15323         (iasyncresult_type, asynccallback_type): Ditto.
15324
15325         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15326         correct.
15327
15328         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15329         too.
15330
15331         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15332         the builders for the 4 members of a delegate type :-)
15333
15334         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15335         type.
15336
15337         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15338
15339         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15340
15341 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15342
15343         * statement.cs (Break::Emit): Implement.   
15344         (Continue::Emit): Implement.
15345
15346         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15347         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15348         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15349         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15350         end loop
15351
15352         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15353         properties that track the label for the current loop (begin of the
15354         loop and end of the loop).
15355
15356 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15357
15358         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15359         use of emitting anything at all.
15360
15361         * class.cs, rootcontext.cs : Get rid of calls to the same.
15362
15363         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15364
15365         (Populate): Define the constructor correctly and set the implementation
15366         attributes.
15367
15368         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15369         have been defined.
15370
15371         (AddDelegateType): Implement.
15372
15373         (IsDelegateType): Implement helper method.
15374
15375         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15376
15377         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15378         and accordingly handle it.
15379
15380         * delegate.cs (Populate): Take TypeContainer argument.
15381         Implement bits to define the Invoke method. However, I still haven't figured out
15382         how to take care of the native int bit :-(
15383
15384         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15385         Qualify the name of the delegate, not its return type !
15386
15387         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15388         conversion.
15389
15390         (StandardConversionExists): Checking for array types turns out to be recursive.
15391
15392         (ConvertReferenceExplicit): Implement array conversion.
15393
15394         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15395
15396 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15397
15398         * cs-parser.jay (delegate_declaration): Store the fully qualified
15399         name as it is a type declaration.
15400
15401         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15402         readonly.
15403
15404         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15405         as TypeContainer::DefineType.
15406
15407         (Populate): Method in which all the definition of the various methods (Invoke)
15408         etc is done.
15409
15410         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15411         see.
15412
15413         (CloseDelegate): Finally creates the delegate.
15414
15415         * class.cs (TypeContainer::DefineType): Update to define delegates.
15416         (Populate, Emit and CloseType): Do the same thing here too.
15417
15418         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15419         delegates in all these operations.
15420
15421 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15422
15423         * expression.cs: LocalTemporary: a new expression used to
15424         reference a temporary that has been created.
15425
15426         * assign.cs: Handle PropertyAccess back here, so that we can
15427         provide the proper semantic access to properties.
15428
15429         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15430         a few more explicit conversions. 
15431
15432         * modifiers.cs: `NEW' modifier maps to HideBySig.
15433
15434         * expression.cs (PropertyExpr): Make this into an
15435         ExpressionStatement, and support the EmitStatement code path. 
15436
15437         Perform get/set error checking, clean up the interface.
15438
15439         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15440         them into toplevel access objects.
15441
15442 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15443
15444         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15445         SRE.
15446
15447         * typemanager.cs: Keep track here of our PropertyBuilders again to
15448         work around lameness in SRE.
15449
15450 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15451
15452         * expression.cs (LValue::LValueResolve): New method in the
15453         interface, used to perform a second resolution pass for LValues. 
15454
15455         (This::DoResolve): Catch the use of this in static methods.
15456
15457         (This::LValueResolve): Implement.
15458
15459         (This::Store): Remove warning, assigning to `this' in structures
15460         is 
15461
15462         (Invocation::Emit): Deal with invocation of
15463         methods on value types.  We need to pass the address to structure
15464         methods rather than the object itself.  (The equivalent code to
15465         emit "this" for structures leaves the entire structure on the
15466         stack instead of a pointer to it). 
15467
15468         (ParameterReference::DoResolve): Compute the real index for the
15469         argument based on whether the method takes or not a `this' pointer
15470         (ie, the method is static).
15471
15472         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15473         value types returned from functions when we need to invoke a
15474         method on the sturcture.
15475
15476
15477 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15478
15479         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15480         defining the type in the Modulebuilder or Typebuilder. This is to take
15481         care of nested types which need to be defined on the TypeBuilder using
15482         DefineNestedMethod.
15483
15484         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15485         methods in RootContext, only ported to be part of TypeContainer.
15486
15487         (TypeContainer::GetInterfaceOrClass): Ditto.
15488
15489         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15490
15491         * interface.cs (Interface::DefineInterface): New method. Does exactly
15492         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15493         too.
15494
15495         (Interface::GetInterfaces): Move from RootContext here and port.
15496
15497         (Interface::GetInterfaceByName): Same here.
15498
15499         * rootcontext.cs (ResolveTree): Re-write.
15500
15501         (PopulateTypes): Re-write.
15502
15503         * class.cs (TypeContainer::Populate): Populate nested types too.
15504         (TypeContainer::Emit): Emit nested members too.
15505
15506         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15507         instead just use the name argument passed in as it is already fully
15508         qualified.
15509
15510         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15511         to TypeContainer mapping to see if a type is user-defined.
15512
15513         * class.cs (TypeContainer::CloseType): Implement. 
15514
15515         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15516         the default constructor.
15517
15518         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15519         twice.
15520
15521         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15522
15523         * interface.cs (CloseType): Create the type here.
15524
15525         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15526         the hierarchy.
15527
15528         Remove all the methods which are now in TypeContainer.
15529
15530 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15531
15532         * delegate.cs (Define): Re-write bits to define the delegate
15533         correctly.
15534
15535 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15536
15537         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15538
15539         * expression.cs (ImplicitReferenceConversion): handle null as well
15540         as a source to convert to any reference type.
15541
15542         * statement.cs (Return): Perform any implicit conversions to
15543         expected return type.  
15544
15545         Validate use of return statement.  
15546
15547         * codegen.cs (EmitContext): Pass the expected return type here.
15548
15549         * class.cs (Method, Constructor, Property): Pass expected return
15550         type to EmitContext.
15551
15552 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15553
15554         * expression.cs: Make DoResolve take an EmitContext instead of a
15555         TypeContainer.
15556
15557         Replaced `l' and `location' for `loc', for consistency.
15558
15559         (Error, Warning): Remove unneeded Tc argument.
15560
15561         * assign.cs, literal.cs, constant.cs: Update to new calling
15562         convention. 
15563
15564         * codegen.cs: EmitContext now contains a flag indicating whether
15565         code is being generated in a static method or not.
15566
15567         * cs-parser.jay: DecomposeQI, new function that replaces the old
15568         QualifiedIdentifier.  Now we always decompose the assembled
15569         strings from qualified_identifier productions into a group of
15570         memberaccesses.
15571
15572 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15573
15574         * rootcontext.cs: Deal with field-less struct types correctly now
15575         by passing the size option to Define Type.
15576
15577         * class.cs: Removed hack that created one static field. 
15578
15579 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15580
15581         * statement.cs: Moved most of the code generation here. 
15582
15583 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15584
15585         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15586         seem very right.
15587
15588         (ElementAccess): Remove useless bits for now - keep checks as the spec
15589         says.
15590
15591 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15592
15593         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15594         and start performing checks according to the spec.
15595
15596 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15597
15598         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15599         rank_specifiers instead.
15600
15601         (rank_specifiers): Change the order in which the rank specifiers are stored
15602
15603         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15604
15605         * expression.cs (ElementAccess): Implement the LValue interface too.
15606
15607 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15608
15609         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15610         except that user defined conversions are not included.
15611
15612         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15613         perform the conversion of the return type, if necessary.
15614
15615         (New::DoResolve): Check whether we are creating an array or an object
15616         and accordingly do the needful.
15617
15618         (New::Emit): Same here.
15619
15620         (New::DoResolve): Implement guts of array creation.
15621
15622         (New::FormLookupType): Helper function.
15623
15624 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15625
15626         * codegen.cs: Removed most of the code generation here, and move the
15627         corresponding code generation bits to the statement classes. 
15628
15629         Added support for try/catch/finalize and throw.
15630
15631         * cs-parser.jay: Added support for try/catch/finalize.
15632
15633         * class.cs: Catch static methods having the flags override,
15634         virtual or abstract.
15635
15636         * expression.cs (UserCast): This user cast was not really doing
15637         what it was supposed to do.  Which is to be born in fully resolved
15638         state.  Parts of the resolution were being performed at Emit time! 
15639
15640         Fixed this code.
15641
15642 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15643
15644         * expression.cs: Implicity convert the result from UserCast.
15645
15646 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15647
15648         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15649         prevented it from working correctly. 
15650
15651         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15652         merely ConvertImplicit.
15653
15654 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15655
15656         * typemanager.cs: Make the LookupTypeContainer function static,
15657         and not per-instance.  
15658
15659         * class.cs: Make static FindMembers (the one that takes a Type
15660         argument). 
15661
15662         * codegen.cs: Add EmitForeach here.
15663
15664         * cs-parser.jay: Make foreach a toplevel object instead of the
15665         inline expansion, as we need to perform semantic analysis on it. 
15666
15667 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15668
15669         * expression.cs (Expression::ImplicitUserConversion): Rename to
15670         UserDefinedConversion.
15671
15672         (Expression::UserDefinedConversion): Take an extra argument specifying 
15673         whether we look for explicit user conversions too.
15674
15675         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15676
15677         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15678
15679         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15680         with the appropriate arguments.
15681
15682         * cs-parser.jay (cast_expression): Record location too.
15683
15684         * expression.cs (Cast): Record location info.
15685
15686         (Expression::ConvertExplicit): Take location argument.
15687
15688         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15689         to determine if we are doing explicit conversions.
15690
15691         (UserCast::Emit): Update accordingly.
15692
15693         (Expression::ConvertExplicit): Report an error if everything fails.
15694
15695         * ../errors/cs0030.cs : Add.
15696
15697 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15698
15699         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15700         virtual and newslot bits. 
15701
15702         * class.cs (TypeContainer::RegisterRequiredImplementations):
15703         Record methods we need.
15704
15705         (TypeContainer::MakeKey): Helper function to make keys for
15706         MethodBases, since the Methodbase key is useless.
15707
15708         (TypeContainer::Populate): Call RegisterRequiredImplementations
15709         before defining the methods.   
15710
15711         Create a mapping for method_builders_to_methods ahead of time
15712         instead of inside a tight loop.
15713
15714         (::RequireMethods):  Accept an object as the data to set into the
15715         hashtable so we can report interface vs abstract method mismatch.
15716
15717 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15718
15719         * report.cs: Make all of it static.
15720
15721         * rootcontext.cs: Drop object_type and value_type computations, as
15722         we have those in the TypeManager anyways.
15723
15724         Drop report instance variable too, now it is a global.
15725
15726         * driver.cs: Use try/catch on command line handling.
15727
15728         Add --probe option to debug the error reporting system with a test
15729         suite. 
15730
15731         * report.cs: Add support for exiting program when a probe
15732         condition is reached.
15733
15734 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15735
15736         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15737         we do a forcible conversion regardless of type, to check if 
15738         ForceConversion returns a null.
15739
15740         (Binary::error19): Use location to report error.
15741
15742         (Unary::error23): Use location here too.
15743
15744         * ../errors/cs0019.cs : Check in.
15745
15746         * ../errors/cs0023.cs : Check in.
15747
15748         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15749         case of a non-null MethodInfo object with a length of 0 !
15750
15751         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15752         an applicable member - according to the spec :-)
15753         Also fix logic to find members in base types.
15754
15755         (Unary::ResolveOperator): Same here.
15756
15757         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15758         as I was getting thoroughly confused between this and error19 :-)
15759
15760         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15761         (::FindMostEncompassedType): Implement.
15762         (::FindMostEncompassingType): Implement.
15763         (::StandardConversionExists): Implement.
15764
15765         (UserImplicitCast): Re-vamp. We now need info about most specific
15766         source and target types so that we can do the necessary conversions.
15767
15768         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15769         mathematical union with no duplicates.
15770
15771 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15772
15773         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15774         in order from base classes to child classes, so that we can in
15775         child classes look up in our parent for method names and
15776         attributes (required for handling abstract, virtual, new, override
15777         constructs: we need to instrospect our base class, and if we dont
15778         populate the classes in order, the introspection might be
15779         incorrect.  For example, a method could query its parent before
15780         the parent has any methods and would determine that the parent has
15781         no abstract methods (while it could have had them)).
15782
15783         (RootContext::CreateType): Record the order in which we define the
15784         classes.
15785
15786 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15787
15788         * class.cs (TypeContainer::Populate): Also method definitions can
15789         fail now, keep track of this.
15790
15791         (TypeContainer::FindMembers): Implement support for
15792         DeclaredOnly/noDeclaredOnly flag.
15793
15794         (Constructor::Emit) Return the ConstructorBuilder.
15795
15796         (Method::Emit) Return the MethodBuilder. 
15797         Check for abstract or virtual methods to be public.
15798
15799         * rootcontext.cs (RootContext::CreateType): Register all the
15800         abstract methods required for the class to be complete and the
15801         interface methods that must be implemented. 
15802
15803         * cs-parser.jay: Report error 501 (method requires body if it is
15804         not marked abstract or extern).
15805
15806         * expression.cs (TypeOf::Emit): Implement.
15807
15808         * typemanager.cs: runtime_handle_type, new global type.
15809
15810         * class.cs (Property::Emit): Generate code for properties.
15811
15812 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15813
15814         * expression.cs (Unary::ResolveOperator): Find operators on base type
15815         too - we now conform exactly to the spec.
15816
15817         (Binary::ResolveOperator): Same here.
15818
15819         * class.cs (Operator::Define): Fix minor quirk in the tests.
15820
15821         * ../errors/cs0215.cs : Added.
15822
15823         * ../errors/cs0556.cs : Added.
15824
15825         * ../errors/cs0555.cs : Added.
15826
15827 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15828
15829         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15830         single integer which is really efficient
15831
15832 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15833
15834         *  expression.cs (Expression::ImplicitUserConversion): Use location
15835         even in the case when we are examining True operators.
15836  
15837         * class.cs (Operator::Define): Perform extensive checks to conform
15838         with the rules for operator overloading in the spec.
15839
15840         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15841         some of the other conversions mentioned in the spec.
15842
15843         * typemanager.cs (array_type): New static member for the System.Array built-in
15844         type.
15845
15846         (cloneable_interface): For System.ICloneable interface.
15847
15848         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15849         we start resolving the tree and populating types.
15850
15851         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15852  
15853 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15854
15855         * expression.cs (Expression::ExprClassFromMemberInfo,
15856         Expression::Literalize): Create literal expressions from
15857         FieldInfos which are literals.
15858
15859         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
15860         type casts, because they were wrong.  The test suite in tests
15861         caught these ones.
15862
15863         (ImplicitNumericConversion): ushort to ulong requires a widening
15864         cast. 
15865
15866         Int32 constant to long requires widening cast as well.
15867
15868         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
15869         for integers because the type on the stack is not i4.
15870
15871 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
15872
15873         * expression.cs (report118): require location argument. 
15874
15875         * parameter.cs: Do not dereference potential null value.
15876
15877         * class.cs: Catch methods that lack the `new' keyword when
15878         overriding a name.  Report warnings when `new' is used without
15879         anything being there to override.
15880
15881         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15882
15883         * class.cs: Only add constructor to hashtable if it is non-null
15884         (as now constructors can fail on define).
15885
15886         (TypeManager, Class, Struct): Take location arguments.
15887
15888         Catch field instance initialization in structs as errors.
15889
15890         accepting_filter: a new filter for FindMembers that is static so
15891         that we dont create an instance per invocation.
15892
15893         (Constructor::Define): Catch errors where a struct constructor is
15894         parameterless 
15895
15896         * cs-parser.jay: Pass location information for various new
15897         constructs. 
15898
15899         * delegate.cs (Delegate): take a location argument.
15900
15901         * driver.cs: Do not call EmitCode if there were problesm in the
15902         Definition of the types, as many Builders wont be there. 
15903
15904         * decl.cs (Decl::Decl): Require a location argument.
15905
15906         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15907         into integers, and find the most appropiate integer for it.
15908
15909         * literal.cs: Implement ULongLiteral.
15910
15911         * rootcontext.cs: Provide better information about the location of
15912         failure when CreateType fails.
15913
15914 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15915
15916         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15917         as well.
15918
15919         * expression.cs (Binary::CheckShiftArguments): Add missing type
15920         computation.
15921         (Binary::ResolveOperator): Add type to the logical and and logical
15922         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15923         before.
15924
15925         (Binary::DoNumericPromotions): In the case where either argument
15926         is ulong (and most signed types combined with ulong cause an
15927         error) perform implicit integer constant conversions as well.
15928
15929 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15930
15931         * expression.cs (UserImplicitCast): Method should always be
15932         non-null. 
15933         (Invocation::BetterConversion): Simplified test for IntLiteral.
15934
15935         (Expression::ImplicitNumericConversion): Split this routine out.
15936         Put the code that performs implicit constant integer conversions
15937         here. 
15938
15939         (Expression::Resolve): Become a wrapper around DoResolve so we can
15940         check eclass and type being set after resolve.
15941
15942         (Invocation::Badness): Remove this dead function
15943
15944         (Binary::ResolveOperator): Do not compute the expensive argumnets
15945         unless we have a union for it.
15946
15947         (Probe::Emit): Is needs to do an isinst and then
15948         compare against null.
15949
15950         (::CanConvert): Added Location argument.  If the Location argument
15951         is null (Location.Null), then we do not report errors.  This is
15952         used by the `probe' mechanism of the Explicit conversion.  We do
15953         not want to generate an error for something that the user
15954         explicitly requested to be casted.  But the pipeline for an
15955         explicit cast first tests for potential implicit casts.
15956
15957         So for now, if the Location is null, it means `Probe only' to
15958         avoid adding another argument.   Might have to revise this
15959         strategy later.
15960
15961         (ClassCast): New class used to type cast objects into arbitrary
15962         classes (used in Explicit Reference Conversions).
15963
15964         Implement `as' as well.
15965
15966         Reverted all the patches from Ravi below: they were broken:
15967
15968                 * The use of `level' as a mechanism to stop recursive
15969                   invocations is wrong.  That was there just to catch the
15970                   bug with a strack trace but not as a way of addressing
15971                   the problem.
15972
15973                   To fix the problem we have to *understand* what is going
15974                   on and the interactions and come up with a plan, not
15975                   just get things going.
15976
15977                 * The use of the type conversion cache that I proposed
15978                   last night had an open topic: How does this work across
15979                   protection domains.  A user defined conversion might not
15980                   be public in the location where we are applying the
15981                   conversion, a different conversion might be selected
15982                   (ie, private A->B (better) but public B->A (worse),
15983                   inside A, A->B applies, but outside it, B->A will
15984                   apply).
15985
15986                 * On top of that (ie, even if the above is solved),
15987                   conversions in a cache need to be abstract.  Ie, `To
15988                   convert from an Int to a Short use an OpcodeCast', not
15989                   `To convert from an Int to a Short use the OpcodeCast on
15990                   the variable 5' (which is what this patch was doing).
15991
15992 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15993
15994         * expression.cs (Invocation::ConversionExists): Re-write to use
15995         the conversion cache
15996
15997         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
15998         cache all conversions done, not just user-defined ones.
15999
16000         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16001         to determine if a conversion exists instead of acutually trying to 
16002         perform the conversion. It's faster too.
16003
16004         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16005         and only then attempt the implicit conversion.
16006
16007 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16008
16009         * expression.cs (ConvertImplicit): Use a cache for conversions
16010         already found. Check level of recursion and bail out if necessary.
16011
16012 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16013
16014         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16015         Export standard methods that we expect for string operations.
16016
16017         * statement.cs (Block::UsageWarning): Track usage of variables and
16018         report the errors for not used variables.
16019
16020         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16021         operator. 
16022
16023 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16024
16025         * codegen.cs: remove unnneded code 
16026
16027         * expression.cs: Removed BuiltinTypeAccess class
16028
16029         Fix the order in which implicit conversions are
16030         done.  
16031
16032         The previous fixed dropped support for boxed conversions (adding a
16033         test to the test suite now)
16034
16035         (UserImplicitCast::CanConvert): Remove test for source being null,
16036         that code is broken.  We should not feed a null to begin with, if
16037         we do, then we should track the bug where the problem originates
16038         and not try to cover it up here.
16039
16040         Return a resolved expression of type UserImplicitCast on success
16041         rather than true/false.  Ravi: this is what I was talking about,
16042         the pattern is to use a static method as a "constructor" for
16043         objects. 
16044
16045         Also, do not create arguments until the very last minute,
16046         otherwise we always create the arguments even for lookups that
16047         will never be performed. 
16048
16049         (UserImplicitCast::Resolve): Eliminate, objects of type
16050         UserImplicitCast are born in a fully resolved state. 
16051
16052         * typemanager.cs (InitCoreTypes): Init also value_type
16053         (System.ValueType). 
16054
16055         * expression.cs (Cast::Resolve): First resolve the child expression.
16056
16057         (LValue): Add new method AddressOf to be used by
16058         the `&' operator.  
16059
16060         Change the argument of Store to take an EmitContext instead of an
16061         ILGenerator, because things like FieldExpr need to be able to call
16062         their children expression to generate the instance code. 
16063
16064         (Expression::Error, Expression::Warning): Sugar functions for
16065         reporting errors.
16066
16067         (Expression::MemberLookup): Accept a TypeContainer instead of a
16068         Report as the first argument.
16069
16070         (Expression::ResolvePrimary): Killed.  I still want to improve
16071         this as currently the code is just not right.
16072
16073         (Expression::ResolveMemberAccess): Simplify, but it is still
16074         wrong. 
16075
16076         (Unary::Resolve): Catch errors in AddressOf operators.
16077
16078         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16079         index to a byte for the short-version, or the compiler will choose
16080         the wrong Emit call, which generates the wrong data.
16081
16082         (ParameterReference::Emit, ::Store): same.
16083
16084         (FieldExpr::AddressOf): Implement.
16085
16086         * typemanager.cs: TypeManager: made public variable instead of
16087         property.
16088
16089         * driver.cs: document --fatal.
16090
16091         * report.cs (ErrorMessage, WarningMessage): new names for the old
16092         Error and Warning classes.
16093
16094         * cs-parser.jay (member_access): Turn built-in access to types
16095         into a normal simplename
16096
16097 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16098
16099         * expression.cs (Invocation::BetterConversion): Fix to cope
16100         with q being null, since this was introducing a bug.
16101
16102         * expression.cs (ConvertImplicit): Do built-in conversions first.
16103
16104 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16105
16106         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16107
16108 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16109
16110         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16111         I had introduced long ago (what's new ?).
16112
16113         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16114         the work of all the checking. 
16115         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16116         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16117
16118         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16119         that is the right way. 
16120
16121         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16122         overloading resolution. Use everywhere instead of cutting and pasting code.
16123
16124         (Binary::ResolveOperator): Use MakeUnionSet.
16125
16126         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16127         we have to convert to bool types. Not complete yet.
16128
16129 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16130
16131         * typemanager.cs (TypeManager::CSharpName): support ushort.
16132
16133         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16134         to provide an expression that performsn an implicit constant int
16135         conversion (section 6.1.6).
16136         (Expression::ConvertImplicitRequired): Reworked to include
16137         implicit constant expression conversions.
16138
16139         (Expression::ConvertNumericExplicit): Finished.
16140
16141         (Invocation::Emit): If InstanceExpression is null, then it means
16142         that we perform a call on this.
16143
16144 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16145
16146         * expression.cs (Unary::Emit): Remove some dead code.
16147         (Probe): Implement Resolve and Emit for `is'.
16148         (Expression::ConvertImplicitRequired): Attempt to do constant
16149         expression conversions here.  Maybe should be moved to
16150         ConvertImplicit, but I am not sure.
16151         (Expression::ImplicitLongConstantConversionPossible,
16152         Expression::ImplicitIntConstantConversionPossible): New functions
16153         that tell whether is it possible to apply an implicit constant
16154         expression conversion.
16155
16156         (ConvertNumericExplicit): Started work on explicit numeric
16157         conversions.
16158
16159         * cs-parser.jay: Update operator constants.
16160
16161         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16162         (Parameters::GetSignature): Hook up VerifyArgs here.
16163         (Parameters::VerifyArgs): Verifies that no two arguments have the
16164         same name. 
16165
16166         * class.cs (Operator): Update the operator names to reflect the
16167         ones that the spec expects (as we are just stringizing the
16168         operator names).
16169
16170         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16171         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16172         previous usage did only work for our methods.
16173         (Expression::ConvertImplicit): Handle decimal implicit numeric
16174         conversions as well.
16175         (Expression::InternalTypeConstructor): Used to invoke constructors
16176         on internal types for default promotions.
16177
16178         (Unary::Emit): Implement special handling for the pre/post
16179         increment/decrement for overloaded operators, as they need to have
16180         the same semantics as the other operators.
16181
16182         (Binary::ResolveOperator): ditto.
16183         (Invocation::ConversionExists): ditto.
16184         (UserImplicitCast::Resolve): ditto.
16185
16186 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16187
16188         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16189         operator, return after emitting body. Regression tests pass again !
16190
16191         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16192         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16193         (Invocation::OverloadResolve): Ditto.
16194         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16195
16196         * everywhere : update calls to the above methods accordingly.
16197
16198 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16199
16200         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16201
16202         * expression.cs (ExpressionStatement): New base class used for
16203         expressions that can appear in statements, so that we can provide
16204         an alternate path to generate expression that do not leave a value
16205         on the stack.
16206
16207         (Expression::Emit, and all the derivatives): We no longer return
16208         whether a value is left on the stack or not.  Every expression
16209         after being emitted leaves a single value on the stack.
16210
16211         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16212         facilties of ExpressionStatement if possible.
16213
16214         * cs-parser.jay: Update statement_expression.
16215
16216 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16217
16218         * driver.cs: Change the wording of message
16219
16220 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16221
16222         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16223         the type of the expression to the return type of the method if
16224         we have an overloaded operator match ! The regression tests pass again !
16225         (Unary::ResolveOperator): Ditto.
16226
16227         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16228         to find "op_Implicit", not "implicit" ;-)
16229         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16230         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16231
16232         * everywhere : Correct calls to the above accordingly.
16233
16234         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16235         (ConvertImplicit): Do user-defined conversion if it exists.
16236
16237 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16238
16239         * assign.cs: track location.
16240         (Resolve): Use implicit conversions on assignment.
16241
16242         * literal.cs: Oops.  Not good, Emit of short access values should
16243         pass (Bytes) or the wrong argument will be selected.
16244
16245         * expression.cs (Unary::Emit): Emit code for -expr.
16246
16247         (Unary::ResolveOperator): Handle `Substract' for non-constants
16248         (substract from zero from the non-constants).
16249         Deal with Doubles as well. 
16250
16251         (Expression::ConvertImplicitRequired): New routine that reports an
16252         error if no implicit conversion exists. 
16253
16254         (Invocation::OverloadResolve): Store the converted implicit
16255         expressions if we make them
16256
16257 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16258
16259         * class.cs (ConstructorInitializer): Take a Location argument.
16260         (ConstructorBaseInitializer): Same here.
16261         (ConstructorThisInitializer): Same here.
16262
16263         * cs-parser.jay : Update all calls accordingly.
16264
16265         * expression.cs (Unary, Binary, New): Take location argument.
16266         Update accordingly everywhere.
16267
16268         * cs-parser.jay : Update all calls to the above to take a location
16269         argument.
16270
16271         * class.cs : Ditto.
16272
16273 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16274
16275         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16276         (Invocation::BetterConversion): Same here
16277         (Invocation::ConversionExists): Ditto.
16278
16279         (Invocation::ConversionExists): Implement.
16280
16281 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16282
16283         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16284         Also take an additional TypeContainer argument.
16285
16286         * All over : Pass in TypeContainer as argument to OverloadResolve.
16287
16288         * typemanager.cs (CSharpName): Update to check for the string type and return
16289         that too.
16290
16291         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16292         a given method.
16293
16294 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16295
16296         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16297         (Invocation::BetterFunction): Implement.
16298         (Invocation::BetterConversion): Implement.
16299         (Invocation::ConversionExists): Skeleton, no implementation yet.
16300
16301         Okay, things work fine !
16302
16303 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16304
16305         * typemanager.cs: declare and load enum_type, delegate_type and
16306         void_type. 
16307
16308         * expression.cs (Expression::Emit): Now emit returns a value that
16309         tells whether a value is left on the stack or not.  This strategy
16310         might be reveted tomorrow with a mechanism that would address
16311         multiple assignments.
16312         (Expression::report118): Utility routine to report mismatches on
16313         the ExprClass.
16314
16315         (Unary::Report23): Report impossible type/operator combination
16316         utility function.
16317
16318         (Unary::IsIncrementableNumber): Whether the type can be
16319         incremented or decremented with add.
16320         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16321         complemented. 
16322         (Unary::ResolveOperator): Implement ++, !, ~,
16323
16324         (Invocation::Emit): Deal with new Emit convetion.
16325
16326         * All Expression derivatives: Updated their Emit method to return
16327         whether they leave values on the stack or not.
16328
16329         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16330         stack for expressions that are statements. 
16331
16332 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16333
16334         * expression.cs (LValue): New interface.  Must be implemented by
16335         LValue objects.
16336         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16337         LValue interface.
16338
16339         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16340         interface for generating code, simplifies the code.
16341
16342 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16343
16344         * expression.cs (everywhere): Comment out return statements in ::Resolve
16345         methods to avoid the warnings.
16346
16347 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16348
16349         * driver.cs (parse): Report error 2001 if we can not open the
16350         source file.
16351
16352         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16353         not resolve it.
16354
16355         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16356         object. 
16357
16358         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16359         otherwise nested blocks end up with the same index.
16360
16361         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16362
16363         * expression.cs:  Instead of having FIXMEs in the Resolve
16364         functions, throw exceptions so it is obvious that we are facing a
16365         bug. 
16366
16367         * cs-parser.jay (invocation_expression): Pass Location information.
16368
16369         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16370         Use a basename for those routines because .NET does not like paths
16371         on them. 
16372
16373         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16374         already defined.
16375
16376 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16377
16378         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16379         are loading the correct data types (throws an exception if not).
16380         (TypeManager::InitCoreTypes): Use CoreLookupType
16381
16382         * expression.cs (Unary::ResolveOperator): return the child
16383         expression for expressions which are just +expr.
16384         (Unary::ResolveOperator): Return negative literals for -LITERAL
16385         expressions (otherwise they are Unary {Literal}).
16386         (Invocation::Badness): Take into account `Implicit constant
16387         expression conversions'.
16388
16389         * literal.cs (LongLiteral): Implement long literal class.
16390         (IntLiteral): export the `Value' of the intliteral. 
16391
16392 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16393
16394         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16395
16396         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16397         instead of 'Operator'
16398
16399         * expression.cs (Binary::ResolveOperator): Update accordingly.
16400         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16401         and 'Minus'
16402
16403         * cs-parser.jay (unary_expression): Update to use the new names.
16404
16405         * gen-treedump.cs (GetUnary): Same here.
16406
16407         * expression.cs (Unary::Resolve): Implement.
16408         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16409         operators are found instead of making noise ;-)
16410         (Unary::ResolveOperator): New method to do precisely the same thing which
16411         Binary::ResolveOperator does for Binary expressions.
16412         (Unary.method, .Arguments): Add.
16413         (Unary::OperName): Implement.   
16414         (Unary::ForceConversion): Copy and Paste !
16415
16416         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16417         a unary operator.
16418
16419         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16420         for the inbuilt operators. Only overloading works for now ;-)
16421
16422 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16423
16424         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16425         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16426
16427         * expression.cs (This::Emit): Implement. 
16428         (This::Resolve): Implement.
16429         (TypeOf:Resolve): Implement.
16430         (Expression::ResolveSimpleName): Add an implicit this to instance
16431         field references. 
16432         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16433         Bind instance variable to Field expressions.
16434         (FieldExpr::Instance): New field used to track the expression that
16435         represents the object instance.
16436         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16437         binding 
16438         (FieldExpr::Emit): Implement.
16439
16440         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16441         the last instruction contains a return opcode to avoid generating
16442         the last `ret' instruction (this generates correct code, and it is
16443         nice to pass the peverify output).
16444
16445         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16446         initializer for static and instance variables.
16447         (Constructor::Emit): Allow initializer to be null in the case of
16448         static constructors.  Only emit initializer for instance
16449         constructors. 
16450
16451         (TypeContainer::FindMembers): Return a null array if there are no
16452         matches.
16453
16454         Also fix the code for the MemberTypes.Method branch, as it was not
16455         scanning that for operators (or tried to access null variables before).
16456
16457         * assign.cs (Assign::Emit): Handle instance and static fields. 
16458
16459         * TODO: Updated.
16460
16461         * driver.cs: Stop compilation if there are parse errors.
16462
16463         * cs-parser.jay (constructor_declaration): Provide default base
16464         initializer for non-static constructors.
16465         (constructor_declarator): Do not provide a default base
16466         initializers if none was specified.
16467         Catch the fact that constructors should not have parameters.
16468
16469         * class.cs: Do not emit parent class initializers for static
16470         constructors, that should be flagged as an error.
16471
16472 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16473
16474         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16475         Move back code into TypeContainer::Populate.
16476
16477 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16478
16479         * class.cs (TypeContainer::AddConstructor): Fix the check to
16480         compare against Name, not Basename. 
16481         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16482
16483         * cs-parser.jay : Update accordingly.
16484
16485         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16486         for methods, don't forget to look into the operators too.
16487         (RegisterMethodBuilder): Helper method to take care of this for
16488         methods, constructors and operators.
16489         (Operator::Define): Completely revamp.
16490         (Operator.OperatorMethod, MethodName): New fields.
16491         (TypeContainer::Populate): Move the registering of builders into
16492         RegisterMethodBuilder.
16493         (Operator::Emit): Re-write.
16494
16495         * expression.cs (Binary::Emit): Comment out code path to emit method
16496         invocation stuff for the case when we have a user defined operator. I am
16497         just not able to get it right !
16498
16499 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16500
16501         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16502         argument. 
16503
16504         (Expression::MemberLookup): Provide a version that allows to
16505         specify the MemberTypes and BindingFlags. 
16506
16507         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16508         so it was not fetching variable information from outer blocks.
16509
16510         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16511         Beforefieldinit as it was buggy.
16512
16513         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16514         that Ravi put here.  
16515
16516         * class.cs (Constructor::Emit): Only emit if block is not null.
16517         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16518         deal with this by semantically definining it as if the user had
16519         done it.
16520
16521         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16522         constructors as we now "emit" them at a higher level.
16523
16524         (TypeContainer::DefineDefaultConstructor): Used to define the
16525         default constructors if none was provided.
16526
16527         (ConstructorInitializer): Add methods Resolve and Emit. 
16528
16529         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16530
16531 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16532
16533         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16534         the default constructor builder with our hashtable for methodbuilders
16535         to methodcores.
16536
16537         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16538         and argument_count is 0 in which case we have a match.
16539         (Binary::ResolveOperator): More null checking and miscellaneous coding
16540         style cleanup.
16541
16542 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16543
16544         * rootcontext.cs (IsNameSpace): Compare against null.
16545
16546         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16547
16548         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16549         and Unary::Operator.
16550
16551         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16552         accordingly.
16553
16554         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16555         we have overloaded operators.
16556         (Binary::ResolveOperator): Implement the part which does the operator overload
16557         resolution.
16558
16559         * class.cs (Operator::Emit): Implement.
16560         (TypeContainer::Emit): Emit the operators we have too.
16561
16562         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16563         the case when we have a user-defined operator.
16564
16565 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16566
16567         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16568
16569 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16570
16571         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16572         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16573         (Constructor::Emit): Implement.
16574         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16575         if we have no work to do. 
16576         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16577         Emit method.
16578
16579         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16580         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16581
16582         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16583         of parent.parent.
16584
16585 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16586
16587         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16588         in the source.
16589         (Tree::RecordNamespace): Method to do what the name says ;-)
16590         (Tree::Namespaces): Property to get at the namespaces hashtable.
16591
16592         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16593         keep track.
16594
16595         * rootcontext.cs (IsNamespace): Fixed it :-)
16596
16597 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16598
16599         * class.cs (TypeContainer::FindMembers): Add support for
16600         constructors. 
16601         (MethodCore): New class that encapsulates both the shared aspects
16602         of a Constructor and a Method.  
16603         (Method, Constructor): Factored pieces into MethodCore.
16604
16605         * driver.cs: Added --fatal which makes errors throw exceptions.
16606         Load System assembly as well as part of the standard library.
16607
16608         * report.cs: Allow throwing exceptions on errors for debugging.
16609
16610         * modifiers.cs: Do not use `parent', instead use the real type
16611         container to evaluate permission settings.
16612
16613         * class.cs: Put Ravi's patch back in.  He is right, and we will
16614         have to cope with the
16615
16616 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16617
16618         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16619         FamORAssem, not FamANDAssem.
16620
16621 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16622
16623         * driver.cs: Added --parse option that only parses its input files
16624         and terminates.
16625
16626         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16627         incorrect.  IsTopLevel is not used to tell whether an object is
16628         root_types or not (that can be achieved by testing this ==
16629         root_types).  But to see if this is a top-level *class* (not
16630         necessarly our "toplevel" container). 
16631
16632 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16633
16634         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16635         parent instead of a direct call to GetType.
16636
16637 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16638
16639         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16640         Modifiers.TypeAttr. This should just be a call to that method.
16641
16642         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16643         object so that we can determine if we are top-level or not.
16644
16645         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16646         TypeContainer too.
16647
16648         * enum.cs (Enum::Define): Ditto.
16649
16650         * modifiers.cs (FieldAttr): Re-write.
16651
16652         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16653         (TypeContainer::HaveStaticConstructor): New property to provide access
16654         to precisely that info.
16655
16656         * modifiers.cs (MethodAttr): Re-write.
16657         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16658
16659         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16660         of top-level types as claimed.
16661
16662 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16663
16664         * expression.cs (MemberLookup): Fruitless attempt to lookup
16665         constructors.  Maybe I need to emit default constructors?  That
16666         might be it (currently .NET emits this for me automatically).
16667         (Invocation::OverloadResolve): Cope with Arguments == null.
16668         (Invocation::EmitArguments): new function, shared by the new
16669         constructor and us.
16670         (Invocation::Emit): Handle static and instance methods.  Emit
16671         proper call instruction for virtual or non-virtual invocations.
16672         (New::Emit): Implement.
16673         (New::Resolve): Implement.
16674         (MemberAccess:Resolve): Implement.
16675         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16676         to track instances.
16677         (FieldExpr::Resolve): Set type.
16678
16679         * support.cs: Handle empty arguments.
16680                 
16681         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16682         SimpleLookup): Auxiliary routines to help parse a qualifier
16683         identifier.  
16684
16685         Update qualifier_identifier rule.
16686
16687         * codegen.cs: Removed debugging messages.
16688
16689         * class.cs: Make this a global thing, this acts just as a "key" to
16690         objects that we might have around.
16691
16692         (Populate): Only initialize method_builders_to_methods once.
16693
16694         * expression.cs (PropertyExpr): Initialize type from the
16695         PropertyType. 
16696
16697         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16698         Resolve pattern.  Attempt to implicitly convert value to boolean.
16699         Emit code.
16700
16701         * expression.cs: Set the type for the int32/int32 argument case.
16702         (Binary::ResolveOperator): Set the return type to boolean for
16703         comparission operators
16704
16705         * typemanager.cs: Remove debugging print code.
16706
16707         (Invocation::Resolve): resolve type.
16708
16709         * class.cs: Allocate a MemberInfo of the correct size, as the code
16710         elsewhere depends on the test to reflect the correct contents.
16711
16712         (Method::) Keep track of parameters, due to System.Reflection holes
16713
16714         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16715         mapping here.
16716
16717         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16718         of the exact size and return that.
16719
16720         (Class::LookupMethodByBuilder): New function that maps
16721         MethodBuilders to its methods.  Required to locate the information
16722         on methods because System.Reflection bit us again.
16723
16724         * support.cs: New file, contains an interface ParameterData and
16725         two implementations: ReflectionParameters and InternalParameters
16726         used to access Parameter information.  We will need to grow this
16727         as required.
16728
16729         * expression.cs (Invocation::GetParameterData): implement a cache
16730         and a wrapper around the ParameterData creation for methods. 
16731         (Invocation::OverloadResolve): Use new code.
16732
16733 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16734
16735         * class.cs (TypeContainer::EmitField): Remove and move into 
16736         (Field::Define): here and modify accordingly.
16737         (Field.FieldBuilder): New member.
16738         (TypeContainer::Populate): Update accordingly.
16739         (TypeContainer::FindMembers): Implement.
16740
16741 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16742
16743         * statement.cs: (VariableInfo::VariableType): New field to be
16744         initialized with the full type once it is resolved. 
16745
16746 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16747
16748         * parameter.cs (GetParameterInfo): Use a type cache to compute
16749         things only once, and to reuse this information
16750
16751         * expression.cs (LocalVariableReference::Emit): Implement.
16752         (OpcodeCast::Emit): fix.
16753
16754         (ParameterReference::Resolve): Implement.
16755         (ParameterReference::Emit): Implement.
16756
16757         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16758         that are expressions need to stay as Expressions.
16759
16760         * typemanager.cs (CSharpName): Returns the C# name of a type if
16761         possible. 
16762
16763         * expression.cs (Expression::ConvertImplicit): New function that
16764         implements implicit type conversions.
16765
16766         (Expression::ImplicitReferenceConversion): Implements implicit
16767         reference conversions.
16768
16769         (EmptyCast): New type for transparent casts.
16770
16771         (OpcodeCast): New type for casts of types that are performed with
16772         a sequence of bytecodes.
16773
16774         (BoxedCast): New type used for casting value types into reference
16775         types.  Emits a box opcode.
16776
16777         (Binary::DoNumericPromotions): Implements numeric promotions of
16778         and computation of the Binary::Type.
16779
16780         (Binary::EmitBranchable): Optimization.
16781
16782         (Binary::Emit): Implement code emission for expressions.
16783
16784         * typemanager.cs (TypeManager): Added two new core types: sbyte
16785         and byte.
16786
16787 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16788
16789         * class.cs (TypeContainer::FindMembers): Method which does exactly
16790         what Type.FindMembers does, only we don't have to use reflection. No
16791         implementation yet.
16792
16793         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16794         typecontainer objects as we need to get at them.
16795         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16796
16797         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16798         typecontainer object.
16799
16800         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16801         of just a Report object.
16802
16803 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16804
16805         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16806         "remove_"
16807         (TypeContainer::Populate): Now define the delegates of the type too.
16808         (TypeContainer.Delegates): Property to access the list of delegates defined
16809         in the type.
16810
16811         * delegates.cs (Delegate::Define): Implement partially.
16812
16813         * modifiers.cs (TypeAttr): Handle more flags.
16814
16815 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16816
16817         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16818         and not <=
16819         (Operator::Define): Re-write logic to get types by using the LookupType method
16820         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16821         (Indexer::Define): Ditto.
16822         (Event::Define): Ditto.
16823         (Property::Define): Ditto.
16824
16825 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16826
16827         * class.cs (TypeContainer::Populate): Now define operators too. 
16828         (TypeContainer.Operators): New property to access the list of operators
16829         in a type.
16830         (Operator.OperatorMethodBuilder): New member to hold the method builder
16831         for the operator we are defining.
16832         (Operator::Define): Implement.
16833
16834 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16835
16836         * class.cs (Event::Define): Make the prefixes of the accessor methods
16837         addOn_ and removeOn_ 
16838
16839         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16840         of the location being passed in too. Ideally, this should go later since all
16841         error reporting should be done through the Report object.
16842
16843         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16844         (Populate): Iterate thru the indexers we have and define them too.
16845         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16846         for the get and set accessors.
16847         (Indexer::Define): Implement.
16848
16849 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16850
16851         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16852         my previous implementation, did not work.
16853
16854         * typemanager.cs: Add a couple of missing types (the longs).
16855
16856         * literal.cs: Use TypeManager.bool_type instead of getting it.
16857
16858         * expression.cs (EventExpr): New kind of expressions.
16859         (Expressio::ExprClassFromMemberInfo): finish
16860
16861 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
16862
16863         * assign.cs: Emit stores to static fields differently.
16864
16865 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16866
16867         * Merge in changes and adjust code to tackle conflicts. Backed out my
16868         code in Assign::Resolve ;-) 
16869
16870 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16871
16872         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
16873         instead Report.Error and also pass in the location.
16874         (CSharpParser::Lexer): New readonly property to return the reference
16875         to the Tokenizer object.
16876         (declare_local_variables): Use Report.Error with location instead of plain 
16877         old error.
16878         (CheckDef): Ditto.
16879
16880         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16881         (Operator.CheckBinaryOperator): Ditto.
16882
16883         * cs-parser.jay (operator_declarator): Update accordingly.
16884
16885         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16886         (CheckBinaryOperator): Same here.
16887
16888         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16889         on the name without any prefixes of namespace names etc. This is because we
16890         already might have something already fully qualified like 
16891         'System.Console.WriteLine'
16892
16893         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16894
16895 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16896
16897         * cs-tokenizer.cs (location): Return a string which also contains
16898         the file name.
16899
16900         * expression.cs (ElementAccess): New class for expressions of the
16901         type 'element access.'
16902         (BaseAccess): New class for expressions of the type 'base access.'
16903         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16904         respectively.
16905
16906         * cs-parser.jay (element_access): Implement action.
16907         (base_access): Implement actions.
16908         (checked_expression, unchecked_expression): Implement.
16909
16910         * cs-parser.jay (local_variable_type): Correct and implement.
16911         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16912
16913         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16914
16915         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16916         name and the specifiers.
16917
16918         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16919
16920         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16921         making them all public ;-)
16922
16923         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16924         class anyways.
16925
16926 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16927
16928         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16929         PropertyExprs.
16930         (FieldExpr, PropertyExprs): New resolved expressions.
16931         (SimpleName::MemberStaticCheck): Perform static checks for access
16932         to non-static fields on static methods. Maybe this should be
16933         generalized for MemberAccesses. 
16934         (SimpleName::ResolveSimpleName): More work on simple name
16935         resolution. 
16936
16937         * cs-parser.jay (primary_expression/qualified_identifier): track
16938         the parameter index.
16939
16940         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16941         (EmitContext::EmitBoolExpression): Chain to expression generation
16942         instead of temporary hack.
16943         (::EmitStatementExpression): Put generic expression code generation.
16944
16945         * assign.cs (Assign::Emit): Implement variable assignments to
16946         local variables, parameters and fields.
16947
16948 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16949
16950         * statement.cs (Block::GetVariableInfo): New method, returns the
16951         VariableInfo for a variable name in a block.
16952         (Block::GetVariableType): Implement in terms of GetVariableInfo
16953
16954         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16955         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16956
16957 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16958
16959         * cs-parser.jay (operator_declaration): Continue on my quest : update
16960         to take attributes argument.
16961         (event_declaration): Ditto.
16962         (enum_declaration): Ditto.
16963         (indexer_declaration): Ditto.
16964
16965         * class.cs (Operator::Operator): Update constructor accordingly.
16966         (Event::Event): Ditto.
16967
16968         * delegate.cs (Delegate::Delegate): Same here.
16969
16970         * enum.cs (Enum::Enum): Same here.
16971
16972 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16973
16974         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16975
16976         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16977
16978         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16979         being passed around as an arraylist.
16980         (Attributes::AddAttribute): Method to add attribute sections.
16981
16982         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16983         (struct_declaration): Update accordingly.
16984         (constant_declaration): Update.
16985         (field_declaration): Update.
16986         (method_header): Update.
16987         (fixed_parameter): Update.
16988         (parameter_array): Ditto.
16989         (property_declaration): Ditto.
16990         (destructor_declaration): Ditto.
16991
16992         * class.cs (Struct::Struct): Update constructors accordingly.
16993         (Class::Class): Ditto.
16994         (Field::Field): Ditto.
16995         (Method::Method): Ditto.
16996         (Property::Property): Ditto.
16997         (TypeContainer::OptAttribute): update property's return type.
16998
16999         * interface.cs (Interface.opt_attributes): New member.
17000         (Interface::Interface): Update to take the extra Attributes argument.
17001
17002         * parameter.cs (Parameter::Parameter): Ditto.
17003
17004         * constant.cs (Constant::Constant): Ditto.
17005
17006         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17007         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17008         the attributes as a parameter.
17009         (InterfaceProperty): Update constructor call.
17010         (InterfaceEvent): Ditto.
17011         (InterfaceMethod): Ditto.
17012         (InterfaceIndexer): Ditto.
17013
17014         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17015         pass the attributes too.
17016         (interface_event_declaration): Ditto.
17017         (interface_property_declaration): Ditto.
17018         (interface_method_declaration): Ditto.
17019         (interface_declaration): Ditto.
17020
17021 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17022
17023         * class.cs (Method::Define): Track the "static Main" definition to
17024         create an entry point. 
17025
17026         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17027         EntryPoint if we find it. 
17028
17029         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17030         (EmitContext::ig): Make this variable public.
17031
17032         * driver.cs: Make the default output file be the first file name
17033         with the .exe extension.  
17034
17035         Detect empty compilations
17036
17037         Handle various kinds of output targets.  Handle --target and
17038         rename -t to --dumper.
17039
17040         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17041         methods inherited from Expression return now an Expression.  This
17042         will is used during the tree rewriting as we resolve them during
17043         semantic analysis.
17044
17045         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17046         the spec.  Missing entirely is the information about
17047         accessability of elements of it.
17048
17049         (Expression::ExprClassFromMemberInfo): New constructor for
17050         Expressions that creates a fully initialized Expression based on
17051         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17052         a Type.
17053
17054         (Invocation::Resolve): Begin implementing resolution of invocations.
17055
17056         * literal.cs (StringLiteral):  Implement Emit.
17057
17058 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17059
17060         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17061         member.
17062
17063 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17064
17065         * cs-parser.jay (attribute_arguments): Implement actions.
17066         (attribute): Fix bug in production. Implement action.
17067         (attribute_list): Implement.
17068         (attribute_target): Implement.
17069         (attribute_target_specifier, opt_target_specifier): Implement
17070         (CheckAttributeTarget): New method to check if the attribute target
17071         is valid.
17072         (attribute_section): Implement.
17073         (opt_attributes): Implement.
17074
17075         * attribute.cs : New file to handle attributes.
17076         (Attribute): Class to hold attribute info.
17077
17078         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17079         (attribute_section): Modify production to use 2 different rules to 
17080         achieve the same thing. 1 s/r conflict down !
17081         Clean out commented, useless, non-reducing dimension_separator rules.
17082
17083         * class.cs (TypeContainer.attributes): New member to hold list
17084         of attributes for a type.
17085         (Struct::Struct): Modify to take one more argument, the attribute list.
17086         (Class::Class): Ditto.
17087         (Field::Field): Ditto.
17088         (Method::Method): Ditto.
17089         (Property::Property): Ditto.
17090
17091         * cs-parser.jay (struct_declaration): Update constructor call to
17092         pass in the attributes too.
17093         (class_declaration): Ditto.
17094         (constant_declaration): Ditto.
17095         (field_declaration): Ditto.
17096         (method_header): Ditto.
17097         (fixed_parameter): Ditto.
17098         (parameter_array): Ditto.
17099         (property_declaration): Ditto.
17100
17101         * constant.cs (Constant::Constant): Update constructor similarly.
17102         Use System.Collections.
17103
17104         * parameter.cs (Parameter::Parameter): Update as above.
17105
17106 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17107
17108         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17109         (TypeContainer.delegates): New member to hold list of delegates.
17110
17111         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17112         this time as I seem to be on crack ;-)
17113
17114 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17115
17116         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17117         tell whether an identifier represents a namespace.
17118
17119         * expression.cs (NamespaceExpr): A namespace expression, used only
17120         temporarly during expression resolution.
17121         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17122         utility functions to resolve names on expressions.
17123
17124 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17125
17126         * codegen.cs: Add hook for StatementExpressions. 
17127
17128         * class.cs: Fix inverted test for static flag in methods.
17129
17130 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17131
17132         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17133         to make it coincide with MS' number.
17134         (Operator::CheckBinaryOperator): Ditto.
17135
17136         * ../errors/errors.txt : Remove error numbers added earlier.
17137
17138         * ../errors/cs1019.cs : Test case for error # 1019
17139
17140         * ../errros/cs1020.cs : Test case for error # 1020
17141
17142         * cs-parser.jay : Clean out commented cruft.
17143         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17144         used anywhere - non-reducing rule.
17145         (namespace_declarations): Non-reducing rule - comment out.
17146
17147         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17148         with TypeContainer::AddEnum.
17149
17150         * delegate.cs : New file for delegate handling classes.
17151         (Delegate): Class for declaring delegates.
17152
17153         * makefile : Update.
17154
17155         * cs-parser.jay (delegate_declaration): Implement.
17156
17157 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17158
17159         * class.cs (Event::Define): Implement.
17160         (Event.EventBuilder): New member.
17161
17162         * class.cs (TypeContainer::Populate): Update to define all enums and events
17163         we have.
17164         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17165         readonly fields for all these cases ?
17166
17167 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17168
17169         * class.cs (Property): Revamp to use the convention of making fields readonly.
17170         Accordingly modify code elsewhere.
17171
17172         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17173         the Define method of the Property class.
17174
17175         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17176         trivial bug.
17177         (TypeContainer::Populate): Update to define all the properties we have. Also
17178         define all enumerations.
17179
17180         * enum.cs (Define): Implement.
17181
17182 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17183
17184         * cs-parser.jay (overloadable_operator): The semantic value is an
17185         enum of the Operator class.
17186         (operator_declarator): Implement actions.
17187         (operator_declaration): Implement.
17188
17189         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17190         validity of definitions.
17191         (Operator::CheckBinaryOperator): Static method to check for binary operators
17192         (TypeContainer::AddOperator): New method to add an operator to a type.
17193
17194         * cs-parser.jay (indexer_declaration): Added line to actually call the
17195         AddIndexer method so it gets added ;-)
17196
17197         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17198         already taken care of by the MS compiler ?  
17199
17200 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17201
17202         * class.cs (Operator): New class for operator declarations.
17203         (Operator::OpType): Enum for the various operators.
17204
17205 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17206
17207         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17208         ostensibly handle this in semantic analysis.
17209
17210         * cs-parser.jay (general_catch_clause): Comment out
17211         (specific_catch_clauses, specific_catch_clause): Ditto.
17212         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17213         (catch_args, opt_catch_args): New productions.
17214         (catch_clause): Rewrite to use the new productions above
17215         (catch_clauses): Modify accordingly.
17216         (opt_catch_clauses): New production to use in try_statement
17217         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17218         and re-write the code in the actions to extract the specific and
17219         general catch clauses by being a little smart ;-)
17220
17221         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17222         Hooray, try and catch statements parse fine !
17223
17224 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17225
17226         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17227         string from the hashtable of variables.
17228
17229         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17230         I end up making that mistake ;-)
17231         (catch_clauses): Fixed gross error which made Key and Value of the 
17232         DictionaryEntry the same : $1 !!
17233
17234 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17235
17236         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17237
17238         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17239         when the add and remove accessors are specified. 
17240
17241 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17242
17243         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17244         information about indexer_declarator.
17245         (indexer_declarator): Implement actions.
17246         (parsing_indexer): New local boolean used to keep track of whether
17247         we are parsing indexers or properties. This is necessary because 
17248         implicit_parameters come into picture even for the get accessor in the 
17249         case of an indexer.
17250         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17251
17252         * class.cs (Indexer): New class for indexer declarations.
17253         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17254         (TypeContainer::indexers): New member to hold list of indexers for the
17255         type.
17256
17257 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17258
17259         * cs-parser.jay (add_accessor_declaration): Implement action.
17260         (remove_accessor_declaration): Implement action.
17261         (event_accessors_declaration): Implement
17262         (variable_declarators): swap statements for first rule - trivial.
17263
17264         * class.cs (Event): New class to hold information about event
17265         declarations.
17266         (TypeContainer::AddEvent): New method to add an event to a type
17267         (TypeContainer::events): New member to hold list of events.
17268
17269         * cs-parser.jay (event_declaration): Implement actions.
17270
17271 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17272
17273         * cs-parser.jay (dim_separators): Implement. Make it a string
17274         concatenating all the commas together, just as they appear.
17275         (opt_dim_separators): Modify accordingly
17276         (rank_specifiers): Update accordingly. Basically do the same
17277         thing - instead, collect the brackets here.
17278         (opt_rank_sepcifiers): Modify accordingly.
17279         (array_type): Modify to actually return the complete type string
17280         instead of ignoring the rank_specifiers.
17281         (expression_list): Implement to collect the expressions
17282         (variable_initializer): Implement. We make it a list of expressions
17283         essentially so that we can handle the array_initializer case neatly too.
17284         (variable_initializer_list): Implement.
17285         (array_initializer): Make it a list of variable_initializers
17286         (opt_array_initializer): Modify accordingly.
17287
17288         * expression.cs (New::NType): Add enumeration to help us
17289         keep track of whether we have an object/delegate creation
17290         or an array creation.
17291         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17292         members to hold data about array creation.
17293         (New:New): Modify to update NewType
17294         (New:New): New Overloaded contructor for the array creation
17295         case.
17296
17297         * cs-parser.jay (array_creation_expression): Implement to call
17298         the overloaded New constructor.
17299
17300 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17301
17302         * class.cs (TypeContainer::Constructors): Return member
17303         constructors instead of returning null.
17304
17305 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17306
17307         * typemanager.cs (InitCoreTypes): Initialize the various core
17308         types after we have populated the type manager with the user
17309         defined types (this distinction will be important later while
17310         compiling corlib.dll)
17311
17312         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17313         on Expression Classification.  Now all expressions have a method
17314         `Resolve' and a method `Emit'.
17315
17316         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17317         generation from working.     Also add some temporary debugging
17318         code. 
17319
17320 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17321
17322         * codegen.cs: Lots of code generation pieces.  This is only the
17323         beginning, will continue tomorrow with more touches of polish.  We
17324         handle the fundamentals of if, while, do, for, return.  Others are
17325         trickier and I need to start working on invocations soon.
17326
17327         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17328         s.InitStatement. 
17329
17330         * codegen.cs (EmitContext): New struct, used during code
17331         emission to keep a context.   Most of the code generation will be
17332         here. 
17333
17334         * cs-parser.jay: Add embedded blocks to the list of statements of
17335         this block.  So code generation proceeds in a top down fashion.
17336
17337 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17338
17339         * statement.cs: Add support for multiple child blocks.
17340
17341 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17342
17343         * codegen.cs (EmitCode): New function, will emit the code for a
17344         Block of code given a TypeContainer and its ILGenerator. 
17345
17346         * statement.cs (Block): Standard public readonly optimization.
17347         (Block::Block constructors): Link children. 
17348         (Block::Child): Child Linker.
17349         (Block::EmitVariables): Emits IL variable declarations.
17350
17351         * class.cs: Drop support for MethodGroups here, delay until
17352         Semantic Analysis.
17353         (Method::): Applied the same simplification that I did before, and
17354         move from Properties to public readonly fields.
17355         (Method::ParameterTypes): Returns the parameter types for the
17356         function, and implements a cache that will be useful later when I
17357         do error checking and the semantic analysis on the methods is
17358         performed.
17359         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17360         and made a method, optional argument tells whether this is a class
17361         or a structure to apply the `has-this' bit.
17362         (Method::GetCallingConvention): Implement, returns the calling
17363         convention. 
17364         (Method::Define): Defines the type, a second pass is performed
17365         later to populate the methods.
17366
17367         (Constructor::ParameterTypes): implement a cache similar to the
17368         one on Method::ParameterTypes, useful later when we do semantic
17369         analysis. 
17370
17371         (TypeContainer::EmitMethod):  New method.  Emits methods.
17372
17373         * expression.cs: Removed MethodGroup class from here.
17374
17375         * parameter.cs (Parameters::GetCallingConvention): new method.
17376
17377 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17378
17379         * class.cs (TypeContainer::Populate): Drop RootContext from the
17380         argument. 
17381
17382         (Constructor::CallingConvention): Returns the calling convention.
17383         (Constructor::ParameterTypes): Returns the constructor parameter
17384         types. 
17385
17386         (TypeContainer::AddConstructor): Keep track of default constructor
17387         and the default static constructor.
17388
17389         (Constructor::) Another class that starts using `public readonly'
17390         instead of properties. 
17391
17392         (Constructor::IsDefault): Whether this is a default constructor. 
17393
17394         (Field::) use readonly public fields instead of properties also.
17395
17396         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17397         track of static constructors;  If none is used, turn on
17398         BeforeFieldInit in the TypeAttributes. 
17399
17400         * cs-parser.jay (opt_argument_list): now the return can be null
17401         for the cases where there are no arguments. 
17402
17403         (constructor_declarator): If there is no implicit `base' or
17404         `this', then invoke the default parent constructor. 
17405
17406         * modifiers.cs (MethodAttr): New static function maps a set of
17407         modifiers flags into a MethodAttributes enum
17408         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17409         MethodAttr, TypeAttr to represent the various mappings where the
17410         modifiers are used.
17411         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17412
17413 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17414
17415         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17416         method arguments.
17417
17418         * interface.cs (PopulateIndexer): Implemented the code generator
17419         for interface indexers.
17420
17421 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17422
17423         * interface.cs (InterfaceMemberBase): Now we track the new status
17424         here.  
17425
17426         (PopulateProperty): Implement property population.  Woohoo!  Got
17427         Methods and Properties going today. 
17428
17429         Removed all the properties for interfaces, and replaced them with
17430         `public readonly' fields. 
17431
17432 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17433
17434         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17435         initialize their hashtables/arraylists only when they are needed
17436         instead of doing this always.
17437
17438         * parameter.cs: Handle refs and out parameters.
17439
17440         * cs-parser.jay: Use an ArrayList to construct the arguments
17441         instead of the ParameterCollection, and then cast that to a
17442         Parameter[] array.
17443
17444         * parameter.cs: Drop the use of ParameterCollection and use
17445         instead arrays of Parameters.
17446
17447         (GetParameterInfo): Use the Type, not the Name when resolving
17448         types. 
17449
17450 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17451
17452         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17453         and instead use public readonly fields.
17454
17455         * class.cs: Put back walking code for type containers.
17456
17457 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17458
17459         * class.cs (MakeConstant): Code to define constants.
17460
17461         * rootcontext.cs (LookupType): New function.  Used to locate types 
17462
17463
17464 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17465
17466         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17467         this System.Reflection code is.  Kudos to Microsoft
17468
17469         * typemanager.cs: Implement a type cache and avoid loading all
17470         types at boot time.  Wrap in LookupType the internals.  This made
17471         the compiler so much faster.  Wow.  I rule!
17472
17473         * driver.cs: Make sure we always load mscorlib first (for
17474         debugging purposes, nothing really important).
17475
17476         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17477         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17478
17479         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17480         on namespaces that have been imported using the `using' keyword.
17481
17482         * class.cs (TypeContainer::TypeAttr): Virtualize.
17483         (Class::TypeAttr): Return attributes suitable for this bad boy.
17484         (Struct::TypeAttr): ditto.
17485         Handle nested classes.
17486         (TypeContainer::) Remove all the type visiting code, it is now
17487         replaced with the rootcontext.cs code
17488
17489         * rootcontext.cs (GetClassBases): Added support for structs. 
17490
17491 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17492
17493         * interface.cs, statement.cs, class.cs, parameter.cs,
17494         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17495         Drop use of TypeRefs, and use strings instead.
17496
17497 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17498
17499         * rootcontext.cs: 
17500
17501         * class.cs (Struct::Struct): set the SEALED flags after
17502         checking the modifiers.
17503         (TypeContainer::TypeAttr): new property, returns the
17504         TypeAttributes for a class.  
17505
17506         * cs-parser.jay (type_list): Oops, list production was creating a
17507         new list of base types.
17508
17509         * rootcontext.cs (StdLib): New property.
17510         (GetInterfaceTypeByName): returns an interface by type name, and
17511         encapsulates error handling here.
17512         (GetInterfaces): simplified.
17513         (ResolveTree): Encapsulated all the tree resolution here.
17514         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17515         types. 
17516
17517         * driver.cs: Add support for --nostdlib, to avoid loading the
17518         default assemblies.
17519         (Main): Do not put tree resolution here. 
17520
17521         * rootcontext.cs: Beginning of the class resolution.
17522
17523 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17524
17525         * rootcontext.cs: Provide better error reporting. 
17526
17527         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17528
17529         * rootcontext.cs (CreateInterface): Handle the case where there
17530         are no parent interfaces.
17531
17532         (CloseTypes): Routine to flush types at the end.
17533         (CreateInterface): Track types.
17534         (GetInterfaces): Returns an array of Types from the list of
17535         defined interfaces.
17536
17537         * typemanager.c (AddUserType): Mechanism to track user types (puts
17538         the type on the global type hash, and allows us to close it at the
17539         end). 
17540
17541 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17542
17543         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17544         RecordInterface instead.
17545
17546         * cs-parser.jay: Updated to reflect changes above.
17547
17548         * decl.cs (Definition): Keep track of the TypeBuilder type that
17549         represents this type here.  Not sure we will use it in the long
17550         run, but wont hurt for now.
17551
17552         * driver.cs: Smaller changes to accomodate the new code.
17553
17554         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17555         when done. 
17556
17557         * rootcontext.cs (CreateInterface):  New method, used to create
17558         the System.TypeBuilder type for interfaces.
17559         (ResolveInterfaces): new entry point to resolve the interface
17560         hierarchy. 
17561         (CodeGen): Property, used to keep track of the code generator.
17562
17563 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17564
17565         * cs-parser.jay: Add a second production for delegate_declaration
17566         with `VOID'.
17567
17568         (enum_body): Put an opt_comma here instead of putting it on
17569         enum_body or enum_member_declarations so we can handle trailing
17570         commas on enumeration members.  Gets rid of a shift/reduce.
17571
17572         (type_list): Need a COMMA in the middle.
17573
17574         (indexer_declaration): Tell tokenizer to recognize get/set
17575
17576         * Remove old targets.
17577
17578         * Re-add the parser target.
17579
17580 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17581
17582         * cs-parser.jay: Add precendence rules for a number of operators
17583         ot reduce the number of shift/reduce conflicts in the grammar.
17584
17585 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17586
17587         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17588         and put it here.
17589
17590         Get rid of old crufty code.
17591
17592         * rootcontext.cs: Use this to keep track of the parsed
17593         representation and the defined types available to the program. 
17594
17595         * gen-treedump.cs: adjust for new convention.
17596
17597         * type.cs: Split out the type manager, and the assembly builder
17598         from here. 
17599
17600         * typemanager.cs: the type manager will live here now.
17601
17602         * cil-codegen.cs: And the code generator here. 
17603
17604 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17605
17606         * makefile: Fixed up for easy making.
17607
17608 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17609
17610         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17611         the 
17612
17613         (unary_expression): Expand pre_increment_expression and
17614         post_decrement_expression to reduce a shift/reduce.
17615
17616 2001-07-11  Simon Cozens
17617
17618         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17619
17620         Improve allow_keyword_as_indent name.
17621
17622 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17623
17624         * Adjustments for Beta2. 
17625
17626 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17627
17628         * decl.cs: Added `Define' abstract method.
17629         (InTransit): new property, used to catch recursive definitions. 
17630
17631         * interface.cs: Implement `Define'. 
17632
17633         * modifiers.cs: Map Modifiers.constants to
17634         System.Reflection.TypeAttribute flags.
17635
17636         * class.cs: Keep track of types and user-defined types.
17637         (BuilderInit): New method for creating an assembly
17638         (ResolveType): New function to launch the resolution process, only
17639         used by interfaces for now.
17640
17641         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17642         that are inserted into the name space. 
17643
17644 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17645
17646         * ARGH.  I have screwed up my tree so many times due to the use of
17647         rsync rather than using CVS.  Going to fix this at once. 
17648
17649         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17650         load types.
17651
17652 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17653
17654         * Experiment successful: Use System.Type rather that our own
17655         version of Type.  
17656
17657 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17658
17659         * cs-parser.jay: Removed nsAliases from here.
17660
17661         Use new namespaces, handle `using XXX;' 
17662
17663         * namespace.cs: Reimplemented namespace handling, use a recursive
17664         definition of the class.  Now we can keep track of using clauses
17665         and catch invalid using clauses.
17666
17667 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17668
17669         * gen-treedump.cs: Adapted for all the renaming.
17670
17671         * expression.cs (Expression): this class now has a Type property
17672         which returns an expression Type.
17673
17674         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17675         `Type', as this has a different meaning now in the base
17676
17677 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17678
17679         * interface.cs, class.cs: Removed from all the sources the
17680         references to signature computation, as we can not do method
17681         signature computation during the parsing time, as we are not
17682         trying to solve at that point distinguishing:
17683
17684         class X {
17685                 void a (Blah x) {}
17686                 void a (NS.Blah x) {}
17687         }
17688
17689         Which depending on the context might be valid or not, as we do not
17690         know if Blah is the same thing as NS.Blah at that point.
17691
17692         * Redid everything so the code uses TypeRefs now instead of
17693         Types.  TypeRefs are just temporary type placeholders, that need
17694         to be resolved.  They initially have a pointer to a string and the
17695         current scope in which they are used.  This is used later by the
17696         compiler to resolve the reference to an actual Type. 
17697
17698         * DeclSpace is no longer a CIR.Type, and neither are
17699         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17700         are all DeclSpaces, but no Types. 
17701
17702         * type.cs (TypeRefManager): This implements the TypeRef manager,
17703         which keeps track of all the types that need to be resolved after
17704         the parsing has finished. 
17705
17706 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17707
17708         * ARGH.  We are going to have to store `foreach' as a class rather
17709         than resolving it, as we need to verify error 1579 after name
17710         resolution.   *OR* we could keep a flag that says `This request to
17711         IEnumerator comes from a foreach statement' which we can then use
17712         to generate the error.
17713
17714 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17715
17716         * class.cs (TypeContainer.AddMethod): we now add methods to the
17717         MethodGroup instead of the method hashtable.  
17718
17719         * expression.cs: Add MethodGroup abstraction, which gets us one
17720         step closer to the specification in the way we handle method
17721         declarations.  
17722
17723         * cs-parser.jay (primary_expression): qualified_identifier now
17724         tried to match up an identifier to a local variable reference or
17725         to a parameter reference.
17726
17727         current_local_parameters is now a parser global variable that
17728         points to the current parameters for the block, used during name
17729         lookup.
17730
17731         (property_declaration): Now creates an implicit `value' argument to
17732         the set accessor.
17733
17734 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17735
17736         * parameter.cs: Do not use `param' arguments as part of the
17737         signature, per the spec.
17738
17739 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17740
17741         * decl.cs: Base class for classes, structs and interfaces.  This
17742         is the "Declaration Space" 
17743
17744         * cs-parser.jay: Use CheckDef for checking declaration errors
17745         instead of having one on each function.
17746
17747         * class.cs: Factor out some code for handling error handling in
17748         accordance to the "Declarations" section in the "Basic Concepts"
17749         chapter in the ECMA C# spec.
17750
17751         * interface.cs: Make all interface member classes derive from
17752         InterfaceMemberBase.
17753
17754 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17755
17756         * Many things: all interfaces are parsed and generated in
17757         gen-treedump.  Support for member variables, constructors,
17758         destructors, properties, constants is there.
17759
17760         Beginning of the IL backend, but very little done, just there for
17761         testing purposes. 
17762
17763 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17764
17765         * cs-parser.jay: Fix labeled statement.
17766
17767         * cs-tokenizer.cs (escape): Escape " and ' always.
17768         ref_line, ref_name: keep track of the line/filename as instructed
17769         by #line by the compiler.
17770         Parse #line.
17771
17772 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17773
17774         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17775         to match the values in System.CodeDOM.
17776
17777         Divid renamed to Divide.
17778
17779         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17780         statements. 
17781         (Statements.set): remove.
17782
17783         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17784         statements. 
17785
17786         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17787         falseStatements always have valid values. 
17788
17789         * cs-parser.jay: Use System.CodeDOM now.
17790