(DISTFILES): Comment out a few missing files.
[mono.git] / mcs / gmcs / ChangeLog
1 2004-11-09  Raja R Harinath  <rharinath@novell.com>
2
3         * Makefile (DISTFILES): Comment out a few missing files.
4
5 2004-10-29  Raja R Harinath  <rharinath@novell.com>
6
7         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
8         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
9         (gmcs.exe): Invoke bootstrap-libs.
10         (clean-local): Clean the net_2_0_bootstrap profile too.
11         (PROGRAM_INSTALL_DIR): New.
12         (install-local): Use it.
13
14 2004-10-13  Martin Baulig  <martin@ximian.com>
15
16         * generic.cs (TypeManager.InflatedConstraints): New nested class.
17         (TypeParameter.DefineType): If we're a method type parameter and
18         that method is overriding something, "inflate" its constraints.
19
20 2004-10-12  Martin Baulig  <martin@ximian.com>
21
22         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
23         and have type arguments, create and resolve a ConstructedType.
24
25 2004-10-12  Martin Baulig  <martin@ximian.com>
26
27         * decl.cs (MemberCache.FindMemberToOverride): Use
28         TypeManager.IsEqual() to compare the parameters and Type.Equals()
29         to compare the invocationType.
30
31         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
32         When comparing two type parameters, only do the signature-only
33         comparision for method type parameters.
34
35 2004-10-11  Martin Baulig  <martin@ximian.com>
36
37         * report.cs: Don't make --fatal abort on warnings, we have
38         -warnaserror for that.
39
40 2004-10-11  Martin Baulig  <martin@ximian.com>
41
42         * typemanager.cs
43         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
44         (TypeManager.IsEqual): Call ourself recursively instead of using
45         Type.IsEqual(). 
46
47 2004-10-11  Martin Baulig  <martin@ximian.com>
48
49         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
50         on our own type parameters, not on the ones we inherit from a containing
51         class.
52
53         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
54         the comparision.
55
56         * generic.cs (TypeParameter.Define): We may only be called once.
57
58         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
59         instead of TypeManager.IsEqual().
60
61 2004-09-28  Martin Baulig  <martin@ximian.com>
62
63         * generic.cs
64         (GenericConstraints.EffectiveBaseClass): New public property.
65         (TypeParameter.GenericConstraints): New public property.
66         (ConstructedType.CheckConstraints): Improved.
67
68         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
69         (Convert.TypeParameterConversion): New private method; use this in
70         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
71         for all conversions related to type parameters.
72
73 2004-09-24  Martin Baulig  <martin@ximian.com>
74
75         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
76         type parameter conversions for type parameters which are known to
77         be reference types.
78
79 2004-09-24  Martin Baulig  <martin@ximian.com>
80
81         * generic.cs (GenericConstraints): Added `IsReferenceType' and
82         `IsValueType' properties.
83
84         * support.cs (ReflectionConstraints): Use
85         Type.GetGenericParameterConstraints() instead of the old hack.
86
87 2004-09-24  Martin Baulig  <martin@ximian.com>
88
89         * generic.cs (GenericConstraints): Moved here and made it an
90         abstract class.
91
92         * support.cs (GenericConstraints): Moved to generic.cs.
93
94 2004-09-24  Martin Baulig  <martin@ximian.com>
95
96         * support.cs
97         (ReflectionConstraints): Un-nested this class and made it public.
98
99         * typemanager.cs
100         (TypeManager.GetTypeParameterConstraints): New public method.
101         (TypeManager.HasConstructorConstraint): Use the attributes.
102
103 2004-09-24  Martin Baulig  <martin@ximian.com>
104
105         * support.cs (GenericConstraints): Replaced `HasConstructor',
106         `IsReferenceType' and `IsValueType' with `Attributes'.
107         (ReflectionParameters.ReflectionConstraints): Removed the Create()
108         method and made the .ctor public.
109
110         * generic.cs (Constraints.Attributes): New public property.
111         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
112         `IsReferenceType' -> `HasReferenceTypeConstraint' and
113         `IsValueType' -> `HasValueTypeConstraint'.
114
115 2004-09-23  Martin Baulig  <martin@ximian.com>
116
117         * generic.cs (Constraints): Reflect latest runtime changes.
118
119 2004-09-23  Martin Baulig  <martin@ximian.com>
120
121         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
122         (Convert.ImplicitReferenceConversionExists): Likewise.
123
124 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
125
126         * class.cs (Operator.Define): Add error 448 and 559 report.
127         
128 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
129
130         * class.cs (MemberBase.IsTypePermitted): New protected
131         method for checking error CS0610.
132
133 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
134
135         * class.cs (TypeContainer.HasExplicitLayout): New property
136         Returns whether container has StructLayout attribute set Explicit.
137         (FieldMember): New abstract class for consts and fields.
138         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
139         (Field): Reuse FieldMember.
140
141         * const.cs (Const): Reuse FieldMember.
142
143         * rootcontext.cs: EmitConstants call moved to class.
144
145 2004-09-22  Martin Baulig  <martin@ximian.com>
146
147         Marek and me just fixed one of our oldest bugs: #28562 :-)
148
149         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
150
151         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
152         we're an EnumConstant, just return that.
153         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
154         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
155         to get the value which'll actually be written into the attribute.
156         However, we have to use GetValue() to access the attribute's value
157         in the compiler.        
158
159 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
160
161         * constant.cs (Constant.IsNegative): New abstract property
162         IsNegative.
163
164         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
165         (StackAlloc.DoResolve): Reused IsNegative.
166
167 2004-09-22  Martin Baulig  <martin@ximian.com>
168
169         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
170         public method; like LookupTypeContainer, but also works for
171         generic instances.
172
173         * report.cs (Report.SymbolRelatedToPreviousError): Use
174         TypeManager.LookupGenericTypeContainer().       
175
176 2004-09-22  Martin Baulig  <martin@ximian.com>
177
178         Thanks to Peter Sestoft for this bug report.
179
180         * expression.cs (Conditional): If both the `trueExpr' and the
181         `falseExpr' is a NullLiteral, return a NullLiteral.
182
183 2004-09-22  Martin Baulig  <martin@ximian.com>
184
185         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
186         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
187         for the "get_Current" call.
188
189 2004-09-21  Martin Baulig  <martin@ximian.com>
190
191         * convert.cs (Convert.ImplicitReferenceConversion): When
192         converting to an interface type, first check whether we're
193         converting from a reference type.
194
195 2004-09-14  Martin Baulig  <martin@ximian.com>
196
197         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
198
199 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
200
201         Fixed bug #61902
202         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
203         called and is obsolete then this member suppress message
204         when call is inside next [Obsolete] method or type.
205
206         * expression.cs: Use TestObsoleteMethodUsage member.
207
208 2004-09-14  Martin Baulig  <martin@ximian.com>
209
210         * genericparser.cs: Removed.
211
212 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
213
214         * class.cs (MethodCore.CheckBase): Fix bug #65757.
215
216 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
217
218         * attribute.cs (Attribute.Resolve): Add error 653 report.
219
220         * class.cs (Class.ApplyAttributeBuilder): Add error 641
221         report.
222         (Method.ApplyAttributeBuilder): Add error 685 report.
223         (Operator.Define): Add error 564 report.
224
225         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
226
227         * expression.cs (Invocation.DoResolve): Add error
228         245 and 250 report.
229
230         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
231         error 674 report.
232
233 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
234
235         * class.cs (ConstructorInitializer.Resolve):
236         Wrong error number (515->516).
237
238 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
239
240         * class.cs (Indexer.Define): Add error 631 report.
241
242 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
243
244         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
245
246 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
247
248         * expression.cs (Probe.DoResolve): Add error CS0241 report.
249
250 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
251
252         * cs-parser.jay: Added error CS0241 report.
253
254 2004-09-10  Raja R Harinath  <rharinath@novell.com>
255
256         * cs-parser.jay (fixed_statement): Introduce a scope for the
257         declaration in the 'fixed' statement.
258
259 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
260
261         * cs-parser.jay: Added CS0230 error report.
262
263 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
264
265         * cs-parser.jay: Added errors CS0231 and CS0257 report.
266
267 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
268
269         * expression.cs (Argument.Resolve): Added error CS0192 and
270         CS0199 report.
271
272 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
273
274         C# 2.0 #pragma warning feature
275
276         * cs-tokenizer.cs (PreProcessPragma): New method; 
277         Handles #pragma directive.
278
279         * report.cs (WarningRegions): New class; Support
280         class for #pragma warning directive. It tests whether
281         warning is enabled for a given line.
282
283 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
284
285         * const.cs: Add more descriptive error report, tahnks to
286         Sebastien. 
287
288 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
289
290         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
291
292 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
293
294         * expression.cs: Apply patch from Ben: Remove dead code from
295         ArrayCreation, and remove the TurnintoConstant call in const.cs,
296         as that code just threw an exception anwyays.
297
298         * const.cs: Remove the call to the turnintoconstant, for details
299         see bug: #63144
300         
301         * literal.cs: The type of the null-literal is the null type;  So
302         we use a placeholder type (literal.cs:System.Null, defined here)
303         for it.
304
305         * expression.cs (Conditional.DoResolve): Remove some old code that
306         is no longer needed, conversions have been fixed.
307
308         (ArrayCreationExpression.DoResolve): Return false if we fail to
309         resolve the inner expression.
310
311 2004-09-07  Raja R Harinath  <rharinath@novell.com>
312
313         Fix test-290.cs.
314         * cs-parser.jay (delegate_declaration): Record a delegate
315         declaration as a type declaration.
316         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
317
318 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
319
320         * parameter.cs: Do not crash if the type can not be resolved. 
321
322         * expression.cs: Report errors with unsafe pointers, fixes #64896
323
324 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
325
326         * expression.cs: Pointer arith always needs to do a conv.i
327         if the operand is a long. fix 65320
328
329 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
330
331         Fixed cs0619-37.cs, cs0619-38.cs
332
333         * enum.cs (GetObsoleteAttribute): Removed.
334
335         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
336         on Enum member is double staged. The first is tested member
337         and then enum.
338
339 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
340
341         Fixed #56986, #63631, #65231
342
343         * class.cs: (TypeContainer.AddToMemberContainer): New method,
344         adds member to name container.
345         (TypeContainer.AddToTypeContainer): New method, adds type to
346         name container.
347         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
348         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
349         AddOperator): Simplified by reusing AddToMemberContainer.
350         (TypeContainer.UserDefinedStaticConstructor): Changed to property
351         instead of field.
352         (Method.CheckForDuplications): Fixed implementation to test all
353         possibilities.
354         (MemberBase): Detection whether member is explicit interface
355         implementation is now in constructor.
356         (MemberBase.UpdateMemberName): Handles IndexerName.
357         (Accessor): Changed to keep also location information.
358         (AbstractPropertyEventMethod): Is derived from MemberCore.
359         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
360         will be emited or not.
361         (PropertyBase.AreAccessorsDuplicateImplementation):
362         Tests whether accessors are not in collision with some method.
363         (Operator): Is derived from MethodCore to simplify common
364         operations.
365
366         * decl.cs (Flags.TestMethodDuplication): Test for duplication
367         must be performed.
368         (DeclSpace.AddToContainer): Adds the member to defined_names
369         table. It tests for duplications and enclosing name conflicts.
370
371         * enum.cs (EnumMember): Clean up to reuse the base structures
372
373 2004-09-03  Martin Baulig  <martin@ximian.com>
374
375         Merged latest changes into gmcs.  Please keep this comment in
376         here, it makes it easier for me to see what changed in MCS since
377         the last time I merged.
378
379 2004-09-03  Martin Baulig  <martin@ximian.com>
380
381         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
382         into TypeContainer, to make partial classes work again.
383
384 2004-09-03  Martin Baulig  <martin@ximian.com>
385
386         * rootcontext.cs (RootContext.V2): Removed.
387
388 2004-03-23  Martin Baulig  <martin@ximian.com>
389
390         * expression.cs (Invocation.OverloadResolve): Added `bool
391         may_fail' argument and use it instead of the Location.IsNull() hack.
392
393 2004-09-09  Martin Baulig  <martin@ximian.com>
394
395         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
396
397 2004-09-09  Martin Baulig  <martin@ximian.com>
398
399         * generic.cs (TypeParameter.DefineType): Added support for
400         explicit interface methods.
401
402 2004-09-09  Martin Baulig  <martin@ximian.com>
403
404         * README.Changes: New document.  Started to list important changes
405         between MCS and GMCS here.
406
407 2004-09-08  Martin Baulig  <martin@ximian.com>
408
409         * class.cs
410         (TypeContainer.CheckRecursiveDefinition): New protected method.
411         (TypeContainer.DefineType): Move the CS0146 check into
412         CheckRecursiveDefinition().     
413
414 2004-09-06  Martin Baulig  <martin@ximian.com>
415
416         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
417         types for the constructor constraint.
418
419 2004-09-03  Martin Baulig  <martin@ximian.com>
420
421         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
422         into TypeContainer, to make partial classes work again.
423
424 2004-09-03  Martin Baulig  <martin@ximian.com>
425
426         * rootcontext.cs (RootContext.V2): Removed.
427
428 2004-03-23  Martin Baulig  <martin@ximian.com>
429
430         * expression.cs (Invocation.OverloadResolve): Added `bool
431         may_fail' argument and use it instead of the Location.IsNull() hack.
432
433 2004-09-03  Martin Baulig  <martin@ximian.com>
434
435         Merged latest changes into gmcs.  Please keep this comment in
436         here, it makes it easier for me to see what changed in MCS since
437         the last time I merged.
438
439 2004-09-03  Raja R Harinath  <rharinath@novell.com>
440
441         Fix #61128.
442         * expression.cs (BetterConversion): Don't allow either conversion 
443         to be null.  Remove redundant implicit conversion test when 'q ==
444         null' -- when this function is invoked, we already know that the
445         implicit conversion exists.
446         (BetterFunction): Assume that 'best' is non-null.  Remove
447         redundant reimplementation of IsApplicable when 'best' is null.
448         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
449         number of arguments.
450         (IsAncestralType): Extract from OverloadResolve.
451         (OverloadResolve): Make robust to the MethodGroupExpr being
452         unsorted.  Implement all the logic of Section 14.5.5.1, and
453         support overloading of methods from multiple applicable types.
454         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
455
456         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
457         (RealError, Warning): Append type of report to related symbol.
458
459 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
460
461         * enum.cs: Fixed CLS-Compliance checks for enum members.
462         Error tests cs3008-8.cs, cs3014-8.cs
463
464 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
465
466         Fixed bug #62342, #63102
467         * class.cs: ImplementIndexer uses member.IsExplicitImpl
468         like ImplementMethod.
469
470 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
471
472         * attribute.cs (Attribute.GetAttributeArgumentExpression):
473         Fixed bug #65170.
474
475 2004-09-02  Martin Baulig  <martin@ximian.com>
476
477         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
478         TypeManager.GetArgumentTypes() rather than calling GetParameters()
479         on the MethodBase.
480
481 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
482
483         C# 2.0 Static classes implemented
484
485         * class.cs (TypeContainer): instance_constructors,
486         initialized_fields, initialized_static_fields,
487         default_constructor, base_inteface_types are protected to be
488         accessible from StaticClass.
489         (TypeContainer.DefineDefaultConstructor): New virtual method
490         for custom default constructor generating
491         (StaticClass): New class to handle "Static classes" feature.
492
493         * cs-parser.jay: Handle static keyword on class like instance
494         of StaticClass.
495
496         * driver.cs: Added "/langversion" command line switch with two
497         options (iso-1, default).
498
499 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
500
501         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
502
503 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
504
505         * delegate.cs: Style.
506
507 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
508
509         * delegate.cs: Add seperate instance expr field for miguel.
510
511 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
512
513         * PointerArithmetic (Resolve): make sure we are not doing
514         pointer arith on void*. Also, make sure we are resolved
515         by not setting eclass until resolve.
516
517         All callers: Make sure that PointerArithmetic gets resolved.
518
519 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
520
521         * ArrayCreation (LookupType): If the type does not resolve 
522         to an array, give an error.
523
524 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
525
526         * statement.cs (Try.Resolve): Fixed bug #64222
527
528 2004-08-27  Martin Baulig  <martin@ximian.com>
529
530         * class.cs
531         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
532         crash here.     
533
534 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
535
536         * ecore.cs (Constantify): Get underlying type via
537         System.Enum.GetUnderlyingType to avoid StackOverflow on the
538         Windows in special cases.
539
540 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
541
542         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
543         for obtaining also private methods.
544         (GetRemoveMethod): Used GetRemoveMethod (true)
545         for obtaining also private methods.
546
547 2004-09-02  Martin Baulig  <martin@ximian.com>
548
549         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
550         TypeManager.GetArgumentTypes() rather than calling GetParameters()
551         on the MethodBase.
552
553 2004-08-27  Martin Baulig  <martin@ximian.com>
554
555         * class.cs
556         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
557         crash here.     
558
559 2004-08-25  Martin Baulig  <martin@ximian.com>
560
561         * support.cs (ReflectionParameters..ctor): If this is a generic
562         method, retrieve and store its type parameters.
563         (InternalParameters..ctor): Added `TypeParameter[]' argument.
564         (ReflectionParameters.GenericConstraints): The argument specifies
565         the type parameter, not the method parameter.
566         (InternalParameters.GenericConstraints): Likewise.
567
568         * generic.cs (TypeParameter.DefineType): Correctly handle
569         constraints wrt. generic methods in interfaces and their
570         implementations.        
571
572 2004-08-24  Martin Baulig  <martin@ximian.com>
573
574         * generic.cs (TypeParameter.IsSubclassOf): New public method.
575         (Constraints.IsSubclassOf): New internal method.
576
577         * typemanager.cs (TypeManager.FindMembers): Added special support
578         for GenericTypeParameterBuilder's.      
579         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
580         type parameters.
581
582 2004-08-24  Martin Baulig  <martin@ximian.com>
583
584         * typemanager.cs
585         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
586         this for accessibility checks.
587         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
588         IsNestedFamilyAccessible.
589         (TypeManager.IsSubclassOf): New method, do what the name actually
590         says.   
591
592 2004-08-24  Martin Baulig  <martin@ximian.com>
593
594         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
595         as a SimpleName, include the generic arity.
596
597 2004-08-24  Martin Baulig  <martin@ximian.com>
598
599         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
600         MethodAttributes.HideBySig for operators.
601
602 2004-08-23  Martin Baulig  <martin@ximian.com>
603
604         Back to the old error reporting system :-)
605
606         * report.cs (Message): Removed.
607         (Report.MessageData, ErrorData, WarningData): Removed.
608         (Report.Error, Warning): Back to the old system.
609
610 2004-08-23  Martin Baulig  <martin@ximian.com>
611
612         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
613
614         * class.cs (TypeContainer.ParentContainer): New public virtual
615         method; replaces the explicit interface implementation.
616         (ClassPart.ParentContainer): Override.
617
618 2004-08-23  Martin Baulig  <martin@ximian.com>
619
620         * statement.cs (Switch): Added support for constant switches; see
621         #59428 or test-285.cs.
622
623 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
624
625         Fixed bug #62740.
626         * statement.cs (GetEnumeratorFilter): Removed useless
627         logic because C# specs is strict. GetEnumerator must be
628         public.
629
630 2004-08-22  Martin Baulig  <martin@ximian.com>
631
632         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
633         a switch and may break, reset the barrier.  Fixes #59867.
634
635 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
636
637         CLS-Compliance speed up (~5% for corlib)
638
639         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
640         New method. Tests container for CLS-Compliant names
641
642         * class.cs (TypeContainer.VerifyClsName): New method.
643         Checks whether container name is CLS Compliant.
644         (Constructor): Implements IMethodData.
645
646         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
647         low-case table for CLS Compliance test.
648         (MemberCache.VerifyClsParameterConflict): New method.
649         Checks method parameters for CS3006 error.
650
651         * enum.cs (EnumMember): Is derived from MemberCore.
652         (Enum.VerifyClsName): Optimized for better performance.
653
654 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
655
656         * report.cs: Renamed Error_T to Error and changed all
657         references.
658
659 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
660
661         * class.cs (TypeContainer.IndexerArrayList): New inner class
662         container for indexers.
663         (TypeContainer.DefaultIndexerName): New constant for default
664         indexer name. Replaced all "Item" with this constant.
665         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
666
667         * typemanager.cs (TypeManager.default_member_ctor): Cache here
668         DefaultMemberAttribute constructor.
669
670 2004-08-05  Martin Baulig  <martin@ximian.com>
671
672         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
673         Fix bug #59429.
674
675 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
676
677         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
678         multi platforms problem.
679
680         * compiler.csproj: Included shared files.
681
682 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
683
684         Fix bug 60333, 55971 in the more general way
685         * attribute.cs (Attribute.GetAttributeArgumentExpression):
686         Added arg_type argument for constant conversion.
687         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
688
689 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
690
691         Fix bug #59760
692         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
693         OperatorArrayList, MethodCoreArrayList for typecontainer
694         containers. Changed class member types to these new types.
695         (MethodArrayList.DefineMembers): Added test for CS0659.
696
697 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
698
699         * cfold.cs: Synchronize the folding with the code in expression.cs
700         Binary.DoNumericPromotions for uint operands.
701
702         * attribute.cs: Revert patch from Raja, it introduced a regression
703         while building Blam-1.2.1 (hard to isolate a test case).
704
705 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
706
707         Fix for #55382
708         * class.cs:
709         (TypeContainer.Define): Renamed to DefineContainerMembers because of
710         name collision.
711         (MethodCore.parent_method): New member. The method we're overriding
712         if this is an override method.
713         (MethodCore.CheckBase): Moved from Method class and made common.
714         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
715         private.
716         (MethodCore.CheckForDuplications): New abstract method. For custom
717         member duplication search in a container
718         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
719         method and its return type.
720         (Event.conflict_symbol): New member. Symbol with same name in the
721         parent class.
722
723         * decl.cs:
724         (MemberCache.FindMemberWithSameName): New method. The method
725         is looking for conflict with inherited symbols.
726
727 2004-08-04  Martin Baulig  <martin@ximian.com>
728
729         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
730
731         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
732
733 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
734
735         * report.cs (Message): New enum for better error, warning reference in
736         the code.
737         (MessageData): New inner abstract class. It generally handles printing of
738         error and warning messages.
739         Removed unused Error, Warning, Message methods.
740
741 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
742
743         Fix for cs0592-8.cs test
744         * attribute.cs
745         (Attributable.ValidAttributeTargets): Made public.
746         (Attribute.ExplicitTarget): New member for explicit target value.
747         (Attribute.CheckTargets): Now we translate explicit attribute
748         target to Target here.
749
750 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
751
752         * ecore.cs (MethodGroupExpr): new IsBase property.
753
754         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
755
756         * delegate.cs (DelegateCreation): store a MethodGroupExpr
757         rather than an instance expr.
758
759         (DelegateCreation.Emit): Use the method group rather than
760         the instance expression. Also, if you have base.Foo as the
761         method for a delegate, make sure to emit ldftn, not ldftnvirt.
762
763         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
764
765         (NewDelegate.DoResolve): Only check for the existance of Invoke
766         if the method is going to be needed. Use MethodGroupExpr.
767
768         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
769
770         * expression.cs: For pointer arith., make sure to use
771         the size of the type, not the size of the pointer to
772         the type.
773
774 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
775
776         Fix for #60722
777         * class.cs (Class): Added error CS0502 test.
778
779 2004-08-03  John Luke  <jluke@cfl.rr.com>
780             Raja R Harinath  <rharinath@novell.com>
781
782         Fix for #60997.
783         * attribute.cs (Attribute.complained_before): New flag.
784         (Attribute.ResolveType, Attribute.Resolve),
785         (Attribute.DefinePInvokeMethod): Set it.
786         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
787         
788 2004-08-03  Martin Baulig  <martin@ximian.com>
789
790         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
791         use a user-defined operator; we still need to do numeric
792         promotions in case one argument is a builtin type and the other
793         one has an implicit conversion to that type.  Fixes #62322.
794
795 2004-08-18  Martin Baulig  <martin@ximian.com>
796
797         * class.cs (Method.Define): Use the correct method name when
798         creating the MethodBuilder for a generic method.
799
800 2004-08-17  Martin Baulig  <martin@ximian.com>
801
802         * generic.cs (Constraints): Support type parameter constraints.
803
804 2004-08-16  Martin Baulig  <martin@ximian.com>
805
806         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
807         (Token.GENERIC_DIMENSION): New token; this is returned if we
808         encounter an unbound generic type in a typeof() expression.
809
810         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
811         this token is only generated while parsing a typeof() expression.
812         (typeof_expression): Removed the old unbound_type hack.
813
814         * generic.cs (TypeArguments.IsUnbound): New public property.
815
816         * decl.cs (MemberName): Added support for unbound types.
817
818 2004-08-14  Martin Baulig  <martin@ximian.com>
819
820         * typemanager.cs
821         (TypeManager.IsEqualGenericInstance): New static method.
822         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
823         just used to check accessibility, so follow the rules of 26.1.6.        
824
825         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
826         ConstructedType instead of a TypeExpression if we have type arguments.
827
828         * cs-parser.jay (typeof_expression): Support unbound generic types.
829
830         * ecore.cs (UnboundTypeExpression): New public class.
831
832 2004-08-12  Martin Baulig  <martin@ximian.com>
833
834         * typemanager.cs (TypeManager.IsNestedChildOf): Use
835         TypeManager.IsEqual() rather than `=='.
836
837         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
838         generic instances as well.
839
840 2004-08-12  Martin Baulig  <martin@ximian.com>
841
842         * expression.cs (Invocation.InferType): We can only infer method
843         type parameters.  Fixes #62647.
844
845 2004-08-11  Martin Baulig  <martin@ximian.com>
846
847         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
848         before resolving the base classes.
849
850 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
851
852         * Makefile: install .mdb file too.
853
854 2004-08-05  Martin Baulig  <martin@ximian.com>
855
856         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
857         initializer, the current type is just the TypeBuilder, not the
858         instantiated generic type.
859         (FieldExpr.IsFieldInitializer): New public property.
860
861 2004-08-04  Martin Baulig  <martin@ximian.com>
862
863         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
864
865         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
866
867 2004-08-03  Martin Baulig  <martin@ximian.com>
868
869         * class.cs (MethodData.Define): If we're an explicit
870         implementation, remove the generic arity from the type name.
871
872 2004-08-03  Martin Baulig  <martin@ximian.com>
873
874         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
875         use a user-defined operator; we still need to do numeric
876         promotions in case one argument is a builtin type and the other
877         one has an implicit conversion to that type.  Fixes #62322.
878
879 2004-08-02  Martin Baulig  <martin@ximian.com>
880
881         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
882         `TypeExpr[]' array.
883         (TypeContainer.GetClassBases): Return the unexpanded list of
884         interfaces; we expand them later.
885         (TypeContainer.DefineType): After creating the TypeBuilder, call
886         TypeManager.ExpandInterfaces() to get an expanded and resolved
887         list of interfaces.
888
889         * ecore.cs (TypeExpr.GetInterfaces): Removed
890
891         * generics.cs (Constraints.InterfaceConstraints): Remove.
892         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
893         register the interface constraints.
894
895         * typemanager.cs
896         (TypeManager.AddUserType): Removed the `ifaces' argument.
897         (TypeManager.AddTypeParameter): Likewise.
898         (TypeManager.AddUserInterface): Removed, was unused.
899         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
900         `TypeExpr[]' array for the interfaces.
901         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
902         has been defined, returns a list of the resolved interfaces types.
903         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
904         (TypeManager.GetExplicitInterfaces): Likewise.  
905
906 2004-08-02  Martin Baulig  <martin@ximian.com>
907
908         * expression.cs (Invocation.EmitCall): If we're invoking a method
909         on a type parameter, use the new `Constrained' prefix opcode.
910
911 2004-08-02  Martin Baulig  <martin@ximian.com>
912
913         * statement.cs (LocalInfo.Flags): Added `IsThis'.
914         (LocalInfo.IsThis): New public property.
915         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
916
917 2004-08-01  Martin Baulig  <martin@ximian.com>
918
919         * class.cs (TypeContainer.GetClassBases): Don't set the default
920         here since we may get called from GetPartialBases().
921         (TypeContainer.DefineType): If GetClassBases() didn't return a
922         parent, use the default one.
923
924 2004-07-30  Martin Baulig  <martin@ximian.com>
925
926         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
927
928         * class.cs (SourceMethod): New public class, derive from the
929         symbol writer's ISourceMethod.
930         (Method): Use the new symbol writer API.
931
932         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
933         as argument and use the new symbol writer.
934
935         * location.cs
936         (SourceFile): Implement the symbol writer's ISourceFile.
937         (Location.SymbolDocument): Removed.
938         (Location.SourceFile): New public property.
939
940         * symbolwriter.cs: Use the new symbol writer API.
941
942 2004-07-30  Raja R Harinath  <rharinath@novell.com>
943
944         * Makefile (install-local): Remove.  Functionality moved to
945         executable.make.
946
947 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
948
949         * Makefile: Install mcs.exe.config file together with mcs.exe.
950         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
951         correct runtime version.
952         
953 2004-07-25  Martin Baulig  <martin@ximian.com>
954
955         * class.cs
956         (TypeContainer.RegisterOrder): Removed, this was unused.
957         (TypeContainer, interface_order): Removed.
958         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
959         TypeContainer as argument since we can also be called with a
960         `PartialContainer' for a partial class/struct/interface.
961         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
962         of checking whether we're an `Interface' - we could be a
963         `PartialContainer'.
964         (PartialContainer.Register): Override; call
965         AddClass()/AddStruct()/AddInterface() on our parent.
966
967         * cs-parser.jay (interface_member_declaration): Add things to the
968         `current_container', not the `current_class'.
969
970         * rootcontext.cs (RegisterOrder): The overloaded version which
971         takes an `Interface' was unused, removed.
972
973         * typemanager.cs (TypeManager.LookupInterface): Return a
974         `TypeContainer', not an `Interface'.
975         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
976         contain a `PartialContainer' for an interface, so check it's
977         `Kind' to figure out what it is.
978
979 2004-07-25  Martin Baulig  <martin@ximian.com>
980
981         * class.cs (Class.DefaultTypeAttributes): New public constant.
982         (Struct.DefaultTypeAttributes): Likewise.
983         (Interface.DefaultTypeAttributes): Likewise.
984         (PartialContainer.TypeAttr): Override this and add the
985         DefaultTypeAttributes.
986
987 2004-07-25  Martin Baulig  <martin@ximian.com>
988
989         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
990         we can just use the `Parent' field instead.
991
992 2004-07-25  Martin Baulig  <martin@ximian.com>
993
994         * class.cs (TypeContainer.Emit): Renamed to EmitType().
995
996 2004-07-25  Martin Baulig  <martin@ximian.com>
997
998         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
999         our parts before defining any methods.
1000         (TypeContainer.VerifyImplements): Make this virtual.
1001         (ClassPart.VerifyImplements): Override and call VerifyImplements()
1002         on our PartialContainer.
1003
1004 2004-07-25  Martin Baulig  <martin@ximian.com>
1005
1006         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1007
1008         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1009         argument, we can just use the `Parent' field instead.
1010
1011         * class.cs
1012         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1013         (MemberBase.DoDefine): Likewise.
1014
1015 2004-07-24  Martin Baulig  <martin@ximian.com>
1016
1017         * decl.cs (MemberCore.Parent): New public field.
1018         (DeclSpace.Parent): Moved to MemberCore.
1019
1020         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1021         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1022         parent's .ctor.
1023         (FieldBase, Field, Operator): Likewise.
1024         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1025         (EventField, Event): Likewise.
1026
1027 2004-07-23  Martin Baulig  <martin@ximian.com>
1028
1029         * class.cs (PartialContainer): New public class.
1030         (ClassPart): New public class.
1031         (TypeContainer): Added support for partial classes.
1032         (TypeContainer.GetClassBases): Splitted some of the functionality
1033         out into GetNormalBases() and GetPartialBases().
1034
1035         * cs-tokenizer.cs (Token.PARTIAL): New token.
1036         (Tokenizer.consume_identifier): Added some hacks to recognize
1037         `partial', but only if it's immediately followed by `class',
1038         `struct' or `interface'.
1039
1040         * cs-parser.jay: Added support for partial clases.
1041
1042 2004-07-23  Martin Baulig  <martin@ximian.com>
1043
1044         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1045         a `DeclSpace' and also made it readonly.
1046         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1047         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1048         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1049
1050         * cs-parser.jay: Pass the `current_class', not the
1051         `current_container' (at the moment, this is still the same thing)
1052         to a new Method, Property, Event, Indexer or Constructor.
1053
1054 2004-07-23  Martin Baulig  <martin@ximian.com>
1055
1056         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1057         and removed the `current_interface' one.
1058         (struct_declaration, class_declaration, interface_declaration):
1059         Set `current_class' to the newly created class/struct/interface;
1060         set their `Bases' and call Register() before parsing their body.
1061
1062 2004-07-23  Martin Baulig  <martin@ximian.com>
1063
1064         * class.cs (Kind): New public enum.
1065         (TypeContainer): Made this class abstract.
1066         (TypeContainer.Kind): New public readonly field.
1067         (TypeContainer.CheckDef): New public method; moved here from
1068         cs-parser.jay.
1069         (TypeContainer.Register): New public abstract method.
1070         (TypeContainer.GetPendingImplementations): New public abstract
1071         method.
1072         (TypeContainer.GetClassBases): Removed the `is_class' and
1073         `is_iface' parameters.
1074         (TypeContainer.DefineNestedTypes): Formerly known as
1075         DoDefineType().
1076         (ClassOrStruct): Made this class abstract.
1077
1078         * tree.cs (RootTypes): New public type. 
1079
1080 2004-07-20  Martin Baulig  <martin@ximian.com>
1081
1082         * tree.cs (Tree.RecordNamespace): Removed.
1083         (Tree.Namespaces): Removed.
1084
1085         * rootcontext.cs (RootContext.IsNamespace): Removed.
1086
1087         * cs-parser.jay (namespace_declaration): Just create a new
1088         NamespaceEntry here.
1089
1090 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
1091
1092         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
1093         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
1094         entry to make sure it runs in the correct runtime version.
1095         
1096 2004-07-18  Martin Baulig  <martin@ximian.com>
1097
1098         * generic.cs (ConstructedType.CheckConstraints): Improved
1099         constraints checking.
1100
1101 2004-07-18  Martin Baulig  <martin@ximian.com>
1102
1103         * expression.cs (Invocation.BetterMethod): Call
1104         TypeManager.TypeToCoreType() on all types and removed my previous
1105         hack; we're already doig the right thing here.
1106
1107 2004-07-17  Martin Baulig  <martin@ximian.com>
1108
1109         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
1110
1111 2004-07-16  Martin Baulig  <martin@ximian.com>
1112
1113         * iterators.cs: Added generics support.
1114
1115 2004-07-16  Martin Baulig  <martin@ximian.com>
1116
1117         * iterators.cs: Rewrote this.  We're now using one single Proxy
1118         class for both the IEnumerable and the IEnumerator interface and
1119         `Iterator' derives from Class so we can use the high-level API.
1120
1121         * class.cs (TypeContainer.AddIterator): New method.
1122         (TypeContainer.DoDefineType): New protected virtual method, which
1123         is called from DefineType().
1124         (TypeContainer.DoDefineMembers): Call DefineType() and
1125         DefineMembers() on all our iterators.
1126         (TypeContainer.Emit): Call Emit() on all our iterators.
1127         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1128
1129         * codegen.cs (EmitContext.CurrentIterator): New public field.
1130
1131 2004-07-15  Martin Baulig  <martin@ximian.com>
1132
1133         * typemanager.cs
1134         (TypeManager.not_supported_exception_type): New type.   
1135
1136 2004-07-14  Martin Baulig  <martin@ximian.com>
1137
1138         * typemanager.cs
1139         (TypeManager.generic_ienumerable_type): New type.
1140         (TypeManager.generic_ienumerator_type): New type.
1141
1142         * rootcontext.cs
1143         (RootContext.interfaces_first_stage): Added
1144         "System.Collections.Generic.IEnumerator`1" and
1145         "System.Collections.Generic.IEnumerable`1".     
1146
1147 2004-07-14  Martin Baulig  <martin@ximian.com>
1148
1149         * iterators.cs: Use real error numbers.
1150
1151 2004-07-14  Martin Baulig  <martin@ximian.com>
1152
1153         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1154         requires this to be a System.Collection.IEnumerable and not a
1155         class implementing that interface.
1156         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1157
1158 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1159
1160         * class.cs: Fixed previous fix, it broke some error tests.
1161
1162 2004-07-12  Martin Baulig  <martin@ximian.com>
1163
1164         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1165         Fixes #61293.
1166
1167 2004-07-14  Martin Baulig  <martin@ximian.com>
1168
1169         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
1170         an exclamation mark (!) for the generic arity to reflect the
1171         latest spec changes; ie. use "System.Collections.Generic.IList`1".
1172
1173 2004-07-13  Martin Baulig  <martin@ximian.com>
1174
1175         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
1176         specifiers being part of a type argument.
1177
1178 2004-07-13  Martin Baulig  <martin@ximian.com>
1179
1180         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
1181         name for generic types.
1182
1183 2004-07-13  Martin Baulig  <martin@ximian.com>
1184
1185         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
1186         bit to fix #60119.
1187
1188 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1189
1190         * assign.cs (LocalTemporary): Add new argument: is_address,If
1191         `is_address' is true, then the value that we store is the address
1192         to the real value, and not the value itself.
1193         
1194         * ecore.cs (PropertyExpr): use the new local temporary
1195         stuff to allow us to handle X.Y += z (where X is a struct)
1196
1197 2004-07-08  Martin Baulig  <martin@ximian.com>
1198
1199         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1200         not always return, just like we're doing in Using.Resolve().
1201
1202 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1203
1204         * cs-parser.jay (fixed_statement): flag this as Pinned.
1205
1206 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1207
1208         * typemanager.cs (TypeManager): Removed MakePinned method, this
1209         mechanism is replaced with the .NET 2.x compatible mechanism of
1210         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1211
1212         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1213         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1214         `IsFixed' property which has a different meaning.
1215
1216 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1217
1218         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1219         visible from inside a nested class, not just the names of the
1220         immediately enclosing class.
1221         Fix for bug #60730.
1222
1223 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1224
1225         * expression.cs (BetterConversion): Remove buggy special-case
1226         handling of "implicit constant expression conversions".  At this
1227         point, we already know that the conversion is possible -- we're
1228         only checking to see which is better.
1229
1230 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1231
1232         * cs-parser.jay: Added error CS0210 test.
1233
1234 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1235
1236         * cs-parser.jay: Added error CS0134 test.
1237
1238 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1239
1240         Fix bug #52507
1241         * cs-parser.jay: Added error CS0145 test.
1242
1243 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1244
1245         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1246
1247 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1248         
1249         * expression.cs (StackAlloc.Resolve): The argument may not
1250         be a constant; deal with this case.
1251         
1252 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1253
1254         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1255         GetIndexerAttributeValue.
1256         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1257
1258         * class.cs (Indexer.Define): Added error tests for CS0415,
1259         CS0609.
1260
1261 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1262
1263         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1264         property code.
1265
1266 2004-06-23  Martin Baulig  <martin@ximian.com>
1267
1268         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1269         neither return nor throw, reset the barrier as well.  Fixes #60457.
1270
1271 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1272
1273         * class.cs : EventAttributes is now set to None by default.
1274           This fixes bug #60459.
1275
1276 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1277
1278         Fix bug #60219
1279         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1280         Don't throw exception but return null (it's sufficient now).
1281
1282 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1283
1284         * typemanager.cs (GetArgumentTypes): Faster implementation.
1285
1286 2004-06-18  Martin Baulig  <martin@ximian.com>
1287
1288         * attribute.cs (Attribute.Resolve): Check whether we're an
1289         EmptyCast which a Constant child.  Fixes #60333.
1290
1291 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1292
1293         * statement.cs (EmitCollectionForeach): Account for the fact that
1294         not all valuetypes are in areas which we can take the address of.
1295         For these variables, we store to a temporary variable. Also, make
1296         sure that we dont emit a `callvirt' on a valuetype method.
1297
1298 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1299
1300         * expression.cs (StackAlloc.DoReSolve): Added test for
1301         negative parameter (CS0247).
1302
1303 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1304
1305         Fix bug #59792
1306         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1307
1308 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1309
1310         Fix bug #59781
1311         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1312         ulong.
1313
1314 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1315
1316         Fix bug #58254 & cs1555.cs, cs1556.cs
1317         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1318
1319 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1320
1321         * cs-parser.jay: Added error CS1669 test for indexers.
1322
1323 2004-06-18  Martin Baulig  <martin@ximian.com>
1324
1325         * generics.cs (GenericMethod.ctor): Don't take an Attributes
1326         argument.  Fixes #60441.
1327
1328 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
1329         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
1330         The name needs to have the actual name of the method in order
1331         for other tests (such as the one in OverloadResolve for Invoke
1332         on a delegate) to work. As well, it does not really help
1333         error reporting because the method group had multiple methods.
1334         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
1335         Make profiling work.
1336         
1337 2004-06-13  Martin Baulig  <martin@ximian.com>
1338
1339         * cs-parser.jay: Don't allow generic attributes.
1340
1341 2004-06-13  Martin Baulig  <martin@ximian.com>
1342
1343         * class.cs (MemberBase.DoDefineBase): New protected method.
1344         (MemberBase.DoDefine): Compute the `flags' in the new
1345         DoDefineBase() which must be called first.
1346         (Method.Define): Call DoDefineBase() first so we have the flags
1347         when defining the generic method.
1348
1349         * cs-parser.jay (interface_method_declaration): Support generic methods.
1350
1351 2004-06-13  Martin Baulig  <martin@ximian.com>
1352
1353         * decl.cs (TypeName): Removed.
1354         (MemberName): Removed TypeName and MemberNow; now we just have
1355         MemberName.
1356
1357         * cs-parser.jay: Don't distinguish between type arguments and type
1358         parameters in the grammar and simplified the rules a bit.  The
1359         reduce/reduce conflicts are now gone (except the one we inherited
1360         from mcs).
1361
1362 2004-06-11  Martin Baulig  <martin@ximian.com>
1363
1364         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1365         call this twice: for params and varargs methods.
1366
1367 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1368
1369         * class.cs:
1370         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1371
1372 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1373
1374         * attribute.cs (Attribute.GetValidTargets): Made public.
1375
1376         * class.cs: 
1377         (AbstractPropertyEventMethod): New class for better code sharing.
1378         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1379         CS1667 report.
1380         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1381
1382 2004-06-09  Martin Baulig  <martin@ximian.com>
1383
1384         * cs-parser.jay: Removed a reduce/reduce conflict.
1385
1386 2004-06-03  Martin Baulig  <martin@ximian.com>
1387
1388         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
1389         GetSimpleName() and return a SimpleName.
1390
1391         * ecore.cs (SimpleName.Arguments): New public field.
1392         (SimpleName): Added overloaded ctor which takes an additional
1393         TypeArguments argument.
1394         (SimpleName.SimpleNameResolve): Added support for generic methods.
1395         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
1396         formerly in MemberAccess.DoResolve(), but we also need it in
1397         SimpleNameResolve().
1398
1399         * expression.cs (MemberAccess.DoResolve): Use the new
1400         MethodGroupExpr.ResolveGeneric().       
1401
1402 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1403
1404         * decl.cs: If possible, use lookuptypedirect here. We can only do
1405         this if there is no `.' after the namespace. Avoids using
1406         LookupType, which does lots of slow processing.
1407         (FindNestedType) New method, does what it says :-).
1408         * namespace.cs: use LookupTypeDirect.
1409         * rootcontext.cs: use membercache, if possible.
1410         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1411
1412 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1413
1414         * expression.cs:
1415         According to the spec, 
1416
1417         In a member access of the form E.I, if E is a single identifier,
1418         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1419         field, property, localvariable, or parameter with the same type as
1420         the meaning of E as a type-name (§3.8), then both possible
1421         meanings of E are permitted.
1422
1423         We did not check that E as a simple-name had the same type as E as
1424         a type name.
1425
1426         This trivial check gives us 5-7% on bootstrap time.
1427
1428 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1429
1430         * expression.cs (Invocation.OverloadResolve): Avoid the
1431         use of hashtables and boxing here by allocating on demand.
1432
1433 2004-05-30  Martin Baulig  <martin@ximian.com>
1434
1435         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1436         we're doing a silent lookup.  Don't try to lookup nested types in
1437         TypeManager.object_type (thanks to Ben Maurer).
1438
1439 2004-05-30  Martin Baulig  <martin@ximian.com>
1440
1441         Committing a patch from Ben Maurer.
1442
1443         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1444
1445 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1446
1447         * convert.cs: add a trivial cache for overload operator resolution.
1448
1449 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
1450
1451         * attribute.cs
1452         (AttributeTester.GetObsoleteAttribute): Returns instance of
1453         ObsoleteAttribute when type is obsolete.
1454
1455         * class.cs
1456         (TypeContainer.VerifyObsoleteAttribute): Override.
1457         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1458         (MethodCode.VerifyObsoleteAttribute): Override.
1459         (MemberBase.VerifyObsoleteAttribute): Override.
1460
1461         * decl.cs
1462         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1463         and report proper error.
1464
1465         *delegate.cs
1466         (Delegate.VerifyObsoleteAttribute): Override.
1467
1468         * ecore.cs
1469         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1470         and report proper error.
1471         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1472
1473         * enum.cs
1474         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1475         and enum member.
1476
1477         * expression.cs
1478         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1479         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1480         Added test for ObsoleteAttribute.
1481
1482         * statement.cs
1483         (Catch): Derived from Statement.
1484
1485 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1486
1487         * decl.cs: If possible, use lookuptypedirect here. We can only do
1488         this if there is no `.' after the namespace. Avoids using
1489         LookupType, which does lots of slow processing.
1490         (FindNestedType) New method, does what it says :-).
1491         * namespace.cs: use LookupTypeDirect.
1492         * rootcontext.cs: use membercache, if possible.
1493         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1494
1495 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1496
1497         * expression.cs:
1498         According to the spec, 
1499
1500         In a member access of the form E.I, if E is a single identifier,
1501         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1502         field, property, localvariable, or parameter with the same type as
1503         the meaning of E as a type-name (§3.8), then both possible
1504         meanings of E are permitted.
1505
1506         We did not check that E as a simple-name had the same type as E as
1507         a type name.
1508
1509         This trivial check gives us 5-7% on bootstrap time.
1510
1511 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1512
1513         Fixed bug #59071 & cs0160.cs
1514         * statement.cs (Try.Resolve): Check here whether order of catch
1515         clauses matches their dependencies.
1516
1517 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1518
1519         Fixed bug #58624
1520         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
1521         unsafe type.
1522
1523 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1524
1525         * expression.cs (Invocation.OverloadResolve): Avoid the
1526         use of hashtables and boxing here by allocating on demand.
1527
1528 2004-05-30  Martin Baulig  <martin@ximian.com>
1529
1530         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1531         we're doing a silent lookup.  Don't try to lookup nested types in
1532         TypeManager.object_type (thanks to Ben Maurer).
1533
1534 2004-05-30  Martin Baulig  <martin@ximian.com>
1535
1536         Committing a patch from Ben Maurer.
1537
1538         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
1539
1540 2004-05-29  Martin Baulig  <martin@ximian.com>
1541
1542         * class.cs (IMethodData.ShouldIgnore): New method.
1543
1544         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1545         `Location' argument, we don't need it anywhere.  Use
1546         `IMethodData.ShouldIgnore ()' instead of
1547         `MethodData.GetMethodFlags ()'.
1548         (TypeManager.AddMethod): Removed.
1549         (TypeManager.AddMethod2): Renamed to AddMethod.
1550
1551 2004-05-29  Martin Baulig  <martin@ximian.com>
1552
1553         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1554
1555         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1556         converting from a class type S to an interface type and we already
1557         have an object on the stack, don't box it again.  Fixes #52578.
1558
1559 2004-05-29  Martin Baulig  <martin@ximian.com>
1560
1561         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1562         Added support for `params' parameters.  Fixes #59267.
1563
1564 2004-05-29  Martin Baulig  <martin@ximian.com>
1565
1566         * literal.cs (NullPointer): Provide a private .ctor which sets
1567         `type' to TypeManager.object_type.  Fixes #59048.
1568
1569 2004-05-29  Martin Baulig  <martin@ximian.com>
1570
1571         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1572         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1573
1574         * ecore.cs (EventExpr.instance_expr): Make the field private.
1575
1576 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1577
1578         Fixed bug #50080 & cs0214-2.cs
1579         * expression.cs (Cast.DoResolve): Check unsafe context here.
1580         
1581         * statement.cs (Resolve.DoResolve): Likewise.
1582
1583 2004-05-26  Martin Baulig  <martin@ximian.com>
1584
1585         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1586
1587         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1588         (RootContext.LookupType): Pass down the `silent' flag.
1589
1590 2004-05-25  Martin Baulig  <martin@ximian.com>
1591
1592         * expression.cs
1593         (MethodGroupExpr.IdenticalTypeName): New public property.
1594         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1595         expression actually refers to a type.
1596
1597 2004-05-25  Martin Baulig  <martin@ximian.com>
1598
1599         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1600         for #56176 and made it actually work.
1601
1602 2004-05-25  Martin Baulig  <martin@ximian.com>
1603
1604         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1605         (FieldExpr, PropertyExpr): Override and implement
1606         CacheTemporaries.  Fixes #52279.
1607
1608 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1609
1610         * location.cs: In the new compiler listing a file twice is a
1611         warning, not an error.
1612
1613 2004-05-24  Martin Baulig  <martin@ximian.com>
1614
1615         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1616         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1617
1618 2004-05-24  Martin Baulig  <martin@ximian.com>
1619
1620         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1621         walking the `using' list.  Fixes #53921.
1622
1623 2004-05-24  Martin Baulig  <martin@ximian.com>
1624
1625         * const.cs (Const.LookupConstantValue): Added support for
1626         EmptyCast's; fixes #55251.
1627
1628 2004-05-24  Martin Baulig  <martin@ximian.com>
1629
1630         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1631         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1632         which does the CS0135 check.  The reason is that we first need to
1633         check whether the variable actually exists.
1634
1635 2004-05-24  Martin Baulig  <martin@ximian.com>
1636
1637         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1638         than RootContext.LookupType() to find the explicit interface
1639         type.  Fixes #58584.
1640
1641 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1642
1643         * Makefile: Simplify.  Use executable.make.
1644         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1645
1646 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1647
1648         * decl.cs:
1649         * enum.cs:
1650         Use the invariant culture when doing String.Compare for CLS case
1651         sensitivity.
1652         
1653 2004-05-23  Martin Baulig  <martin@ximian.com>
1654
1655         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1656         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1657
1658         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1659
1660 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1661
1662         * class.cs (MemberBase.Define): Reuse MemberType member for 
1663         resolved type. Other methods can use it too.
1664
1665 2004-05-23  Martin Baulig  <martin@ximian.com>
1666
1667         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1668         the variable also exists in the current block (otherwise, we need
1669         to report a CS0103).  Fixes #58670.
1670
1671 2004-05-23  Martin Baulig  <martin@ximian.com>
1672
1673         * flowanalysis.cs (Reachability.Reachable): Compute this
1674         on-the-fly rather than storing it as a field.
1675
1676 2004-05-23  Martin Baulig  <martin@ximian.com>
1677
1678         * flowanalysis.cs (Reachability.And): Manually compute the
1679         resulting `barrier' from the reachability.      
1680        
1681 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1682
1683         Fix bug #57835
1684         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1685         instance of ObsoleteAttribute when symbol is obsolete.
1686
1687         * class.cs
1688         (IMethodData): Extended interface for ObsoleteAttribute support.
1689
1690 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1691
1692         * attribute.cs: Fix bug #55970
1693
1694 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1695
1696         Fix bug #52705
1697         * attribute.cs
1698         (GetObsoleteAttribute): New method. Creates the instance of
1699         ObsoleteAttribute.
1700         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1701         ObsoleteAttribute when member is obsolete.
1702         (AttributeTester.Report_ObsoleteMessage): Common method for
1703         Obsolete error/warning reporting.
1704
1705         * class.cs
1706         (TypeContainer.base_classs_type): New member for storing parent type.
1707
1708         * decl.cs
1709         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1710         for this MemberCore.
1711
1712 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1713
1714         * attribute.cs, const.cs: Fix bug #58590
1715
1716 2004-05-21  Martin Baulig  <martin@ximian.com>
1717
1718         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1719         out parameters if the end of the method is unreachable.  Fixes
1720         #58098. 
1721
1722 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1723
1724         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1725         Hari was right, why extra method.
1726
1727 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1728
1729         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1730
1731 2004-05-20  Martin Baulig  <martin@ximian.com>
1732
1733         * delegate.cs: Convert this file to Unix mode - like the original
1734         version in mcs is.
1735
1736 2004-05-20  Martin Baulig  <martin@ximian.com>
1737
1738         * attribute.cs: Convert this file to Unix mode - like the original
1739         version in mcs is.
1740
1741 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1742
1743        Fix bug #58688 (MCS does not report error when the same attribute
1744        is assigned twice)
1745
1746        * attribute.cs (Attribute.Emit): Distinction between null and default.
1747
1748 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1749
1750        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1751        of a top-level attribute without an attribute target.
1752        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1753        Make non-static.
1754        (Attribute.Conditional_GetConditionName), 
1755        (Attribute.Obsolete_GetObsoleteMessage): Update.
1756        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1757        part of ScanForIndexerName.
1758        (Attribute.CanIgnoreInvalidAttribute): New function.
1759        (Attribute.ScanForIndexerName): Move to ...
1760        (Attributes.ScanForIndexerName): ... here.
1761        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1762        (Attributes.Search): New internal variant that can choose not to
1763        complain if types aren't resolved.  The original signature now
1764        complains.
1765        (Attributes.GetClsCompliantAttribute): Use internal variant, with
1766        complaints suppressed.
1767        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1768        only if it not useful.
1769        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1770        top-level for attributes that are shared between the assembly
1771        and a top-level class.
1772        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1773        * class.cs: Update to reflect changes.
1774        (DefineIndexers): Fuse loops.
1775        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1776        a couple more variants of attribute names.
1777
1778 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1779
1780         Fix bug #52585 (Implemented explicit attribute declaration)
1781
1782         * attribute.cs:
1783         (Attributable.ValidAttributeTargets): New abstract method. It gets
1784         list of valid attribute targets for explicit target declaration.
1785         (Attribute.Target): It holds target itself.
1786         (AttributeSection): Removed.
1787         (Attribute.CheckTargets): New method. It checks whether attribute
1788         target is valid for the current element.
1789
1790         * class.cs:
1791         (EventProperty): New class. For events that are declared like
1792         property (with add and remove accessors).
1793         (EventField): New class. For events that are declared like field.
1794         class.cs
1795
1796         * cs-parser.jay: Implemented explicit attribute target declaration.
1797
1798         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1799         Override ValidAttributeTargets.
1800
1801         * parameter.cs:
1802         (ReturnParameter): Class for applying custom attributes on 
1803         the return type.
1804         (ParameterAtribute): New class. Class for applying custom
1805         attributes on the parameter type.
1806
1807 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1808
1809         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1810         definitions. 
1811
1812         (Method): Allow UNSAFE here.
1813
1814         * modifiers.cs: Support unsafe reporting.
1815
1816 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1817
1818         * decl.cs: Fix bug #58478.
1819
1820 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1821
1822         * statement.cs: When checking for unreachable code on an EmptyStatement,
1823         set the location. Fixes bug #58488.
1824
1825 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1826
1827         * driver.cs: Add -pkg handling.
1828
1829         From Gonzalo: UseShelLExecute=false
1830
1831 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1832
1833         * attribute.cs:
1834         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1835         for attribute.
1836         (Attribute.IsClsCompliaceRequired): Moved to base for better
1837         accesibility.
1838         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1839         when attribute is AttributeUsageAttribute.
1840         (Attribute.GetValidTargets): Simplified.
1841         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1842         attribute for this type.
1843         (Attribute.ApplyAttributes): Method renamed to Emit and make
1844         non-static.
1845         (GlobalAttributeSection): New class for special handling of global
1846         attributes (assembly, module).
1847         (AttributeSection.Emit): New method.
1848
1849         * class.cs: Implemented Attributable abstract methods.
1850         (MethodCore.LabelParameters): Moved to Parameter class.
1851         (Accessor): Is back simple class.
1852         (PropertyMethod): Implemented Attributable abstract class.
1853         (DelegateMethod): Implemented Attributable abstract class.
1854         (Event): New constructor for disctintion between normal Event
1855         and Event with accessors.
1856
1857         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1858
1859         * codegen.cs, const.cs, decl.cs, delegate.cs:
1860         (CommonAssemblyModulClass): Implemented Attributable abstract class
1861         and simplified.
1862
1863         * enum.cs: Implement IAttributeSupport interface.
1864         (EnumMember): New class for emum members. Implemented Attributable
1865         abstract class
1866
1867         * parameter.cs:
1868         (ParameterBase): Is abstract.
1869         (ReturnParameter): New class for easier [return:] attribute handling.
1870
1871         * typemanager.cs: Removed builder_to_attr.
1872
1873 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1874
1875         Fix bug #57151.
1876         * attribute.cs (Attribute.GetPositionalValue): New function.
1877         * class.cs (TypeContainer.VerifyMembers): New function.
1878         (TypeContainer.Emit): Use it.
1879         (ClassOrStruct): New base class for Class and Struct.
1880         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1881         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1882         class.
1883         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1884         then each non-static field should have a FieldOffset attribute.
1885         Otherwise, none of the fields should have a FieldOffset attribute.
1886         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1887         and FieldOffset attributes.
1888         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1889         (TypeManager.field_offset_attribute_type): New core types.
1890         (TypeManager.InitCoreTypes): Initialize them.
1891
1892 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1893
1894         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1895         Return correct type.
1896         From bug #58270.
1897
1898 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1899
1900         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1901         be implicitly converted to ulong.
1902         
1903         * expression.cs: The logic for allowing operator &, | and ^ worked
1904         was wrong, it worked before because we did not report an error in
1905         an else branch.  Fixes 57895.
1906
1907         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1908         allow volatile fields to be reference types.
1909
1910 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1911
1912         * driver.cs: Add support for /debug-
1913
1914 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1915
1916         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1917         Add a 'complain' parameter to silence errors.
1918         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1919         silently overlooked type-resolutions.
1920         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1921         to reflect changes.
1922         (Attributes.Search): New function.
1923         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1924         (Attributes.GetAttributeFullName): Remove hack.
1925         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1926         Update to reflect changes.
1927         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1928         Use Attributes.Search instead of nested loops.
1929
1930 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1931
1932         * decl.cs:
1933         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1934         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1935         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1936
1937         * report.cs: (Report.Warning): Renamed to Warning_T because of
1938         parameter collision.
1939
1940 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1941
1942         * expression.cs (MemberAccess.ResolveMemberAccess):
1943         Exit with non-zero status after Report.Error.
1944         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1945         Likewise.
1946         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1947
1948 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1949
1950         * support.cs: Don't hang when the file is empty.
1951
1952 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1953
1954         * support.cs: In SeekableStreamReader, compute the preamble size of the
1955           underlying stream. Position changes should take into account that initial
1956           count of bytes.
1957
1958 2004-05-03  Todd Berman  <tberman@sevenl.net>
1959
1960         * driver.cs: remove unused GetSysVersion function.
1961
1962 2004-05-03  Todd Berman  <tberman@sevenl.net>
1963
1964         * driver.cs: Remove the hack from saturday, as well as the hack
1965         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1966         link_paths to get that bit proper.
1967
1968 2004-05-01  Todd Berman  <tberman@sevenl.net>
1969
1970         * driver.cs: Try a LoadFrom before a Load, this checks the current
1971         path. This is currently a bug in mono that is be fixed, however, this
1972         provides a workaround for now. This will be removed when the bug
1973         is fixed.
1974
1975 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1976
1977         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1978         incomplete key pairs (#57941).
1979
1980 2004-05-01  Todd Berman  <tberman@sevenl.net>
1981
1982         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1983         from the GAC
1984
1985 2004-04-30  Jackson Harper  <jackson@ximian.com>
1986
1987         * codegen.cs: Open keys readonly.
1988         
1989 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1990
1991         * typemanager.cs: don't report cyclic struct layout when a struct
1992         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1993         which has 2 Pango.Rectangle fields.
1994
1995 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1996
1997         * expression.cs: Handle IntPtr comparisons with IL code
1998         rather than a method call.
1999
2000 2004-04-29  Martin Baulig  <martin@ximian.com>
2001
2002         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
2003         the list of PropertyInfo's in class hierarchy and find the
2004         accessor.  Fixes #56013.
2005
2006 2004-04-29  Martin Baulig  <martin@ximian.com>
2007
2008         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2009
2010 2004-04-29  Martin Baulig  <martin@ximian.com>
2011
2012         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2013
2014         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2015
2016 2004-04-29  Martin Baulig  <martin@ximian.com>
2017
2018         * class.cs (ConstructorInitializer.Resolve): Check whether the
2019         parent .ctor is accessible.  Fixes #52146.
2020
2021 2004-04-29  Martin Baulig  <martin@ximian.com>
2022
2023         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2024
2025         * statement.cs (Using.EmitLocalVariableDecls): Use
2026         TypeManager.idisposable_type, not typeof (IDisposable).
2027         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2028
2029 2004-04-29  Martin Baulig  <martin@ximian.com>
2030
2031         * class.cs (Event.Define): Don't emit the field and don't set
2032         RTSpecialName and SpecialName for events on interfaces.  Fixes
2033         #57703. 
2034
2035 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2036
2037         Refactor Attribute.ApplyAttributes.
2038         * attribute.cs (Attributable): New base class for objects that can
2039         have Attributes applied on them.
2040         (Attribute): Make AttributeUsage fields public.
2041         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2042         (Attribute.IsInternalCall): New property.
2043         (Attribute.UsageAttr): Convert to a public read-only property.
2044         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2045         (Attribute.ResolveType, Attribute.Resolve)
2046         (Attribute.ScanForIndexerName): Update to reflect changes.
2047         (Attribute.CheckAttributeTarget): Re-format.
2048         (Attribute.ApplyAttributes): Refactor, to various
2049         Attributable.ApplyAttributeBuilder methods.
2050         * decl.cs (MemberCore): Make Attributable.
2051         * class.cs (Accessor): Make Attributable.
2052         (MethodData.ApplyAttributes): Use proper attribute types, not
2053         attribute names.
2054         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2055         (TypeContainer.ApplyAttributeBuilder)
2056         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2057         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2058         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2059         (Operator.ApplyAttributeBuilder): New factored-out methods.
2060         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2061         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2062         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2063         * parameter.cs (ParameterBase): New Attributable base class
2064         that can also represent Return types.
2065         (Parameter): Update to the changes.
2066
2067 2004-04-29  Jackson Harper  <jackson@ximian.com>
2068
2069         * driver.cs: Prefer the corlib system version when looking for
2070         assemblies in the GAC. This is still a hack, but its a better hack
2071         now.
2072         
2073 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2074
2075         * decl.cs, enum.cs: Improved error 3005 reporting.
2076   
2077         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2078         (related_symbols): New private member for list of symbols
2079         related to reported error/warning.
2080         
2081         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2082
2083 2004-04-29  Martin Baulig  <martin@ximian.com>
2084
2085         * ecore.cs (Expression.Constantify): If we're an enum and
2086         TypeManager.TypeToCoreType() doesn't give us another type, use
2087         t.UnderlyingSystemType.  Fixes #56178.  
2088
2089 2004-04-29  Martin Baulig  <martin@ximian.com>
2090
2091         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2092         interfaces and for each interface, only add members directly
2093         declared in that interface.  Fixes #53255.
2094
2095 2004-04-28  Martin Baulig  <martin@ximian.com>
2096
2097         * expression.cs (ConditionalLogicalOperator): Use a temporary
2098         variable for `left' to avoid that we evaluate it more than once;
2099         bug #52588.
2100
2101 2004-04-28  Martin Baulig  <martin@ximian.com>
2102
2103         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2104         `void[]' (CS1547).
2105
2106 2004-04-28  Martin Baulig  <martin@ximian.com>
2107
2108         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2109         void (CS1547).
2110
2111         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2112         whether the type is not void (CS1547).
2113
2114 2004-04-28  Martin Baulig  <martin@ximian.com>
2115
2116         * expression.cs (Unary.DoResolveLValue): Override this and report
2117         CS0131 for anything but Operator.Indirection.
2118
2119 2004-04-28  Martin Baulig  <martin@ximian.com>
2120
2121         Committing a patch from Ben Maurer; see bug #50820.
2122
2123         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2124         check for classes.
2125
2126         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2127         classes.        
2128
2129 2004-04-28  Martin Baulig  <martin@ximian.com>
2130
2131         Committing a patch from Ben Maurer; see bug #50820.
2132
2133         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2134         check for classes.
2135
2136         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2137         classes.        
2138
2139 2004-04-28  Martin Baulig  <martin@ximian.com>
2140
2141         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2142         (Block.AddLabel): Call DoLookupLabel() to only search in the
2143         current block.
2144
2145 2004-04-28  Martin Baulig  <martin@ximian.com>
2146
2147         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2148         comparing StringConstants and NullLiterals in Equality and Inequality.
2149
2150 2004-04-28  Jackson Harper  <jackson@ximian.com>
2151
2152         * driver.cs: Attempt to load referenced assemblies from the
2153         GAC. This is the quick and dirty version of this method that
2154         doesnt take into account versions and just takes the first
2155         canidate found. Will be good enough for now as we will not have more
2156         then one version installed into the GAC until I update this method.
2157
2158 2004-04-28  Martin Baulig  <martin@ximian.com>
2159
2160         * typemanager.cs (TypeManager.CheckStructCycles): New public
2161         static method to check for cycles in the struct layout.
2162
2163         * rootcontext.cs (RootContext.PopulateTypes): Call
2164         TypeManager.CheckStructCycles() for each TypeContainer.
2165         [Note: We only need to visit each type once.]
2166
2167 2004-04-28  Martin Baulig  <martin@ximian.com>
2168
2169         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2170
2171         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2172         success and added `out object value'.  Use a `bool resolved' field
2173         to check whether we've already been called rather than
2174         `ConstantValue != null' since this breaks for NullLiterals.
2175
2176 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2177
2178         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2179         setting of this flag, since the 'set' method may be non-public.
2180
2181 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2182
2183         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2184         check on current_vector.Block.
2185
2186 2004-04-27  Martin Baulig  <martin@ximian.com>
2187
2188         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2189         a field initializer.  Fixes #56459.
2190
2191 2004-04-27  Martin Baulig  <martin@ximian.com>
2192
2193         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2194         we're not attempting to use an indexer.  Fixes #52154.
2195
2196 2004-04-27  Martin Baulig  <martin@ximian.com>
2197
2198         * statement.cs (Return): Don't create a return label if we don't
2199         need it; reverts my change from January 20th.  Thanks to Ben
2200         Maurer for this.
2201
2202 2004-04-27  Martin Baulig  <martin@ximian.com>
2203
2204         According to the spec, `goto' can only leave a nested scope, but
2205         never enter it.
2206
2207         * statement.cs (Block.LookupLabel): Only lookup in the current
2208         block, don't recurse into parent or child blocks.
2209         (Block.AddLabel): Check in parent and child blocks, report
2210         CS0140/CS0158 if we find a duplicate.
2211         (Block): Removed this indexer for label lookups.
2212         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2213         this already does the error reporting for us.
2214
2215         * flowanalysis.cs
2216         (FlowBranching.UsageVector.Block): New public variable; may be null.
2217         (FlowBranching.CreateSibling): Added `Block' argument.
2218         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2219         label for the target of a `goto' and check whether we're not
2220         leaving a `finally'.
2221
2222 2004-04-27  Martin Baulig  <martin@ximian.com>
2223
2224         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2225         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2226         just for returns).
2227
2228 2004-04-27  Martin Baulig  <martin@ximian.com>
2229
2230         * statement.cs (Block.AddLabel): Also check for implicit blocks
2231         and added a CS0158 check.
2232
2233 2004-04-27  Martin Baulig  <martin@ximian.com>
2234
2235         * flowanalysis.cs (FlowBranchingLoop): New class.
2236         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2237         UsageVector's instead of an ArrayList.
2238         (FlowBranching.Label): Likewise.
2239         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2240         (FlowBranching.AddBreakVector): New method.
2241
2242 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2243
2244         * attribute.cs: Small regression fix: only convert the type if we
2245         the type is different, fixes System.Drawing build.
2246
2247 2004-04-27  Martin Baulig  <martin@ximian.com>
2248
2249         * attribute.cs (Attribute.Resolve): If we have a constant value
2250         for a named field or property, implicity convert it to the correct
2251         type.
2252
2253 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2254
2255         * statement.cs (Block.Block): Implicit blocks share
2256         'child_variable_names' fields with parent blocks.
2257         (Block.AddChildVariableNames): Remove.
2258         (Block.AddVariable): Mark variable as "used by a child block" in
2259         every surrounding block.
2260         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2261         been used in a child block, complain about violation of "Invariant
2262         meaning in blocks" rule.
2263         * cs-parser.jay (declare_local_variables): Don't use
2264         AddChildVariableNames.
2265         (foreach_statement): Don't create an implicit block: 'foreach'
2266         introduces a scope.
2267
2268 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2269
2270         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2271         converting from 0L to ulong.  Fixes 57522.
2272
2273 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2274
2275         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2276         derived class hides via 'new' keyword field from base class (test-242.cs).
2277         TODO: Handle this in the more general way.
2278         
2279         * class.cs (CheckBase): Ditto.
2280
2281 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2282
2283         * decl.cs (caching_flags): New member for storing cached values
2284         as bit flags.
2285         (MemberCore.Flags): New enum where bit flags for caching_flags
2286         are defined.
2287         (MemberCore.cls_compliance): Moved to caching_flags.
2288         (DeclSpace.Created): Moved to caching_flags.
2289
2290         * class.cs: Use caching_flags instead of DeclSpace.Created
2291         
2292 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2293
2294         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2295         if we are only a derived class, not a nested class.
2296
2297         * typemanager.cs: Same as above, but do this at the MemberLookup
2298         level (used by field and methods, properties are handled in
2299         PropertyExpr).   Allow for the qualified access if we are a nested
2300         method. 
2301
2302 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2303
2304         * class.cs: Refactoring.
2305         (IMethodData): New inteface; Holds links to parent members
2306         to avoid member duplication (reduced memory allocation).
2307         (Method): Implemented IMethodData interface.
2308         (PropertyBase): New inner classes for get/set methods.
2309         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2310         (Event): New inner classes for add/remove methods.
2311         (Event.DelegateMethod): Implemented IMethodData interface.
2312
2313         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2314         EmitContext (related to class.cs refactoring).
2315
2316 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2317
2318         * delegate.cs (Delegate.VerifyApplicability): If the number of
2319         arguments are the same as the number of parameters, first try to
2320         verify applicability ignoring  any 'params' modifier on the last
2321         parameter.
2322         Fixes #56442.
2323
2324 2004-04-08  Martin Baulig  <martin@ximian.com>
2325
2326         Merged latest changes into gmcs.  Please keep this comment in
2327         here, it makes it easier for me to see what changed in MCS since
2328         the last time I merged.
2329
2330 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2331
2332         * class.cs (TypeContainer.AddIndexer): Use
2333         'ExplicitInterfaceName' to determine if interface name was
2334         explicitly specified.  'InterfaceType' is not initialized at this time.
2335         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2336         Indexers array is already in the required order.  Initialize
2337         'IndexerName' only if there are normal indexers.
2338         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2339         (TypeContainer.Emit): Emit DefaultMember attribute only if
2340         IndexerName is initialized.
2341         Fixes #56300.
2342
2343 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2344
2345         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2346         Fixes #57007
2347
2348 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2349
2350         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2351         attributes.
2352         Fix for #56456.
2353
2354         * attribute.cs (Attribute.Resolve): Check for duplicate named
2355         attributes.
2356         Fix for #56463.
2357
2358 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2359
2360         * iterators.cs (MarkYield): track whether we are in an exception,
2361         and generate code accordingly.  Use a temporary value to store the
2362         result for our state.
2363
2364         I had ignored a bit the interaction of try/catch with iterators
2365         since their behavior was not entirely obvious, but now it is
2366         possible to verify that our behavior is the same as MS .NET 2.0
2367
2368         Fixes 54814
2369
2370 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2371
2372         * iterators.cs: Avoid creating temporaries if there is no work to
2373         do. 
2374
2375         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2376         Enumerations, use TypeManager.EnumToUnderlying and call
2377         recursively. 
2378
2379         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2380         bug #57013
2381
2382         (This.Emit): Use EmitContext.EmitThis to emit our
2383         instance variable.
2384
2385         (This.EmitAssign): Ditto.
2386
2387         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2388         codepaths, we will move all the functionality into
2389         Mono.CSharp.This 
2390
2391         (FieldExpr.EmitAssign): Ditto.
2392
2393         This fixes several hidden bugs that I uncovered while doing a code
2394         review of this today.
2395
2396         * codegen.cs (EmitThis): reworked so the semantics are more clear
2397         and also support value types "this" instances.
2398
2399         * iterators.cs: Changed so that for iterators in value types, we
2400         do not pass the value type as a parameter.  
2401
2402         Initialization of the enumerator helpers is now done in the caller
2403         instead of passing the parameters to the constructors and having
2404         the constructor set the fields.
2405
2406         The fields have now `assembly' visibility instead of private.
2407
2408 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2409
2410         * expression.cs (Argument.Resolve): Check if fields passed as ref
2411         or out are contained in a MarshalByRefObject.
2412
2413         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2414         another compiler type.
2415
2416 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2417
2418         * class.cs (Indexer.Define): use the new name checking method.
2419         Also, return false on an error.
2420         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2421         (is_identifier_[start/part]_character): make static.
2422
2423 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2424
2425         * expression.cs (Binary.ResolveOperator): Do no append strings
2426         twice: since we can be invoked more than once (array evaluation)
2427         on the same concatenation, take care of this here.  Based on a fix
2428         from Ben (bug #56454)
2429
2430 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2431
2432         * codegen.cs: Fix another case where CS1548 must be reported (when 
2433         delay-sign isn't specified and no private is available #56564). Fix
2434         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2435         error when MCS is used on the MS runtime and we need to delay-sign 
2436         (which seems unsupported by AssemblyBuilder - see #56621).
2437
2438 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2439
2440         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2441         (TypeManager.ComputeNamespaces): Faster implementation for
2442         Microsoft runtime.
2443
2444         * compiler.csproj: Updated AssemblyName to mcs.
2445
2446 2004-05-11  Jackson Harper  <jackson@ximian.com>
2447
2448         * Makefile: Preserve MONO_PATH
2449         
2450 2004-05-11  Jackson Harper  <jackson@ximian.com>
2451
2452         * Makefile: Use mono and mcs to build gmcs
2453         
2454 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
2455
2456         * codegen.cs: Add patch from Robert Shade
2457         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
2458         sync with mcs.
2459
2460 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
2461
2462         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2463         incomplete key pairs (#57941).
2464
2465 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2466
2467         * codegen.cs: Fix another case where CS1548 must be reported (when 
2468         delay-sign isn't specified and no private is available #56564). Fix
2469         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2470         error when MCS is used on the MS runtime and we need to delay-sign 
2471         (which seems unsupported by AssemblyBuilder - see #56621).
2472
2473 2004-04-29  Jackson Harper  <jackson@ximian.com>
2474
2475         * Makefile: Set MONO_PATH to use the bootstrap corlib
2476         * driver.cs: Check the GAC for referenced assemblies.
2477                 
2478 2004-04-29  Martin Baulig  <martin@ximian.com>
2479
2480         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
2481
2482 2004-04-07  Martin Baulig  <martin@ximian.com>
2483
2484         * expression.cs (Binary.ResolveOperator): Added special case for
2485         Equality/Inequality between a type parameter and a null literal.
2486
2487 2004-04-07  Martin Baulig  <martin@ximian.com>
2488
2489         * convert.cs: Check null literal -> type parameter conversions.
2490
2491 2004-04-07  Martin Baulig  <martin@ximian.com>
2492
2493         * generic.cs (ConstructedType.CheckConstraints): Enforce the
2494         `class' and `struct' constraints.
2495
2496 2004-04-07  Martin Baulig  <martin@ximian.com>
2497
2498         * generic.cs (SpecialConstraint): New public enum.
2499         (Constraints.Resolve): Added support for the `class' and `struct'
2500         constraints.
2501
2502         * cs-parser.jay (type_parameter_constraint): Added support for the
2503         `class' and `struct' constraints.
2504
2505 2004-04-07  Martin Baulig  <martin@ximian.com>
2506
2507         * support.cs (GenericConstraints): Replaced `Types' by
2508         `ClassConstraint' and `InterfaceConstraints'; added
2509         `HasClassConstraint'.   
2510
2511 2004-04-07  Martin Baulig  <martin@ximian.com>
2512
2513         * generic.cs
2514         (Constraints.InterfaceConstraints): New public property.
2515         (Constraints.Types): Make this property public
2516         (TypeParameter): Implement IMemberContainer.
2517         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
2518         instead of a TypeBuilder/MethodBuilder; pass the interface
2519         constraints to TypeManager.AddTypeParameter().
2520         (TypeParameter.DefineType): Just take an EmitContext and no
2521         TypeBuilder/MethodBuilder.  Use the new public API.
2522
2523         * typemanager.cs (TypeManager.AddTypeParameter): Added
2524         `TypeExpr[]' argument; add the interfaces to the
2525         `builder_to_ifaces' hash.
2526         (TypeManager.LookupMemberContainer): For
2527         GenericTypeParameterBuilders, get the TypeParameter from the
2528         `builder_to_type_param'.
2529         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
2530         the TypeParameter and call FindMembers on it.
2531
2532 2004-04-07  Martin Baulig  <martin@ximian.com>
2533
2534         * class.cs
2535         (MethodCore.GenericMethod): Moved this field here from Method.
2536         (MethodCore.IsDuplicateImplementation): Take the number of type
2537         parameters into account if we're a generic method.
2538
2539         * expression.cs (Invocation.InferTypeArguments): Don't return true
2540         if `arguments' is null; we still need to check whether we actually
2541         don't need to infer anything in this case.
2542         (MemberAccess): Merged the functionality from GenericMemberAccess
2543         into this class.
2544
2545         * generic.cs (GenericMemberAccess): Removed.
2546
2547 2004-04-05  Martin Baulig  <martin@ximian.com>
2548
2549         * decl.cs (MemberCore): For generic classes, interfaces and
2550         structs, `Name' now includes the number of type parameters
2551         ("Stack!1.Node!1").
2552         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
2553         encode the number of type arguments in the type name.
2554
2555         * expression.cs (Expression.MemberLookup): Removed the
2556         `num_type_args' argument; we now encode the number of type
2557         arguments in the type name.
2558
2559         * ecore.cs (SimpleName): Encode the number of type arguments in
2560         the type name itself.
2561
2562         * generic.cs (ConstructedType): Likewise.
2563
2564         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
2565         `MemberName'; we now include the number of type parameters in the
2566         type name.
2567
2568         * typemanager.cs (TypeManager.CheckGeneric): Removed.
2569         (TypeManager.MemberLookup): Removed the
2570         `num_type_args' argument; we now encode the number of type
2571         arguments in the type name.     
2572
2573 2004-04-03  Martin Baulig  <martin@ximian.com>
2574
2575         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
2576         (MemberCore.MemberName): Moved here from MemberBase.
2577         (DeclSpace.SetParameterInfo): Just take the constraints as an
2578         ArrayList; we already have the type parameters in our
2579         `MemberName'; also do the CS0080 reporting here.
2580
2581         * cs-parser.jay (struct_declaration): Use `member_name' instead of
2582         `IDENTIFIER opt_type_parameter_list'; when constructing our
2583         `MemberName', it'll already include our type parameters.
2584         (class_declaration, interface_declaration): Likewise.
2585         (delegate_declaration): Likewise.
2586         (MakeName): Take a MemberName and return a MemberName.
2587         The following two changes are required to avoid shift/reduce conflicts:
2588         (member_name): Don't include a TypeName anymore; ie. this is now
2589         just 'IDENTIFIER opt_type_parameter_list'.
2590         (property_declaration, event_declaration): Use a
2591         `namespace_or_type_name' instead of a `member_name'.            
2592
2593 2004-04-03  Martin Baulig  <martin@ximian.com>
2594
2595         * decl.cs (MemberName): Renamed to `TypeName' and created a new
2596         `MemberName' class.
2597         (TypeName): Formerly known as MemberName.
2598
2599         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
2600         instead of a `MemberName'.
2601
2602         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
2603         (member_name): New rule; create a MemberName.
2604
2605 2004-04-02  Martin Baulig  <martin@ximian.com>
2606
2607         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
2608         (CS0305 and CS0308).
2609
2610 2004-04-02  Martin Baulig  <martin@ximian.com>
2611
2612         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
2613         support for nested types.
2614
2615 2004-04-02  Martin Baulig  <martin@ximian.com>
2616
2617         * ecore.cs (IAlias): New public interface.
2618         (TypeExpr, TypeExpression): Implement IAlias.
2619         (TypeAliasExpression): New public class.
2620
2621         * namespace.cs (Namespace): Implement IAlias.
2622         (Namespace.Lookup): Return an IAlias instead on an object.
2623         (Namespace.DefineName): Take an IAlias instead of an object.
2624         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
2625         an object.
2626         (NamespaceEntry.UsingAlias): Take a Membername instead of an
2627         Expression.
2628         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
2629         object.
2630         (NamespaceEntry.Lookup): Likewise.
2631
2632         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
2633         instead of a Type.      
2634
2635         * decl.cs (DeclSpace): Implement IAlias.
2636         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
2637
2638         * generic.cs (ConstructedType): Improved error checking.
2639
2640 2004-04-02  Martin Baulig  <martin@ximian.com>
2641
2642         * convert.cs: Added type parameter conversions.
2643
2644         * ecore.cs
2645         (UnboxCast.Emit): Emit an `unbox.any' for type params.
2646         (ClassCast.Emit): If the source type is a type parameter, box it.
2647         If the target type is a type parameter, emit an `unbox.any'
2648         instead of a `classcast'.1      
2649
2650 2004-04-01  Martin Baulig  <martin@ximian.com>
2651
2652         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
2653
2654 2004-04-01  Martin Baulig  <martin@ximian.com>
2655
2656         * generic.cs (ConstructedType.CheckConstraints): Use
2657         Convert.ImplicitStandardConversionExists(); user-defined implicit
2658         conversions are not allowed according to the spec.
2659
2660 2004-03-30  Martin Baulig  <martin@ximian.com>
2661
2662         * expression.cs (New): Added support for type parameters.
2663
2664         * typemanager.cs
2665         (TypeManager.activator_type): New public static field.
2666         (TypeManager.activator_create_instance): Likewise.
2667
2668 2004-03-30  Martin Baulig  <martin@ximian.com>
2669
2670         * typemanager.cs (TypeManager.HasConstructorConstraint): New
2671         public method.
2672
2673 2004-03-30  Martin Baulig  <martin@ximian.com>
2674
2675         * generic.cs (ConstructedType.CheckConstraints): Actually follow
2676         the spec here: the argument type must be convertible to the
2677         constraints.
2678
2679 2004-03-30  Martin Baulig  <martin@ximian.com>
2680
2681         * generic.cs
2682         (TypeParameter.Define, TypeParameter.DefineMethod): Call
2683         TypeManager.AddTypeParameter().
2684         (ConstructedType.CheckConstraints): Re-enable this and actually
2685         check whether we have a constructor constraint.
2686
2687         * typemanager.cs
2688         (TypeManager.builder_to_type_param): New static field.
2689         (TypeManager.AddTypeParameter): New static method.
2690         (TypeManager.LookupTypeParameter): New public method.
2691
2692 2004-03-30  Martin Baulig  <martin@ximian.com>
2693
2694         * generic.cs (TypeParameter.DefineType): Return a boolean and use
2695         the new API to actually define the constructor constraint.
2696
2697         * typemanager.cs
2698         (TypeManager.new_constraint_attr_type): New static field.
2699         (TypeManager.InitCoreTypes): Initialize it.
2700
2701 2004-03-30  Martin Baulig  <martin@ximian.com>
2702
2703         * generic.cs (Constraints): Completed error checking, use correct
2704         error numbers.
2705
2706 2004-03-29  Martin Baulig  <martin@ximian.com>
2707
2708         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
2709
2710         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2711         public version which takes a `ParameterData pd' instead of an
2712         `ArrayList args'.
2713
2714 2004-03-29  Martin Baulig  <martin@ximian.com>
2715
2716         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
2717         not a MethodInfo.       
2718
2719 2004-03-29  Martin Baulig  <martin@ximian.com>
2720
2721         * expression.cs (Argument.ResolveMethodGroup): If we're a
2722         ConstructedType, call GetMemberAccess() on it.  
2723
2724 2004-03-29  Martin Baulig  <martin@ximian.com>
2725
2726         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
2727         (MethodCore.CheckGenericOverride): When overriding a generic
2728         method, check whether the constraints match.
2729
2730         * support.cs (GenericConstraints): New public interface.
2731         (ParameterData.GenericConstraints): New public method.
2732
2733         * parameter.cs (Parameter.Resolve): Check whether we're a generic
2734         method parameter and compute our constraints if appropriate.
2735         (Parameter.GenericConstraints): New public property.
2736
2737         * generic.cs (Constraints): Implement GenericConstraints.
2738
2739 2004-03-29  Martin Baulig  <martin@ximian.com>
2740
2741         * decl.cs (MemberCache.FindMemberToOverride): Use
2742         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
2743
2744 2004-03-29  Martin Baulig  <martin@ximian.com>
2745
2746         * generic.cs (GenericMethod.Define): Resolve our type parameters.
2747
2748 2004-03-29  Martin Baulig  <martin@ximian.com>
2749
2750         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
2751         not allowed on non-generic declarations").
2752
2753 2004-03-29  Martin Baulig  <martin@ximian.com>
2754
2755         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2756         public version of this method.
2757
2758         * class.cs (MethodCore.IsDuplicateImplementation): Use
2759         Invocation.InferTypeArguments() to check this.
2760
2761 2004-03-29  Martin Baulig  <martin@ximian.com>
2762
2763         * convert.cs: Use TypeManager.IsDelegateType() instead of
2764         comparing types correctly.
2765
2766 2004-03-29  Martin Baulig  <martin@ximian.com>
2767
2768         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
2769         types directly to make it work for generic instances.
2770
2771         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
2772
2773 2004-03-29  Martin Baulig  <martin@ximian.com>
2774
2775         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
2776         support for arrays.     
2777
2778 2004-03-24  Martin Baulig  <martin@ximian.com>
2779
2780         * decl.cs (DeclSpace.FindType): Also use
2781         TypeManager.CheckGeneric() for types from the using clauses.
2782
2783 2004-03-23  Martin Baulig  <martin@ximian.com>
2784
2785         * expression.cs (Invocation.OverloadResolve): Added `bool
2786         may_fail' argument and use it instead of the Location.IsNull() hack.
2787
2788 2004-03-23  Martin Baulig  <martin@ximian.com>
2789
2790         * expression.cs (Invocation.InferType): Use correct type inference
2791         rules here.     
2792
2793 2004-03-23  Martin Baulig  <martin@ximian.com>
2794
2795         * ecore.cs (MethodGroupExpr.Name): Use
2796         TypeManager.CSharpSignature() instead of just the name.
2797
2798         * expression.cs (Invocation.OverloadResolve): Provide better error
2799         reporting.
2800         (Invocation.DoResolve): OverloadResolve() never returns null
2801         without reporting an error, so removed the error -6 reporting here.
2802
2803 2004-03-23  Martin Baulig  <martin@ximian.com>
2804
2805         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
2806         generic methods.
2807
2808         * cs-parser.jay (delegate_declaration): Support generic delegates.
2809
2810         * delegate.cs: Support generic delegates.
2811
2812 2004-03-22  Martin Baulig  <martin@ximian.com>
2813
2814         * expression.cs (Invocation.InferParamsTypeArguments): New static
2815         method; does type inference for params arguments.
2816
2817 2004-03-21  Martin Baulig  <martin@ximian.com>
2818
2819         * typemanager.cs (TypeManager.IsGenericMethod): New public static
2820         method; checks whether a method is a generic method.    
2821
2822         * expression.cs (Invocation.InferTypeArguments): New static method;
2823         infer type arguments for generic method invocation.
2824
2825         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
2826         property; we set this to true if we're resolving a generic method
2827         invocation and the user specified type arguments, ie. we're not
2828         doing type inference.
2829
2830 2004-03-20  Martin Baulig  <martin@ximian.com>
2831
2832         * class.cs (MethodData.DeclaringType): New public property.
2833         (MethodData.Define): Set DeclaringType here.
2834         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
2835         instead of OperatorMethodBuilder.DeclaringType.
2836
2837 2004-03-20  Martin Baulig  <martin@ximian.com>
2838
2839         * cs-tokenizer.cs (xtoken): Return a special
2840         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
2841
2842         * cs-parser.jay (default_value_expression): Switch to the new
2843         syntax (14.5.13).
2844
2845 2004-03-19  Martin Baulig  <martin@ximian.com>
2846
2847         * decl.cs (MemberName): New class.  We use this to "construct"
2848         namespace_or_type_name's.
2849
2850         * generics.cs (TypeArguments.GetDeclarations): New public method;
2851         returns the type arguments as a string[] and reports a CS0081 if
2852         one of them is not an identifier.
2853
2854         * class.cs (MemberBase): The .ctor now takes the name as a
2855         MemberName instead of a string.
2856         (MemberBase.ExplicitInterfaceName): Changed type from string to
2857         Expression.
2858         (MemberBase.DoDefine): If we're an explicit implementation, the
2859         InterfaceType may be a generic instance.
2860
2861         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
2862         (namespace_name): Call MemberName.GetName () to transform the
2863         MemberName into a string and ensure we don't have any type
2864         arguments.
2865         (type_name): Call MemberName.GetTypeExpression() to transfrom the
2866         MemberName into an expression.
2867         (method_header): Use namespace_or_type_name instead of member_name.     
2868
2869 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2870
2871         * rootcontext.cs: Add new types to the boot resolution.
2872
2873         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2874         MulticastDelegate is not allowed.
2875
2876         * typemanager.cs: Add new types to lookup: System.TypedReference
2877         and ArgIterator.
2878
2879         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2880         check for TypedReference or ArgIterator, they are not allowed. 
2881
2882         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2883         makes us properly catch 1510 in some conditions (see bug 56016 for
2884         details). 
2885
2886 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2887
2888         * CryptoConvert.cs: update from corlib version
2889         with endian fixes.
2890
2891 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2892
2893         * class.cs (Indexer.Define): Check indexername declaration
2894
2895 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2896
2897         * attribute.cs (IsClsCompliant): Fixed problem with handling
2898         all three states (compliant, not-compliant, undetected).
2899
2900 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2901
2902         * attribute.cs (Attribute): Location is now public.
2903         (Resolve): Store resolved arguments (pos_values) in attribute class.
2904         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2905         (GetClsCompliantAttributeValue): New method that gets
2906         CLSCompliantAttribute value.
2907         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2908         if exists else null.
2909         (AttributeTester): New class for CLS-Compliant verification routines.
2910
2911         * class.cs (Emit): Add CLS-Compliant verification.
2912         (Method.GetSignatureForError): Implemented.
2913         (Constructor.GetSignatureForError): Implemented
2914         (Constructor.HasCompliantArgs): Returns if constructor has
2915         CLS-Compliant arguments.
2916         (Constructor.Emit): Override.
2917         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2918         is needed to test only parameters.
2919         (FieldBase.GetSignatureForError): Implemented.
2920         (TypeContainer): New member for storing base interfaces.
2921         (TypeContainer.FindMembers): Search in base interfaces too.
2922
2923         * codegen.cs (GetClsComplianceAttribute): New method that gets
2924         assembly or module CLSCompliantAttribute value.
2925         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2926         for assembly.
2927         (ModuleClass.Emit): Add error 3012 test.
2928
2929         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2930
2931         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2932         state for all decl types.
2933         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2934         if CLS-Compliant tests are required.
2935         (IsClsCompliaceRequired): New method. Analyze whether code
2936         must be CLS-Compliant.
2937         (IsExposedFromAssembly): New method. Returns true when MemberCore
2938         is exposed from assembly.
2939         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2940         value or gets cached value.
2941         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2942         is explicitly marked with CLSCompliantAttribute.
2943         (IsIdentifierClsCompliant): New abstract method. This method is
2944         used to testing error 3005.
2945         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2946         for identifier and parameters CLS-Compliant testing.
2947         (VerifyClsCompliance): New method. The main virtual method for
2948         CLS-Compliant verifications.
2949         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2950         null. I don't know why is null (too many public members !).
2951         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2952         and get value of first CLSCompliantAttribute that found.
2953
2954         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2955         (VerifyClsCompliance): Override and add extra tests.
2956
2957         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2958         clscheck- disable CLS-Compliant verification event if assembly is has
2959         CLSCompliantAttribute(true).
2960
2961         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2962         ApllyAttribute is now called in emit section as in the other cases.
2963         Possible future Emit integration.
2964         (IsIdentifierClsCompliant): New override.
2965         (VerifyClsCompliance): New override.
2966         (GetEnumeratorName): Returns full enum name.
2967
2968         * parameter.cs (GetSignatureForError): Implemented.
2969
2970         * report.cs (WarningData): New struct for Warning message information.
2971         (LocationOfPreviousError): New method.
2972         (Warning): New method. Reports warning based on the warning table.
2973         (Error_T): New method. Reports error based on the error table.
2974
2975         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2976         verifications are done here.
2977
2978         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2979
2980         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2981         CLSCompliantAttribute.
2982         (all_imported_types): New member holds all imported types from other
2983         assemblies.
2984         (LoadAllImportedTypes): New method fills static table with exported types
2985         from all referenced assemblies.
2986         (Modules): New property returns all assembly modules.
2987
2988 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2989
2990         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2991         throwing a parser error.
2992
2993         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2994         which removes the hardcoded get_/set_ prefixes for properties, as
2995         IL allows for the properties to be named something else.  
2996
2997         Bug #56013
2998
2999         * expression.cs: Do not override operand before we know if it is
3000         non-null.  Fix 56207
3001
3002 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3003
3004         * typemanager.cs: support for pinned variables.
3005
3006 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3007
3008         * decl.cs, typemanager.cs: Avoid using an arraylist
3009         as a buffer if there is only one result set.
3010
3011 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3012
3013         * expression.cs: Make sure you cant call a static method
3014         with an instance expression, bug #56174.
3015
3016 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3017
3018         * class.cs (IsDuplicateImplementation): Improve error reporting to
3019         flag 663 (method only differs in parameter modifier).
3020
3021         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3022         in preprocessor directives.
3023
3024         * location.cs (LookupFile): Allow for the empty path.
3025
3026         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3027         better approach for some of that patch, but its failing with the
3028         CharSet enumeration.  For now try/catch will do.
3029
3030         * typemanager.cs: Do not crash if a struct does not have fields.
3031         Fixes 56150.
3032
3033 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3034
3035         * expression.cs: cs0213, cant fix a fixed expression.
3036         fixes 50231.
3037
3038 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3039
3040         * cs-parser.jay: detect invalid embeded statements gracefully.
3041         bug #51113.
3042
3043 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3044
3045         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3046         As a regex:
3047         s/
3048         the invocation type may not be a subclass of the tye of the item/
3049         The type of the item must be a subclass of the invocation item.
3050         /g
3051
3052         Fixes bug #50820.
3053
3054 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3055
3056         * attribute.cs: Added methods to get a string and a bool from an
3057         attribute. Required to information from AssemblyKeyFileAttribute,
3058         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3059         * codegen.cs: Modified AssemblyName creation to include support for
3060         strongnames. Catch additional exceptions to report them as CS1548.
3061         * compiler.csproj: Updated include CryptoConvert.cs.
3062         * compiler.csproj.user: Removed file - user specific configuration.
3063         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3064         Mono.Security assembly. The original class is maintained and tested in
3065         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3066         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3067         like CSC 8.0 (C# v2) supports.
3068         * Makefile: Added CryptoConvert.cs to mcs sources.
3069         * rootcontext.cs: Added new options for strongnames.
3070
3071 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3072
3073         * driver.cs: For --expect-error, report error code `2'
3074         if the program compiled with no errors, error code `1' if
3075         it compiled with an error other than the one expected.
3076
3077 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3078
3079         * compiler.csproj: Updated for Visual Studio .NET 2003.
3080         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3081         * compiler.sln: Updated for Visual Studio .NET 2003.
3082
3083 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3084
3085         * expression.cs: Fix bug #47234. We basically need to apply the
3086         rule that we prefer the conversion of null to a reference type
3087         when faced with a conversion to 'object' (csc behaviour).
3088
3089 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3090
3091         * statement.cs: Shorter form for foreach, eliminates
3092         a local variable. r=Martin.
3093
3094 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3095
3096         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3097         checks if we can use brtrue/brfalse to test for 0.
3098         * expression.cs: use the above in the test for using brtrue/brfalse.
3099         cleanup code a bit.
3100
3101 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3102
3103         * expression.cs: Rewrite string concat stuff. Benefits:
3104
3105         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3106         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3107         rather than a concat chain.
3108
3109         * typemanager.cs: Add lookups for more concat overloads.
3110
3111 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3112
3113         * expression.cs: Emit shorter il code for array init.
3114
3115         newarr
3116         dup
3117         // set 1
3118
3119         // set 2
3120
3121         newarr
3122         stloc.x
3123
3124         ldloc.x
3125         // set 1
3126
3127         ldloc.x
3128         // set 2
3129
3130 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3131
3132         * statement.cs: Before, two switch blocks would be merged if the
3133         total size of the blocks (end_item - begin_item + 1) was less than
3134         two times the combined sizes of the blocks.
3135
3136         Now, it will only merge if after the merge at least half of the
3137         slots are filled.
3138
3139         fixes 55885.
3140
3141 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3142
3143         * class.cs : csc build fix for GetMethods(). See bug #52503.
3144
3145 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3146
3147         * expression.cs: Make sure fp comparisons work with NaN.
3148         This fixes bug #54303. Mig approved this patch a long
3149         time ago, but we were not able to test b/c the runtime
3150         had a related bug.
3151
3152 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3153
3154         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3155
3156 2004-03-19  Martin Baulig  <martin@ximian.com>
3157
3158         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
3159         two overloads may unify for some type parameter substitutions and
3160         report a CS0408 if appropriate.
3161
3162 2004-03-19  Martin Baulig  <martin@ximian.com>
3163
3164         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3165         error here and not in our caller.
3166
3167 2004-03-19  Martin Baulig  <martin@ximian.com>
3168
3169         * interface.cs: Completely killed this file.
3170         (Interface): We're now a TypeContainer and live in class.cs.
3171
3172         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3173         argument; we're now also called for interfaces.
3174         (TypeContainer.DefineMembers): Allow this method being called
3175         multiple times.
3176         (TypeContainer.GetMethods): New public method; formerly known as
3177         Interface.GetMethod().  This is used by PendingImplementation.
3178         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3179         it's now private and non-static.
3180         (Interface): Moved this here; it's now implemented similar to
3181         Class and Struct.
3182         (Method, Property, Event, Indexer): Added `bool is_interface'
3183         argument to their .ctor's.
3184         (MemberBase.IsInterface): New public field.
3185
3186         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3187         instances instead of InterfaceMethod, InterfaceProperty, etc.
3188         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3189         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3190
3191 2004-03-19  Martin Baulig  <martin@ximian.com>
3192
3193         * class.cs (MethodCore.IsDuplicateImplementation): New private
3194         method which does the CS0111 checking.
3195         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3196         Use IsDuplicateImplementation().
3197
3198 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3199
3200         * decl.cs (FindMemberToOverride): New method to find the correct
3201         method or property to override in the base class.
3202         * class.cs
3203             - Make Method/Property use the above method to find the
3204               version in the base class.
3205             - Remove the InheritableMemberSignatureCompare as it is now
3206               dead code.
3207
3208         This patch makes large code bases much faster to compile, as it is
3209         O(n) rather than O(n^2) to do this validation.
3210
3211         Also, it fixes bug 52458 which is that nested classes are not
3212         taken into account when finding the base class member.
3213
3214         Reviewed/Approved by Martin.
3215
3216 2004-03-17  Martin Baulig  <martin@ximian.com>
3217
3218         * expression.cs (MemberAccess.DoResolve): Take the parent's number
3219         of type arguments into account; use the `real_num_type_args'
3220         approach like in DoResolveAsTypeStep().
3221
3222         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
3223         nested types.
3224
3225 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3226
3227         * interface.cs: In all interface classes removed redundant
3228         member initialization.
3229
3230 2004-03-16  Martin Baulig  <martin@ximian.com>
3231
3232         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3233
3234 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3235
3236         * decl.cs (DefineTypeAndParents): New helper method to define a
3237         type's containers before the type itself is defined;  This is a
3238         bug exposed by the recent changes to Windows.Forms when an
3239         implemented interface was defined inside a class that had not been
3240         built yet.   
3241
3242         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3243
3244         (Check): Loop correctly to report errors modifiers
3245         (UNSAFE was not in the loop, since it was the same as TOP).
3246
3247         * interface.cs: Every interface member now takes a ModFlags,
3248         instead of a "is_new" bool, which we set on the base MemberCore. 
3249
3250         Every place where we called "UnsafeOk" in the interface, now we
3251         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3252         the unsafe settings from the member declaration instead of the
3253         container interface. 
3254
3255         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3256
3257         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3258         `set_indexer_name' to the pending bits (one per type).
3259
3260         We fixed a bug today that was picking the wrong method to
3261         override, since for properties the existing InterfaceMethod code
3262         basically ignored the method name.  Now we make sure that the
3263         method name is one of the valid indexer names.
3264
3265 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
3266  
3267         * support.cs (SeekableStreamReader): Keep track of stream byte
3268         positions and don't mix them with character offsets to the buffer.
3269
3270         Patch from Gustavo Giráldez
3271
3272 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
3273
3274         * interface.cs (InterfaceSetGetBase): Removed double member
3275         initialization, base class does it as well.
3276
3277 2004-03-13  Martin Baulig  <martin@ximian.com>
3278
3279         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3280         when compiling corlib.
3281
3282 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3283
3284         * convert.cs (ExplicitConversion): We were reporting an error on
3285         certain conversions (object_type source to a value type, when the
3286         expression was `null') before we had a chance to pass it through
3287         the user defined conversions.
3288
3289         * driver.cs: Replace / and \ in resource specifications to dots.
3290         Fixes 50752
3291
3292         * class.cs: Add check for duplicate operators.  Fixes 52477
3293
3294 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3295
3296         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3297         that are in the middle of the statements, not only at the end.
3298         Fixes #54987
3299
3300         * class.cs (TypeContainer.AddField): No longer set the
3301         `HaveStaticConstructor' flag, now we call it
3302         `UserDefineStaticConstructor' to diferentiate the slightly
3303         semantic difference.
3304
3305         The situation is that we were not adding BeforeFieldInit (from
3306         Modifiers.TypeAttr) to classes that could have it.
3307         BeforeFieldInit should be set to classes that have no static
3308         constructor. 
3309
3310         See:
3311
3312         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3313
3314         And most importantly Zoltan's comment:
3315
3316         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3317
3318         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3319          before its static fields are used', i.e. initialization does not need
3320          to be triggered by the first access to the type. Setting this flag
3321          helps the JIT to compile better code, since it can run the static
3322          constructor at JIT time, and does not need to generate code to call it
3323          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3324          this flag for lots of classes like String. 
3325          
3326          csc sets this flag if the type does not have an explicit static 
3327          constructor. The reasoning seems to be that if there are only static
3328          initalizers for a type, and no static constructor, then the programmer
3329          does not care when this initialization happens, so beforefieldinit
3330          can be used.
3331          
3332          This bug prevents the AOT compiler from being usable, since it 
3333          generates so many calls to mono_runtime_class_init that the AOT code
3334          is much slower than the JITted code. The JITted code is faster, 
3335          because it does not generate these calls if the vtable is type is
3336          already initialized, which is true in the majority of cases. But the
3337          AOT compiler can't do this."
3338
3339 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3340
3341         * class.cs (MethodData.Emit): Refactor the code so symbolic
3342         information is generated for destructors;  For some reasons we
3343         were taking a code path that did not generate symbolic information
3344         before. 
3345
3346 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3347
3348         * class.cs: Create a Constructor.CheckBase method that
3349         takes care of all validation type code. The method
3350         contains some code that was moved from Define.
3351
3352         It also includes new code that checks for duplicate ctors.
3353         This fixes bug #55148.
3354
3355 2004-03-09  Joshua Tauberer <tauberer@for.net>
3356
3357         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3358         a { ... }-style array creation invokes EmitStaticInitializers
3359         which is not good for reference-type arrays.  String, decimal
3360         and now null constants (NullCast) are not counted toward
3361         static initializers.
3362
3363 2004-03-05  Martin Baulig  <martin@ximian.com>
3364
3365         * location.cs (SourceFile.HasLineDirective): New public field;
3366         specifies whether the file contains or is referenced by a "#line"
3367         directive.
3368         (Location.DefineSymbolDocuments): Ignore source files which
3369         either contain or are referenced by a "#line" directive.        
3370
3371 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3372
3373         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3374         direct access to our parent, so check the method inline there.
3375
3376 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3377
3378         * expression.cs (Invocation.EmitCall): Miguel's last commit
3379         caused a regression. If you had:
3380
3381             T t = null;
3382             t.Foo ();
3383
3384         In Foo the implict this would be null.
3385
3386 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3387
3388         * expression.cs (Invocation.EmitCall): If the method is not
3389         virtual, do not emit a CallVirt to it, use Call.
3390
3391         * typemanager.cs (GetFullNameSignature): Improve the method to
3392         cope with ".ctor" and replace it with the type name.
3393
3394         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3395         as an argument the ConstructorBuilder where it is being defined,
3396         to catch the recursive constructor invocations.
3397
3398 2004-03-16  Martin Baulig  <martin@ximian.com>
3399
3400         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
3401         ConstructedType, call ResolveType() on it to get the type rather
3402         than just using `expr.Type'.
3403
3404 2004-03-16  Martin Baulig  <martin@ximian.com>
3405
3406         * generics.cs (ConstructedType.GetMemberAccess): Take the
3407         EmitContext instead on the TypeExpr and use
3408         ec.TypeContainer.CurrentType/ec.ContainerType.
3409
3410 2004-03-16  Martin Baulig  <martin@ximian.com>
3411
3412         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
3413         parameters before aliases.
3414
3415 2004-03-16  Martin Baulig  <martin@ximian.com>
3416
3417         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
3418         New oublic function; checks whether two generic instances may become
3419         equal under some instantiations (26.3.1).
3420
3421         * class.cs (TypeContainer.Define): Call
3422         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
3423         error.
3424
3425 2004-03-16  Martin Baulig  <martin@ximian.com>
3426
3427         * class.cs (TypeContainer.GetClassBases): Moved
3428         Error_TypeParameterAsBase() here and also check whether the base
3429         class is not an attribute.
3430
3431 2004-03-16  Martin Baulig  <martin@ximian.com>
3432
3433         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3434
3435 2004-03-16  Martin Baulig  <martin@ximian.com>
3436
3437         * class.cs (Error_TypeParameterAsBase): Use correct error number
3438         here (CS0689).  
3439
3440 2004-03-16  Martin Baulig  <martin@ximian.com>
3441
3442         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
3443         for generics.
3444
3445         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
3446         error reporting.
3447
3448 2004-03-15  Martin Baulig  <martin@ximian.com>
3449
3450         * typemanager.cs (TypeManager.GetFullName): New public method.
3451         (TypeManager.MemberLookup): Added `int_num_type_arguments'
3452         argument; only return members with the correct number of type
3453         arguments.
3454         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
3455         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
3456         whether the number of type arguments matches.
3457
3458         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
3459         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
3460
3461         * expression.cs (MemberAccess): Added public `NumTypeArguments'
3462         field; it's set by the protected .ctor when we're actually a
3463         GenericMemberAccess.
3464         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
3465         arguments and pass it to MemberLookupFinal ().
3466
3467         * ecore.cs (Expression.MemberLookup): Added `int
3468         num_type_arguments' argument; only return members with the correct
3469         number of type arguments.
3470         (Expression.MemberLookupFailed): Check whether the MemberLookup
3471         failed because we did not have the correct number of type
3472         arguments; report CS0305 in this case.
3473
3474         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
3475         `e.ResolveAsTypeTerminal()' already did so.
3476
3477 2004-03-15  Martin Baulig  <martin@ximian.com>
3478
3479         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
3480         we're a ConstructedType; in this case, the caller must report an
3481         error (for instance CS0131).
3482
3483         * generic.cs (TypeArguments): Added Location argument to the .ctor.
3484         (TypeArguments.Resolve): Actually report errors here.
3485
3486 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3487
3488         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3489         `set_indexer_name' to the pending bits (one per type).
3490
3491         We fixed a bug today that was picking the wrong method to
3492         override, since for properties the existing InterfaceMethod code
3493         basically ignored the method name.  Now we make sure that the
3494         method name is one of the valid indexer names.
3495
3496 2004-03-15  Martin Baulig  <martin@ximian.com>
3497
3498         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
3499         for generic instances.
3500
3501 2004-03-13  Martin Baulig  <martin@ximian.com>
3502
3503         * class.cs (TypeContainer.DefineType): Call
3504         TypeManager.AddUserType() immediately after creating the
3505         TypeBuilder; pass all type parameters when creating the
3506         CurrentType.
3507
3508         * decl.cs (DeclSpace.FindNestedType): New public method.
3509         (DeclSpace.FindType): Added `int num_type_args' argument; only
3510         return types with the correct number of type parameters.
3511         (DeclSpace.CountTypeParams): New public property.
3512
3513         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
3514         the number of type parameters; defaults to zero.
3515
3516         * generic.cs (TypeArguments.Count): New public property.
3517         (ConstructedType.DoResolveAsTypeStep): First call
3518         ds.FindNestedType() to find out whether we're nested in the
3519         current generic type; in this case, we inherit all type parameters
3520         from the current class.
3521
3522         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
3523         num_type_args' argument.
3524         (RootContext.LookupType): Added overloaded version which takes the
3525         number of type arguments; only return types with the correct
3526         number of type arguments.
3527
3528         * typemanager.cs (TypeManager.CheckGeneric): New public function;
3529         checks whether `Type t' has `int num_type_args'.
3530
3531 2004-03-13  Martin Baulig  <martin@ximian.com>
3532
3533         * generic.cs (GenericMethod.DefineType): New method; calls
3534         DefineType() on all the type parameters.
3535
3536         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
3537         (MethodData.Define): If we're a generic method, call
3538         GenericMethod.DefineType() to define the type parameters.       
3539
3540 2004-03-10  Martin Baulig  <martin@ximian.com>
3541
3542         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
3543         instead of IsAssignableFrom.    
3544
3545 2004-03-10  Martin Baulig  <martin@ximian.com>
3546
3547         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
3548
3549         * support.cs (ParameterData.HasArrayParameter): New property.
3550         (ReflectionParameters.ctor): Take a MethodBase instead of a
3551         ParameterInfo[].  If we have any type parameters, get the generic
3552         method definition and ask it whether we have variable arguments.
3553
3554 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3555
3556         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3557         routines to check if a type is an enumerable/enumerator allow
3558         classes that implement the IEnumerable or IEnumerator interfaces.
3559
3560         * class.cs (Property, Operator): Implement IIteratorContainer, and
3561         implement SetYields.
3562
3563         (Property.Define): Do the block swapping for get_methods in the
3564         context of iterators.   We need to check if Properties also
3565         include indexers or not.
3566
3567         (Operator): Assign the Block before invoking the
3568         OperatorMethod.Define, so we can trigger the Iterator code
3569         replacement. 
3570
3571         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3572         Property and Operator classes are not created when we parse the
3573         declarator but until we have the block completed, so we use a
3574         singleton SimpleIteratorContainer.Simple to flag whether the
3575         SetYields has been invoked.
3576
3577         We propagate this setting then to the Property or the Operator to
3578         allow the `yield' to function.
3579
3580 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3581
3582         * codegen.cs: Implemented attribute support for modules.
3583         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3584         Assembly/Module functionality.
3585
3586         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3587         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3588         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3589
3590 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3591
3592         * interface.cs (FindMembers): The operation is performed on all base
3593         interfaces and not only on the first. It is required for future CLS Compliance patch.
3594
3595 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3596
3597         * statement.cs, codegen.cs:
3598         This patch deals with patterns such as:
3599
3600         public class List : IEnumerable {
3601
3602                 public MyEnumerator GetEnumerator () {
3603                         return new MyEnumerator(this);
3604                 }
3605
3606                 IEnumerator IEnumerable.GetEnumerator () {
3607                         ...
3608                 }
3609                 
3610                 public struct MyEnumerator : IEnumerator {
3611                         ...
3612                 }
3613         }
3614
3615         Before, there were a few things we did wrong:
3616         1) we would emit callvirt on a struct, which is illegal
3617         2) we emited ldarg when we needed to emit ldarga
3618         3) we would mistakenly call the interface methods on an enumerator
3619         type that derived from IEnumerator and was in another assembly. For example:
3620
3621         public class MyEnumerator : IEnumerator
3622
3623         Would have the interface methods called, even if there were public impls of the
3624         method. In a struct, this lead to invalid IL code.
3625
3626 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3627
3628         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3629           renamed to Emit.
3630
3631         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3632
3633 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3634
3635         * cs-parser.jay: Fix small regression: we were not testing V2
3636         compiler features correctly.
3637
3638         * interface.cs: If the emit context is null, then create one
3639
3640 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3641
3642         * decl.cs (GetSignatureForError): New virtual method to get full name
3643           for error messages.
3644
3645         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3646           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3647
3648         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3649           Duplicated members and code in these classes has been removed.
3650           Better encapsulation in these classes.
3651
3652 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3653
3654         * assign.cs (Assign.DoResolve): When dealing with compound
3655         assignments, there is a new rule in ECMA C# 2.4 (might have been
3656         there before, but it is documented here) that states that in:
3657
3658         a op= b;
3659
3660         If b is of type int, and the `op' is a shift-operator, then the
3661         above is evaluated as:
3662
3663         a = (int) a op b 
3664
3665         * expression.cs (Binary.ResolveOperator): Instead of testing for
3666         int/uint/long/ulong, try to implicitly convert to any of those
3667         types and use that in pointer arithmetic.
3668
3669         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3670         method to print information for from the type, not from the
3671         null-method we were given.
3672
3673 2004-02-01  Duncan Mak  <duncan@ximian.com>
3674
3675         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3676         parsing for cmd, fixes bug #53694.
3677
3678 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3679
3680         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3681         in the member name duplication tests. Property and operator name duplication
3682         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3683
3684 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3685
3686         * interface.cs (PopulateMethod): Fixed crash when interface method
3687         returns not existing type (error test cs0246-3.cs).
3688
3689 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3690
3691         * cs-parser.jay (interface_accessors): Re-write actions to also
3692         store attributes attached to get and set methods. Fix spelling
3693         while at it.
3694
3695         (inteface_property_declaration): Modify accordingly.
3696
3697         (InterfaceAccessorInfo): New helper class to store information to pass
3698         around between rules that use interface_accessors.
3699
3700         * interface.cs (Emit): Apply attributes on the get and set
3701         accessors of properties and indexers too.
3702
3703         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3704         right MethodBuilder when applying attributes to the get and set accessors.
3705
3706 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3707
3708         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3709
3710 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3711
3712         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3713
3714 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3715
3716         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3717         changes that treat `yield' specially when present before `break'
3718         or `return' tokens.
3719
3720         * cs-tokenizer.cs: yield is no longer a keyword.
3721
3722 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3723
3724         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3725         setting for default constructors.
3726         For default constructors are almost every time set wrong Modifier. The
3727         generated IL code has been alright. But inside mcs this values was
3728         wrong and this was reason why several of my CLS Compliance tests
3729         failed.
3730
3731 2004-02-27  Martin Baulig  <martin@ximian.com>
3732
3733         * generics.cs (ConstructedType.ResolveType): Make the nested type
3734         stuff actually work.
3735
3736 2004-02-25  Martin Baulig  <martin@ximian.com>
3737
3738         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
3739         property; returns the type parameters just from the current type,
3740         ie. with the ones from outer classes.
3741         (DeclSpace.LookupGeneric): First search in the current class, then
3742         in outer classes.
3743         (DeclSpace.initialize_type_params): When hiding a type parameter
3744         from an outer class, put it into the `type_param_list' anyways.
3745
3746         * expression.cs (MemberAccess.expr): Made this field protected.
3747
3748         * class.cs (TypeContainer.Define): The `CurrentType' just contains
3749         the type parameters from the current class.
3750
3751         * generic.cs (ConstructedType.ResolveType): Support nested generic
3752         types by taking the type parameters which we inherit from outer
3753         classes into account.
3754         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
3755         support for nested generic types.
3756
3757 2004-02-23  Martin Baulig  <martin@ximian.com>
3758
3759         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
3760         field and check whether we're nested inside a generic type.
3761         (DeclSpace.ResolveType): If we're resolving to a generic type
3762         definition, create a ConstructedType and return its resolved type.
3763         (DeclSpace.initialize_type_params): New private method;
3764         initializes the `type_param_list' field from the type parameters
3765         from this and all enclosing classes.
3766         (DeclSpace.TypeParameters): Call initialize_type_params() unless
3767         we're already initialized.
3768
3769 2004-02-23  Martin Baulig  <martin@ximian.com>
3770
3771         * class.cs (Method.Define): Create the generic method before
3772         calling DoDefine().
3773         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
3774         the TypeContainer one); we use this for generic methods.
3775
3776         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
3777         parent's TypeBuilder.
3778
3779 2004-02-18  Martin Baulig  <martin@ximian.com>
3780
3781         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
3782         to check for equality.
3783
3784 2004-02-05  Martin Baulig  <martin@ximian.com>
3785
3786         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
3787         `ec.TypeContainer.CurrentType', use it instead of
3788         `ec.ContainerType' to check whether we're in the type's ctor.
3789
3790 2004-01-29  Martin Baulig  <martin@ximian.com>
3791
3792         * expression.cs (Invocation.DoResolve): If we're a
3793         `ConstructedType', then we're actually a generic method, so
3794         rewrite the expr as a GenericMemberAccess.
3795
3796         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
3797         here; manually parse it into a string.
3798
3799 2004-01-28  Martin Baulig  <martin@ximian.com>
3800
3801         * typemanager.cs (TypeManager.IsEqual): New static method.
3802         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
3803         check for equality instead of using `=='.
3804
3805 2004-01-26  Martin Baulig  <martin@ximian.com>
3806
3807         * decl.cs (DeclSpace.CurrentType): New public field.
3808
3809         * expression.cs (This.ResolveBase): If we have an
3810         `ec.TypeContainer.CurrentType', use it instead of
3811         `ec.ContainerType'.
3812
3813         * class.cs (TypeContainer.DefineType): If we're a generic type,
3814         create the `CurrentType' (unresolved).
3815         (TypeContainer.GenericType): New private field.
3816         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
3817         it and store it in `GenericType' before creating the MemberCache.
3818         (TypeContainer.GetMembers): If we have a `GenericType', call
3819         TypeManager.FindMembers() on it.
3820
3821         * interface.cs (Interface.GenericType): New private field.
3822         (Interface.DefineType): If we're a generic type, create the
3823         `CurrentType' (unresolved).
3824         (Interface.DefineMembers): If we have a `CurrentType', resolve it
3825         and store it in `GenericType' before creating the MemberCache.
3826         (Interface.GetMembers): If we have a `GenericType', call
3827         TypeManager.FindMembers() on it.
3828
3829 2004-01-22  Martin Baulig  <martin@ximian.com>
3830
3831         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3832         not a QualifiedIdentifier.  This is what `type_name_expression'
3833         was previously doing.
3834         (type_name_expression): Removed; the code is now in
3835         `namespace_or_type_name'.
3836         (qualified_identifier): Removed, use `namespace_or_type_name'
3837         instead.
3838         (QualifiedIdentifier): Removed this class.      
3839
3840 2004-01-22  Martin Baulig  <martin@ximian.com>
3841
3842         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3843         not a string as alias name.
3844
3845 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3846
3847         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3848         #52730 bug, and instead compute correctly the need to use a
3849         temporary variable when requesting an address based on the
3850         static/instace modified of the field and the constructor.
3851  
3852 2004-01-21  Martin Baulig  <martin@ximian.com>
3853
3854         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3855         class and namespace before looking up aliases.  Fixes #52517.
3856
3857 2004-01-21  Martin Baulig  <martin@ximian.com>
3858
3859         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3860         assinged in a 'try'; fixes exception4.cs.
3861
3862 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3863         * class.cs : Implemented parameter-less constructor for TypeContainer
3864
3865         * decl.cs: Attributes are now stored here. New property OptAttributes
3866
3867         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3868
3869         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3870
3871 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3872
3873         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3874           (CSharpSignature): New method for indexer and property signature.
3875
3876 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3877
3878         * pending.cs (IsVirtualFilter): Faster implementation.
3879
3880 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3881
3882         * typemanager.cs: Avoid inclusion of same assembly more than once.
3883
3884 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3885
3886         * cs-parser.jay: Fixed problem where the last assembly attribute
3887           has been applied also to following declaration (class, struct, etc.)
3888           
3889 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3890
3891         * class.cs: Added error CS0538, CS0539 reporting.
3892         Fixed crash on Microsoft runtime when field type is void.
3893
3894         * cs-parser.jay: Added error CS0537 reporting.
3895
3896         * pending.cs: Added error CS0535 reporting.
3897         Improved error report for errors CS0536, CS0534.
3898
3899 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3900
3901         Merge a few bits from the Anonymous Method MCS tree.
3902
3903         * statement.cs (ToplevelBlock): New class for toplevel methods,
3904         will hold anonymous methods, lifted variables.
3905
3906         * cs-parser.jay: Create toplevel blocks for delegates and for
3907         regular blocks of code. 
3908
3909 2004-01-20  Martin Baulig  <martin@ximian.com>
3910
3911         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3912         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3913         and `NeedExplicitReturn'; added `IsLastStatement'.
3914         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3915         have a `ReturnLabel' or we're not unreachable.
3916
3917         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3918         child's reachability; don't just override ours with it.  Fixes
3919         #58058 (lluis's example).
3920         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3921         InFinally(), InLoop(), InSwitch() and
3922         BreakCrossesTryCatchBoundary() methods.
3923
3924         * statement.cs (Return): Do all error checking in Resolve().
3925         Unless we are the last statement in a top-level block, always
3926         create a return label and jump to it.
3927         (Break, Continue): Do all error checking in Resolve(); also make
3928         sure we aren't leaving a `finally'.
3929         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3930         statement in a top-level block.
3931         (Block.Flags): Added `IsDestructor'.
3932         (Block.IsDestructor): New public property.
3933
3934 2004-01-20  Martin Baulig  <martin@ximian.com>
3935
3936         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3937
3938 2004-01-20  Martin Baulig  <martin@ximian.com>
3939
3940         * statement.cs (Statement.ResolveUnreachable): New public method.
3941         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3942         (Block.Resolve): Resolve unreachable statements.
3943
3944 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3945
3946         * expression.cs: We need to fix the case where we do
3947         not have a temp variable here.
3948
3949         * assign.cs: Only expression compound assignments need
3950         temporary variables.
3951
3952 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3953
3954         * flowanalysis.cs: Reduce memory allocation in a few ways:
3955           - A block with no variables should not allocate a bit
3956             vector for itself.
3957           - A method with no out parameters does not need any tracking
3958             for assignment of the parameters, so we need not allocate
3959             any data for it.
3960           - The arrays:
3961                 public readonly Type[] VariableTypes;
3962                 public readonly string[] VariableNames;
3963             Are redundant. The data is already stored in the variable
3964             map, so we need not allocate another array for it.
3965           - We need to add alot of checks for if (params | locals) == null
3966             due to the first two changes.
3967
3968 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3969
3970         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3971         implement IMemoryLocation, we store a copy on a local variable and
3972         take the address of it.  Patch from Benjamin Jemlich
3973
3974         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3975         to use a special "type_name_expression" rule which reduces the
3976         number of "QualifiedIdentifier" classes created, and instead
3977         directly creates MemberAccess expressions.
3978
3979 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3980
3981         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3982         that fixes #52853.  Null literal assignment to ValueType
3983
3984         * class.cs (MethodData.Emit): Instead of checking the name of the
3985         method to determine if its a destructor, create a new derived
3986         class from Method called Destructor, and test for that.  
3987
3988         * cs-parser.jay: Create a Destructor object instead of a Method.  
3989
3990         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3991
3992         Fixes: 52933
3993
3994 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3995
3996         * expression.cs (Binary.ResolveOperator): Perform an implicit
3997         conversion from MethodGroups to their delegate types on the
3998         Addition operation.
3999
4000         * delegate.cs: Introduce a new class DelegateCreation that is the
4001         base class for `NewDelegate' and `ImplicitDelegateCreation',
4002         factor some code in here.
4003
4004         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4005         conversion from MethodGroups to compatible delegate types. 
4006
4007         * ecore.cs (Expression.Resolve): Do not flag error 654
4008         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4009         we allow conversions from MethodGroups to delegate types now.
4010
4011         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4012         assignments in v2 either.
4013
4014 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4015
4016         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4017         static read-only fields in ctors.
4018
4019         Applied patch from Benjamin Jemlich 
4020
4021         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4022
4023 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4024
4025         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4026         here to return true, as they can be used like this:
4027
4028                 (XXX) int.MEMBER ()
4029
4030         Fixed 49836 and all the other dups
4031
4032 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4033
4034         * driver.cs: Implement /win32res and /win32icon.
4035
4036 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4037
4038         * cs-parser.jay: Add a rule to improve error handling for the
4039         common mistake of placing modifiers after the type.
4040
4041 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4042
4043         * cs-parser.jay (interface_event_declaration): Catch
4044         initialization of events on interfaces, and report cs0068
4045
4046         * cs-parser.jay (interface_event_declaration): Catch
4047         initialization of events. 
4048
4049         * ecore.cs: Better report missing constructors.
4050
4051         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4052         the error reporting done in the wrong place.  Fix.
4053
4054         * expression.cs (Binary.ResolveOperator): Catch the 
4055         operator + (E x, E y) error earlier, and later allow for implicit
4056         conversions in operator +/- (E e, U x) from U to the underlying
4057         type of E.
4058
4059         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4060         52596, if the container class is abstract, the default constructor
4061         is protected otherwise its public (before, we were always public).
4062
4063         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4064         fixed statement.
4065
4066         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4067         Jemlich that fixes bug #52597, MCS was generating invalid code for
4068         idisposable structs.   Thanks to Ben for following up with this
4069         bug as well.
4070
4071 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4072
4073         * driver.cs: Allow assemblies without code to be generated, fixes
4074         52230.
4075
4076 2004-01-07  Nick Drochak <ndrochak@gol.com>
4077
4078         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4079
4080 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4081
4082         * cs-parser.jay: Add rules to improve error reporting if fields or
4083         methods are declared at the namespace level (error 116)
4084
4085         * Add rules to catch event add/remove
4086
4087 2004-01-04  David Sheldon <dave-mono@earth.li>
4088
4089   * expression.cs: Added matching ")" to error message for 
4090   CS0077
4091
4092 2004-01-03 Todd Berman <tberman@gentoo.org>
4093
4094         * ecore.cs, attribute.cs:
4095         Applying fix from #52429.
4096
4097 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4098
4099         * ecore.cs, expression.cs, statement.cs:
4100         Total rewrite of how we handle branching. We
4101         now handle complex boolean expressions with fewer
4102         jumps. As well if (x == 0) no longer emits a ceq.
4103
4104         if (x is Foo) is much faster now, because we generate
4105         better code.
4106
4107         Overall, we get a pretty big improvement on our benchmark
4108         tests. The code we generate is smaller and more readable.
4109
4110         I did a full two-stage bootstrap. The patch was reviewed
4111         by Martin and Miguel.
4112
4113 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4114
4115         * cs-parser.jay: Make primary_expression not take a QI.
4116         we dont need this because the member_access rule covers
4117         us here. So we replace the rule with just IDENTIFIER.
4118
4119         This has two good effects. First, we remove a s/r conflict.
4120         Second, we allocate many fewer QualifiedIdentifier objects.
4121
4122 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4123
4124         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4125         set the correct information via SRE. This prevents
4126         hanging on the MS runtime. Fixes #29374.
4127
4128 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4129
4130         * convert.cs: correctly handle conversions to value types
4131         from Enum and ValueType as unboxing conversions.
4132
4133         Fixes bug #52569. Patch by Benjamin Jemlich.
4134
4135 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4136
4137         * expression.cs (BetterConversion): Prefer int -> uint
4138         over int -> ulong (csc's behaviour). This fixed bug #52046.
4139
4140 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4141
4142         * decl.cs (MemberCache.FindMembers): now returns a
4143         MemberInfo [].
4144
4145         * typemanager.cs: In general, go with with ^^.
4146         (CopyNewMethods): take an IList.
4147         (RealMemberLookup): Only allocate an arraylist
4148         if we copy from two sets of methods.
4149
4150         This change basically does two things:
4151         1) Fewer array lists allocated due to CopyNewMethods.
4152         2) the explicit cast in MemberList costed ALOT.
4153
4154 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4155
4156         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4157         a hashtable to avoid needless string allocations when an identifier is
4158         used more than once (the common case).
4159
4160 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4161
4162         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4163         is broken, it will not return anything. So, we
4164         have to use the information we have in mcs to
4165         do the task.
4166
4167         * typemanager.cs: Add a cache for GetInterfaces,
4168         since this will now be used more often (due to ^^)
4169
4170         (GetExplicitInterfaces) New method that gets the
4171         declared, not effective, interfaces on a type
4172         builder (eg, if you have interface IFoo, interface
4173         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4174         { IBar }.
4175
4176         This patch makes MCS able to bootstrap itself on
4177         Windows again.
4178
4179 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4180
4181         * expression.cs: Remove the Nop's that Miguel put
4182         in by mistake.
4183
4184 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4185
4186         * report.cs, codegen.cs: Give the real stack trace to
4187         the error when an exception is thrown.
4188
4189 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4190
4191         * decl.cs: only allocate hashtables for ifaces if 
4192         it is an iface!
4193
4194 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4195
4196         * expression.cs: fix the error from cs0121-2.cs
4197         (a parent interface has two child interfaces that
4198         have a function with the same name and 0 params
4199         and the function is called through the parent).
4200
4201 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4202
4203         * class.cs, rootcontext.cs, typmanager.cs: do not
4204         leak pointers.
4205
4206 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4207
4208         * codegen.cs: remove stack for the ec flow branching.
4209         It is already a linked list, so no need.
4210
4211 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4212
4213         * Makefile: Allow custom profiler here.
4214
4215 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4216
4217         * typemanager.cs (LookupType):
4218           - Use a static char [], because split takes
4219             a param array for args, so it was allocating
4220             every time.
4221           - Do not store true in a hashtable, it boxes.
4222
4223 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4224
4225         * flowanalysis.cs: bytify common enums.
4226
4227 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4228
4229         * modifiers.cs: Add a new set of flags for the
4230         flags allowed on explicit interface impls.
4231         * cs-parser.jay: catch the use of modifiers in
4232         interfaces correctly.
4233         * class.cs: catch private void IFoo.Blah ().
4234
4235         All related to bug #50572.
4236
4237 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4238
4239         * decl.cs: Rewrite the consistant accessability checking.
4240         Accessability is not linear, it must be implemented in
4241         a tableish way. Fixes #49704.
4242
4243 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4244
4245         * expression.cs: Handle negation in a checked context.
4246         We must use subtraction from zero. Fixes #38674.
4247
4248 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4249
4250         * class.cs: Ignore static void main in DLLs.
4251         * rootcontext.cs: Handle the target type here,
4252         since we are have to access it from class.cs
4253         * driver.cs: account for the above.
4254
4255 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4256
4257         * report.cs: Give line numbers and files if available.
4258
4259 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4260
4261         * driver.cs: Implement /addmodule.
4262
4263         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4264         ModuleBuilders.
4265
4266 2003-12-20  Martin Baulig  <martin@ximian.com>
4267
4268         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4269         (FieldBase.IsAssigned): Removed this field.
4270         (FieldBase.SetAssigned): New public method.
4271         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4272
4273 2003-12-20  Martin Baulig  <martin@ximian.com>
4274
4275         * expression.cs (LocalVariableReference.DoResolve): Don't set
4276         `vi.Used' if we're called from DoResolveLValue().
4277
4278         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4279         returns the usage vector it just merged into the current one -
4280         pass this one to UsageWarning().
4281         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4282         of the `EmitContext', don't call this recursively on our children.
4283
4284 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4285
4286         * driver.cs: Implement /target:module.
4287
4288 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4289
4290         * support.cs (CharArrayHashtable): New helper class.
4291
4292         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4293         char arrays, not strings, so we can avoid creating a string in
4294         consume_identifier if the identifier is a keyword.
4295
4296 2003-12-16  Martin Baulig  <martin@ximian.com>
4297
4298         * statement.cs (LocalInfo.Assigned): Removed this property.
4299         (LocalInfo.Flags): Removed `Assigned'.
4300         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4301         and uses flow analysis.
4302         (Block.UsageWarning): Made this method private.
4303         (Block.Resolve): Call UsageWarning() if appropriate.
4304
4305         * expression.cs (LocalVariableReference.DoResolve): Always set
4306         LocalInfo.Used here.
4307
4308 2003-12-13  Martin Baulig  <martin@ximian.com>
4309
4310         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4311         any value here; we're now using flow analysis to figure out
4312         whether a statement/block returns a value.
4313
4314 2003-12-13  Martin Baulig  <martin@ximian.com>
4315
4316         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4317         working again.
4318         (FlowBranching.MergeFinally): Don't call
4319         `branching.CheckOutParameters()' here, this is called in
4320         MergeTopBlock().
4321         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4322         when adding the `finally' vector.       
4323
4324 2003-12-13  Martin Baulig  <martin@ximian.com>
4325
4326         * flowanalysis.cs
4327         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4328         actually work and also fix #48962.
4329
4330 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4331
4332         * decl.cs: Do not check System.Object for nested types,
4333         since we know it does not have any. Big bang for buck:
4334
4335         BEFORE:
4336            Run 1:   8.35 seconds
4337            Run 2:   8.32 seconds
4338            corlib:  17.99 seconds
4339         AFTER:
4340            Run 1:   8.17 seconds
4341            Run 2:   8.17 seconds
4342            corlib:  17.39 seconds
4343
4344 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4345
4346         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4347         time we are returning 0 members, so we save alot here.
4348
4349 2003-12-11  Martin Baulig  <martin@ximian.com>
4350
4351         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4352         `MergeChild()', also just take the `FlowBranching' as argument;
4353         call Merge() on it and return the result.
4354         (FlowBranching.Merge): We don't need to do anything if we just
4355         have one sibling.
4356
4357 2003-12-11  Martin Baulig  <martin@ximian.com>
4358
4359         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4360         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4361         Maurer for this idea.
4362
4363 2003-12-11  Martin Baulig  <martin@ximian.com>
4364
4365         * flowanalysis.cs (MergeResult): This class is now gone; we now
4366         use the `UsageVector' for this.  The reason for this is that if a
4367         branching just has one sibling, we don't need to "merge" them at
4368         all - that's the next step to do.
4369         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4370         `MergeResult'.
4371
4372 2003-12-11  Martin Baulig  <martin@ximian.com>
4373
4374         Reworked flow analyis and made it more precise and bug-free.  The
4375         most important change is that we're now using a special `Reachability'
4376         class instead of having "magic" meanings of `FlowReturns'.  I'll
4377         do some more cleanups and optimizations and also add some more
4378         documentation this week.
4379
4380         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4381         largely reworked this class.
4382         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4383         the new `Reachability' class instead of having "magic" values here.
4384         (FlowBranching): We're now using an instance of `Reachability'
4385         instead of having separate `Returns', `Breaks' etc. fields.
4386
4387         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4388         based on flow analysis; ignore the return value of block.Emit ().
4389
4390 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4391
4392         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4393         if they are private.
4394
4395 2003-12-09  Martin Baulig  <martin@ximian.com>
4396
4397         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4398         call them directly on the UsageVector.
4399
4400 2003-12-09  Martin Baulig  <martin@ximian.com>
4401
4402         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4403         Changed return type from `FlowReturns' to `Reachability'.
4404
4405 2003-12-09  Martin Baulig  <martin@ximian.com>
4406
4407         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4408         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4409         `Reachable' fields with a single `Reachability' one.
4410
4411 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4412
4413         * class.cs (FindMembers): Remove foreach's.
4414
4415         Bootstrap times:
4416
4417         BEFORE
4418                 Run 1:   8.74 seconds
4419                 Run 2:   8.71 seconds
4420
4421         AFTER
4422                 Run 1:   8.64 seconds
4423                 Run 2:   8.58 seconds
4424
4425
4426 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4427
4428         * cs-parser.jay:
4429         * gen-treedump.cs:
4430         * statement.cs:
4431         This patch does a few things:
4432                 1. EmptyStatement is now a singleton, so it is never reallocated.
4433                 2. All blah is EmptyStatement constructs have been changed to
4434                    blah == EmptyStatement.Value, which is much faster and valid
4435                    now that EmptyStatement is a singleton.
4436                 3. When resolving a block, rather than allocating a new array for
4437                    the non-empty statements, empty statements are replaced with
4438                    EmptyStatement.Value
4439                 4. Some recursive functions have been made non-recursive.
4440         Mainly the performance impact is from (3), however (1) and (2) are needed for
4441         this to work. (4) does not make a big difference in normal situations, however
4442         it makes the profile look saner.
4443
4444         Bootstrap times:
4445
4446         BEFORE
4447         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4448         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4449         Total memory allocated: 56397 KB
4450
4451         AFTER
4452         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4453         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4454         Total memory allocated: 55666 KB
4455
4456 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4457
4458         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4459         than the hashtable in a hashtable version
4460
4461         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4462         we always end up concating a string. This results in a huge perf
4463         loss, because many strings have to be tracked by the GC. In this
4464         patch, we first use a hashtable that works with two keys, so that
4465         the strings do not need to be concat'ed.
4466
4467         Bootstrap times:
4468         BEFORE
4469                 Run 1:   8.74 seconds
4470                 Run 2:   8.71 seconds
4471
4472         AFTER
4473                 Run 1:   8.65 seconds
4474                 Run 2:   8.56 seconds
4475
4476 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4477
4478         * Makefile: Add a new target `do-time' that does a quick and simple
4479         profile, leaving easy to parse output.
4480
4481 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4482
4483         * codegen.cs (Init): Create the dynamic assembly with 
4484         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4485
4486 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4487
4488         * support.cs: Make the PtrHashtable use only one
4489         instance of its comparer.
4490
4491 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4492
4493         * typemanager.cs: Fix lookup of GetNamespaces.
4494
4495 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4496
4497         * expression.cs: Removed redundant line.
4498
4499         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4500         ArrayLists, use for loops with bounds.  
4501
4502         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4503         arraylist.
4504
4505         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4506         arraylists, use for loop with bounds.
4507
4508         The above three changes give us a 0.071 second performance
4509         improvement out of 3.294 seconds down to 3.223.  On my machine
4510         the above changes reduced the memory usage by 1,387 KB during
4511         compiler bootstrap.
4512
4513         * cs-parser.jay (QualifiedIdentifier): New class used to represent
4514         QualifiedIdentifiers.  Before we created a new string through
4515         concatenation, and mostly later on, the result would be
4516         manipulated by DecomposeQI through string manipulation.
4517
4518         This reduced the compiler memory usage for bootstrapping from
4519         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
4520         compile times in 0.05 seconds.
4521
4522 2003-11-28  Dick Porter  <dick@ximian.com>
4523
4524         * support.cs: Do string compares with the Invariant culture.
4525
4526         * rootcontext.cs: 
4527         * gen-treedump.cs: 
4528         * expression.cs: 
4529         * driver.cs: 
4530         * decl.cs: 
4531         * codegen.cs: 
4532         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4533         the comparison is done with the Invariant culture.
4534
4535 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4536
4537         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4538         GetEnumerator method.
4539
4540         (ProbeCollectionType): Iterate starting at the most specific type
4541         upwards looking for a GetEnumerator
4542
4543         * expression.cs: Shift count can be up to 31 for int/uint and 63
4544         for long/ulong.
4545
4546 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4547
4548         * statement.cs (Block.LookupLabel): Also look for the label on the
4549         children blocks.  Use a hash table to keep track of visited
4550         nodes. 
4551
4552         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4553         we actually did transform the other operand, otherwise fall back
4554         to the common codepath that casts to long.
4555
4556         * cs-tokenizer.cs: Use the same code pattern as the int case.
4557         Maybe I should do the parsing myself, and avoid depending on the
4558         Parse routines to get this done.
4559
4560 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4561
4562         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4563         which fixes bug 51347.  This time test it.
4564
4565         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4566         attributes for example can not tell the difference between these.
4567         The difference was only a syntax feature of the language. 
4568
4569         * attribute.cs: Apply attributes to delegates.
4570
4571         * delegate.cs: Call the apply attributes method.
4572
4573 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4574
4575         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4576         comparing 0 vs Byte.MinValue, not the value
4577
4578         (ImplicitConversionRequired): When reporting a conversion error,
4579         use error 31 to print out the constant error instead of the
4580         simpler 29.
4581
4582         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4583         which fixes bug 51347.
4584
4585 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4586
4587         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4588         which fixes the -warnaserror command line option.
4589
4590 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4591
4592         * cfold.cs (DoNumericPromotions): During constant folding of
4593         additions on UIntConstant, special case intconstants with
4594         IntConstants like we do on the expression binary operator. 
4595
4596 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4597
4598         * convert.cs (ImplicitReferenceConversion): We were missing a case
4599         (System.Enum are not value types or class types, so we need to
4600         classify them separatedly).
4601
4602         * driver.cs: We do not support error 2007.
4603
4604 2003-11-12 Jackson Harper <jackson@ximian.com>
4605
4606         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4607         system directory. Also use the full file name so users can
4608         libraries names mscorlib-o-tron.dll in a non system dir.
4609         
4610 2004-01-04  David Sheldon <dave-mono@earth.li>
4611
4612         * expression.cs: Added matching ")" to error message for CS0077.
4613
4614 2003-12-19  Martin Baulig  <martin@ximian.com>
4615
4616         * typemanager.cs (TypeManager.IsEqualGenericType): New public
4617         static method; see documentation in the method.
4618         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
4619
4620         * convert.cs (Convert.ImplicitReferenceConversion,
4621         Convert.ImplicitReferenceConversionExists): Add support for
4622         generic type declarations; see gen-36.cs.
4623
4624 2003-12-19  Martin Baulig  <martin@ximian.com>
4625
4626         * pending.cs (Pending.InterfaceMethod): Use
4627         `Type.IsAssignableFrom()' instead of `=='.
4628
4629 2003-12-18  Martin Baulig  <martin@ximian.com>
4630
4631         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
4632         byref types first.
4633
4634         * convert.cs (Convert.ImplicitStandardConversionExists): Use
4635         `expr_type.Equals (target_type)' instead of `=='.
4636
4637 2003-12-08  Martin Baulig  <martin@ximian.com>
4638
4639         * generics.cs (Constraints.Types): Removed.
4640         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
4641         to Type's.
4642         (Constraints.ResolveTypes): New public method; resolves the
4643         TypeExpr's to Type's.
4644         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
4645         longer takes the constraints.
4646         (TypeParameter.DefineMethod): Likewise.
4647         (TypeParameter.DefineType): New public method.  Calls
4648         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
4649         the constraints.
4650
4651 2003-12-08  Martin Baulig  <martin@ximian.com>
4652
4653         * convert.cs (Convert.ImplicitConversionStandard): Use
4654         `expr_type.Equals (target_type)' instead of `=='.
4655
4656 2003-12-08  Martin Baulig  <martin@ximian.com>
4657
4658         * typemanager.cs (TypeManager.GetReferenceType): Call
4659         `Type.MakeByRefType ()'.
4660
4661 2003-12-08  Martin Baulig  <martin@ximian.com>
4662
4663         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
4664         just has some special meaning in some situations.  For instance,
4665         it is allowed to use `where' as the name of a variable etc.
4666
4667 2003-12-04  Martin Baulig  <martin@ximian.com>
4668
4669         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
4670         `Type.MakeArrayType()' for array types.
4671
4672 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
4673
4674         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
4675         debugging message.
4676
4677         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
4678         corlib to compile.
4679
4680 2003-11-16  Martin Baulig  <martin@ximian.com>
4681
4682         * codegen.cs (EmitContext.IsGeneric): Removed.
4683
4684         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
4685         ResolveGeneric() on the DeclSpace.
4686
4687 2003-11-16  Martin Baulig  <martin@ximian.com>
4688
4689         * generic.cs (TypeArguments.Resolve):
4690         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
4691         `ResolveType()' on it to get the Type.
4692
4693 2003-11-15  Martin Baulig  <martin@ximian.com>
4694
4695         * generic.cs (ConstructedType.GetInterfaces): Override this.
4696
4697 2003-11-14  Martin Baulig  <martin@ximian.com>
4698
4699         * interface.cs (Interface.DefineType): Define all type parameters
4700         before adding the interfaces we inherit.
4701
4702 2003-11-11  Martin Baulig  <martin@ximian.com>
4703
4704         * generic.cs (ConstructedType.ResolveType): Always call
4705         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
4706
4707 2003-11-10  Martin Baulig  <martin@ximian.com>
4708
4709         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4710         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4711         calling `ResolveType()' on them, directly assign their `Type'.
4712
4713 2003-11-08  Martin Baulig  <martin@ximian.com>
4714
4715         * generic.cs (ConstructedType): Override `IsClass' etc.
4716
4717 2003-11-08  Martin Baulig  <martin@ximian.com>
4718
4719         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4720         return value and the `out parent' parameter.
4721         (TypeContainer.DefineType): Moved the CS0644 check into
4722         GetClassBases().  Don't pass the interface types to the
4723         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4724         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4725
4726         * ecore.cs (TypeExpr.IsAttribute): New property.
4727         (TypeExpr.GetInterfaces): New method.
4728
4729         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4730         TypeExpr instead of a Type.
4731         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4732         (Interface.DefineType): Don't pass the interface types to the
4733         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4734         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4735
4736         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4737         instead of a `Type[]'.
4738         (TypeManager.RegisterBuilder): Likewise.
4739         (TypeManager.AddUserInterface): Likewise.
4740         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4741         `Type[]' and also return a `TypeExpr[]'.
4742         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4743
4744 2003-11-08  Martin Baulig  <martin@ximian.com>
4745
4746         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4747         Expression.     
4748
4749 2003-11-08  Martin Baulig  <martin@ximian.com>
4750
4751         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4752         TypeManager.ResolveExpressionTypes().
4753
4754         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4755         instead of an Expression.
4756         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4757         (TypeExpression): New public class; formerly known as `TypeExpr'.
4758
4759         * expression.cs (ComposedCast): Derive from TypeExpr.
4760
4761         * typemanager.cs (TypeManager.system_*_expr): These are now
4762         TypExpr's instead of Expression's.
4763         (TypeManager.ResolveExpressionTypes): New public static function;
4764         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4765         of them.        
4766
4767 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4768
4769         * expression.cs (New.DoResolve): Do not dereference value that
4770         might be a null return.
4771
4772         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4773         sure that the constant value has the right type.  Fixes an
4774         unreported bug, similar to 50425.
4775
4776         * const.cs (Const.LookupConstantValue): Call
4777         ImplicitStandardConversionExists before doing a conversion to
4778         avoid havng the TypeManager.ChangeType do conversions.
4779
4780         Reduced the number of casts used
4781
4782         (Const.ChangeType): New routine to enable reuse of the constant
4783         type changing code from statement.
4784
4785         * typemanager.cs (ChangeType): Move common initialization to
4786         static global variables.
4787
4788         Fixes #50425.
4789
4790         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4791         every value type to go through, even if it was void.  Fix that. 
4792
4793         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4794         character of the define, and the is_identifier_part_character for
4795         the rest of the string.
4796
4797 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4798
4799         * expression.cs (UnaryMutator.EmitCode): When I updated
4800         LocalVariableReference.DoResolve, I overdid it, and dropped an
4801         optimization done on local variable references.
4802
4803 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4804
4805         * ecore.cs: Convert the return from Ldlen into an int.
4806
4807 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4808
4809         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4810         the accessibility, this is a special case for toplevel non-public
4811         classes (internal for instance).
4812
4813 2003-10-20  Nick Drochak <ndrochak@gol.com>
4814
4815         * ecore.cs: Fix typo and build.  Needed another right paren.
4816
4817 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4818
4819         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4820         `internal' case regular and protected, but not allowing protected
4821         to be evaluated later.  Bug 49840
4822
4823 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4824
4825         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4826         to kb.Nlast, and not the kb.nFirst to isolate the switch
4827         statement.
4828
4829         Extract the underlying type, so enumerations of long/ulong are
4830         treated like long/ulong.
4831
4832 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4833
4834         * expression.cs (New): Overload the meaning of RequestedType to
4835         track the possible creation of the NewDelegate type, since
4836         DoResolve is invoked more than once for new constructors on field
4837         initialization.
4838
4839         See bugs: #48800 and #37014
4840
4841         * cs-parser.jay (declare_local_constants): Take an arraylist
4842         instead of a single constant.
4843
4844         (local_constant_declaration): It should take a
4845         constant_declarators, not a constant_declarator.  Fixes 49487
4846
4847         * convert.cs: Fix error report.
4848
4849 2003-10-13 Jackson Harper <jackson@ximian.com>
4850
4851         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4852         bug #49611
4853         
4854 2003-11-03  Martin Baulig  <martin@ximian.com>
4855
4856         * expression.cs (ArrayAccess.GetStoreOpcode): Added
4857         `out bool has_type_arg'; if set, we need to pass the type to
4858         ig.Emit().
4859         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
4860         Stelem_Any/Ldelem_Any for generic parameters.   
4861
4862 2003-11-02  Martin Baulig  <martin@ximian.com>
4863
4864         * expression.cs (Invocation.EmitCall): Use
4865         `TypeManager.IsValueType()' to check whether it's a value type.
4866         Don't set `struct_call' when calling a method on a type parameter.
4867
4868 2003-11-02  Martin Baulig  <martin@ximian.com>
4869
4870         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
4871         and removed the TypeBuilder argument.
4872
4873         * typemanager.cs (TypeManager.IsValueType): Return
4874         `t.IsGenericParameter || t.IsValueType'.
4875
4876 2003-10-25  Martin Baulig  <martin@ximian.com>
4877
4878         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
4879         call ConstructedType.Resolve() on it.
4880
4881         * generic.cs (ConstructedType.Resolve): Set `type' on success.
4882
4883 2003-10-25  Martin Baulig  <martin@ximian.com>
4884
4885         * class.cs (TypeContainer.GetClassBases): Changed
4886         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
4887         CS8214 reporting here.
4888         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
4889         instead of a `Type' for our parent.  In case of a recursive
4890         declaration (see tests/gen-23.cs for an example), our parent is a
4891         ConstructedType and it doesn't have its type set.  So, first
4892         create our own TypeBuilder, then call constructed.Resolve() to get
4893         the parent's type and finally TypeBuilder.SetParent() it.
4894
4895         * ecore.cs (TypeExpr.Name): New public virtual property.
4896
4897         * generic.cs
4898         (ConstructedType): We're now a TypeExpr and not just an Expression.
4899         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
4900         arguments here; this is done later.
4901         (ConstructedType.Resolve): New public method to resolve the type
4902         arguments and bind them.
4903
4904 2003-10-21  Martin Baulig  <martin@ximian.com>
4905
4906         * convert.cs: Use `TypeManager.IsValueType' instead of
4907         'type.IsValueType' everywhere.
4908
4909         * typemanager.cs (TypeManager.IsValueType): Return true for type
4910         parameters.  The reason for this is that we need to box a type
4911         parameter when converting it to a reference type.
4912
4913         * cs-parser.jay: Added support for default value expressions.
4914
4915         * generics.cs (DefaultValueExpression): New public class.       
4916
4917 2003-10-17  Martin Baulig  <martin@ximian.com>
4918
4919         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
4920         TypeContainer so we can also use this for Interfaces.
4921         (TypeParameter.Resolve): Likewise.
4922
4923         * interface.cs (Interface.DefineType): Added support for generic
4924         interfaces.
4925
4926         * cs-parser.jay: Added support for generic structs and interfaces.
4927
4928 2003-10-17  Martin Baulig  <martin@ximian.com>
4929
4930         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
4931         call generic methods :-)
4932
4933 2003-10-16  Martin Baulig  <martin@ximian.com>
4934
4935         * cs-parser.jay (namespace_or_type_name): Only create a
4936         GenericMemberAccess if we actually have type arguments.
4937
4938 2003-10-13  Martin Baulig  <martin@ximian.com>
4939
4940         * class.cs (Method.Define): If we're a generic method, call
4941         TypeBuilder.DefineGenericMethod () before resolving
4942         the parameters.
4943         (MethodData): Added .ctor which takes an additional MethodBuilder
4944         argument; this is used for generic methods.
4945         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
4946         we already have a MethodBuilder.
4947
4948 2003-10-10  Martin Baulig  <martin@ximian.com>
4949
4950         * class.cs (Method): Added .ctor which takes a `GenericMethod'
4951         instead of a `DeclSpace'.  This is used for generic methods.
4952
4953         * cs-parser.jay (method_header): Added support for generic
4954         methods; create a `GenericMethod' instance and pass it to the
4955         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
4956         parameters and locals.
4957
4958         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
4959         since we already have the location.  Check whether we're a generic
4960         type declaration or a generic method and create the correct type
4961         parameter.
4962
4963         * generic.cs (TypeParameter.DefineMethod): New public method.
4964         (GenericMethod): New public class; derives from DeclSpace and is
4965         used for generic methods.       
4966
4967 2003-10-09  Martin Baulig  <martin@ximian.com>
4968
4969         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4970         to the .ctor.
4971         (MethodCore.DoDefineParameters): Removed the TypeContainer
4972         argument; use the DeclSpace which was passed to the .ctor instead.
4973         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4974         TypeContainer; we only need a DeclSpace here.
4975
4976 2003-10-09  Martin Baulig  <martin@ximian.com>
4977
4978         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4979         to the .ctor.
4980         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4981         EmitContext's .ctor.    
4982
4983 2003-10-09  Martin Baulig  <martin@ximian.com>
4984
4985         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4986         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4987         AsAccessible(), moved them as well.
4988
4989         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4990
4991 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4992
4993         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4994         generation for >=, as spotted by Paolo, bug 48679.  
4995         Patch from David Waite.
4996
4997         * cs-tokenizer.cs: Add handling for #pragma.
4998
4999         * cs-parser.jay: Allow for both yield and yield return in the
5000         syntax.  The anti-cobolization of C# fight will go on!
5001
5002         * class.cs (TypeBuilder.DefineType): Catch error condition here
5003         (Parent.DefineType erroring out and returning null).
5004
5005         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5006         coping with enumerations variables, we were mistakenly processing
5007         them as a regular value type instead of built-in types.  Fixes the
5008         bug #48063
5009
5010         * typemanager.cs (IsBuiltinOrEnum): New method.
5011
5012 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5013
5014         * cs-parser.jay: Upgrade: yield now needs the return clause.
5015
5016 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5017
5018         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5019
5020 2003-09-29  Martin Baulig  <martin@ximian.com>
5021
5022         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
5023         inflated generic methods.
5024
5025         * generics.cs (ConstructedType): Distinguish between open and
5026         closed constructed types; correctly resolve the arguments.
5027
5028 2003-09-22  Martin Baulig  <martin@ximian.com>
5029
5030         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
5031         all type arguments meet their constraints.
5032
5033 2003-09-19  Martin Baulig  <martin@ximian.com>
5034
5035         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5036         `MemberCache parent' argument.  Normally, an interface doesn't
5037         have a parent type except System.Object, but we use this in gmcs
5038         for generic type parameters.
5039
5040 2003-09-18  Martin Baulig  <martin@ximian.com>
5041
5042         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5043         on `type.IsInterface'; don't check whether the type has a parent
5044         to determine whether it's an interface.
5045
5046 2003-09-17  Martin Baulig  <martin@ximian.com>
5047
5048         * generic.cs (ConstructedType.ToString): Always use `name' as the
5049         type name.
5050
5051 2003-09-15  Martin Baulig  <martin@ximian.com>
5052
5053         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
5054
5055         * generic.cs (Constraints.Resolve): New public method; this is
5056         called to resolve the constraint types and to check whether all
5057         the constraints are correct.
5058         (Constraints.Types): New public property.
5059         (TypeParameter.Resolve): New public method; resolves all the
5060         type's constraints.
5061
5062         * class.cs (TypeContainer.DefineType): Call
5063         TypeParameter.Resolve() before actually defining the type.
5064
5065 2003-09-15  Martin Baulig  <martin@ximian.com>
5066
5067         * class.cs (TypeContainer.DefineType): Added an error flag to
5068         avoid reporting duplicate CS0146's ("class definition is
5069         circular.").
5070
5071         * driver.cs (Driver.MainDriver): Abort if
5072         RootContext.ResolveTree() reported any errors.
5073
5074 2003-09-07  Martin Baulig  <martin@ximian.com>
5075
5076         * report.cs (Error, Warning): Added overloaded versions which take
5077         a `params object[] args' and call String.Format().
5078
5079 2003-09-07  Martin Baulig  <martin@ximian.com>
5080
5081         * decl.cs (DeclSpace..ctor): Don't call
5082         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5083         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5084         (DeclSpace.RecordDecl): New method.
5085
5086         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5087
5088 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5089
5090         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5091         value attributes to be applied to ParameterBuilders.
5092
5093         * class.cs (MethodCore.LabelParameters): Make static and more
5094         generic so that it can be used from other places - like interface
5095         methods, for instance.
5096
5097         * interface.cs (Interface.Emit): Call LabelParameters before
5098         emitting attributes on the InterfaceMethod.
5099
5100 2003-09-07  Martin Baulig  <martin@ximian.com>
5101
5102         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
5103         if the number of type parameters doesn't match.
5104
5105 2003-09-04  Martin Baulig  <martin@ximian.com>
5106
5107         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
5108         for arrays of generic type params (ie. `!0[]').
5109
5110 2003-09-04  Martin Baulig  <martin@ximian.com>
5111
5112         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
5113         for the moment.
5114
5115 2003-09-04  Martin Baulig  <martin@ximian.com>
5116
5117         * decl.cs (DeclSpace.LookupGeneric): New method.
5118         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
5119         moment.
5120
5121         * generic.cs (TypeParameterExpr): Take a TypeParameter as
5122         argument, not just a string.
5123         (TypeParameter.Define): New public method; this is called to
5124         actually define the generic parameter; after this, you can use the
5125         new `Type' property to get the type.
5126
5127 2003-09-04  Martin Baulig  <martin@ximian.com>
5128
5129         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
5130         is now an ArrayList; initialize the result of the `TypeParameters'
5131         property here.
5132         (DeclSpace.GetGenericData): Removed.
5133         (DeclSpace.LookupGeneric): Temporarily removed; we need to
5134         implement this in a different way.
5135         (DeclSpace.GetTypeParameters): Removed; there's now a
5136         `TypeParameters' property.
5137         (DeclSpace.TypeParameters): New public property.
5138
5139         * generic.cs (Constraints): Make this class public.
5140         (TypeParameter): New public class.
5141
5142 2003-09-04  Martin Baulig  <martin@ximian.com>
5143
5144         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
5145         generic parameters.
5146
5147         * class.cs (TypeContainer.DefineType): Call
5148         TypeBuilder.DefineGenericParameter () on all generic parameters if
5149         this is a generic type.
5150
5151 2003-08-28  Martin Baulig  <martin@ximian.com>
5152
5153         * sample-stack.il: Compile this with ilasm: "ilasm /dll
5154         sample-stack.il".
5155
5156         * sample-hello.cs: Compile this with gmcs: "gmcs
5157         /r:sample-stack.dll sample-hello.cs".
5158
5159 2003-08-28  Martin Baulig  <martin@ximian.com>
5160
5161         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
5162         the parameters to the generic type.
5163
5164 2003-08-28  Martin Baulig  <martin@ximian.com>
5165
5166         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
5167
5168 2003-08-28  Martin Baulig  <martin@ximian.com>
5169
5170         * cs-parser.jay (opt_type_argument_list): Use
5171         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
5172         (primary_expression): Replace `qualified_identifier' with `type_name'.
5173         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
5174
5175         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
5176         parser to check whether it is syntactically a type parameter list;
5177         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
5178         this case.
5179
5180 2003-08-26  Martin Baulig  <martin@ximian.com>
5181
5182         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5183         resolving aliases; fixes #47927.
5184
5185 2003-08-26  Martin Baulig  <martin@ximian.com>
5186
5187         * statement.cs (Using.DoResolve): This is internally emitting a
5188         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5189         do not always return.  Fixes #47681.
5190
5191 2003-08-26  Martin Baulig  <martin@ximian.com>
5192
5193         * decl.cs (MemberCore): Moved WarningNotHiding(),
5194         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5195         into MemberBase.
5196         (AdditionResult): Make this nested in DeclSpace.
5197         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5198         argument; call NamespaceEntry.Define() unless we're nested in a
5199         class or struct.
5200
5201         * namespace.cs (Namespace.DefineName): New public function.  This
5202         is called from DeclSpace's .ctor to add 
5203         (Namespace.Lookup): Include DeclSpaces in the lookup.
5204
5205         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5206
5207         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5208
5209 2003-08-25  Martin Baulig  <martin@ximian.com>
5210
5211         * convert.cs (Convert.ExplicitReferenceConversion): When
5212         converting from an interface type to a class, unbox if the target
5213         type is a struct type.  Fixes #47822.
5214
5215 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5216
5217         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5218         #47854.
5219
5220 2003-08-22  Martin Baulig  <martin@ximian.com>
5221
5222         * class.cs (TypeManager.DefineType): When defining a nested type,
5223         call DefineType() on our parent; fixes #47801.
5224
5225 2003-08-22  Martin Baulig  <martin@ximian.com>
5226
5227         * class.cs (MethodData.Define): While checking if a method is an
5228         interface implementation, improve the test a bit more to fix #47654.
5229
5230 2003-08-22  Martin Baulig  <martin@ximian.com>
5231
5232         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5233         correctly; fixes #47722.
5234
5235 2003-08-22  Martin Baulig  <martin@ximian.com>
5236
5237         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5238         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5239
5240         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5241
5242 2003-08-22  Martin Baulig  <martin@ximian.com>
5243
5244         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5245         can only be assigned in static constructors.  Fixes #47161.
5246
5247 2003-08-22  Martin Baulig  <martin@ximian.com>
5248
5249         Rewrote and improved the flow analysis code.
5250
5251         * flowbranching.cs (FlowBranching): Make this class abstract.
5252         (FlowBranching.CreateBranching): New static function to create a
5253         new flow branching.
5254         (FlowBranchingBlock, FlowBranchingException): New classes.
5255         (FlowBranching.UsageVector.Type): New public readonly field.
5256         (FlowBranching.UsageVector.Breaks): Removed the setter.
5257         (FlowBranching.UsageVector.Returns): Removed the setter.
5258         (FlowBranching.UsageVector): Added Break(), Return(),
5259         NeverReachable() and Throw() methods to modify the reachability.
5260         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5261         done by FlowBranching.Merge().
5262         (FlowBranching.UsageVector.MergeChild): New method; merges the
5263         merge result into the current vector.
5264         (FlowBranching.Merge): New abstract method to merge a branching.
5265
5266 2003-08-12  Martin Baulig  <martin@ximian.com>
5267
5268         * expression.cs (Indirection.CacheTemporaries): Create the
5269         LocalTemporary with the pointer type, not its element type.
5270
5271 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5272
5273         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5274         token was a keyword or not.
5275
5276         Add `error' options where an IDENTIFIER was expected;  Provide
5277         CheckToken and CheckIdentifierToken convenience error reporting
5278         functions. 
5279
5280         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5281
5282         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5283         NameSpaceEntry NameSpaceEntry.
5284
5285         (LookupInterfaceOrClass): Avoid creating a full qualified name
5286         from namespace and name: avoid doing lookups when we know the
5287         namespace is non-existant.   Use new Tree.LookupByNamespace which
5288         looks up DeclSpaces based on their namespace, name pair.
5289
5290         * driver.cs: Provide a new `parser verbose' to display the
5291         exception thrown during parsing.  This is turned off by default
5292         now, so the output of a failure from mcs is more graceful.
5293
5294         * namespace.cs: Track all the namespaces defined in a hashtable
5295         for quick lookup.
5296
5297         (IsNamespace): New method
5298
5299 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5300
5301         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5302         we know that we need to concatenate (full typename can never be
5303         null). 
5304
5305         * class.cs: ditto.
5306
5307         * statement.cs: Use a bitfield;  Do not initialize to null things
5308         which are done by the constructor by default.
5309
5310         * cs-parser.jay: bug fix, parameter was 4, not 3.
5311
5312         * expression.cs: Just use the property;
5313
5314         * statement.cs: No need for GetVariableInfo method.
5315
5316 2003-08-08  Martin Baulig  <martin@ximian.com>
5317
5318         * flowanalysis.cs (FlowReturns): This is now nested in the
5319         `FlowBranching' class.
5320         (MyBitVector): Moved this here from statement.cs.
5321         (FlowBranching.SiblingType): New enum type.
5322         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5323
5324 2003-08-07  Martin Baulig  <martin@ximian.com>
5325
5326         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5327         `FlowBranching' class and called `BranchingType'.
5328
5329 2003-08-07  Martin Baulig  <martin@ximian.com>
5330
5331         * flowanalysis.cs: Moved all the control flow analysis code into
5332         its own file.
5333
5334 2003-08-07  Martin Baulig  <martin@ximian.com>
5335
5336         * assign.cs (Assign.DoResolve): `target' must either be an
5337         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5338         #37319.
5339
5340 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5341
5342         * expression.cs (BinaryMethod): This kind of expression is created by the
5343         Binary class if it determines that the operator has to be handled
5344         by a method.
5345
5346         (BinaryDelegate): This kind of expression is created if we are
5347         dealing with a + or - operator on delegates.
5348
5349         (Binary): remove method, argumetns, and DelegateOperator: when
5350         dealing with methods, 
5351
5352         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5353
5354         * statement.cs (Block): use bitfields for the three extra booleans
5355         we had in use.   Remove unused topblock parameter.
5356
5357         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5358
5359         * assign.cs: Drop extra unneeded tests.
5360
5361 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5362
5363         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5364
5365         * statement.cs (Foreach): Use VariableStorage instead of
5366         LocalBuilders.   
5367
5368         * codegen.cs (VariableStorage): New class used by clients that
5369         require a variable stored: locals or fields for variables that
5370         need to live across yield.
5371
5372         Maybe provide a convenience api for EmitThis+EmitLoad?
5373
5374         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5375         these bad boys.
5376
5377 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5378
5379         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5380         RemapParameterLValue): New methods that are used to turn a
5381         precomputed FieldInfo into an expression like this:
5382
5383                 instance.FieldInfo
5384
5385         The idea is to use this instead of making LocalVariableReference
5386         have more than one meaning.
5387
5388         * cs-parser.jay: Add error production to BASE.
5389
5390         * ecore.cs: Deal with TypeManager.GetField returning null, which
5391         is now a valid return value.
5392
5393         (FieldExprNoAddress): New expression for Fields whose address can
5394         not be taken.
5395
5396         * expression.cs (LocalVariableReference): During the resolve
5397         phases, create new expressions if we are in a remapping context.
5398         Remove code that dealt with remapping here.
5399
5400         (ParameterReference): same.
5401
5402         (ProxyInstance): New expression, like the `This' expression, but
5403         it is born fully resolved.  We know what we are doing, so remove
5404         the errors that are targeted to user-provided uses of `this'.
5405
5406         * statement.cs (Foreach): our variable is now stored as an
5407         Expression;  During resolution, follow the protocol, dont just
5408         assume it will return this.
5409
5410 2003-08-06  Martin Baulig  <martin@ximian.com>
5411
5412         * support.cs (SeekableStreamReader.cs): New public class.
5413
5414         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5415         SeekableStreamReader instead of the normal StreamReader.
5416
5417 2003-08-04  Martin Baulig  <martin@ximian.com>
5418
5419         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5420         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5421         deambiguate casts and delegate invocations.
5422         (parenthesized_expression): Use the new tokens to ensure this is
5423         not a cast of method invocation.
5424
5425         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5426         when reading a `)' and Deambiguate_CloseParens () was previously
5427         called.
5428
5429         * expression.cs (ParenthesizedExpression): New class.  This is
5430         just used for the CS0075 test.
5431         (Binary.DoResolve): Check for CS0075.   
5432
5433 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5434
5435         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5436         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5437         reference comparison.
5438
5439         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5440         examine the ReturnType for equality - this is necessary in the
5441         cases of implicit and explicit operators whose signature also
5442         includes the return type.
5443
5444 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5445
5446         * namespace.cs: Cache the result of the namespace computation,
5447         instead of computing it every time.
5448
5449 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5450
5451         * decl.cs: Use a global arraylist that we reuse over invocations
5452         to avoid excesive memory consumption.  Reduces memory usage on an
5453         mcs compile by one meg (45 average).
5454
5455         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5456         private, work around that.
5457
5458 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5459
5460         * literal.cs (IntLiteral): Define Zero and One static literals. 
5461
5462         * cs-parser.jay (integer_literal): use static literals to reduce
5463         memory usage for the most used literals (0, 1 and -1).  211kb
5464         reduced in memory usage.
5465
5466         Replace all calls to `new ArrayList' with `new
5467         ArrayList(4)' which is a good average number for most allocations,
5468         and also requires only 16 bytes of memory for its buffer by
5469         default. 
5470
5471         This reduced MCS memory usage in seven megabytes for the RSS after
5472         bootstrapping.
5473
5474 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5475
5476         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5477         handle params methods the correct way by forming only one
5478         applicable set with params and normal methods in them. Earlier we
5479         were looking at params methods only if we found no normal methods
5480         which was not the correct thing to do.
5481
5482         (Invocation.BetterFunction): Take separate arguments indicating
5483         when candidate and the best method are params methods in their
5484         expanded form.
5485
5486         This fixes bugs #43367 and #46199.
5487
5488         * attribute.cs: Documentation updates.
5489
5490         (CheckAttribute): Rename to CheckAttributeTarget.
5491         (GetValidPlaces): Rename to GetValidTargets.
5492
5493         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5494         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5495
5496         Fixes bug #44468.
5497
5498 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
5499
5500         * codegen.cs: Compute IsGeneric correctly.
5501
5502         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
5503         resolution. 
5504
5505         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
5506         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
5507         regressions, and I was chasing more bugs than I required.
5508
5509         * interface.cs: Use expressions for base type names (like classes
5510         and structs have been doing for a while now), and resolve that.
5511         This patch should probably go into head as well.
5512
5513         This makes it one less user of FindType.
5514
5515 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5516
5517         This compiler can not self host currently.  Need to fix that.
5518         
5519         * Makefile: compile to `gmcs.exe'
5520
5521         * driver.cs: Turn on v2 by default on gmcs.
5522
5523         * generic.cs (ConstructedType): Does no longer take a container
5524         type argument;  That will be taken care of later.
5525
5526         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
5527         Use SimpleName to resolve for now, so we can continue the work on
5528         the parser, until we get Type.GetType that understands generics.
5529
5530         (ConstructedType.ToString): Implement
5531
5532         (TypeArguments.Resolve): Resolve the child expressions as types. 
5533         
5534         * cs-parser.jay: Rename interface_constraints to
5535         type_parameter_constraints
5536
5537         (namespace_or_type_name): Only use constructed types for the basic
5538         construction, we will deal with identifier<...> later.
5539
5540         (type/type_name): No longer call DecomposeQI, as
5541         namespace_or_type_name is always decoded now.
5542         
5543 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5544
5545         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5546         closely: we eliminate methods in base types when we have an
5547         applicable method in a top-level type.
5548
5549         Please see section 14.5.5.1 for an exact description of what goes
5550         on. 
5551
5552         This fixes bug #45127 and a host of other related to corlib compilation.
5553
5554         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5555         array is the method corresponding to the top-level type (this is
5556         because of the changes made to icall.c) so we change this
5557         accordingly.
5558
5559         (MethodGroupExpr.Name): This too.
5560
5561         * typemanager.cs (GetElementType): New method which does the right
5562         thing when compiling corlib. 
5563
5564         * everywhere: Make use of the above in the relevant places.
5565
5566 2003-07-22  Martin Baulig  <martin@ximian.com>
5567
5568         * cs-parser.jay (invocation_expression): Moved
5569         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5570         `cast_expression', but create a InvocationOrCast which later
5571         resolves to either an Invocation or a Cast.
5572
5573         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5574         method; call this before EmitStatement() to make sure that this
5575         expression can be used as a statement.
5576
5577         * expression.cs (InvocationOrCast): New class; resolves to either
5578         an Invocation or a Cast.
5579
5580         * statement.cs (StatementExpression): Call ResolveStatement() on
5581         the ExpressionStatement before emitting it.
5582
5583 2003-07-21  Martin Baulig  <martin@ximian.com>
5584
5585         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5586         `ref' and `out' attributes match; fixes #46220.
5587         (MemberAccess.ResolveMemberAccess): You can't reference a type
5588         through an expression; fixes #33180.
5589         (Indexers.GetIndexersForType): Don't return the indexers from
5590         interfaces the class implements; fixes #46502.
5591
5592 2003-07-21  Martin Baulig  <martin@ximian.com>
5593
5594         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5595         CS0661 checks; fixes bug #30442.
5596
5597 2003-07-21  Martin Baulig  <martin@ximian.com>
5598
5599         * decl.cs (AdditionResult): Added `Error'.
5600
5601         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5602
5603         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
5604         cs0031.cs actually work.
5605
5606  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5607  
5608         * cs-parser.jay (namespace_name): do not use
5609         namespace_or_type_name, use qualified_identifier, because
5610         namespace_or_type_name will soon return a composed expression
5611         instead of a string.
5612  
5613         (namespace_or_type_name): Instead of returning a string, now this
5614         production returns an expression.
5615  
5616         * codegen.cs (EmitContext): Setup IsGeneric property based on
5617         whether our DeclSpace is generic, our the method is generic.
5618  
5619         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
5620         the method is generic.
5621  
5622         * cs-parser.jay (type_arguments, opt_type_argument_list,
5623         type_parameters, type_parameter_list, opt_type_parameter_list,
5624         type_parameter,, opt_type_parameter_constraints_clauses,
5625         type_parameter_constraints_clauses,
5626         type_parameter_constraint_clause, type_parameter_constraint,
5627         interface_constraints): Add new production
5628  
5629         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
5630         DeclSpace is generic or not.
5631  
5632         (DeclSpace.SetParameterInfo): New routine, used to set the
5633         parameter info for a type.
5634  
5635         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
5636         returns a GenericTypeExpr
5637  
5638         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
5639         generic, lookup the generic argument.
5640  
5641         * attribute.cs: Do not allow TypeParameterExpressions in
5642         Attributes.
5643  
5644         * class.cs: Do not allow the Main method to be defined in a
5645         Generic container.
5646  
5647         * expression.cs (SizeOf): Do not allow generic types to be used as
5648         arguments to sizeof.
5649  
5650         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
5651         it: whether a type is generic or not.  Only works for types we are
5652         currently building for now.
5653         
5654 2003-07-20  Martin Baulig  <martin@ximian.com>
5655
5656         * namespace.cs: Fixed that bug which caused a crash when compiling
5657         the debugger's GUI.
5658
5659 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5660
5661         * typemanager.cs (LookupTypeReflection): Never expose types which
5662         are NotPublic, NestedPrivate, NestedAssembly, or
5663         NestedFamANDAssem.  We used to return these, and later do a check
5664         that would report a meaningful error, but the problem is that we
5665         would not get the real match, if there was a name override.
5666
5667 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5668
5669         * namespace.cs (Namespace, Name): Do not compute the namespace
5670         name dynamically, compute it in the constructor.  This reduced
5671         memory usage by 1697 KB.
5672
5673         * driver.cs: Use --pause to pause at the end.
5674
5675 2003-07-17  Peter Williams  <peter@newton.cx>
5676
5677         * Makefile: Change the name of the test target so that it doesn't
5678         conflict with the recursive test target.
5679
5680 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5681
5682         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5683         AddressOf): Do not use EmitThis, that was wrong, use the actual
5684         this pointer.
5685
5686 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5687
5688         * class.cs (MethodData.Define): While checking if a method is an
5689         interface implementation, improve the test: If we are not public
5690         (use new test here: use the computed MethodAttributes directly,
5691         instead of the parsed modifier flags) check if the `implementing'
5692         method comes from an interface or not.
5693
5694         * pending.cs (VerifyPendingMethods): Slightly better error
5695         message.
5696
5697         * makefile: add test target that does the mcs bootstrap.
5698
5699 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5700
5701         * interface.cs (Define): Do nothing here since there are no
5702         members to populate etc. Move the attribute emission out of here
5703         since this was just totally the wrong place to put it. Attribute
5704         application happens during the 'Emit' phase, not in the 'Define'
5705         phase.
5706
5707         (Emit): Add this method and move the attribute emission here
5708
5709         * rootcontext.cs (EmitCode): Call the Emit method on interface
5710         types too.
5711
5712 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5713
5714         * expression.cs (OverloadResolve): Report error only if Location
5715         is not 'Null' which means that there was a probe going on.
5716
5717 2003-07-14  Martin Baulig  <martin@ximian.com>
5718
5719         * expression.cs (ConditionalLogicalOperator): New public class to
5720         implement user defined conditional logical operators.
5721         This is section 14.11.2 in the spec and bug #40505.
5722
5723 2003-07-14  Martin Baulig  <martin@ximian.com>
5724
5725         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5726
5727 2003-07-14  Martin Baulig  <martin@ximian.com>
5728
5729         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5730
5731         * ecore.cs (IVariable.VerifyFixed): New interface method.
5732
5733         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5734         operator, check whether the variable is actually fixed.  Fixes bug
5735         #36055.  Set a variable definitely assigned when taking its
5736         address as required by the spec.
5737
5738         * statement.cs (LocalInfo.IsFixed): New field.
5739         (LocalInfo.MakePinned): Set `IsFixed' to true.
5740
5741 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5742
5743         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5744         for .ctors, ensure that we only ask for members declared in the
5745         attribute type (BindingFlags.DeclaredOnly).
5746
5747         Fixes bug #43632.
5748
5749         * expression.cs (Error_WrongNumArguments): Report error 1501
5750         correctly the way CSC does.
5751
5752 2003-07-13  Martin Baulig  <martin@ximian.com>
5753
5754         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5755         lookup on the fully qualified name, to make things like "X.X" work
5756         where "X.X" is a fully qualified type name, but we also have a
5757         namespace "X" in the using list.  Fixes #41975.
5758
5759 2003-07-13  Martin Baulig  <martin@ximian.com>
5760
5761         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5762         function. If we're a CompoundAssign, we need to create an embedded
5763         CompoundAssign, not an embedded Assign.
5764         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5765         Fixes #45854.
5766
5767 2003-07-13  Martin Baulig  <martin@ximian.com>
5768
5769         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5770         work to fix bug #46088.
5771
5772 2003-07-13  Ravi Pratap <ravi@ximian.com>
5773
5774         * class.cs (Operator.Emit): Do not emit attributes here - it is
5775         taken care of by the Method class that we delegate too. This takes
5776         care of bug #45876.
5777
5778 2003-07-10  Martin Baulig  <martin@ximian.com>
5779
5780         * expression.cs (TypeOfVoid): New class.
5781         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5782
5783 2003-07-10  Martin Baulig  <martin@ximian.com>
5784
5785         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5786         bug #35957.
5787
5788 2003-07-10  Martin Baulig  <martin@ximian.com>
5789
5790         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5791         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5792
5793         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5794
5795         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5796
5797 2003-07-10  Martin Baulig  <martin@ximian.com>
5798
5799         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5800         of decimal.  Fixes #42850.
5801
5802         NOTE: I also fixed the created byte blob, but this doesn't work on
5803         the MS runtime and csc never produces any byte blobs for decimal
5804         arrays.
5805
5806 2003-07-10  Martin Baulig  <martin@ximian.com>
5807
5808         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5809         structs; fixes #32068.
5810         (Block.AddChildVariableNames): Fixed #44302.
5811
5812 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5813
5814         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5815
5816 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5817
5818         * attribute.cs: And this test is onger needed.
5819
5820 2003-07-08  Martin Baulig  <martin@ximian.com>
5821
5822         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5823         inaccessible types.  Fixes #36313.
5824
5825         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5826
5827         * namespace.cs (NamespaceEntry): Create implicit entries for all
5828         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5829         implicit entries for N1.N2 and N1.
5830
5831 2003-07-08  Martin Baulig  <martin@ximian.com>
5832
5833         Rewrote the handling of namespaces to fix a lot of the issues
5834         wrt. `using' aliases etc.
5835
5836         * namespace.cs (Namespace): Splitted this class into a
5837         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5838
5839         * typemanager.cs (TypeManager.IsNamespace): Removed.
5840         (TypeManager.ComputeNamespaces): Only compute namespaces from
5841         loaded assemblies here, not the namespaces from the assembly we're
5842         currently compiling.
5843
5844 2003-07-08  Martin Baulig  <martin@ximian.com>
5845
5846         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
5847
5848 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5849
5850         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
5851         already fixed it.  
5852
5853         I thought about the memory savings here, but LookupTypeReflection
5854         is used under already very constrained scenarios.  Compiling
5855         corlib or mcs only exposes one hit, so it would not really reduce
5856         any memory consumption.
5857
5858 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5859
5860         * typemanager.cs: fixes bug #45889 by only adding public types from
5861         other assemblies to the list of known types.
5862
5863 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5864
5865         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
5866         on the type we resolved.
5867
5868 2003-07-05  Martin Baulig  <martin@ximian.com>
5869
5870         * pending.cs (PendingImplementation.ParentImplements): Don't
5871         create the proxy if the parent is abstract.
5872
5873         * class.cs (TypeContainer.DefineIndexers): Process explicit
5874         interface implementations first.  Fixes #37714.
5875
5876 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5877
5878         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5879         defined recursively;  but since we modify the input parameters
5880         (left is set to `this' temporarily), we reset this value if the
5881         left_is_explicit is false, which gives the original semantics to
5882         the code.  
5883
5884         * literal.cs (NullPointer): new class used to represent a null
5885         literal in a pointer context.
5886
5887         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5888         type is a pointer, use a NullPointer object instead of a
5889         NullLiteral.   Closes 43687
5890
5891         (ExplicitConversion): Convert pointer values using
5892         the conv opcode to the proper type.
5893
5894         * ecore.cs (New): change ValueTypeVariable property into a method,
5895         that returns whether the valuetype is suitable for being used.
5896
5897         * expression.cs (Binary.DoNumericPromotions): Only return if we
5898         the int constant was a valid uint, and we can return both left and
5899         right as uints.  If not, we continue processing, to trigger the
5900         type conversion.  This fixes 39018.
5901
5902         * statement.cs (Block.EmitMeta): During constant resolution, set
5903         the CurrentBlock property on the emitcontext, so that we resolve
5904         constants propertly.
5905
5906 2003-07-02  Martin Baulig  <martin@ximian.com>
5907
5908         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5909         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5910
5911         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5912         than emitting it here.
5913
5914         * statement.cs: Fixed some more flow analysis bugs.
5915
5916 2003-07-02  Martin Baulig  <martin@ximian.com>
5917
5918         * class.cs (MethodData.Define): When implementing interface
5919         methods, set Final unless we're Virtual.
5920
5921         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5922         check work for interface methods.
5923
5924 2003-07-01  Martin Baulig  <martin@ximian.com>
5925
5926         * ecore.cs (EmitContext.This): Replaced this property with a
5927         GetThis() method which takes a Location argument.  This ensures
5928         that we get the correct error location for a CS0188.
5929
5930 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5931
5932         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5933         ImplicitStandardConversion.
5934
5935         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5936
5937 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5938
5939         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5940         optimization.
5941
5942 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5943
5944         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5945         constructors.
5946
5947         (MethodData.Define): Turn off initlocals for unsafe methods.
5948
5949 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5950
5951         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5952         complete;  Fixes #37521.
5953
5954         * delegate.cs: Use Modifiers.TypeAttr to compute the
5955         TypeAttributes, instead of rolling our own.  This makes the flags
5956         correct for the delegates.
5957
5958 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5959
5960         * class.cs (Constructor.Define): Set the private flag for static
5961         constructors as well.
5962
5963         * cs-parser.jay (statement_expression): Set the return value to
5964         null, to avoid a crash when we catch an error.
5965
5966 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5967
5968         * cs-parser.jay: Applied patch from Jackson that adds support for
5969         extern and unsafe modifiers to destructor declarations.
5970
5971         * expression.cs: Report error 21 if the user is trying to index a
5972         System.Array.
5973
5974         * driver.cs: Add an error message, suggested by the bug report.
5975
5976         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5977         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5978
5979 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5980
5981         * namespace.cs: Add some information to reduce FAQs.
5982
5983 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5984
5985         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5986         underlying enumeration types.  Fixes #43915.
5987
5988         * expression.cs: Treat ushort/short as legal values to be used in
5989         bitwise operations.
5990
5991 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5992
5993         * delegate.cs: transfer custom attributes for paramenters from
5994         the delegate declaration to Invoke and BeginInvoke.
5995
5996 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5997
5998         * attribute.cs: handle custom marshalers and emit marshal info
5999         for fields, too.
6000
6001 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
6002
6003         * makefile.gnu: Added anonymous.cs to the compiler sources.
6004
6005 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6006
6007         * iterators.cs: Change the name of the proxy class to include two
6008         underscores.
6009
6010         * cs-parser.jay: Update grammar to include anonymous methods.
6011
6012         * anonymous.cs: new file.
6013
6014 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6015
6016         * class.cs (Field.Define): Add missing test for pointers and
6017         safety. 
6018
6019 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6020
6021         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6022         we use the stobj opcode.
6023
6024         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6025         since it wasn't the correct fix. 
6026
6027         It still is puzzling that we are required to use stobj for IntPtr
6028         which seems to be a ValueType.
6029
6030 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6031
6032         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6033         during regular simple name resolution.   Now, the trick is that
6034         instead of returning for processing the simplename, we do a
6035         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6036         contextual lookup type).   If a match is found, return that, if
6037         not, return for further composition.
6038
6039         This fixes long-standing 30485.
6040
6041         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6042         using the address to initialize an object, do an Stobj instead of
6043         using the regular Stelem.
6044
6045         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6046         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6047         Because if we are a BaseIndexerAccess that value will be true.
6048         Fixes 43643.
6049
6050         * statement.cs (GotoCase.Resolve): Return after reporting an
6051         error, do not attempt to continue. 
6052
6053         * expression.cs (PointerArithmetic.Emit): If our operand is a
6054         long, convert our constants to match the operand before
6055         multiplying.  Convert to I type before adding.   Fixes 43670.
6056
6057 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6058
6059         * enum.cs (ImplicitConversionExists) : Rename to
6060         ImplicitEnumConversionExists to remove ambiguity. 
6061
6062         * ecore.cs (NullCast): New type of cast expression class which
6063         basically is very similar to EmptyCast with the difference being
6064         it still is a constant since it is used only to cast a null to
6065         something else
6066         (eg. (string) null)
6067
6068         * convert.cs (ImplicitReferenceConversion): When casting a null
6069         literal, we return a NullCast.
6070
6071         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6072         should be around anymore.
6073
6074         The renaming (reported was slightly wrong). Corrections:
6075
6076         ConvertImplicitStandard -> ImplicitConversionStandard
6077         ConvertExplicitStandard -> ExplicitConversionStandard
6078
6079         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6080         before passing them in !
6081
6082         * convert.cs (ImplicitConversionStandard): When comparing for
6083         equal expr and target types, ensure that expr is not a
6084         NullLiteral.
6085
6086         In general, we must not be checking (expr_type ==
6087         target_type) in the top level conversion methods
6088         (ImplicitConversion, ExplicitConversion etc). This checking is
6089         done in the methods that they delegate to.
6090
6091 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6092
6093         * convert.cs: Move Error_CannotConvertType,
6094         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6095         ImplicitNumericConversion, ImplicitConversionExists,
6096         ImplicitUserConversionExists, StandardConversionExists,
6097         FindMostEncompassedType, FindMostSpecificSource,
6098         FindMostSpecificTarget, ImplicitUserConversion,
6099         ExplicitUserConversion, GetConversionOperators,
6100         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6101         TryImplicitIntConversion, Error_CannotConvertImplicit,
6102         ConvertImplicitRequired, ConvertNumericExplicit,
6103         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6104         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6105         its own file.
6106
6107         Perform the following renames:
6108
6109         StandardConversionExists -> ImplicitStandardConversionExists
6110         ConvertImplicit -> ImplicitConversion
6111         ConvertImplicitStandard -> ImplicitStandardConversion
6112         TryImplicitIntConversion -> ImplicitIntConversion
6113         ConvertImplicitRequired -> ImplicitConversionRequired
6114         ConvertNumericExplicit -> ExplicitNumericConversion
6115         ConvertReferenceExplicit -> ExplicitReferenceConversion
6116         ConvertExplicit -> ExplicitConversion
6117         ConvertExplicitStandard -> ExplicitStandardConversion
6118
6119 2003-05-19  Martin Baulig  <martin@ximian.com>
6120
6121         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6122         (TypeInfo): Added support for structs having structs as fields.
6123
6124         * ecore.cs (FieldExpr): Implement IVariable.
6125         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6126         VariableInfo for the field.
6127
6128 2003-05-18  Martin Baulig  <martin@ximian.com>
6129
6130         * expression.cs (This.DoResolve): Report a CS0027 if we're
6131         emitting a field initializer.
6132
6133 2003-05-18  Martin Baulig  <martin@ximian.com>
6134
6135         * expression.cs (This.ResolveBase): New public function.
6136         (This.DoResolve): Check for CS0188.
6137
6138         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6139         This.Resolve().
6140
6141         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6142         `instance_expression' to null if we don't have any non-static
6143         methods.
6144
6145 2003-05-18  Martin Baulig  <martin@ximian.com>
6146
6147         Reworked the way how local variables and parameters are handled by
6148         the flow analysis code.
6149
6150         * statement.cs (TypeInfo, VariableMap): New public classes.
6151         (VariableInfo): New public class.  This is now responsible for
6152         checking whether a variable has been assigned.  It is used for
6153         parameters and local variables.
6154         (Block.EmitMeta): Take the InternalParameters as argument; compute
6155         the layout of the flow vectors here.
6156         (Block.LocalMap, Block.ParameterMap): New public properties.
6157         (FlowBranching): The .ctor doesn't get the InternalParameters
6158         anymore since Block.EmitMeta() now computes the layout of the flow
6159         vector.
6160         (MyStructInfo): This class is now known as `StructInfo' and nested
6161         in `TypeInfo'; we don't access this directly anymore.
6162
6163         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6164         property and removed IsAssigned(), IsFieldAssigned(),
6165         SetAssigned() and SetFieldAssigned(); we now call them on the
6166         VariableInfo so we don't need to duplicate this code everywhere.
6167
6168         * expression.cs (ParameterReference): Added `Block block' argument
6169         to the .ctor.
6170         (LocalVariableReference, ParameterReference, This): The new
6171         VariableInfo class is now responsible for all the definite
6172         assignment stuff.
6173
6174         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6175         IsParameterAssigned, SetParameterAssigned): Removed.
6176
6177 2003-05-18  Martin Baulig  <martin@ximian.com>
6178
6179         * typemanager.cs (InitCoreTypes): Try calling
6180         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6181         the 3-args-version.  Corlib now also needs our `void_type'.
6182         (GetMethod): Added overloaded version which takes an optional
6183         `bool report_errors' to allow lookups of optional methods.
6184
6185 2003-05-12  Martin Baulig  <martin@ximian.com>
6186
6187         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6188         only used for locals and not for parameters.
6189
6190 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6191
6192         * support.cs (InternalParameters.ParameterType): Return the
6193         ExternalType of the parameter.
6194
6195         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6196         they were unused.
6197
6198 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6199
6200         * class.cs (MethodData.Define): Do not set the `newslot' on
6201         interface members, if they are also flagged as "override".
6202
6203         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6204         better code for ++i and i++.  This only works for static fields
6205         and local variables.
6206
6207         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6208         want to pull the DeclSpace out of the builder_to_declspace instead
6209         of the TypeBuilder (like in TypeContainer.FindMembers).
6210
6211         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6212         instead of LookupTypeContainer.  Fixes the crash on .NET for
6213         looking up interface members.
6214
6215         * const.cs: Create our own emit context during the Definition
6216         stage, so that constants are evaluated in the proper context, when
6217         a recursive definition happens.
6218
6219 2003-05-11  Martin Baulig  <martin@ximian.com>
6220
6221         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6222         new block for a switch section.
6223         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6224         the adding/lookup in the switch block.  Fixes #39828.
6225
6226 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6227
6228         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6229         functionality: I needed to convert the data after I had performed
6230         the add/sub operation into the operands type size.
6231
6232         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6233         pass the type for the box operation, otherwise the resulting
6234         object would have been of type object.
6235
6236         (BoxedCast): Add constructor to specify the type to box as.
6237
6238 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6239
6240         * iterators.cs: I was reusing the `count' variable inadvertently,
6241         take steps to not allow this to happen.
6242
6243 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6244
6245         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6246         by creating an array at the point where the params starts and
6247         putting all those arguments there, then adjusting the size of the
6248         array.
6249
6250 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6251
6252         * expression.cs (New.AddressOf): Implement interface
6253         IMemoryLocation.  This is used when the `new' operator is used in
6254         the context of an invocation to a method on a value type.
6255
6256         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6257         example. 
6258
6259         * namespace.cs: Also check the using aliases here.
6260
6261         * driver.cs: Move the test for using validity after the types have
6262         been entered, so we do a single pass that also includes the using
6263         aliases. 
6264
6265         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6266         in the regular case.   CreateSiblingForFinally is doing extra
6267         error checking.
6268
6269         * attribute.cs (GetAttributeArgumentExpression): Store the result
6270         on an out value, and use the return value to indicate failure
6271         instead of using null (which is a valid return for Constant.GetValue).
6272
6273         * statement.cs: Perform the analysis flow for the increment
6274         portion after the statement, because this will be the real flow of
6275         execution.  Fixes #42385
6276
6277         * codegen.cs (EmitContext.EmitArgument,
6278         EmitContext.EmitStoreArgument): New helper functions when the
6279         RemapToProxy flag is set.
6280
6281         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6282         function.
6283
6284         Add support for remapping parameters. 
6285
6286         * iterators.cs: Propagate parameter values;  Store parameter
6287         values in the proxy classes.
6288
6289 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6290
6291         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6292         need a proxy reference;  I do not know what I was thinking
6293
6294         * cs-parser.jay (constructor_initializer): catch another error,
6295         and display nice message.
6296
6297         (field_declaration): catch void field declaration
6298         to flag a better error. 
6299
6300         * class.cs (MemberBase.CheckBase): Report an error instead of a
6301         warning if a new protected member is declared in a struct. 
6302         (Field.Define): catch the error of readonly/volatile.
6303
6304         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6305
6306         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6307         volatile variable is taken
6308
6309 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6310
6311         * statement.cs (Fixed.Resolve): Report an error if we are not in
6312         an unsafe context.
6313
6314 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6315
6316         * typemanager.cs: reuse the code that handles type clashes for
6317         delegates and enumerations.
6318
6319         * class.cs (Report28): Always report.
6320
6321         * expression.cs (EncodeAsAttribute): Allow nulls here.
6322
6323 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6324
6325         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6326         the functionality for testing whether an expression is valid for
6327         an attribute here.  Also handle the case of arrays of elements
6328         being stored. 
6329
6330         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6331         encoding a linear array into an array of objects that are suitable
6332         to be passed to an CustomAttributeBuilder.
6333
6334         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6335
6336         * ecore.cs: (FieldExpr): Handle field remapping here.
6337
6338         * iteratators.cs: Pass the instance variable (if the method is an
6339         instance method) to the constructors, so we can access the field
6340         variables on the class.
6341
6342         TODO: Test this with structs.  I think the THIS variable on
6343         structs might have to be a pointer, and not a refenrece
6344
6345 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6346
6347         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6348         local variables to fields in a proxy class.
6349
6350         * iterators.cs (PopulateProxy): Rename our internal fields to
6351         <XXX>.  
6352         Create a <THIS> field if we are an instance method, so we can
6353         reference our parent container variables.
6354         (MapVariable): Called back from the EmitContext code to enter a
6355         new variable to field mapping into the proxy class (we just create
6356         a FieldBuilder).
6357
6358         * expression.cs
6359         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6360         for using the remapped locals to fields.
6361
6362         I placed the code here, because that gives the same semantics to
6363         local variables, and only changes the Emit code.
6364
6365         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6366         statements inside iterators.
6367         (VariableInfo): Add a FieldBuilder for the cases when we are
6368         remapping local variables to fields in a proxy class
6369
6370         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6371         current_block != null.
6372
6373         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6374         not cope with strings, as it has been moved to the
6375         TableSwitchEmit.  Fixed bug in switch generation.
6376
6377         * expression.cs (New.DoResolve): Provide more context for the user
6378         when reporting an error.
6379
6380         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6381         pointers. 
6382
6383         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6384         check the permissions for it.  Note than in a type-resolution
6385         context the check was already present in DeclSpace.ResolveType,
6386         but was missing from the MemberAccess.
6387
6388         (ArrayCreation.CheckIndices): warn if the user has
6389         more nested levels of expressions, but there are no more
6390         dimensions specified.  Avoids crash on bug 41906.
6391
6392 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6393
6394         * statement.cs (Block): replace Implicit bool, for a generic
6395         flags.   
6396         New flag: `Unchecked'.  This is used during the EmitMeta phase
6397         (which is out-of-line with the regular Resolve/Emit process for a
6398         statement, as this is done ahead of time, but still gets a chance
6399         to call constant resolve).
6400
6401         (Block.Flags): new enum for adding a new flag.
6402
6403         (Block.EmitMeta): track the state of unchecked.
6404
6405         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6406         to enable constant resolution to work there as well.
6407
6408 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6409
6410         * typemanager.cs (ienumerable_type): Also look up
6411         System.Collections.IEnumerable. 
6412
6413 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6414
6415         TODO: Test more than one conditional per method.
6416
6417         * class.cs (Indexer.Define): Report the location where the user is
6418         referencing the unsupported feature.
6419
6420         (MethodData): Overload the use of `conditionals' to
6421         minimize the creation of needless ArrayLists.   This saves roughly
6422         212kb on my machine.
6423
6424         (Method): Implement the new IIteratorContainer interface.
6425         (Method.SetYields): Implement the method by setting the ModFlags
6426         to contain METHOD_YIELDS.
6427
6428         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6429         which just got set to null.
6430
6431         * iterators.cs: New file.
6432
6433         (Yield, YieldBreak): New statements.
6434
6435         * statement.cs (Return.Resolve): Flag an error if we are used in
6436         an iterator method.
6437
6438         * codegen.cs (InIterator): New flag set if the code is being
6439         compiled in an iterator method.
6440
6441         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6442         internal modifier, and we just use it to avoid adding extra
6443         fields, as this is seldom used.  
6444
6445         * cs-parser.jay: Add yield_statement (yield and yield break).
6446
6447         * driver.cs: New flag -v2 to turn on version 2 features. 
6448
6449         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6450         hashtable when v2 is enabled.
6451
6452 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6453
6454         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6455         there is already a namespace defined with this name.
6456
6457         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6458         people upgraded their corlibs.
6459
6460         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6461         always use fully qualified types, no need to use the compiler
6462         front end.
6463
6464         (TypeManager.IsNamespace): Use binarysearch.
6465
6466         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6467         AddDelegate): I did not quite use the new IsValid API properly: I
6468         have to pass the short-name and the fullname.  I was passing only
6469         the basename instead of the fullname sometimes. 
6470
6471         (TypeContainer.DefineType): call NamespaceClash.
6472
6473         * interface.cs (Interface.DefineType): use NamespaceClash before
6474         defining the type.
6475
6476         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6477         defining the type.
6478
6479         * enum.cs: (Enum.DefineType): use NamespaceClash before
6480         defining the type.
6481
6482         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6483         speed increase.  First, use the negative_hits cache when we get a
6484         negative.  Second, add the type with its full original name
6485         instead of the new . and + encoded name (reflection uses + to
6486         separate type from a nested type).  Use LookupTypeReflection
6487         directly which bypasses the type->name hashtable (that we already
6488         know does not contain the type.
6489
6490         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6491         location/container type. 
6492
6493         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6494
6495 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6496
6497         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6498
6499         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6500         method is being referenced in the method group from a static
6501         context, and report error 120 if so.
6502
6503         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6504         Error118. 
6505
6506         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6507         is created, we create the A namespace).
6508
6509         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6510         Fixes #41591
6511
6512 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6513
6514         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6515         invocation to ModuleBuilder.GetType with the same values will
6516         return a new type instance, so we need to cache its return
6517         values. 
6518
6519         * expression.cs (Binary.ResolveOperator): Only allow the compare
6520         operators on enums if they are of the same type.
6521
6522         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6523         types of ValueType on their own case.  Before we were giving them
6524         the same treatment as objects.
6525
6526         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6527         fullname.  Short name is used to compare against container name.
6528         Fullname is used to check against defined namespace names.
6529
6530         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6531         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6532
6533         (Method.CheckBase): Call parent.
6534         (MemberBase.CheckBase): Check for protected members on sealed
6535         classes.
6536         (PropertyBase.CheckBase): Call parent.
6537         (Field.Define): Call parent.
6538
6539         * report.cs: Negative error codes are now mapped to 8000 - code,
6540         so that the display is render more nicely.
6541
6542         * typemanager.cs: Do not use try/catch, instead report a regular
6543         error. 
6544
6545         (GetPointerType, GetReferenceType): These methods provide
6546         mechanisms to obtain the T* and T& from a T.  We had the code
6547         previously scattered around the code base, and it also used
6548         TypeManager.LookupType that would go through plenty of caches.
6549         This one goes directly to the type source.
6550
6551         In some places we did the Type.GetType followed by
6552         ModuleBuilder.GetType, but not in others, so this unifies the
6553         processing as well.
6554
6555         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6556         statements now that we have namespace information.
6557
6558         * typemanager.cs (IsNamespace): New method, returns whether the
6559         string presented is a namespace or not.
6560
6561         (ComputeNamespaces): New public entry point, computes the list of
6562         available namespaces, using the GetNamespaces API call in Mono, or
6563         the slower version in MS.NET.   
6564
6565         Now before we start the semantic analysis phase, we have a
6566         complete list of namespaces including everything that the user has
6567         provided.
6568
6569         Deleted old code to cache namespaces in .nsc files.
6570
6571 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6572
6573         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6574         class/struct location definition Location for the implicit
6575         constructor location.
6576
6577         (Operator.Define): Use the location of the operator for the
6578         implicit Method definition.
6579
6580         (Constructor.Emit): use the constructor location for the implicit
6581         base initializer constructor.
6582
6583         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6584         and the Expression class now contains two new methods:
6585
6586         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6587         isolate type lookup from the rest of the resolution process.
6588
6589         Since we use Expressions to hold type definitions due to the way
6590         we parse the input we have historically overloaded Resolve to
6591         perform the Type lookups if a special flag is passed.  Now this is
6592         eliminated and two methods take their place. 
6593
6594         The differences in the two methods between xStep and xTerminal is
6595         that xStep is involved in our current lookup system that uses
6596         SimpleNames to compose a name, while xTerminal is used just to
6597         catch the case where the simplename lookup failed.
6598
6599 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6600
6601         * expression.cs (ResolveMemberAccess): Remove redundant code.
6602         TypeExpr expressions are always born fully resolved.
6603
6604         * interface.cs (PopulateMethod): Do not lookup the types twice.
6605         We were doing it once during SemanticAnalysis and once during
6606         PopulateMethod.
6607
6608         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6609         in local variable type definitions, were being returned as a
6610         SimpleName (we decomposed everything into a string), that is
6611         because primary_expression was being used instead of a type in the
6612         grammar (reduce/reduce conflicts).
6613
6614         The part that was wrong is that we converted the expression into a
6615         string (an oversimplification in one hand, compounded with primary
6616         expressions doing string concatenation).
6617
6618         So things like:
6619
6620         A.B.C [] x;
6621
6622         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6623         using clauses from working on this particular context.  And a type
6624         was being matched directly against "A.B.C[]".
6625
6626         We now use the correct approach, and allow for ComposedCast to be
6627         part of the unary expression.  So the "A.B.C []" become a composed
6628         cast of "A.B.C" (as a nested group of MemberAccess with a
6629         SimpleName at the end) plus the rank composition "[]". 
6630
6631         Also fixes 35567
6632
6633 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6634
6635         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6636         for the access level checking.
6637
6638         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6639         `TypeContainer container', because I kept getting confused when I
6640         was debugging this code.
6641
6642         * expression.cs (Indexers): Instead of tracking getters/setters,
6643         we now track them in parallel.  We create one arraylist less, but
6644         most importantly it is possible now for the LValue code to find a
6645         matching get for a set.
6646
6647         (IndexerAccess.DoResolveLValue): Update the code.
6648         GetIndexersForType has been modified already to extract all the
6649         indexers from a type.  The code assumed it did not.
6650
6651         Also make the code set the correct return type for the indexer.
6652         This was fixed a long time ago for properties, but was missing for
6653         indexers.  It used to be void_type.
6654
6655         (Binary.Emit): Test first for doubles instead of
6656         floats, as they are more common.
6657
6658         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6659         when dealing with floats and the <=, >= operators.  This fixes bug
6660         #39314 
6661
6662         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6663         to load the array value by emitting a load on the foreach variable
6664         type.  This was incorrect.  
6665
6666         We now emit the code to load an element using the the array
6667         variable type, and then we emit the conversion operator.
6668
6669         Fixed #40176
6670
6671 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6672
6673         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6674
6675 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6676
6677         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6678         test for protection before we test for signatures. 
6679
6680         (MethodSignature.ToString): implement.
6681
6682         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6683         to the case where we reduced into a LongConstant.
6684
6685         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6686         depend on whether the information is acurrate, because the
6687         Microsoft runtime will always claim that the array type is public,
6688         regardless of the real state.
6689
6690         If the type is a pointer, another problem happens: the type is
6691         reported as non-public in Microsoft.  
6692
6693         In both cases we have to call CheckAccessLevel recursively with
6694         the underlying type as the argument to be tested.
6695
6696 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6697
6698         * assign.cs (Assign.Emit): If we are dealing with a compound
6699         assignment expression, we should use the code path that stores the
6700         intermediate result in a temporary value.  This fixes #40903.
6701
6702         *expression.cs (Indirection.ToString): Provide ToString method for
6703         debugging. 
6704
6705 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6706
6707         * class.cs: Null out fields holding references to Block objects so
6708         they can be garbage collected.
6709
6710         * expression.cs (OverloadResolve): Remove unused local.
6711
6712 2003-04-07  Martin Baulig  <martin@ximian.com>
6713
6714         * codegen.cs (EmitContext.CurrentFile): New public field.
6715         (EmitContext.Mark): Use the CurrentFile to check whether the
6716         location is in the correct file.
6717         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6718
6719 2003-04-07  Martin Baulig  <martin@ximian.com>
6720
6721         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6722
6723         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6724         location.  [FIXME: The location argument which gets passed to this
6725         method is sometimes wrong!]
6726
6727 2003-04-07  Nick Drochak <ndrochak@gol.com>
6728
6729         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6730
6731 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6732
6733         * expression.cs (Indirection.EmitAssign): We were using the
6734         temporary, but returning immediately instead of continuing the
6735         EmitAssing flow.
6736
6737 2003-04-06  Martin Baulig  <martin@ximian.com>
6738
6739         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6740         if it's a nested child, but also deriving from the outer class.
6741         See test 190.cs.
6742
6743         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6744         nested child, but also deriving from the outer class.  See
6745         test-190.cs.
6746         (FilterWithClosure): We may access private members of the outer
6747         class if we're a nested child and deriving from the outer class.
6748         (RealMemberLookup): Only set `closure_private_ok' if the
6749         `original_bf' contained BindingFlags.NonPublic.
6750
6751 2003-04-05  Martin Baulig  <martin@ximian.com>
6752
6753         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
6754         probe if its a type parameter, and if so, flag an error.
6755
6756         * decl.cs: Move here the SetParameterInfo code from class.cs.
6757         Handle IsGeneric here.
6758
6759         Handle a variety of errors in the parameter info definition.
6760
6761         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
6762         type parameters here.
6763
6764         * cs-parser.jay (class_declaration): report errors for parameters
6765         here as well.
6766
6767 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
6768
6769         * generic.cs: New file, contains support code for generics.
6770
6771         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
6772         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
6773
6774         Update parser for the above removals.
6775
6776         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
6777         now taken care of in the parser.
6778
6779 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6780
6781         * class.cs (Event.Define): Do not allow abstract events to have
6782         initializers. 
6783
6784 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6785
6786         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6787         block in event declarations.
6788
6789         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6790         value type, get its address.
6791
6792         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6793         leaving a class on the stack instead of a boolean value (int
6794         0/1).  Change the code so we compare against null, and then the
6795         result against zero.
6796
6797         * class.cs (TypeContainer.GetClassBases): We were checking for the
6798         parent class being sealed too late.
6799
6800         * expression.cs (Binary.Emit): For <= and >= when dealing with
6801         floating point values, use cgt.un and clt.un instead of cgt and
6802         clt alone.
6803
6804 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6805
6806         * statement.cs: Apply the same optimization as MS: skip the 
6807         GetEnumerator returning an IEnumerator, and use the one returning a 
6808         CharEnumerator instead. This allows us to avoid the try-finally block 
6809         and the boxing.
6810
6811 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6812
6813         * cs-parser.jay: Attributes cannot be applied to
6814                          namespaces. Fixes #40473
6815
6816 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6817
6818         * class.cs:
6819         (Add*): check if the name is valid using the full name for constants,
6820         fields, properties and events.
6821
6822 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6823
6824         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6825         char constants to be part of the enumeration.
6826
6827         * expression.cs (Conditional.DoResolve): Add support for operator
6828         true. Implements the missing functionality from 14.12
6829
6830         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6831         operator true/false as required by the spec.
6832
6833         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6834         implicit conversion to boolean.
6835
6836         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6837         also one where the type implements `operator true'. 
6838
6839         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6840         get an expression that will invoke operator true based on an
6841         expression.  
6842
6843         (GetConversionOperators): Removed the hack that called op_True
6844         here.  
6845
6846         (Expression.ResolveBoolean): Move this from Statement.
6847
6848 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6849
6850         * ecore.cs (FieldExpr): do not allow initialization of initonly
6851         fields on derived classes
6852
6853 2003-03-13  Martin Baulig  <martin@ximian.com>
6854
6855         * statement.cs (Block.Emit): Call ig.BeginScope() and
6856         ig.EndScope() when compiling with debugging info; call
6857         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6858
6859 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6860
6861         * expression.cs (Indexers): Do not construct immediately, allow
6862         for new members to be appended as we go.  Fixes 38143
6863
6864 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6865
6866         * expression.cs: save/restore context when resolving an unchecked
6867         expression.
6868
6869 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6870
6871         * cfold.cs: Catch division by zero in modulus operator during
6872         constant folding.
6873
6874 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
6875
6876         * interface.cs (Interface.DefineMembers): Avoid defining members
6877         twice. 
6878
6879 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
6880
6881         * driver.cs: handle the +/- options for -noconfig
6882
6883         * statement.cs (Unckeched.Resolve): Also track the state of
6884         unchecked in the Resolve phase.
6885
6886 2003-02-27  Martin Baulig  <martin@ximian.com>
6887
6888         * ecore.cs (Expression.MemberLookup): Don't create a
6889         MethodGroupExpr for something which is not a method.  Fixes #38291.
6890
6891 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6892
6893         * class.cs (MemberBase.CheckParameters): Also check that the type
6894         is unmanaged if it is a pointer.
6895
6896         * expression.cs (SizeOf.Resolve): Add location information.
6897
6898         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6899         a managed type is declared.
6900
6901         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6902         parameter modifiers as well.  Fixes bug 38606
6903
6904         * class.cs: Very sad.  Am backing out the speed up changes
6905         introduced by the ArrayList -> Array in the TypeContainer, as they
6906         were not actually that much faster, and introduced a bug (no error
6907         reports on duplicated methods).
6908
6909         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6910         source first, this will guarantee that we have a valid expression
6911         before calling in lower levels functions that will require a
6912         resolved object.  Then use this original_source in the
6913         target.ResolveLValue instead of the original source that was
6914         passed to us.
6915
6916         Another change.  Use target.Resolve instead of LValueResolve.
6917         Although we are resolving for LValues, we will let the Assign code
6918         take care of that (it will be called again from Resolve).  This
6919         basically allows code like this:
6920
6921         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6922         class Y { void A (X x) { x [0] += o; }
6923
6924         The problem was that the indexer was trying to resolve for
6925         set_Item (idx, object o) and never finding one.  The real set_Item
6926         was set_Item (idx, X).  By delaying the process we get the right
6927         semantics. 
6928
6929         Fixes bug 36505
6930
6931 2003-02-23  Martin Baulig  <martin@ximian.com>
6932
6933         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6934         while calling DoEmit ().
6935
6936         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6937         source files; if you use the #line directive inside a method, the
6938         compiler stops emitting line numbers for the debugger until it
6939         reaches the end of the method or another #line directive which
6940         restores the original file.
6941
6942 2003-02-23  Martin Baulig  <martin@ximian.com>
6943
6944         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6945
6946 2003-02-23  Martin Baulig  <martin@ximian.com>
6947
6948         * statement.cs (Block.AddChildVariableNames): We need to call this
6949         recursively, not just for our immediate children.
6950
6951 2003-02-23  Martin Baulig  <martin@ximian.com>
6952
6953         * class.cs (Event.Define): Always make the field private, like csc does.
6954
6955         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6956         actually work, fixes bug #37521.
6957
6958 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6959
6960         * delegate.cs: When creating the various temporary "Parameters"
6961         classes, make sure that we call the ComputeAndDefineParameterTypes
6962         on those new parameters (just like we do with the formal ones), to
6963         allow them to be resolved in the context of the DeclSpace.
6964
6965         This fixes the bug that Dick observed in Bugzilla #38530.
6966
6967 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6968
6969         * expression.cs (ResolveMemberAccess): When resolving a constant,
6970         do not attempt to pull a constant if the value was not able to
6971         generate a valid constant.
6972
6973         * const.cs (LookupConstantValue): Do not report more errors than required.
6974
6975 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6976
6977         * expression.cs: fixes bug #38328.
6978
6979 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6980
6981         * class.cs: Changed all the various members that can be part of a
6982         class from being an ArrayList to be an Array of the right type.
6983         During the DefineType type_list, interface_list, delegate_list and
6984         enum_list are turned into types, interfaces, delegates and enums
6985         arrays.  
6986
6987         And during the member population, indexer_list, event_list,
6988         constant_list, field_list, instance_constructor_list, method_list,
6989         operator_list and property_list are turned into their real arrays.
6990
6991         Although we could probably perform this operation earlier, for
6992         good error reporting we need to keep the lists and remove the
6993         lists for longer than required.
6994
6995         This optimization was triggered by Paolo profiling the compiler
6996         speed on the output of `gen-sample-program.pl' perl script. 
6997
6998         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6999         not crash in methods like MemberLookupFailed that use this field.  
7000
7001         This problem arises when the compiler fails to resolve a type
7002         during interface type definition for example.
7003
7004 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7005
7006         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7007         inherit from System.Object, so we have to stop at null, not only
7008         when reaching System.Object.
7009
7010 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7011
7012         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7013         DeclaredOnly because the parent indexer might have had a different
7014         name, but did not loop until the top of the hierarchy was reached.
7015
7016         The problem this one fixes is 35492: when a class implemented an
7017         indexer from an interface, we were getting the interface method
7018         (which was abstract) and we were flagging an error (can not invoke
7019         abstract method).
7020
7021         This also keeps bug 33089 functioning, and test-148 functioning.
7022
7023         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7024         out if a method is special is to see if it is declared in a
7025         property or event, or whether it is one of the predefined operator
7026         names.   This should fix correctly #36804.
7027
7028 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7029
7030         The goal here is to remove the dependency on EmptyCast.Peel ().
7031         Killing it completely.
7032
7033         The problem is that currently in a number of places where
7034         constants are expected, we have to "probe" for an EmptyCast, and
7035         Peel, which is not the correct thing to do, as this will be
7036         repetitive and will likely lead to errors. 
7037
7038         The idea is to remove any EmptyCasts that are used in casts that
7039         can be reduced to constants, so we only have to cope with
7040         constants. 
7041
7042         This bug hunt was triggered by Bug 37363 and the desire to remove
7043         the duplicate pattern where we were "peeling" emptycasts to check
7044         whether they were constants.  Now constants will always be
7045         constants.
7046
7047         * ecore.cs: Use an enumconstant here instead of wrapping with
7048         EmptyCast.  
7049
7050         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7051         throwing me off.  By handling this we can get rid of a few hacks.
7052
7053         * statement.cs (Switch): Removed Peel() code.
7054
7055 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7056
7057         * class.cs: Location information for error 508
7058
7059         * expression.cs (New.DoResolve): Add a guard against double
7060         resolution of an expression.  
7061
7062         The New DoResolve might be called twice when initializing field
7063         expressions (see EmitFieldInitializers, the call to
7064         GetInitializerExpression will perform a resolve on the expression,
7065         and later the assign will trigger another resolution
7066
7067         This leads to bugs (#37014)
7068
7069         * delegate.cs: The signature for EndInvoke should contain any ref
7070         or out parameters as well.  We were not doing this in the past. 
7071
7072         * class.cs (Field.Define): Do not overwrite the type definition
7073         inside the `volatile' group.  Turns out that volatile enumerations
7074         were changing the type here to perform a validity test, which
7075         broke conversions. 
7076
7077 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7078
7079         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7080         and structs, we do not want to load the instance variable
7081
7082         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7083         enum_type has to be handled like an object reference (implicit
7084         conversions exists from this to object), but the regular IsClass
7085         and IsValueType tests will never return true for this one.
7086
7087         Also we use TypeManager.IsValueType instead of type.IsValueType,
7088         just for consistency with the rest of the code (this is only
7089         needed if we ever use the construct exposed by test-180.cs inside
7090         corlib, which we dont today).
7091
7092 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7093
7094         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7095         just InternalCall.
7096
7097 2003-02-09  Martin Baulig  <martin@ximian.com>
7098
7099         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7100         (Namespace.DefineNamespaces): New static public method; this is
7101         called when we're compiling with debugging to add all namespaces
7102         to the symbol file.
7103
7104         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7105         pass it to the Namespace's .ctor.
7106
7107         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7108         and MethodBase arguments; pass the namespace ID to the symwriter;
7109         pass the MethodBase instead of the token to the symwriter.
7110         (SymbolWriter.DefineNamespace): New method to add a namespace to
7111         the symbol file.
7112
7113 2003-02-09  Martin Baulig  <martin@ximian.com>
7114
7115         * symbolwriter.cs: New file.  This is a wrapper around
7116         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7117         methods here in near future.
7118
7119 2003-02-09  Martin Baulig  <martin@ximian.com>
7120
7121         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7122         ILGenerator.MarkSequencePoint() which are actually used by the
7123         symbol writer.
7124
7125 2003-02-09  Martin Baulig  <martin@ximian.com>
7126
7127         * location.cs (SourceFile): New public sealed class.  This
7128         contains the name and an index which is used in the location's token.
7129         (Location): Reserve an appropriate number of bits in the token for
7130         the source file instead of walking over that list, this gives us a
7131         really huge performance improvement when compiling with debugging.
7132
7133         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7134         `SourceFile' argument instead of a string.
7135         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7136         but don't parse/tokenize here, we need to generate the list of all
7137         source files before we do that.
7138         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7139         the files.
7140
7141         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7142         instead of a string.
7143
7144         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7145         of a string.
7146
7147 2003-02-09  Martin Baulig  <martin@ximian.com>
7148
7149         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7150         filename on `#line default'.
7151
7152 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7153
7154         * statement.cs: don't clear the pinned var when the fixed statement
7155         returns from the method (fixes bug#37752).
7156
7157 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7158
7159         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7160         to IsValueType.
7161
7162 2003-02-07  Martin Baulig  <martin@ximian.com>
7163
7164         * driver.cs: Removed the `--debug-args' command line argument.
7165
7166         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7167         automatically by the AsssemblyBuilder.
7168         (CodeGen.InitializeSymbolWriter): We don't need to call any
7169         initialization function on the symbol writer anymore.  This method
7170         doesn't take any arguments.
7171
7172 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7173
7174         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7175         from referenced assemblies as well.
7176
7177 2003-02-02  Martin Baulig  <martin@ximian.com>
7178
7179         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7180
7181 2003-02-02  Martin Baulig  <martin@ximian.com>
7182
7183         * class.cs (Constructor.Emit): Open the symbol writer before
7184         emitting the constructor initializer.
7185         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7186         single-stepping through constructor initializers.
7187
7188 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7189
7190         * class.cs: Handle error 549: do not allow virtual methods in
7191         sealed classes. 
7192
7193 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7194
7195         * decl.cs: Check access levels when resolving types
7196
7197 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7198
7199         * statement.cs: Add parameters and locals set in catch blocks that might 
7200         return to set vector
7201
7202 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7203
7204         * class.cs (Operator): Set the SpecialName flags for operators.
7205
7206         * expression.cs (Invocation.DoResolve): Only block calls to
7207         accessors and operators on SpecialName methods.
7208
7209         (Cast.TryReduce): Handle conversions from char constants.
7210
7211
7212 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7213
7214         * statement.cs: small memory and time optimization in FlowBranching.
7215
7216 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7217
7218         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7219         problem that the last fix but in the other sid (Set).
7220
7221         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7222         access when there is no indexer in the hierarchy.
7223
7224 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7225
7226         * class.cs: Combine some if statements.
7227
7228 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7229
7230         * driver.cs: fixed bug #37187.
7231
7232 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7233
7234         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7235         any indexer, it's needed to build a list with all the indexers in the
7236         hierarchy (AllGetters), else we have problems. Fixes #35653.
7237
7238 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7239
7240         * class.cs (MethodData.Define): It is wrong for an interface
7241         implementation to be static in both cases: explicit and implicit.
7242         We were only handling this in one case.
7243
7244         Improve the if situation there to not have negations.
7245
7246         * class.cs (Field.Define): Turns out that we do not need to check
7247         the unsafe bit on field definition, only on usage.  Remove the test.
7248
7249 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7250
7251         * driver.cs: use assembly.Location instead of Codebase (the latest
7252         patch made mcs fail when using MS assemblies).
7253
7254 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7255
7256         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7257         get the path to *corlib.dll.
7258
7259 2003-01-21  Nick Drochak <ndrochak@gol.com>
7260
7261         * cs-tokenizer.cs:
7262         * pending.cs:
7263         * typemanager.cs: Remove compiler warnings
7264
7265 2003-01-20  Duncan Mak  <duncan@ximian.com>
7266
7267         * AssemblyInfo.cs: Bump the version number to 0.19.
7268
7269 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7270
7271         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7272
7273 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7274
7275         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7276
7277 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7278
7279         * cs-parser.jay: Small fix: we were not comparing the constructor
7280         name correctly.   Thanks to Zoltan for the initial pointer.
7281
7282 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7283
7284         * cs-tokenizer.cs: Set file name when specified with #line
7285
7286 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7287
7288         * cs-parser.jay: Only perform the constructor checks here if we
7289         are named like the class;  This will help provider a better
7290         error.  The constructor path is taken when a type definition is
7291         not found, but most likely the user forgot to add the type, so
7292         report that rather than the constructor error.
7293
7294 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7295
7296         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7297         allocations.
7298
7299 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7300
7301         * cs-parser.jay: Add cleanup call.
7302
7303 2003-01-13  Duncan Mak  <duncan@ximian.com>
7304
7305         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7306         consistent with other methods.
7307
7308 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7309
7310         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7311
7312 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7313
7314         * attribute.cs: only set GuidAttr to true when we have a
7315         GuidAttribute.
7316
7317 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7318
7319         * ecore.cs:
7320         * expression.cs:
7321         * typemanager.cs: fixes to allow mcs compile corlib with the new
7322         Type.IsSubclassOf fix.
7323
7324 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7325
7326         * expression.cs (LocalVariableReference.DoResolve): Classify a
7327         constant as a value, not as a variable.   Also, set the type for
7328         the variable.
7329
7330         * cs-parser.jay (fixed_statement): take a type instead of a
7331         pointer_type, so we can produce a better error message later.
7332
7333         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7334         as an error.  
7335
7336         (For.DoEmit): Make inifinite loops have a
7337         non-conditional branch back.
7338
7339         (Fixed.DoEmit): First populate the pinned variables, then emit the
7340         statement, then clear the variables.  Before I was emitting the
7341         code once for each fixed piece.
7342
7343
7344 2003-01-08  Martin Baulig  <martin@ximian.com>
7345
7346         * statement.cs (FlowBranching.MergeChild): A break in a
7347         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7348
7349 2003-01-08  Martin Baulig  <martin@ximian.com>
7350
7351         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7352         lives in the same number space than `param_map'.  Fixes #36154.
7353
7354 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7355
7356         * cs-parser.jay (constructor_declaration): Set the
7357         Constructor.ModFlags before probing for it.  This makes the
7358         compiler report 514, 515 and 132 (the code was there, but got
7359         broken). 
7360
7361         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7362         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7363         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7364
7365 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7366
7367         * enum.cs: create the enum static fields using the enum type.
7368
7369 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7370
7371         * class.cs: don't try to create the ParamBuilder for the return
7372         type if it's not needed (and handle it breaking for the ms runtime
7373         anyway).
7374
7375 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7376
7377         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7378
7379 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7380
7381         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7382         the command.   This showed up while compiling the JANET source
7383         code, which used \r as its only newline separator.
7384
7385 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7386
7387         * class.cs (Method.Define): If we are an operator (because it
7388         reuses our code), then set the SpecialName and HideBySig.  #36128
7389
7390 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7391
7392         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7393         exception, report error 120 `object reference required'.
7394
7395         * driver.cs: Add --pause option, used during to measure the size
7396         of the process as it goes with --timestamp.
7397
7398         * expression.cs (Invocation.DoResolve): Do not allow methods with
7399         SpecialName to be invoked.
7400
7401 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7402
7403         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7404         number before adding it.
7405
7406 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7407
7408         * ecore.cs (StandardImplicitConversion): When in an unsafe
7409         context, we allow conversion between void * to any other pointer
7410         type. This fixes bug #35973.
7411
7412 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7413
7414         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7415         is not thrown when extensionless outputs are used 
7416
7417 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7418
7419         * rootcontext.cs: fixed compilation of corlib.
7420
7421 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7422
7423         * attribute.cs (Attributes.Contains): Add new method.
7424
7425         * class.cs (MethodCore.LabelParameters): if the parameter is an
7426         `out' parameter, check that no attribute `[In]' has been passed.
7427
7428         * enum.cs: Handle the `value__' name in an enumeration.
7429
7430 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7431
7432         * decl.cs: Added special case to allow overrides on "protected
7433         internal" methods
7434
7435 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7436
7437         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7438         since it makes much more sense.
7439
7440         (Attributes.ctor): Don't require a Location parameter.
7441
7442         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7443
7444         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7445         since we already have that information per attribute.
7446
7447         * everywhere : make appropriate changes.
7448
7449         * class.cs (LabelParameters): Write the code which actually
7450         applies attributes to the return type. We can't do this on the MS
7451         .NET runtime so we flag a warning in the case an exception is
7452         thrown.
7453
7454 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7455
7456         * const.cs: Handle implicit null conversions here too.
7457
7458 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7459
7460         * class.cs (MethodCore.LabelParameters): Remove the extra
7461         Type [] parameter since it is completely unnecessary. Instead
7462         pass in the method's attributes so that we can extract
7463         the "return" attribute.
7464
7465 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7466
7467         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7468         of ignoring it and letting the compile continue.
7469
7470         * typemanager.cs (ChangeType): use an extra argument to return an
7471         error condition instead of throwing an exception.
7472
7473 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7474
7475         * expression.cs (Unary.TryReduce): mimic the code for the regular
7476         code path.  Perform an implicit cast in the cases where we can
7477         implicitly convert to one of the integral types, and then reduce
7478         based on that constant.   This fixes bug #35483.
7479
7480 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7481
7482         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7483
7484 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7485
7486         * namespace.cs: fixed bug #35489.
7487
7488 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7489
7490         * class.cs: Remove some dead code.
7491
7492         * cs-parser.jay: Estimate the number of methods needed
7493         (RootContext.MethodCount);
7494
7495         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7496         numbers instead of StringBuilders.
7497
7498         * support.cs (PtrHashtable): Add constructor with initial size;
7499         We can now reduce reallocations of the method table.
7500
7501 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7502
7503         * attribute.cs (ApplyAttributes): Keep track of the emitted
7504         attributes on a per-target basis. This fixes bug #35413.
7505
7506 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7507
7508         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7509         default to the Windows 1252 encoding.
7510
7511         (UnixParseOption): Support version, thanks to Alp for the missing
7512         pointer. 
7513
7514         * AssemblyInfo.cs: Add nice assembly information.
7515
7516         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7517         (bug 35169).
7518
7519         * cs-parser.jay: Allow a trailing comma before the close bracked
7520         in the attribute_section production.
7521
7522         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7523         address of the instance was being taken, I will take this out,
7524         because we take the address of the object immediately here.
7525
7526 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7527
7528         * typemanager.cs (AreMultipleAllowed): Take care of the most
7529         obvious case where attribute type is not in the current assembly -
7530         stupid me ;-)
7531
7532 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7533
7534         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7535         definitions, instead of doing that afterwards.  
7536
7537         Also we use a nice little hack, depending on the constructor, we
7538         know if we are a "composed" name or a simple name.  Hence, we
7539         avoid the IndexOf test, and we avoid 
7540
7541         * codegen.cs: Add code to assist in a bug reporter to track down
7542         the source of a compiler crash. 
7543
7544 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7545
7546         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7547         types have been emitted for a given element and flag an error
7548         if something which does not have AllowMultiple set is used more
7549         than once.
7550
7551         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7552         attribute types and their corresponding AllowMultiple properties
7553
7554         (AreMultipleAllowed): Check the property for a given type.
7555
7556         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7557         property in the case we have a TypeContainer.
7558
7559         (Attributes.AddAttribute): Detect duplicates and just skip on
7560         adding them. This trivial fix catches a pretty gross error in our
7561         attribute emission - global attributes were being emitted twice!
7562
7563         Bugzilla bug #33187 is now fixed.
7564
7565 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7566
7567         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7568         instead of pp_and).
7569
7570         * expression.cs (Binary.ResolveOperator): I can only use the
7571         Concat (string, string, string) and Concat (string, string,
7572         string, string) if the child is actually a concatenation of
7573         strings. 
7574
7575 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7576
7577         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7578         context where we need a 2-character lookahead.
7579
7580         * pending.cs (PendingImplementation): Rework so we can keep track
7581         of interface types all the time, and flag those which were
7582         implemented by parents as optional.
7583
7584 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7585
7586         * expression.cs (Binary.ResolveOperator): Use
7587         String.Concat(string,string,string) or
7588         String.Concat(string,string,string,string) when possible. 
7589
7590         * typemanager: More helper methods.
7591
7592
7593 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7594
7595         * pending.cs: remove the bogus return from GetMissingInterfaces()
7596         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7597
7598 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7599
7600         * namespace.cs: avoid duplicated 'using xxx' being added to
7601         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7602         when we get more than one 'using' statement for the same namespace.
7603         Report a CS0105 warning for it.
7604
7605 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7606
7607         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7608         of calling getChar/putback, uses internal knowledge of it.    
7609
7610         (xtoken): Reorder tokenizer so most common patterns are checked
7611         first.  This reduces the compilation time in another 5% (from 8.11s
7612         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7613
7614         The parsing time is 22% of the compilation in mcs, and from that
7615         64% is spent on the tokenization process.  
7616
7617         I tried using a binary search for keywords, but this is slower
7618         than the hashtable.  Another option would be to do a couple of
7619         things:
7620
7621                 * Not use a StringBuilder, instead use an array of chars,
7622                   with a set value.  Notice that this way we could catch
7623                   the 645 error without having to do it *afterwards*.
7624
7625                 * We could write a hand-parser to avoid the hashtable
7626                   compares altogether.
7627
7628         The identifier consumption process takes 37% of the tokenization
7629         time.  Another 15% is spent on is_number.  56% of the time spent
7630         on is_number is spent on Int64.Parse:
7631
7632                 * We could probably choose based on the string length to
7633                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7634                   computations. 
7635
7636         Another 3% is spend on wrapping `xtoken' in the `token' function.
7637
7638         Handle 0xa0 as whitespace (#34752)
7639
7640 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7641
7642         * typemanager.cs (IsCLRType): New routine to tell whether a type
7643         is one of the builtin types.  
7644
7645         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7646         typecode in more places instead of doing pointer comparissions.
7647         We could leverage some knowledge about the way the typecodes are
7648         laid out.
7649
7650         New code to cache namespaces in assemblies, it is currently not
7651         invoked, to be used soon.
7652
7653         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7654
7655         * expression.cs (Binary.ResolveOperator): specially handle
7656         strings, and do not perform user-defined operator overloading for
7657         built-in types.
7658
7659 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7660
7661         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7662         internalcall as it is a pretty simple operation;  Avoid whenever
7663         possible to call Char.IsLetter.
7664
7665         (consume_identifier): Cut by half the number of
7666         hashtable calls by merging the is_keyword and GetKeyword behavior.
7667
7668         Do not short-circuit, because if we do, we
7669         report errors (ie, #if false && true would produce an invalid
7670         directive error);
7671
7672
7673 2002-11-24  Martin Baulig  <martin@ximian.com>
7674
7675         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7676         check constant ranges and report a CS0221.  Fixes #33186.
7677
7678 2002-11-24  Martin Baulig  <martin@ximian.com>
7679
7680         * cs-parser.jay: Make this work for uninitialized variable
7681         declarations in the `for' initializer.  Fixes #32416.
7682
7683 2002-11-24  Martin Baulig  <martin@ximian.com>
7684
7685         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7686         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7687
7688 2002-11-24  Martin Baulig  <martin@ximian.com>
7689
7690         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7691         argument; if true, we also check for user-defined conversions.
7692         This is only needed if both arguments are of a user-defined type.
7693         Fixes #30443, added test-175.cs.
7694         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7695
7696         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7697
7698 2002-11-24  Martin Baulig  <martin@ximian.com>
7699
7700         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7701         function to get the store opcode.
7702         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7703         only emit the Ldelema if the store opcode is Stobj.  You must run
7704         both test-34 and test-167 to test this.  Fixes #34529.
7705
7706 2002-11-23  Martin Baulig  <martin@ximian.com>
7707
7708         * ecore.cs (Expression.MemberLookup): Added additional
7709         `qualifier_type' argument which is used when we're being called
7710         from MemberAccess.DoResolve() and null if we're called from a
7711         SimpleName lookup.
7712         (Expression.MemberLookupFailed): New method to report errors; this
7713         does the CS1540 check and reports the correct error message.
7714
7715         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7716         argument for the CS1540 check and redone the way how we're dealing
7717         with private members.  See the comment in the source code for details.
7718         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7719         `closure_start_type' to `closure_qualifier_type' and check whether
7720         it's not null.  It was not this filter being broken, it was just
7721         being called with the wrong arguments.
7722
7723         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7724         and pass it the correct `qualifier_type'; this also does the error
7725         handling for us.
7726
7727 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7728
7729         * expression.cs (Invocation.EmitParams): If the we are dealing
7730         with a non-built-in value type, load its address as well.
7731
7732         (ArrayCreation): Use a a pretty constant instead
7733         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7734         static initializers.  
7735
7736         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7737         because they are not really value types, just glorified integers. 
7738
7739         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7740
7741         * ecore.cs: Remove redundant code for enumerations, make them use
7742         the same code path as everything else, fixes the casting issue
7743         with enumerations in Windows.Forms.
7744
7745         * attribute.cs: Do only cast to string if it is a string, the
7746         validation happens later.
7747
7748         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7749         people upgrade their corlibs.
7750
7751         * ecore.cs: Oops, enumerations were not following the entire code path
7752
7753 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7754
7755         * typemanager.cs (FilterWithClosure): Commented out the test for
7756         1540 in typemanager.cs, as it has problems when accessing
7757         protected methods from a parent class (see test-174.cs). 
7758
7759         * attribute.cs (Attribute.ValidateGuid): new method.
7760         (Attribute.Resolve): Use above.
7761
7762 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7763
7764         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7765
7766         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7767         handling for enumerations, as we only needed the TypeContainer
7768         functionality to begin with (this is required for the fix below to
7769         work for enums that reference constants in a container class for
7770         example). 
7771
7772         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7773
7774         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7775         a valid TypeBuilder to perform lookups on.o
7776
7777         * class.cs (InheritableMemberSignatureCompare): Use true in the
7778         call to GetGetMethod and GetSetMethod, because we are comparing
7779         the signature, and we need to get the methods *even* if they are
7780         private. 
7781
7782         (PropertyBase.CheckBase): ditto.
7783
7784         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7785         GotoCase.Resolve): Use Peel on EmpytCasts.
7786
7787         * ecore.cs (EmptyCast): drop child, add Peel method.
7788
7789 2002-11-17  Martin Baulig  <martin@ximian.com>
7790
7791         * ecore.cs (EmptyCast.Child): New public property.
7792
7793         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7794         label resolved to an EmptyCast.  Fixes #34162.
7795         (GotoCase.Resolve): Likewise.
7796         (Block.EmitMeta): Likewise.
7797
7798 2002-11-17  Martin Baulig  <martin@ximian.com>
7799
7800         * expression.cs (Invocation.BetterConversion): Prefer int over
7801         uint; short over ushort; long over ulong for integer literals.
7802         Use ImplicitConversionExists instead of StandardConversionExists
7803         since we also need to check for user-defined implicit conversions.
7804         Fixes #34165.  Added test-173.cs.
7805
7806 2002-11-16  Martin Baulig  <martin@ximian.com>
7807
7808         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7809         with the `true' and `false' literals.  Fixes #33151.
7810
7811 2002-11-16  Martin Baulig  <martin@ximian.com>
7812
7813         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7814         October 22nd; don't do the cs1540 check for static members.
7815
7816         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7817         now using our own filter here and doing the cs1540 check again.
7818
7819 2002-11-16  Martin Baulig  <martin@ximian.com>
7820
7821         * support.cs (InternalParameters): Don't crash if we don't have
7822         any fixed parameters.  Fixes #33532.
7823
7824 2002-11-16  Martin Baulig  <martin@ximian.com>
7825
7826         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7827         when looking up static methods to make this work on Windows.
7828         Fixes #33773.
7829
7830 2002-11-16  Martin Baulig  <martin@ximian.com>
7831
7832         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7833         a setter rather than using PropertyInfo.CanWrite.
7834
7835 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7836
7837         * class.cs: Allow acces to block member by subclasses. Fixes build
7838         breaker.
7839
7840 2002-11-14  Martin Baulig  <martin@ximian.com>
7841
7842         * class.cs (Constructor.Emit): Added the extern/block check.
7843         Fixes bug #33678.
7844
7845 2002-11-14  Martin Baulig  <martin@ximian.com>
7846
7847         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7848         iteration while looking for indexers, this is needed because the
7849         indexer may have a different name in our base classes.  Fixed the
7850         error reporting (no indexers at all, not get accessor, no
7851         overloaded match).  Fixes bug #33089.
7852         (IndexerAccess.DoResolveLValue): Likewise.
7853
7854 2002-11-14  Martin Baulig  <martin@ximian.com>
7855
7856         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7857         indexers.  Fixes the first part of bug #33089.
7858         (MethodSignature.InheritableMemberSignatureCompare): Added support
7859         for properties.
7860
7861 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7862
7863         * attribute.cs (Attribute.Resolve): Catch the
7864         NullReferenceException and report it since it isn't supposed to
7865         happen. 
7866
7867 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7868
7869         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7870         LogicalOr and LogicalAnd that can benefit from recursively
7871         handling EmitBranchable.  The code now should be nice for Paolo.
7872
7873 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
7874
7875         * typemanager.cs (LookupType): Added a negative-hit hashtable for
7876         the Type lookups, as we perform quite a number of lookups on
7877         non-Types.  This can be removed once we can deterministically tell
7878         whether we have a type or a namespace in advance.
7879
7880         But this might require special hacks from our corlib.
7881
7882         * TODO: updated.
7883
7884         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
7885         and double which avoids a conversion from an integer to a double.
7886
7887         * expression.cs: tiny optimization, avoid calling IsConstant,
7888         because it effectively performs the lookup twice.
7889
7890 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
7891
7892         But a bogus return here to keep the semantics of the old code
7893         until the Mono runtime is fixed.
7894
7895         * pending.cs (GetMissingInterfaces): New method used to remove all
7896         the interfaces that are already implemented by our parent
7897         classes from the list of pending methods. 
7898
7899         * interface.cs: Add checks for calls after ResolveTypeExpr.
7900
7901 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7902
7903         * class.cs (Class.Emit): Report warning 67: event not used if the
7904         warning level is beyond 3.
7905
7906         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7907         being a NullLiteral.
7908
7909         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7910         specifiers. 
7911
7912         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7913         path that might fail if a type can not be resolved.
7914
7915         * expression.cs (Binary.Emit): Emit unsigned versions of the
7916         operators. 
7917
7918         * driver.cs: use error 5.
7919
7920 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7921
7922         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7923
7924 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7925
7926         * cs-parser.jay (switch_section): A beautiful patch from Martin
7927         Baulig that fixed 33094.
7928
7929 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7930
7931         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7932         Check whether the base is abstract and report an error if so.
7933
7934         * expression.cs (IndexerAccess.DoResolveLValue,
7935         IndexerAccess.DoResolve): ditto. 
7936
7937         (Invocation.DoResolve): ditto.
7938
7939         (Invocation.FullMethodDesc): Improve the report string.
7940
7941         * statement.cs (Block): Eliminate IsVariableDefined as it is
7942         basically just a wrapper for GetVariableInfo.
7943
7944         * ecore.cs (SimpleName): Use new 
7945
7946         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7947         type, as we return the actual parameter ref/unref state on a
7948         different call.
7949
7950 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7951
7952         * support.cs: Return proper flags REF/OUT fixing the previous
7953         commit.  
7954
7955         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7956         not used to mean `ref' but `ref or out' in ParameterReference
7957
7958         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7959         full type signature instead of calling TypeManger.CSharpName
7960         ourselves. 
7961
7962         * support.cs (InternalParameters.ParameterDesc): Do not compare
7963         directly to the modflags, because REF/OUT will actually be bitsets
7964         if set. 
7965
7966         * delegate.cs (VerifyMethod): Check also the modifiers.
7967
7968         * cs-tokenizer.cs: Fix bug where floating point values with an
7969         exponent where a sign was missing was ignored.
7970
7971         * driver.cs: Allow multiple assemblies to be specified in a single
7972         /r: argument
7973
7974 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7975
7976         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7977         because identifiers after a parenthesis would end up in this kind
7978         of production, and we needed to desamiguate it for having casts
7979         like:
7980
7981                 (UserDefinedType *) xxx
7982
7983 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7984
7985         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7986         we should set on the Bindingflags.NonPublic, but not turn on
7987         private_ok.  private_ok controls whether a Private member is
7988         returned (this is chekced on the filter routine), while the
7989         BindingFlags.NonPublic just controls whether private/protected
7990         will be allowed.   This fixes the problem part of the problem of
7991         private properties being allowed to be used in derived classes.
7992
7993         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7994         so we can call the children DoResolveLValue method (this will
7995         properly signal errors on lvalue assignments to base properties)
7996
7997         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7998         getter are null, and we have a property info, we know that this
7999         happened because the lookup failed, so we report an error 122 for
8000         protection level violation.
8001
8002         We also silently return if setter and getter are null in the
8003         resolve functions, this condition only happens if we have flagged
8004         the error before.  This is the other half of the problem. 
8005
8006         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8007         not have accessibility information, that is why we were returning
8008         true in the filter function in typemanager.cs.
8009
8010         To properly report 122 (property is inaccessible because of its
8011         protection level) correctly, we report this error in ResolveAccess
8012         by failing if both the setter and the getter are lacking (ie, the
8013         lookup failed). 
8014
8015         DoResolve and DoLResolve have been modified to check for both
8016         setter/getter being null and returning silently, the reason being
8017         that I did not want to put the knowledge about this error in upper
8018         layers, like:
8019
8020         int old = Report.Errors;
8021         x = new PropertyExpr (...);
8022         if (old != Report.Errors)
8023                 return null;
8024         else
8025                 return x;
8026
8027         So the property expr is returned, but it is invalid, so the error
8028         will be flagged during the resolve process. 
8029
8030         * class.cs: Remove InheritablePropertySignatureCompare from the
8031         class, as we no longer depend on the property signature to compute
8032         whether it is possible to implement a method or not.
8033
8034         The reason is that calling PropertyInfo.GetGetMethod will return
8035         null (in .NET, in Mono it works, and we should change this), in
8036         cases where the Get Method does not exist in that particular
8037         class.
8038
8039         So this code:
8040
8041         class X { public virtual int A { get { return 1; } } }
8042         class Y : X { }
8043         class Z : Y { public override int A { get { return 2; } } }
8044
8045         Would fail in Z because the parent (Y) would not have the property
8046         defined.  So we avoid this completely now (because the alternative
8047         fix was ugly and slow), and we now depend exclusively on the
8048         method names.
8049
8050         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8051         reference method, instead of using the property.
8052
8053         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8054         routines are gone now.
8055
8056         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8057         names, they were incorrectly named.
8058
8059         * cs-tokenizer.cs: Return are more gentle token on failure. 
8060
8061         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8062         had an out-of-sync index variable, which caused it to remove from
8063         the list of pending methods the wrong method sometimes.
8064
8065 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8066
8067         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8068         CanWrite, because those refer to this particular instance of the
8069         property, and do not take into account the fact that we can
8070         override single members of a property.
8071
8072         Constructor requires an EmitContext.  The resolution process does
8073         not happen here, but we need to compute the accessors before,
8074         because the resolution does not always happen for properties.
8075
8076         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8077         subclass, before we did not update this flag, but we did update
8078         bindingflags. 
8079
8080         (GetAccessors): Drop this routine, as it did not work in the
8081         presence of partially overwritten set/get methods. 
8082
8083         Notice that this broke the cs1540 detection, but that will require
8084         more thinking. 
8085
8086 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8087
8088         * class.cs:
8089         * codegen.cs:
8090         * driver.cs: issue a warning instead of an error if we don't support
8091         debugging for the platform. Also ignore a couple of errors that may
8092         arise when trying to write the symbols. Undo my previous patch.
8093
8094 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8095
8096         * driver.cs: ignore /debug switch except for Unix platforms.
8097
8098 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8099
8100         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8101
8102 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8103
8104         * driver.cs: Do not make mcs-debug conditional, so we do not break
8105         builds that use it.
8106
8107         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8108         review this patch.  But basically after all the children variables
8109         have been merged, the value of "Breaks" was not being set to
8110         new_breaks for Switch blocks.  I think that it should be set after
8111         it has executed.  Currently I set this to the value of new_breaks,
8112         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8113         conservative, but I do not understand this code very well.
8114
8115         I did not break anything in the build, so that is good ;-)
8116
8117         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8118
8119 2002-10-20  Mark Crichton  <crichton@gimp.org>
8120
8121         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8122
8123 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8124
8125         * cfold.cs: Fixed compile blocker.
8126
8127 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8128
8129         * driver.cs: I was chekcing the key, not the file.
8130
8131 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8132
8133         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8134         message that we were generating - we just need to silently return
8135         a null.
8136
8137 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8138
8139         * class.cs (Event.Define): Change my previous commit, as this
8140         breaks the debugger.  This is a temporary hack, as it seems like
8141         the compiler is generating events incorrectly to begin with.
8142
8143         * expression.cs (Binary.ResolveOperator): Added support for 
8144         "U operator - (E x, E y)"
8145
8146         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8147         y)".
8148
8149         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8150         init-only variables, but this path did not take into account that
8151         there might be also instance readonly variables.  Correct this
8152         problem. 
8153
8154         This fixes bug 32253
8155
8156         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8157         delegates as well.
8158
8159         * driver.cs: Change the extension for modules to `netmodule'
8160
8161         * cs-parser.jay: Improved slightly the location tracking for
8162         the debugger symbols.
8163
8164         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8165         modifiers that were specified instead of the hardcoded value
8166         (FamAndAssem).  This was basically ignoring the static modifier,
8167         and others.  Fixes 32429.
8168
8169         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8170         fixed a bug in the process (32476)
8171
8172         * expression.cs (ArrayAccess.EmitAssign): Patch from
8173         hwang_rob@yahoo.ca that fixes bug 31834.3
8174
8175 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8176
8177         * driver.cs: Make the module extension .netmodule.
8178
8179 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8180
8181         * driver.cs: Report an error if the resource file is not found
8182         instead of crashing.
8183
8184         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8185         false, like Emit does.
8186
8187 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8188
8189         * typemanager.cs: Remove unused private member.  Also reported mcs
8190         bug to report this as a warning like csc.
8191
8192 2002-10-15  Martin Baulig  <martin@gnome.org>
8193
8194         * statement.cs (Statement.Emit): Made this a virtual method; emits
8195         the line number info and calls DoEmit().
8196         (Statement.DoEmit): New protected abstract method, formerly knows
8197         as Statement.Emit().
8198
8199         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8200
8201 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8202
8203         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8204         have fixed a remaining problem: not every AddXXXX was adding a
8205         fully qualified name.  
8206
8207         Now everyone registers a fully qualified name in the DeclSpace as
8208         being defined instead of the partial name.  
8209
8210         Downsides: we are slower than we need to be due to the excess
8211         copies and the names being registered this way.  
8212
8213         The reason for this is that we currently depend (on the corlib
8214         bootstrap for instance) that types are fully qualified, because
8215         we dump all the types in the namespace, and we should really have
8216         types inserted into the proper namespace, so we can only store the
8217         basenames in the defined_names array.
8218
8219 2002-10-10  Martin Baulig  <martin@gnome.org>
8220
8221         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8222         from bug #31834, see the bug report for a testcase which is
8223         miscompiled.
8224
8225 2002-10-10  Martin Baulig  <martin@gnome.org>
8226
8227         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8228         flow analysis code for this.
8229
8230         * statement.cs (Do, While, For): Tell the flow analysis code about
8231         infinite loops.
8232         (FlowBranching.UsageVector): Added support for infinite loops.
8233         (Block.Resolve): Moved the dead code elimination here and use flow
8234         analysis to do it.
8235
8236 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8237
8238         * class.cs (Field.Define): Catch cycles on struct type
8239         definitions. 
8240
8241         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8242         fields if the fields are static.  We only need to check instance
8243         fields. 
8244
8245         * expression.cs (As.DoResolve): Test for reference type.
8246
8247         * statement.cs (Using.ResolveExpression): Use
8248         ConvertImplicitRequired, not ConvertImplicit which reports an
8249         error on failture
8250         (Using.ResolveLocalVariableDecls): ditto.
8251
8252         * expression.cs (Binary.ResolveOperator): Report errors in a few
8253         places where we had to.
8254
8255         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8256
8257 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8258
8259         * expression.cs: Use StoreFromPtr instead of extracting the type
8260         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8261
8262         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8263         an enumeration value to a System.Enum, but System.Enum is not a
8264         value type, but an class type, so we need to box.
8265
8266         (Expression.ConvertExplicit): One codepath could return
8267         errors but not flag them.  Fix this.  Fixes #31853
8268
8269         * parameter.cs (Resolve): Do not allow void as a parameter type.
8270
8271 2002-10-06  Martin Baulig  <martin@gnome.org>
8272
8273         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8274         if it's a class type and not a struct.  Fixes #31815.
8275
8276 2002-10-06  Martin Baulig  <martin@gnome.org>
8277
8278         * statement.cs: Reworked the flow analysis code a bit to make it
8279         usable for dead code elimination.
8280
8281 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8282
8283         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8284
8285 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8286
8287         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8288         to fix the test 165, will investigate deeper.
8289
8290 2002-10-04  Martin Baulig  <martin@gnome.org>
8291
8292         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8293         finally blocks actually work.
8294         (Try.Resolve): We don't need to create a sibling for `finally' if
8295         there is no finally block.
8296
8297 2002-10-04  Martin Baulig  <martin@gnome.org>
8298
8299         * class.cs (Constructor.Define): The default accessibility for a
8300         non-default constructor is private, not public.
8301
8302 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8303
8304         * class.cs (Constructor): Make AllowedModifiers public, add
8305         EXTERN.
8306
8307         * cs-parser.jay: Perform the modifiers test here, as the
8308         constructor for the Constructor class usually receives a zero
8309         because of the way we create it (first we create, later we
8310         customize, and we were never checking the modifiers).
8311
8312         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8313         is a version of LookupTypeReflection that includes the type-name
8314         cache.  This can be used as a fast path for functions that know
8315         the fully qualified name and are only calling into *.GetType() to
8316         obtain a composed type.
8317
8318         This is also used by TypeManager.LookupType during its type
8319         composition.
8320
8321         (LookupType): We now also track the real type name, as sometimes
8322         we can get a quey for the real type name from things like
8323         ComposedCast.  This fixes bug 31422.
8324
8325         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8326         complete type fullname, it does not have to go through the type
8327         resolution system to obtain the composed version of the type (for
8328         obtaining arrays or pointers).
8329
8330         (Conditional.Emit): Use the EmitBoolExpression to
8331         generate nicer code, as requested by Paolo.
8332
8333         (ArrayCreation.CheckIndices): Use the patch from
8334         hwang_rob@yahoo.ca to validate the array initializers. 
8335
8336 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8337
8338         * class.cs (ConstructorInitializer.Emit): simplify code by using
8339         Invocation.EmitCall, and at the same time, fix the bugs in calling
8340         parent constructors that took variable arguments. 
8341
8342         * ecore.cs (Expression.ConvertNumericExplicit,
8343         Expression.ImplicitNumericConversion): Remove the code that
8344         manually wrapped decimal (InternalTypeConstructor call is now gone
8345         as well).
8346
8347         * expression.cs (Cast.TryReduce): Also handle decimal types when
8348         trying to perform a constant fold on the type.
8349
8350         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8351
8352         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8353         that only turned off an error report, and did nothing else. 
8354
8355 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8356
8357         * driver.cs: Handle and ignore /fullpaths
8358
8359 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8360
8361         * expression.cs (Binary.ResolveOperator): Catch the case where
8362         DoNumericPromotions returns true, 
8363
8364         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8365
8366 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8367
8368         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8369         report error 70.
8370
8371 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8372
8373         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8374         conversion exists, but it is also required that the conversion be
8375         performed.  This manifested in "(Type64Enum) 2".  
8376
8377         * class.cs (TypeManager.AddMethod): The fix is not to change
8378         AddEnum, because that one was using a fully qualified name (every
8379         DeclSpace derivative does), but to change the AddMethod routine
8380         that was using an un-namespaced name.  This now correctly reports
8381         the duplicated name.
8382
8383         Revert patch until I can properly fix it.  The issue
8384         is that we have a shared Type space across all namespaces
8385         currently, which is wrong.
8386
8387         Options include making the Namespace a DeclSpace, and merge
8388         current_namespace/current_container in the parser.
8389
8390 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8391
8392         * cs-parser.jay: Improve error reporting when we get a different
8393         kind of expression in local_variable_type and
8394         local_variable_pointer_type. 
8395
8396         Propagate this to avoid missleading errors being reported.
8397
8398         * ecore.cs (ImplicitReferenceConversion): treat
8399         TypeManager.value_type as a target just like object_type.   As
8400         code like this:
8401
8402         ValueType v = 1;
8403
8404         Is valid, and needs to result in the int 1 being boxed before it
8405         is assigned to the value type v.
8406
8407         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8408         to validate the enumeration name.
8409
8410         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8411         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8412         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8413
8414         * ecore.cs (TryImplicitIntConversion): When doing an
8415         implicit-enumeration-conversion, check if the type is 64-bits and
8416         perform a conversion before passing to EnumConstant.
8417
8418 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8419
8420         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8421         report ambiguous type references.  Unlike the MS version, we
8422         report what the ambiguity is.   Innovation at work ;-)
8423
8424         (DeclSpace.FindType): Require a location argument to
8425         display when we display an ambiguous error.
8426
8427         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8428
8429         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8430
8431         * expression.cs (EmitDynamicInitializers): Apply patch from
8432         hwang_rob@yahoo.ca that fixes the order in which we emit our
8433         initializers. 
8434
8435 2002-09-21  Martin Baulig  <martin@gnome.org>
8436
8437         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8438         delegate takes no arguments.
8439
8440 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8441
8442         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8443         from integers.
8444
8445         * expression.cs: Extract the underlying type.
8446
8447         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8448
8449         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8450
8451 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8452
8453         * class.cs (TypeContainer.DefineType): We can not use the nice
8454         PackingSize with the size set to 1 DefineType method, because it
8455         will not allow us to define the interfaces that the struct
8456         implements.
8457
8458         This completes the fixing of bug 27287
8459
8460         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8461         means also structs.  This fixes part of the problem. 
8462         (Expresion.ImplicitReferenceConversionExists): ditto.
8463
8464         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8465         error if there were no errors reported during the type lookup
8466         process, to avoid duplicates or redundant errors.  Without this
8467         you would get an ambiguous errors plus a type not found.  We have
8468         beaten the user enough with the first error.  
8469
8470         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8471         reference. 
8472
8473         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8474         during the resolution process, stop the lookup, this avoids
8475         repeated error reports (same error twice).
8476
8477         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8478
8479         * typemanager.cs (LookupType): Redo the type lookup code to match
8480         the needs of System.Reflection.  
8481
8482         The issue is that System.Reflection requires references to nested
8483         types to begin with a "+" sign instead of a dot.  So toplevel
8484         types look like: "NameSpace.TopLevelClass", and nested ones look
8485         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8486         levels. 
8487
8488 2002-09-19  Martin Baulig  <martin@gnome.org>
8489
8490         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8491         says that a method always returns or always throws an exception,
8492         don't report the CS0161.
8493
8494         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8495         set `Returns = new_returns'.
8496
8497 2002-09-19  Martin Baulig  <martin@gnome.org>
8498
8499         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8500         to an enum constant, check for a CS0176.
8501
8502 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8503
8504         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8505         for operators that must be in pairs and report errors.
8506
8507         * ecore.cs (SimpleName.DoResolveType): During the initial type
8508         resolution process, when we define types recursively, we must
8509         check first for types in our current scope before we perform
8510         lookups in the enclosing scopes.
8511
8512         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8513
8514         (Invocation.VerifyArgumentsCompat): Call
8515         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8516         I thought we were supposed to always call this, but there are a
8517         few places in the code where we dont do it.
8518
8519 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8520
8521         * driver.cs: Add support in -linkres and -resource to specify the
8522         name of the identifier.
8523
8524 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8525
8526         * ecore.cs (StandardConversionExists): Sync with the conversion
8527         code: allow anything-* to void* conversions.
8528
8529         (FindMostSpecificSource): Use an Expression argument
8530         instead of a Type, because we might be handed over a Literal which
8531         gets a few more implicit conversions that plain types do not.  So
8532         this information was being lost.
8533
8534         Also, we drop the temporary type-holder expression when not
8535         required.
8536
8537 2002-09-17  Martin Baulig  <martin@gnome.org>
8538
8539         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8540         this is an explicit interface implementation.
8541
8542 2002-09-17  Martin Baulig  <martin@gnome.org>
8543
8544         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8545         different `IndexerName' attributes.
8546
8547         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8548         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8549         virtual CommonResolve().
8550
8551 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8552
8553         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8554         and convert that to the UnderlyingType.
8555
8556         * statement.cs (Foreach.Resolve): Indexers are just like variables
8557         or PropertyAccesses.
8558
8559         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8560         inside quoted strings, we were not doing this before.
8561
8562 2002-09-16  Martin Baulig  <martin@gnome.org>
8563
8564         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8565         resolve it.  This is needed for the definite assignment check of the
8566         instance expression, fixes bug #29846.
8567         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8568
8569 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8570
8571         * parameter.cs: Fix compile error.  Cannot reference static member
8572         from an instance object.  Is this an mcs bug?
8573
8574 2002-09-14  Martin Baulig  <martin@gnome.org>
8575
8576         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8577         multiple times.  Fixes bug #30295, added test-166.cs.
8578
8579 2002-09-14  Martin Baulig  <martin@gnome.org>
8580
8581         * statement.cs (Block.Emit): Don't emit unreachable code.
8582         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8583         `break' statements.
8584         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8585
8586 2002-09-14  Martin Baulig  <martin@gnome.org>
8587
8588         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8589         is set.
8590
8591 2002-09-14  Martin Baulig  <martin@gnome.org>
8592
8593         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8594         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8595         be false on the ms runtime.
8596
8597 2002-09-13  Martin Baulig  <martin@gnome.org>
8598
8599         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8600         the CS0038 error message.
8601
8602 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8603
8604         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8605         constant inside, return it.
8606
8607 2002-09-12  Martin Baulig  <martin@gnome.org>
8608
8609         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8610         implicit conversion can be done between enum types.
8611
8612         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8613         check whether an implicit conversion to the current enum's UnderlyingType
8614         exists and report an error if not.
8615
8616         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8617         without debugging support.
8618
8619         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8620         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8621
8622 2002-09-12  Martin Baulig  <martin@gnome.org>
8623
8624         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8625
8626         * ecore.cs (IMemberExpr.DeclaringType): New property.
8627         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8628         nonstatic member of an outer type (CS0038).
8629
8630 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8631
8632         * driver.cs: Activate the using-error detector at warning level
8633         4 (at least for MS-compatible APIs).
8634
8635         * namespace.cs (VerifyUsing): Small buglett fix.
8636
8637         * pending.cs (PendingImplementation): pass the container pointer. 
8638
8639         * interface.cs (GetMethods): Allow for recursive definition.  Long
8640         term, I would like to move every type to support recursive
8641         definitions, not the current ordering mechanism that we have right
8642         now.
8643
8644         The situation is this: Attributes are handled before interfaces,
8645         so we can apply attributes to interfaces.  But some attributes
8646         implement interfaces, we will now handle the simple cases
8647         (recursive definitions will just get an error).  
8648
8649         * parameter.cs: Only invalidate types at the end if we fail to
8650         lookup all types.  
8651
8652 2002-09-09  Martin Baulig  <martin@gnome.org>
8653
8654         * ecore.cs (PropertyExpr.Emit): Also check for
8655         TypeManager.system_int_array_get_length so this'll also work when
8656         compiling corlib.  Fixes #30003.
8657
8658 2002-09-09  Martin Baulig  <martin@gnome.org>
8659
8660         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8661         and throw an exception if we can't get the type's size.  Fixed #30040,
8662         added test-165.cs.
8663
8664 2002-09-09  Martin Baulig  <martin@gnome.org>
8665
8666         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8667
8668         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8669         context.  Fixes bug #30027.
8670
8671         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8672         virtual functions.  Fixes bug #30043, added test-164.cs.
8673
8674 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8675
8676         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8677
8678 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8679
8680         * driver.cs: Use an object to get the windows codepage since it's not a
8681         static property.
8682
8683 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8684
8685         * statement.cs (For.Emit): for infinite loops (test == null)
8686         return whether there is a break inside, not always "true".
8687
8688         * namespace.cs (UsingEntry): New struct to hold the name of the
8689         using definition, the location where it is defined, and whether it
8690         has been used in a successful type lookup.
8691
8692         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8693         strings.
8694
8695         * decl.cs: ditto.
8696
8697 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8698
8699         * attribute.cs : Fix incorrect code which relied on catching
8700         a NullReferenceException to detect a null being passed in
8701         where an object was expected.
8702
8703 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8704
8705         * statement.cs (Try): flag the catch variable as assigned
8706
8707         * expression.cs (Cast): Simplified by using ResolveType instead of
8708         manually resolving.
8709
8710         * statement.cs (Catch): Fix bug by using ResolveType.
8711
8712 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8713
8714         * expression.cs (BetterConversion): Special case for when we have
8715         a NullLiteral as the argument and we have to choose between string
8716         and object types - we choose string the way csc does.
8717
8718         * attribute.cs (Attribute.Resolve): Catch the
8719         NullReferenceException and report error #182 since the Mono
8720         runtime no more has the bug and having this exception raised means
8721         we tried to select a constructor which takes an object and is
8722         passed a null.
8723
8724 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8725
8726         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8727         message (1502, 1503) when we can't locate a method after overload
8728         resolution. This is much more informative and closes the bug
8729         Miguel reported.
8730
8731         * interface.cs (PopulateMethod): Return if there are no argument
8732         types. Fixes a NullReferenceException bug.
8733
8734         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8735         expressions too. Previously we were checking only in one place for
8736         positional arguments leaving out named arguments.
8737
8738         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8739         type to the enum type is not allowed. Remove code corresponding to
8740         that.
8741
8742         (ConvertNumericExplicit): Allow explicit conversions from
8743         the underlying type to enum type. This precisely follows the spec
8744         and closes a bug filed by Gonzalo.
8745
8746 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8747
8748         * compiler.csproj:
8749         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8750
8751 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8752
8753         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8754         it was important that we stored the right value after the
8755         reduction in `converted'.
8756
8757 2002-09-04  Martin Baulig  <martin@gnome.org>
8758
8759         * location.cs (Location.SymbolDocument): Use full pathnames for the
8760         source files.
8761
8762 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8763
8764         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8765         of the expression resolve mechanism, because that will catch the
8766         SimpleName error failures.
8767
8768         (Conditional): If we can not resolve the
8769         expression, return, do not crash.
8770
8771 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8772
8773         * cs-tokenizer.cs:
8774         (location): display token name instead of its number.
8775
8776 2002-08-28  Martin Baulig  <martin@gnome.org>
8777
8778         * expression.cs (Binary.ResolveOperator): Don't silently return
8779         but return an error if an operator cannot be applied between two
8780         enum types.
8781
8782 2002-08-28  Martin Baulig  <martin@gnome.org>
8783
8784         * class.cs (Constructor.Define): Set the permission attributes
8785         correctly instead of making all constructors public.
8786
8787 2002-08-28  Martin Baulig  <martin@gnome.org>
8788
8789         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8790         for private members before reporting a CS0103; if we find anything,
8791         it's a CS0122.
8792
8793 2002-08-28  Martin Baulig  <martin@gnome.org>
8794
8795         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8796         to check whether `closure_start_type == closure_invocation_type',
8797         we also need to check whether `m.DeclaringType == closure_invocation_type'
8798         before bypassing the permission checks.  We might be accessing
8799         protected/private members from the base class.
8800         (TypeManager.RealMemberLookup): Only set private_ok if private
8801         members were requested via BindingFlags.NonPublic.
8802
8803         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8804
8805         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8806         MethodGroupExpr.IsExplicitImpl if appropriate.
8807         (Invocation.DoResolve): Don't report the CS0120 for explicit
8808         interface implementations.
8809
8810 2002-08-27  Martin Baulig  <martin@gnome.org>
8811
8812         * expression.cs (Invocation.DoResolve): If this is a static
8813         method and we don't have an InstanceExpression, we must report
8814         a CS0120.
8815
8816 2002-08-25  Martin Baulig  <martin@gnome.org>
8817
8818         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8819         `==' between a valuetype and an object.
8820
8821 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8822
8823         * ecore.cs (TypeExpr): Provide a ToString method.
8824
8825 2002-08-24  Martin Baulig  <martin@gnome.org>
8826
8827         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8828         now called proggie.dbg and it's a binary file.
8829
8830 2002-08-23  Martin Baulig  <martin@gnome.org>
8831
8832         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8833
8834 2002-08-23  Martin Baulig  <martin@gnome.org>
8835
8836         * struct.cs (MyStructInfo.ctor): Make this work with empty
8837         structs; it's not allowed to use foreach() on null.
8838
8839 2002-08-23  Martin Baulig  <martin@gnome.org>
8840
8841         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8842         writer the full pathname of the generated assembly.
8843
8844 2002-08-23  Martin Baulig  <martin@gnome.org>
8845
8846         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8847         A `finally' block never returns or breaks; improved handling of
8848         unreachable code.
8849
8850 2002-08-23  Martin Baulig  <martin@gnome.org>
8851
8852         * statement.cs (Throw.Resolve): Allow `throw null'.
8853
8854 2002-08-23  Martin Baulig  <martin@gnome.org>
8855
8856         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8857         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8858         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8859         MemberLookup would return a wrong event if this is an explicit
8860         interface implementation and the class has an event with the same
8861         name.
8862
8863 2002-08-23  Martin Baulig  <martin@gnome.org>
8864
8865         * statement.cs (Block.AddChildVariableNames): New public method.
8866         (Block.AddChildVariableName): Likewise.
8867         (Block.IsVariableNameUsedInChildBlock): Likewise.
8868         (Block.AddVariable): Check whether a variable name has already
8869         been used in a child block.
8870
8871         * cs-parser.jay (declare_local_variables): Mark all variable names
8872         from the current block as being used in a child block in the
8873         implicit block.
8874
8875 2002-08-23  Martin Baulig  <martin@gnome.org>
8876
8877         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
8878         find the symbol writer.
8879
8880         * driver.cs: csc also allows the arguments to /define being
8881         separated by commas, not only by semicolons.
8882
8883 2002-08-23  Martin Baulig  <martin@gnome.org>
8884
8885         * interface.cs (Interface.GetMembers): Added static check for events.
8886
8887 2002-08-15  Martin Baulig  <martin@gnome.org>
8888
8889         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
8890         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
8891
8892         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8893         why the MethodData.EmitDestructor() change was necessary.
8894
8895 2002-08-20  Martin Baulig  <martin@gnome.org>
8896
8897         * class.cs (TypeContainer.FindMembers): Added static check for events.
8898
8899         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8900
8901         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8902         use Type.GetEvents(), not Type.FindMembers().
8903
8904 2002-08-20  Martin Baulig  <martin@gnome.org>
8905
8906         * decl.cs (MemberCache): Added a special method cache which will
8907         be used for method-only searched.  This ensures that a method
8908         search will return a MethodInfo with the correct ReflectedType for
8909         inherited methods.      
8910
8911 2002-08-20  Martin Baulig  <martin@gnome.org>
8912
8913         * decl.cs (DeclSpace.FindMembers): Made this public.
8914
8915 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8916
8917         * delegate.cs: fixed build on windows.
8918         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8919
8920 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8921
8922         * ecore.cs (StandardConversionExists): Return a false
8923         if we are trying to convert the void type to anything else
8924         since that is not allowed.
8925
8926         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8927         we flag error 70 in the event an event is trying to be accessed
8928         directly from outside the declaring type.
8929
8930 2002-08-20  Martin Baulig  <martin@gnome.org>
8931
8932         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8933         MemberCache from typemanager.cs to decl.cs.
8934
8935 2002-08-19  Martin Baulig  <martin@gnome.org>
8936
8937         * class.cs (TypeContainer): Implement IMemberContainer.
8938         (TypeContainer.DefineMembers): Create the MemberCache.
8939         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8940         return public members if BindingFlags.Public was given, check
8941         whether members are static.
8942
8943 2002-08-16  Martin Baulig  <martin@gnome.org>
8944
8945         * decl.cs (DeclSpace.Define): Splitted this in Define and
8946         DefineMembers.  DefineMembers is called first and initializes the
8947         MemberCache.
8948
8949         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8950         DefineMembers() on all our DeclSpaces.
8951
8952         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8953         but call DefineMembers() on all nested interfaces.  We call their
8954         Define() in our new Define() function.
8955
8956         * interface.cs (Interface): Implement IMemberContainer.
8957         (Interface.Define): Moved all code except the attribute stuf to
8958         DefineMembers().
8959         (Interface.DefineMembers): Initialize the member cache.
8960
8961         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8962         need this anymore since we can use MemberCache.FindMembers directly.
8963
8964 2002-08-19  Martin Baulig  <martin@gnome.org>
8965
8966         * typemanager.cs (MemberCache): When creating the cache for an
8967         interface type, add all inherited members.
8968         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8969         to `out bool used_cache' and documented it.
8970         (TypeManager.MemberLookup): If we already used the cache in the first
8971         iteration, we don't need to do the interfaces check.
8972
8973 2002-08-19  Martin Baulig  <martin@gnome.org>
8974
8975         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8976         here from IMemberFinder and don't implement this interface anymore.
8977         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8978
8979         * typemanager.cs (IMemberFinder): This interface is now only used by
8980         classes which actually support the member cache.
8981         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8982         since we only put DeclSpaces into this Hashtable.
8983         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8984         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8985
8986 2002-08-16  Martin Baulig  <martin@gnome.org>
8987
8988         * typemanager.cs (ICachingMemberFinder): Removed.
8989         (IMemberFinder.MemberCache): New property.
8990         (TypeManager.FindMembers): Merged this with RealFindMembers().
8991         This function will never be called from TypeManager.MemberLookup()
8992         so we can't use the cache here, just the IMemberFinder.
8993         (TypeManager.MemberLookup_FindMembers): Check whether the
8994         IMemberFinder has a MemberCache and call the cache's FindMembers
8995         function.
8996         (MemberCache): Rewrote larger parts of this yet another time and
8997         cleaned it up a bit.
8998
8999 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
9000
9001         * driver.cs (LoadArgs): Support quoting.
9002
9003         (Usage): Show the CSC-like command line arguments.
9004
9005         Improved a few error messages.
9006
9007 2002-08-15  Martin Baulig  <martin@gnome.org>
9008
9009         * typemanager.cs (IMemberContainer.Type): New property.
9010         (IMemberContainer.IsInterface): New property.
9011
9012         The following changes are conditional to BROKEN_RUNTIME, which is
9013         defined at the top of the file.
9014
9015         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9016         class'es members, but add all members from TypeHandle.ObjectType
9017         if we're an interface.
9018         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9019         is the current type.
9020         (MemberCache.CacheEntry.Container): Removed this field.
9021         (TypeHandle.GetMembers): Include inherited members.
9022
9023 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9024
9025         * typemanager.cs: fixed compilation and added a comment on a field that
9026         is never used.
9027
9028 2002-08-15  Martin Baulig  <martin@gnome.org>
9029
9030         * class.cs (ConstructorInitializer.Resolve): In the
9031         Expression.MemberLookup call, use the queried_type as
9032         invocation_type.
9033
9034         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9035         declared' attribute, it's always true.
9036         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9037         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9038         temporary wrapper for FindMembers which tells MemberLookup whether
9039         members from the base classes are included in the return value.
9040         This will go away soon.
9041         (TypeManager.MemberLookup): Use this temporary hack here; once the
9042         new MemberCache is completed, we don't need to do the DeclaredOnly
9043         looping here anymore since the MemberCache will take care of this.
9044         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9045         (MemberCache): When creating the MemberCache for a class, get
9046         members from the current class and all its base classes.
9047         (MemberCache.CacheEntry.Container): New field.  This is a
9048         temporary hack until the Mono runtime is fixed to distinguish
9049         between ReflectedType and DeclaringType.  It allows us to use MCS
9050         with both the MS runtime and the unfixed Mono runtime without
9051         problems and without accecting performance.
9052         (MemberCache.SearchMembers): The DeclaredOnly looping from
9053         TypeManager.MemberLookup is now done here.      
9054
9055 2002-08-14  Martin Baulig  <martin@gnome.org>
9056
9057         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9058         Type.GetFields on dynamic types but get the fields from the
9059         corresponding TypeContainer.
9060         (MyStructInfo.GetStructInfo): Added check for enum types.
9061
9062         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9063         (MemberList.SyncRoot): Implemented.
9064         (TypeManager.FilterWithClosure): No need to check permissions if
9065         closure_start_type == closure_invocation_type, don't crash if
9066         closure_invocation_type is null.
9067
9068 2002-08-13  Martin Baulig  <martin@gnome.org>
9069
9070         Rewrote TypeContainer.FindMembers to use a member cache.  This
9071         gives us a speed increase of about 35% for the self-hosting MCS
9072         build and of about 15-20% for the class libs (both on GNU/Linux).
9073
9074         * report.cs (Timer): New class to get enhanced profiling.  This
9075         whole class is "TIMER" conditional since it remarkably slows down
9076         compilation speed.
9077
9078         * class.cs (MemberList): New class.  This is an IList wrapper
9079         which we're now using instead of passing MemberInfo[]'s around to
9080         avoid copying this array unnecessarily.
9081         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9082         (ICachingMemberFinder, IMemberContainer): New interface.
9083         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9084         has already been checked, otherwise use it for the name comparision.
9085         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9086         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9087         if possible.  Returns a MemberList, not a MemberInfo [].
9088         (TypeHandle): New class, implements IMemberContainer.  We create
9089         one instance of this class per type, it contains a MemberCache
9090         which is used to do the member lookups.
9091         (MemberCache): New class.  Each instance of this class contains
9092         all members of a type and a name-based hash table.
9093         (MemberCache.FindMembers): This is our new member lookup
9094         function.  First, it looks up all members of the requested name in
9095         the hash table.  Then, it walks this list and sorts out all
9096         applicable members and returns them.
9097
9098 2002-08-13  Martin Baulig  <martin@gnome.org>
9099
9100         In addition to a nice code cleanup, this gives us a performance
9101         increase of about 1.4% on GNU/Linux - not much, but it's already
9102         half a second for the self-hosting MCS compilation.
9103
9104         * typemanager.cs (IMemberFinder): New interface.  It is used by
9105         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9106         Enum, Delegate or Interface.
9107         (TypeManager.finder_to_member_finder): New PtrHashtable.
9108         (TypeManager.finder_to_container): Removed.
9109         (TypeManager.finder_to_delegate): Removed.
9110         (TypeManager.finder_to_interface): Removed.
9111         (TypeManager.finder_to_enum): Removed.
9112
9113         * interface.cs (Interface): Implement IMemberFinder.
9114
9115         * delegate.cs (Delegate): Implement IMemberFinder.
9116
9117         * enum.cs (Enum): Implement IMemberFinder.
9118
9119         * class.cs (TypeContainer): Implement IMemberFinder.
9120
9121 2002-08-12  Martin Baulig  <martin@gnome.org>
9122
9123         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9124
9125 2002-08-12  Martin Baulig  <martin@gnome.org>
9126
9127         * ecore.cs (ITypeExpression): New interface for expressions which
9128         resolve to a type.
9129         (TypeExpression): Renamed to TypeLookupExpression.
9130         (Expression.DoResolve): If we're doing a types-only lookup, the
9131         expression must implement the ITypeExpression interface and we
9132         call DoResolveType() on it.
9133         (SimpleName): Implement the new ITypeExpression interface.
9134         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9135         hack, the situation that we're only looking up types can't happen
9136         anymore when this method is called.  Moved the type lookup code to
9137         DoResolveType() and call it.
9138         (SimpleName.DoResolveType): This ITypeExpression interface method
9139         is now doing the types-only lookup.
9140         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9141         (ResolveFlags): Added MaskExprClass.
9142
9143         * expression.cs (MemberAccess): Implement the ITypeExpression
9144         interface.
9145         (MemberAccess.DoResolve): Added support for a types-only lookup
9146         when we're called via ITypeExpression.DoResolveType().
9147         (ComposedCast): Implement the ITypeExpression interface.
9148
9149         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9150         Expression.Resolve() with ResolveFlags.Type instead.
9151
9152 2002-08-12  Martin Baulig  <martin@gnome.org>
9153
9154         * interface.cs (Interface.Define): Apply attributes.
9155
9156         * attribute.cs (Attribute.ApplyAttributes): Added support for
9157         interface attributes.
9158
9159 2002-08-11  Martin Baulig  <martin@gnome.org>
9160
9161         * statement.cs (Block.Emit): Only check the "this" variable if we
9162         do not always throw an exception.
9163
9164         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9165         whether the property has a set accessor.
9166
9167 2002-08-11  Martin Baulig  <martin@gnome.org>
9168
9169         Added control flow analysis support for structs.
9170
9171         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9172         with control flow analysis turned off.
9173         (IVariable): New interface.
9174         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9175         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9176         (FieldExpr.DoResolve): Resolve the instance expression with flow
9177         analysis turned off and do the definite assignment check after the
9178         resolving when we know what the expression will resolve to.
9179
9180         * expression.cs (LocalVariableReference, ParameterReference):
9181         Implement the new IVariable interface, only call the flow analysis
9182         code if ec.DoFlowAnalysis is true.
9183         (This): Added constructor which takes a Block argument.  Implement
9184         the new IVariable interface.
9185         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9186         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9187         This does the definite assignment checks for struct members.
9188
9189         * class.cs (Constructor.Emit): If this is a non-static `struct'
9190         constructor which doesn't have any initializer, call
9191         Block.AddThisVariable() to tell the flow analysis code that all
9192         struct elements must be initialized before control returns from
9193         the constructor.
9194
9195         * statement.cs (MyStructInfo): New public class.
9196         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9197         argument to this indexer.  If non-zero, check an individual struct
9198         member, not the whole struct.
9199         (FlowBranching.CheckOutParameters): Check struct members.
9200         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9201         overloaded versions of these methods which take an additional
9202         `int field_idx' argument to check struct members.
9203         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9204         overloaded versions of these methods which take an additional
9205         `string field_name' argument to check struct member.s
9206         (VariableInfo): Implement the IVariable interface.
9207         (VariableInfo.StructInfo): New public property.  Returns the
9208         MyStructInfo instance of the variable if it's a struct or null.
9209         (Block.AddThisVariable): New public method.  This is called from
9210         Constructor.Emit() for non-static `struct' constructor which do
9211         not have any initializer.  It creates a special variable for the
9212         "this" instance variable which will be checked by the flow
9213         analysis code to ensure that all of the struct's fields are
9214         initialized before control returns from the constructor.
9215         (UsageVector): Added support for struct members.  If a
9216         variable/parameter is a struct with N members, we reserve a slot
9217         in the usage vector for each member.  A struct is considered fully
9218         initialized if either the struct itself (slot 0) or all its
9219         members are initialized.
9220
9221 2002-08-08  Martin Baulig  <martin@gnome.org>
9222
9223         * driver.cs (Driver.MainDriver): Only report an error CS5001
9224         if there were no compilation errors.
9225
9226         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9227         `UnsafeContext' property to determine whether the parent is in
9228         unsafe context rather than checking the parent's ModFlags:
9229         classes nested in an unsafe class are unsafe as well.
9230
9231 2002-08-08  Martin Baulig  <martin@gnome.org>
9232
9233         * statement.cs (UsageVector.MergeChildren): Distinguish between
9234         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9235         we return.  Added test17() and test18() to test-154.cs.
9236
9237 2002-08-08  Martin Baulig  <martin@gnome.org>
9238
9239         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9240         Family access, make sure the invoking type isn't a subclass of the
9241         queried type (that'd be a CS1540).
9242
9243         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9244         this method which takes an additional `Type invocation_type'.
9245
9246         * expression.cs (BaseAccess.DoResolve): Use the base type as
9247         invocation and query type.
9248         (MemberAccess.DoResolve): If the lookup failed and we're about to
9249         report a CS0122, try a lookup with the ec.ContainerType - if this
9250         succeeds, we must report a CS1540.
9251
9252 2002-08-08  Martin Baulig  <martin@gnome.org>
9253
9254         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9255         (MethodGroupExpr): Implement the IMemberExpr interface.
9256
9257         * expression (MemberAccess.ResolveMemberAccess): No need to have
9258         any special code for MethodGroupExprs anymore, they're now
9259         IMemberExprs.   
9260
9261 2002-08-08  Martin Baulig  <martin@gnome.org>
9262
9263         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9264         Family, FamANDAssem and FamORAssem permissions.
9265         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9266
9267 2002-08-08  Martin Baulig  <martin@gnome.org>
9268
9269         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9270         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9271         or loop block.
9272
9273 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9274
9275         * driver.cs: implemented /resource option to embed managed resources.
9276
9277 2002-08-07  Martin Baulig  <martin@gnome.org>
9278
9279         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9280         (FieldBase.HasFieldInitializer): New public property.
9281         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9282         returns the field initializer and makes sure it is only resolved once.
9283         (TypeContainer.EmitFieldInitializers): Call
9284         FieldBase.GetInitializerExpression to get the initializer, this ensures
9285         that it isn't resolved multiple times.
9286
9287         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9288         the resolving process (SimpleName/MemberLookup) that we're currently
9289         emitting a field initializer (which must not access any instance members,
9290         this is an error CS0236).
9291
9292         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9293         argument, if the `IsFieldInitializer' flag is set, we must report and
9294         error CS0236 and not an error CS0120.   
9295
9296 2002-08-07  Martin Baulig  <martin@gnome.org>
9297
9298         * ecore.cs (IMemberExpr): New public interface.
9299         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9300         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9301         if the expression is an IMemberExpr.
9302
9303         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9304         to be null, implicitly default to `this' if we're non-static in
9305         this case.  Simplified the code a lot by using the new IMemberExpr
9306         interface.  Also fixed bug #28176 here.
9307
9308 2002-08-06  Martin Baulig  <martin@gnome.org>
9309
9310         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9311         ParameterReferences during semantic analysis so that we can do a
9312         type-only search when resolving Cast, TypeOf and SizeOf.
9313         (block): Pass the `current_local_parameters' to the Block's
9314         constructor.
9315
9316         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9317         argument to the constructor.
9318         (ConstructorInitializer.Resolve): Create a temporary implicit
9319         block with the parameters.
9320
9321         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9322         references here if we aren't doing a type-only search.
9323
9324         * statement.cs (Block): Added constructor which takes a
9325         `Parameters parameters' argument.
9326         (Block.Parameters): New public property.
9327
9328         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9329         to `Parameters' and made it public readonly.
9330
9331 2002-08-06  Martin Baulig  <martin@gnome.org>
9332
9333         * ecore.cs (Expression.Warning): Made this public as well.
9334
9335         * report.cs (Report.Debug): Print the contents of collections.
9336
9337 2002-08-06  Martin Baulig  <martin@gnome.org>
9338
9339         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9340         used to tell Resolve() which kinds of expressions it may return.
9341         (Expression.Resolve): Added overloaded version of this method which
9342         takes a `ResolveFlags flags' argument.  This can be used to tell
9343         Resolve() which kinds of expressions it may return.  Reports a
9344         CS0118 on error.
9345         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9346         ResolveFlags.SimpleName.
9347         (Expression.Error118): Added overloaded version of this method which
9348         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9349         which kinds of expressions are allowed.
9350
9351         * expression.cs (Argument.ResolveMethodGroup): New public method.
9352         Resolves an argument, but allows a MethodGroup to be returned.
9353         This is used when invoking a delegate.
9354
9355         * TODO: Updated a bit.
9356
9357 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9358
9359         Fixed compilation with csc.
9360
9361         * ecore.cs: Expression.Error made public. Is this correct? Should
9362         Warning be made public too?
9363
9364         * expression.cs: use ea.Location instead of ea.loc.
9365         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9366
9367 2002-08-06  Martin Baulig  <martin@gnome.org>
9368
9369         * ecore.cs (Expression.loc): Moved the location here instead of
9370         duplicating it in all derived classes.
9371         (Expression.Location): New public property.
9372         (Expression.Error, Expression.Warning): Made them non-static and
9373         removed the location argument.
9374         (Expression.Warning): Added overloaded version which takes an
9375         `int level' argument.
9376         (Expression.Error118): Make this non-static and removed the
9377         expression and location arguments.
9378         (TypeExpr): Added location argument to the constructor.
9379
9380         * expression.cs (StaticCallExpr): Added location argument to
9381         the constructor.
9382         (Indirection, PointerArithmetic): Likewise.
9383         (CheckedExpr, UnCheckedExpr): Likewise.
9384         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9385         (StringPtr): Likewise.
9386
9387
9388 2002-08-05  Martin Baulig  <martin@gnome.org>
9389
9390         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9391
9392         * assign.cs (Assign.DoResolve): Check whether the source
9393         expression is a value or variable.
9394
9395         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9396         while resolving the corresponding blocks.
9397
9398         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9399         an error, don't silently return null.
9400
9401         * statement.cs (Block.AddVariable): Do the error reporting here
9402         and distinguish between CS0128 and CS0136.
9403         (Block.DoResolve): Report all unused labels (warning CS0164).
9404         (LabeledStatement): Pass the location to the constructor.
9405         (LabeledStatement.HasBeenReferenced): New property.
9406         (LabeledStatement.Resolve): Set it to true here.
9407
9408         * statement.cs (Return.Emit): Return success even after reporting
9409         a type mismatch error (CS0126 or CS0127), this is what csc does and
9410         it avoids confusing the users with any consecutive errors.
9411
9412 2002-08-05  Martin Baulig  <martin@gnome.org>
9413
9414         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9415
9416         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9417
9418         * expression.cs (MemberAccess.DoResolve): Silently return if an
9419         error has already been reported.
9420
9421         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9422         error has already been reported.
9423
9424 2002-08-05  Martin Baulig  <martin@gnome.org>
9425
9426         * statement.cs (UsageVector): Only initialize the `parameters'
9427         vector if we actually have any "out" parameters.
9428
9429 2002-08-05  Martin Baulig  <martin@gnome.org>
9430
9431         * expression.cs (Binary.ResolveOperator): When combining delegates,
9432         they must have the same type.
9433
9434 2002-08-05  Martin Baulig  <martin@gnome.org>
9435
9436         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9437         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9438         work with the ms runtime and we also don't need it: if we're a
9439         PropertyBuilder and not in the `indexer_arguments' hash, then we
9440         are a property and not an indexer.
9441
9442         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9443         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9444         since the latter one doesn't work with the ms runtime.
9445
9446 2002-08-03  Martin Baulig  <martin@gnome.org>
9447
9448         Fixed bugs #27998 and #22735.
9449
9450         * class.cs (Method.IsOperator): New public field.
9451         (Method.CheckBase): Report CS0111 if there's already a method
9452         with the same parameters in the current class.  Report CS0508 when
9453         attempting to change the return type of an inherited method.
9454         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9455         and it's not marked abstract or extern.
9456         (PropertyBase): New abstract base class for Property and Indexer.
9457         (PropertyBase.CheckBase): Moved here from Property and made it work
9458         for indexers.
9459         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9460         the same so we can reuse it there.
9461         (Property, Indexer): Derive from PropertyBase.
9462         (MethodSignature.inheritable_property_signature_filter): New delegate
9463         to find properties and indexers.
9464
9465         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9466         argument and improved error reporting.
9467
9468         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9469         EmptyReadOnlyParameters and made it a property.
9470
9471         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9472         version of this method which takes a `PropertyInfo indexer'.
9473         (TypeManager.RegisterIndexer): New method.
9474
9475         * class.cs: Added myself as author of this file :-)
9476
9477 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9478
9479         * class.cs: fixed compilation on windoze.
9480
9481 2002-08-03  Martin Baulig  <martin@gnome.org>
9482
9483         * interface.cs (Interface.GetInterfaceBases): Check whether all
9484         base interfaces are at least as accessible than the current one.
9485
9486         * class.cs (TypeContainer.GetClassBases): Check whether base types
9487         are at least as accessible than the current type.
9488         (TypeContainer.AsAccessible): Implemented and made non-static.
9489         (MemberBase.CheckParameters): Report errors if the accessibility
9490         checks fail.
9491
9492         * delegate.cs (Delegate.Delegate): The default visibility is
9493         internal for top-level types and private for nested types.
9494         (Delegate.Define): Report errors if the accessibility checks fail.
9495
9496         * enum.cs (Enum.Enum): The default visibility is internal for
9497         top-level types and private for nested types.
9498         (Enum.DefineType): Compute the correct visibility.
9499
9500         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9501         function which takes a `bool is_toplevel' instead of a TypeContainer.
9502
9503         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9504         builtin type.
9505
9506 2002-08-02  Martin Baulig  <martin@gnome.org>
9507
9508         * expression.cs (LocalVariableReferenc): Added constructor which
9509         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9510         (LocalVariableReference.IsReadOnly): New property.
9511         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9512         variable is readonly, use our own readonly flag to do this; you can
9513         use the new constructor to get a writable reference to a read-only
9514         variable.
9515
9516         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9517         reference to the local variable.
9518
9519 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9520
9521         * rootcontext.cs (ResolveCore): Also include System.Exception
9522
9523         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9524         we reach an EmptyStatement.
9525
9526         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9527         is also fine.
9528
9529         * expression.cs (Binary.ResolveOperator): Check error result in
9530         two places.
9531
9532         use brtrue/brfalse directly and avoid compares to null.
9533
9534 2002-08-02  Martin Baulig  <martin@gnome.org>
9535
9536         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9537         Fixes bug #28407, added test-155.cs.
9538
9539 2002-08-01  Martin Baulig  <martin@gnome.org>
9540
9541         * class.cs (Event.EmitDefaultMethod): Make this work with static
9542         events.  Fixes #28311, added verify-3.cs.
9543
9544 2002-08-01  Martin Baulig  <martin@gnome.org>
9545
9546         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9547         `is_disposable' fields.
9548         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9549         `hm.is_disposable' if we're using the collection pattern.
9550         (Foreach.EmitCollectionForeach): Use the correct type for the
9551         enumerator's local variable, only emit the try/finally block if
9552         necessary (fixes #27713).
9553
9554 2002-08-01  Martin Baulig  <martin@gnome.org>
9555
9556         * ecore.cs (Expression.report118): Renamed to Error118 and made
9557         it public static.
9558
9559         * statement.cs (Throw.Resolve): Check whether the expression is of
9560         the correct type (CS0118) and whether the type derives from
9561         System.Exception (CS0155).
9562         (Catch.Resolve): New method.  Do the type lookup here and check
9563         whether it derives from System.Exception (CS0155).
9564         (Catch.CatchType, Catch.IsGeneral): New public properties.
9565
9566         * typemanager.cs (TypeManager.exception_type): Added.
9567
9568 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9569
9570         * driver.cs: Updated About function.
9571
9572 2002-07-31  Martin Baulig  <martin@gnome.org>
9573
9574         Implemented Control Flow Analysis.
9575
9576         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9577         (EmitContext.CurrentBranching): Added.
9578         (EmitContext.StartFlowBranching): Added.
9579         (EmitContext.EndFlowBranching): Added.
9580         (EmitContext.KillFlowBranching): Added.
9581         (EmitContext.IsVariableAssigned): Added.
9582         (EmitContext.SetVariableAssigned): Added.
9583         (EmitContext.IsParameterAssigned): Added.
9584         (EmitContext.SetParameterAssigned): Added.
9585         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9586         Added control flow analysis stuff here.
9587
9588         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9589         resolve the expression as lvalue.
9590         (LocalVariableReference.DoResolve): Check whether the variable has
9591         already been assigned.
9592         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9593         the parameter as assigned here.
9594         (ParameterReference.DoResolve): Check whether the parameter has already
9595         been assigned.
9596         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9597         expression as lvalue.
9598
9599         * statement.cs (FlowBranching): New class for the flow analysis code.
9600         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9601         (LabeledStatement.IsDefined): New public property.
9602         (LabeledStatement.AddUsageVector): New public method to tell flow
9603         analyis that the label may be reached via a forward jump.
9604         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9605         flow analysis.
9606         (VariableInfo.Number): New public field.  This is used by flow analysis
9607         to number all locals of a block.
9608         (Block.CountVariables): New public property.  This is the number of
9609         local variables in this block (including the locals from all parent
9610         blocks).
9611         (Block.EmitMeta): Number all the variables.
9612
9613         * statement.cs: Added flow analysis support to all classes.
9614
9615 2002-07-31  Martin Baulig  <martin@gnome.org>
9616
9617         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9618         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9619         then use this argument.
9620
9621         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9622
9623         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9624         use this to specify /define options.
9625
9626 2002-07-29  Martin Baulig  <martin@gnome.org>
9627
9628         * statement.cs (Fixed): Moved all code that does variable lookups
9629         and resolvings from Emit to Resolve.
9630
9631         * statement.cs (For): Moved all code that does variable lookups
9632         and resolvings from Emit to Resolve.
9633
9634         * statement.cs (Using): Moved all code that does variable lookups
9635         and resolvings from Emit to Resolve.
9636
9637 2002-07-29  Martin Baulig  <martin@gnome.org>
9638
9639         * attribute.cs (Attribute.Resolve): Explicitly catch a
9640         System.NullReferenceException when creating the
9641         CustromAttributeBuilder and report a different warning message.
9642
9643 2002-07-29  Martin Baulig  <martin@gnome.org>
9644
9645         * support.cs (ParameterData.ParameterName): Added method to
9646         get the name of a parameter.
9647
9648         * typemanager.cs (TypeManager.IsValueType): New public method.
9649
9650 2002-07-29  Martin Baulig  <martin@gnome.org>
9651
9652         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9653         is a flag which specifies that it's either ref or out.
9654         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9655         the out parameter to `out Parameter.Modifier mod', also set the
9656         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9657
9658         * support.cs (InternalParameters.ParameterModifier): Distinguish
9659         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9660         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9661
9662         * expression.cs (Argument.GetParameterModifier): Distinguish
9663         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9664         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9665
9666 2002-07-29  Martin Baulig  <martin@gnome.org>
9667
9668         * expression.cs (ParameterReference.ParameterReference): Added
9669         `Location loc' argument to the constructor.
9670
9671         * cs-parser.jay: Pass location to ParameterReference.
9672
9673 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9674
9675         * statement.cs (Try): Initialize the location.
9676
9677         * cs-parser.jay: pass location to Try.
9678
9679         * expression.cs (Unary.Reduce): Change the prototype to return
9680         whether a constant fold could be performed or not.  The result is
9681         returned in an out parameters.  In the case of Indirection and
9682         AddressOf, we want to perform the full tests.
9683
9684 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9685
9686         * statement.cs (Statement.Emit): Flag dead code.
9687
9688 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9689
9690         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9691
9692 2002-07-27  Martin Baulig  <martin@gnome.org>
9693
9694         * class.cs (MethodData.Define): Put back call to
9695         TypeManager.AddMethod(), accidentally commented this out.
9696
9697         * report.cs (Debug): New public method to print debugging information,
9698         this is `[Conditional ("DEBUG")]'.
9699
9700 2002-07-26  Martin Baulig  <martin@gnome.org>
9701
9702         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9703         (switch_statement): Push the current_block to the switch_stack and
9704         pop it again when we're done with the switch.
9705         (switch_section): The new block is a child of the current_block.
9706         Fixes bug #24007, added test-152.cs.
9707
9708 2002-07-27  Martin Baulig  <martin@gnome.org>
9709
9710         * expression.cs (Invocation.EmitArguments): When calling a varargs
9711         function with only its fixed arguments, we need to pass an empty
9712         array.
9713
9714 2002-07-27  Martin Baulig  <martin@gnome.org>
9715
9716         Mono 0.13 has been released.
9717
9718 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9719
9720         * driver.cs: Rename --resource to --linkres, because that is what
9721         we do currently, we dont support --resource yet.
9722
9723         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9724
9725 2002-07-25  Martin Baulig  <martin@gnome.org>
9726
9727         * class.cs (MethodData): New public class.  This is a `method builder'
9728         class for a method or one accessor of a Property/Indexer/Event.
9729         (MethodData.GetMethodFlags): Moved here from MemberBase.
9730         (MethodData.ApplyAttributes): Likewise.
9731         (MethodData.ApplyObsoleteAttribute): Likewise.
9732         (MethodData.ApplyConditionalAttribute): Likewise.
9733         (MethodData.ApplyDllImportAttribute): Likewise.
9734         (MethodData.CheckAbstractAndExternal): Likewise.
9735         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9736         (MethodData.Emit): Formerly known as Method.Emit().
9737         (MemberBase): Moved everything which was specific to a single
9738         accessor/method to MethodData.
9739         (Method): Create a new MethodData and call Define() and Emit() on it.
9740         (Property, Indexer, Event): Create a new MethodData objects for each
9741         accessor and call Define() and Emit() on them.
9742
9743 2002-07-25  Martin Baulig  <martin@gnome.org>
9744
9745         Made MethodCore derive from MemberBase to reuse the code from there.
9746         MemberBase now also checks for attributes.
9747
9748         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9749         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9750         as virtual.
9751         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9752         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9753         (MemberBase.ApplyAttributes): New virtual method; applies the
9754         attributes to a method or accessor.
9755         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9756         (MemberBase.ApplyConditionalAttribute): Likewise.
9757         (MemberBase.ApplyDllImportAttribute): Likewise.
9758         (MemberBase.CheckAbstractAndExternal): Likewise.
9759         (MethodCore.ParameterTypes): This is now a property instead of a
9760         method, it's initialized from DoDefineParameters().
9761         (MethodCore.ParameterInfo): Removed the set accessor.
9762         (MethodCore.DoDefineParameters): New protected virtual method to
9763         initialize ParameterTypes and ParameterInfo.
9764         (Method.GetReturnType): We can now simply return the MemberType.
9765         (Method.GetMethodFlags): Override the MemberBase version and add
9766         the conditional flags.
9767         (Method.CheckBase): Moved some code from Define() here, call
9768         DoDefineParameters() here.
9769         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9770         here to avoid some larger code duplication.
9771         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9772         ensure that abstract and external accessors don't declare a body.
9773
9774         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9775         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9776         lookup in the attribute's parent classes, so we need to abort as soon
9777         as we found the first match.
9778         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9779         the attribute has no arguments.
9780
9781         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9782         of a Method.
9783
9784 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9785
9786         * cs-parser.jay: reverted previous patch.
9787
9788 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9789
9790         * cs-parser.jay: fixed bug #22119.
9791
9792 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9793
9794         * attribute.cs: fixed compilation. The error was:
9795         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9796         be assigned to before control leaves the current method."
9797         [FIXME:  Filed as bug #28186: MCS must report this error.]
9798
9799 2002-07-25  Martin Baulig  <martin@gnome.org>
9800
9801         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9802         method to pull the condition name ouf of a Conditional attribute.
9803         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9804         the obsolete message and error flag out of an Obsolete attribute.
9805
9806         * class.cs (Method.GetMethodFlags): New public method to get the
9807         TypeManager.MethodFlags for this method.
9808         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9809         private methods.
9810         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9811         if we're overriding a virtual function, set the new private variable
9812         `parent_method'; call the new TypeManager.AddMethod().
9813
9814         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9815         the MethodBuilder and the Method in a PtrHashtable.
9816         (TypeManager.builder_to_method): Added for this purpose.
9817         (TypeManager.MethodFlags): Added IsObsoleteError.
9818         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9819         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9820         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9821         the message from the attribute.
9822
9823 2002-07-24  Martin Baulig  <martin@gnome.org>
9824
9825         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9826         preprocessor directives, ensure that the argument to #define/#undef is
9827         exactly one identifier and that it's actually an identifier.
9828
9829         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9830         did not work ....
9831
9832 2002-07-24  Martin Baulig  <martin@gnome.org>
9833
9834         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9835         initialize it to TypeManager.object_type in the constructor.
9836         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9837         of the `hm.get_current' method if we're using the collection pattern.
9838         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9839         for the explicit conversion to make it work when we're using the collection
9840         pattern and the `Current' property has a different return type than `object'.
9841         Fixes #27713.
9842
9843 2002-07-24  Martin Baulig  <martin@gnome.org>
9844
9845         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9846         does not match, but don't report any errors.  This method is called in
9847         order for all methods in a MethodGroupExpr until a matching method is
9848         found, so we don't want to bail out if the first method doesn't match.
9849         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9850         matches, report the 123.  Fixes #28070.
9851
9852 2002-07-24  Martin Baulig  <martin@gnome.org>
9853
9854         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9855         TypeManager.TypeToCoreType() to the top of the method so the
9856         following equality checks will work.  Fixes #28107.
9857
9858 2002-07-24  Martin Baulig  <martin@gnome.org>
9859
9860         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9861         operand is of type uint, and the other operand is of type sbyte,
9862         short or int, the operands are converted to type long." -
9863         Actually do what this comment already told us.  Fixes bug #28106,
9864         added test-150.cs.
9865
9866 2002-07-24  Martin Baulig  <martin@gnome.org>
9867
9868         * class.cs (MethodBase): New abstract class.  This is now a base
9869         class for Property, Indexer and Event to avoid some code duplication
9870         in their Define() and DefineMethods() methods.
9871         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
9872         generic methods for Define() and DefineMethods().
9873         (FieldBase): Derive from MemberBase, not MemberCore.
9874         (Property): Derive from MemberBase, not MemberCore.
9875         (Property.DefineMethod): Moved all the code from this method to the
9876         new MethodBase.DefineAccessor(), just call it with appropriate
9877         argumetnts.
9878         (Property.Define): Call the new Property.DoDefine(), this does some
9879         sanity checks and we don't need to duplicate the code everywhere.
9880         (Event): Derive from MemberBase, not MemberCore.
9881         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
9882         accessors, this will also make them work with interface events.
9883         (Indexer): Derive from MemberBase, not MemberCore.
9884         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
9885         (Indexer.Define): Use the new MethodBase functions.
9886
9887         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
9888         argument to the constructor.
9889         (Interface.FindMembers): Added support for interface events.
9890         (Interface.PopluateEvent): Implemented.
9891
9892         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9893
9894 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9895
9896         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9897         but this is required to check for a method name being the same as
9898         the containing class.  
9899
9900         Handle this now.
9901
9902 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9903
9904         * interface.cs: initialize variable.
9905
9906 2002-07-23  Martin Baulig  <martin@gnome.org>
9907
9908         Implemented the IndexerName attribute in interfaces.
9909
9910         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9911         name if this is an explicit interface implementation.
9912         (Indexer.InterfaceIndexerName): New public variable.  If we're
9913         implementing an interface indexer, this is the IndexerName in that
9914         interface.  Otherwise, it's the IndexerName.
9915         (Indexer.DefineMethod): If we're implementing interface indexer,
9916         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9917         and Pending.ImplementIndexer methods.
9918         (Indexer.Define): Also define the PropertyBuilder if we're
9919         implementing an interface indexer and this is neither an explicit
9920         interface implementation nor do the IndexerName match the one in
9921         the interface.
9922
9923         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9924         If a method is defined here, then we always need to create a proxy
9925         for it.  This is used when implementing interface indexers.
9926         (Pending.IsInterfaceIndexer): New public method.
9927         (Pending.ImplementIndexer): New public method.
9928         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9929         This is used when implementing interface indexers to define a proxy
9930         if necessary.
9931         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9932         define a proxy if necessary.
9933
9934         * interface.cs (Interface.IndexerName): New public variable.
9935         (Interface.PopulateIndexer): Set the IndexerName.
9936         (Interface.DefineIndexers): New private method.  Populate all the
9937         indexers and make sure their IndexerNames match.
9938
9939         * typemanager.cs (IndexerPropertyName): Added support for interface
9940         indexers.
9941
9942 2002-07-22  Martin Baulig  <martin@gnome.org>
9943
9944         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9945         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9946         ret if HasReturnLabel.
9947         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9948         variables.
9949
9950         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9951         and set the ec.LoopBeginTryCatchLevel.
9952         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9953         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9954         the current ec.TryCatchLevel, the branch goes out of an exception
9955         block.  In this case, we need to use Leave and not Br.
9956
9957 2002-07-22  Martin Baulig  <martin@gnome.org>
9958
9959         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9960         block unless the block does not always return or it is contained in
9961         another try { ... } catch { ... } block.  Fixes bug #26506.
9962         Added verify-1.cs to the test suite.
9963
9964 2002-07-22  Martin Baulig  <martin@gnome.org>
9965
9966         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9967         then we do not always return.  Fixes bug #24985.
9968
9969 2002-07-22  Martin Baulig  <martin@gnome.org>
9970
9971         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9972         lookup on a per-class level; ie. walk up the class hierarchy until we
9973         found at least one applicable method, then choose the best among them.
9974         Fixes bug #24463 and test-29.cs.
9975
9976 2002-07-22  Martin Baulig  <martin@gnome.org>
9977
9978         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9979         return types of the methods.  The return type is not part of the
9980         signature and we must not check it to make the `new' modifier work.
9981         Fixes bug #27999, also added test-147.cs.
9982         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9983
9984         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9985         on the method's return type.
9986
9987 2002-07-21  Martin Baulig  <martin@gnome.org>
9988
9989         * assign.cs: Make this work if the rightmost source is a constant and
9990         we need to do an implicit type conversion.  Also adding a few more tests
9991         to test-38.cs which should have caught this.
9992
9993         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9994         target in the makefile for this.  The makefile.gnu is primarily intended
9995         for end-users who don't want to debug the compiler.
9996
9997 2002-07-21  Martin Baulig  <martin@gnome.org>
9998
9999         * assign.cs: Improved the Assign class so it can now handle embedded
10000         assignments (X = Y = Z = something).  As a side-effect this'll now also
10001         consume less local variables.  test-38.cs now passes with MCS, added
10002         a few new test cases to that test.
10003
10004 2002-07-20  Martin Baulig  <martin@gnome.org>
10005
10006         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10007         instructions.  Fixes bug #27977, also added test-146.cs.
10008
10009 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10010
10011         * cs-tokenizer.cs: fixed getHex ().
10012
10013 2002-07-19  Martin Baulig  <martin@gnome.org>
10014
10015         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10016         not Type.GetType() to lookup the array type.  This is needed when
10017         we're constructing an array of a user-defined type.
10018         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10019         single-dimensional arrays, but also for single-dimensial arrays of
10020         type decimal.
10021
10022 2002-07-19  Martin Baulig  <martin@gnome.org>
10023
10024         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10025         this function is called, it's not allowed to share LocalBuilders
10026         among ILGenerators.
10027
10028 2002-07-19  Martin Baulig  <martin@gnome.org>
10029
10030         * expression.cs (Argument.Resolve): Report an error 118 when trying
10031         to pass a type as argument.
10032
10033 2002-07-18  Martin Baulig  <martin@gnome.org>
10034
10035         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10036         Conv_R_Un for the signed `long' type.
10037
10038 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10039
10040         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10041         `expr' for the temporary result, as that will fail if we do
10042         multiple resolves on the same expression.
10043
10044 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10045
10046         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10047         ec.TypeContainer for looking up aliases. 
10048
10049         * class.cs (TypeContainer): Remove LookupAlias from here.
10050
10051         * decl.cs (DeclSpace); Move here.
10052
10053 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10054
10055         * class.cs (FindMembers): Only call filter if the constructor
10056         bulider is not null.
10057
10058         Also handle delegates in `NestedTypes' now.  Now we will perform
10059         type lookups using the standard resolution process.  This also
10060         fixes a bug.
10061
10062         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10063         This uses Expressions (the limited kind that can be parsed by the
10064         tree) instead of strings.
10065
10066         * expression.cs (ComposedCast.ToString): Implement, used to flag
10067         errors since now we have to render expressions.
10068
10069         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10070         FormArrayType. 
10071
10072         * ecore.cs (SimpleName.ToString): ditto.
10073
10074         * cs-parser.jay: Instead of using strings to assemble types, use
10075         Expressions to assemble the type (using SimpleName, ComposedCast,
10076         MemberAccess).  This should fix the type lookups in declarations,
10077         because we were using a different code path for this.
10078
10079         * statement.cs (Block.Resolve): Continue processing statements
10080         even when there is an error.
10081
10082 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10083
10084         * class.cs (Event.Define): Also remove the `remove' method from
10085         the list of pending items.
10086
10087         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10088         generate more compact code. 
10089
10090 2002-07-17  Martin Baulig  <martin@gnome.org>
10091
10092         * const.cs (Const.LookupConstantValue): Add support for constant
10093         `unchecked' and `checked' expressions.
10094         Also adding test case test-140.cs for this.
10095
10096 2002-07-17  Martin Baulig  <martin@gnome.org>
10097
10098         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10099         check whether mi.ReturnType implements the IEnumerator interface; the
10100         `==' and the IsAssignableFrom() will fail in this situation.
10101
10102 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10103
10104         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10105         here too.
10106
10107 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10108
10109         * expression.cs: fixed bug #27811.
10110
10111 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10112
10113         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10114         Molaro: when we are a ref, the value already contains a pointer
10115         value, do not take the address of it.
10116
10117 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10118         * removed mb-parser.jay and mb-tokenizer.cs
10119
10120 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10121
10122         * expression.cs: check against the building corlib void type.
10123
10124 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10125
10126         * ecore.cs: fix for valuetype static readonly fields: when 
10127         initializing them, we need their address, not the address of a copy.
10128
10129 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10130
10131         * typemanager.cs: register also enum_type in corlib.
10132
10133 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10134
10135         * class.cs: allow calling this (but not base) initializers in structs.
10136
10137 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10138
10139         * ecore.cs: make sure we compare against the building base types
10140         in GetTypeSize ().
10141
10142 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10143
10144         * typemanager.cs: fix TypeToCoreType() to handle void and object
10145         (corlib gets no more typerefs after this change).
10146
10147 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10148
10149         * expression.cs (ArrayCreation.EmitArrayArguments): use
10150         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10151
10152         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10153         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10154         array indexes, the runtime actually forbids them.
10155
10156         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10157         for array arguments here.
10158
10159         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10160         instead of the default for ValueTypes.
10161
10162         (New.DoEmit): Use IsValueType instead of
10163         IsSubclassOf (value_type)
10164         (New.DoResolve): ditto.
10165         (Invocation.EmitCall): ditto.
10166
10167         * assign.cs (Assign): ditto.
10168
10169         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10170         Statements *are* currently doing part of their resolution during
10171         Emit.  
10172
10173         Expressions do always resolve during resolve, but statements are
10174         only required to propagate resolution to their children.
10175
10176 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10177
10178         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10179
10180         (LoadAssembly): Do not add the dll if it is already specified
10181
10182         (MainDriver): Add the System directory to the link path at the end,
10183         after all the other -L arguments. 
10184
10185         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10186         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10187         ldelem.u1) and using the opposite for sbytes.
10188
10189         This fixes Digger, and we can finally run it.
10190
10191         * driver.cs (UnixParseOption): Move the option parsing here.  
10192         (CSCParseOption): Implement CSC-like parsing of options.
10193
10194         We now support both modes of operation, the old Unix way, and the
10195         new CSC-like way.  This should help those who wanted to make cross
10196         platform makefiles.
10197
10198         The only thing broken is that /r:, /reference: and /lib: are not
10199         implemented, because I want to make those have the same semantics
10200         as the CSC compiler has, and kill once and for all the confussion
10201         around this.   Will be doing this tomorrow.
10202
10203         * statement.cs (Unsafe.Resolve): The state is checked during
10204         resolve, not emit, so we have to set the flags for IsUnsfe here.
10205
10206 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10207
10208         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10209         not catch the Error_ObjectRefRequired in SimpleName (as it is
10210         possible to have a class/instance variable name that later gets
10211         deambiguated), we have to check this here.      
10212
10213 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10214
10215         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10216         make static and put into Expression.
10217
10218         (Event.Define): Register the private field of the event with the 
10219         TypeManager so that GetFieldFromEvent can get at it.
10220
10221         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10222         keep track of the private field associated with an event which
10223         has no accessors.
10224
10225         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10226         private field.
10227
10228         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10229
10230 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10231
10232         * expression.cs (Binary.EmitBranchable): this routine emits the
10233         Binary expression in a branchable context.  This basically means:
10234         we need to branch somewhere, not just get the value on the stack.
10235
10236         This works together with Statement.EmitBoolExpression.
10237
10238         * statement.cs (Statement.EmitBoolExpression): Use
10239         EmitBranchable. 
10240
10241 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10242
10243         * statement.cs (For): Reduce the number of jumps in loops.
10244
10245         (For): Implement loop inversion for the For statement.
10246
10247         (Break): We can be breaking out of a Try/Catch controlled section
10248         (foreach might have an implicit try/catch clause), so we need to
10249         use Leave instead of Br.
10250
10251         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10252         now).  If the instace expression supports IMemoryLocation, we use
10253         the AddressOf method from the IMemoryLocation to extract the
10254         address instead of emitting the instance.
10255
10256         This showed up with `This', as we were emitting the instance
10257         always (Emit) instead of the Address of This.  Particularly
10258         interesting when This is a value type, as we dont want the Emit
10259         effect (which was to load the object).
10260
10261 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10262
10263         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10264
10265         * statement.cs (Checked): Set the CheckedState during the resolve
10266         process too, as the ConvCast operations track the checked state on
10267         the resolve process, and not emit.
10268
10269         * cs-parser.jay (namespace_member_declaration): Flag that we have
10270         found a declaration when we do.  This is used to flag error 1529
10271
10272         * driver.cs: Report ok when we display the help only.
10273
10274 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10275
10276         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10277
10278 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10279
10280         * cs-tokenizer.cs (define): We also have to track locally the
10281         defines.  AllDefines is just used for the Conditional Attribute,
10282         but we also need the local defines for the current source code. 
10283
10284 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10285
10286         * statement.cs (While, For, Do): These loops can exit through a
10287         Break statement, use this information to tell whether the
10288         statement is the last piece of code.
10289
10290         (Break): Flag that we break.
10291
10292         * codegen.cs (EmitContexts): New `Breaks' state variable.
10293
10294 2002-07-03  Martin Baulig  <martin@gnome.org>
10295
10296         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10297         modifiers in method declarations in structs.  Otherwise, you won't
10298         be able to override things like Object.Equals().
10299
10300 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10301
10302         * class.cs (Method, Property, Indexer): Do not allow the public
10303         modifier to be used in explicit interface implementations.
10304
10305         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10306         override modifiers in method declarations in structs
10307
10308 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10309
10310         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10311         integer or real overflow, report an error
10312
10313 2002-07-02  Martin Baulig  <martin@gnome.org>
10314
10315         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10316         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10317         to tell the runtime about our newly created System.Object and
10318         System.ValueType types.
10319
10320 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10321
10322         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10323         struct instead of Ldarg/Starg.
10324
10325 2002-07-02  Martin Baulig  <martin@gnome.org>
10326
10327         * expression.cs (Indirection.Indirection): Call
10328         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10329
10330 2002-07-02  Martin Baulig  <martin@gnome.org>
10331
10332         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10333         ValueType, call TypeManager.TypeToCoreType() on it.
10334         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10335         the OpCodes.Newarr argument.
10336
10337 2002-07-02  Martin Baulig  <martin@gnome.org>
10338
10339         * expression.cs (Invocation.EmitCall): When compiling corlib,
10340         replace all calls to the system's System.Array type to calls to
10341         the newly created one.
10342
10343         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10344         System.Array methods.
10345         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10346         from the system's System.Array type which must be replaced.
10347
10348 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10349
10350         * typemanager.cs: load unverifiable_code_ctor so we can build
10351         corlib using the correct type. Avoid using GetTypeCode() with
10352         TypeBuilders.
10353         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10354         TypeManager.object_type to allow building corlib.
10355
10356 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10357
10358         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10359
10360 2002-07-01  Martin Baulig  <martin@gnome.org>
10361
10362         * class.cs: Make the last change actually work, we need to check
10363         whether `ifaces != null' to avoid a crash.
10364
10365 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10366
10367         * class.cs: when we build structs without fields that implement
10368         interfaces, we need to add the interfaces separately, since there is
10369         no API to both set the size and add the interfaces at type creation
10370         time.
10371
10372 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10373
10374         * expression.cs: the dimension arguments to the array constructors
10375         need to be converted if they are a long.
10376
10377 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10378
10379         * class.cs: don't emit ldarg.0 if there is no parent constructor
10380         (fixes showstopper for corlib).
10381
10382 2002-06-29  Martin Baulig  <martin@gnome.org>
10383
10384         MCS now compiles corlib on GNU/Linux :-)
10385
10386         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10387         ie. check for MethodImplOptions.InternalCall.
10388
10389         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10390         and TypeManager.attribute_type are null, so we must explicitly check
10391         whether parent is not null to find out whether it's an attribute type.
10392         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10393         and SetBuilder, not only if the property is neither abstract nor external.
10394         This is necessary to set the MethodImplOptions on the accessor methods.
10395         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10396         SetBuilder, see Property.Emit().
10397
10398         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10399         populate "System.Object", "System.ValueType" and "System.Attribute" since
10400         they've already been populated from BootCorlib_PopulateCoreTypes().
10401
10402 2002-06-29  Martin Baulig  <martin@gnome.org>
10403
10404         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10405         is the NullLiteral, we also need to make sure that target_type is not
10406         an enum type.   
10407
10408 2002-06-29  Martin Baulig  <martin@gnome.org>
10409
10410         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10411         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10412         before calling BootstrapCorlib_ResolveDelegate ().
10413
10414 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10415
10416         * statement.cs: fixed build-breaker. All tests passed ok.
10417
10418 2002-06-27  Martin Baulig  <martin@gnome.org>
10419
10420         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10421         for System.Decimal when compiling corlib.
10422
10423 2002-06-27  Martin Baulig  <martin@gnome.org>
10424
10425         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10426         switch blocks which contain nothing but a default clause.
10427
10428 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10429
10430        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10431
10432 2002-06-27  Martin Baulig  <martin@gnome.org>
10433
10434         * ecore.cs (PropertyExpr.PropertyExpr): Call
10435         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10436
10437         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10438         is already a TypeBuilder.
10439
10440 2002-06-27  Martin Baulig  <martin@gnome.org>
10441
10442         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10443         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10444         the "from an array-type to System.Array" case.  This makes it work
10445         when compiling corlib.
10446
10447 2002-06-27  Martin Baulig  <martin@gnome.org>
10448
10449         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10450         non-static PropertyExpr, set its InstanceExpression.  This makes
10451         the `ICollection.Count' property work in System/Array.cs.
10452
10453 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10454
10455         * driver.cs: Made error handling more consistent.  Errors now
10456         tracked by Report class, so many methods which used to return int
10457         now return void.  Main() now prints success/failure and 
10458         errors/warnings message.
10459
10460         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10461         the magic number return values (123 and 124).  Now, if the
10462         expected error occurs, the compiler exits with success (exit value
10463         0).  If the compilation completes without seeing that particular
10464         error, the compiler exits with failure (exit value 1).  The
10465         makefile in mcs/errors has been changed to handle the new behaviour.
10466
10467         * report.cs: Made 'expected error' number a property and renamed
10468         it from 'Probe' to 'ExpectedError'.
10469
10470         * genericparser.cs: Removed error handling support, since it is
10471         now all done by Report class.
10472
10473         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10474         class, so parse() no longer returns an int.
10475
10476         * namespace.cs: Use Report.Error instead of GenericParser.error
10477
10478 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10479
10480         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10481         TypeContainer.AddOperator): At the front of the list put the
10482         explicit implementations, so they get resolved/defined first. 
10483
10484 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10485
10486         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10487         interface type is implemented by this TypeContainer.  Used during
10488         explicit interface implementation.
10489
10490         (Property.Define, Indexer.Define, Method.Define): Validate that
10491         the given interface in the explicit implementation is one of the
10492         base classes for the containing type.
10493
10494         Also if we are explicitly implementing an interface, but there is
10495         no match in the pending implementation table, report an error.
10496
10497         (Property.Define): Only define the property if we are
10498         not explicitly implementing a property from an interface.  Use the
10499         correct name also for those properties (the same CSC uses,
10500         although that is really not needed).
10501
10502         (Property.Emit): Do not emit attributes for explicitly implemented
10503         properties, as there is no TypeBuilder.
10504
10505         (Indexer.Emit): ditto.
10506
10507         Hiding then means that we do not really *implement* a pending
10508         implementation, which makes code fail.
10509
10510 2002-06-22  Martin Baulig  <martin@gnome.org>
10511
10512         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10513         the return value of Object.GetType().  [FIXME: we need to do this whenever
10514         we get a type back from the reflection library].
10515
10516 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10517
10518         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10519
10520 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10521
10522         * attribute.cs: Return null if we can not look up the type.
10523
10524         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10525         the interface types found.
10526
10527         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10528         interface types found.
10529
10530         * typemanager.cs (GetInterfaces): Make this routine returns alll
10531         the interfaces and work around the lame differences between
10532         System.Type and System.Reflection.Emit.TypeBuilder in the results
10533         result for GetInterfaces.
10534
10535         (ExpandInterfaces): Given an array of interface types, expand and
10536         eliminate repeated ocurrences of an interface.  This expands in
10537         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10538         be IA, IB, IC.
10539
10540 2002-06-21  Martin Baulig  <martin@gnome.org>
10541
10542         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10543         on System.Enum.
10544
10545 2002-06-21  Martin Baulig  <martin@gnome.org>
10546
10547         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10548         and called with one of the core types, return the corresponding typebuilder for
10549         that type.
10550
10551         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10552         element type.
10553
10554 2002-06-21  Martin Baulig  <martin@gnome.org>
10555
10556         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10557         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10558         (Expression.ConvertReferenceExplicit): Likewise.
10559
10560         * expression.cs (ElementAccess.DoResolve): Likewise.
10561         (ElementAccess.DoResolveLValue): Likewise.
10562
10563 2002-06-10  Martin Baulig  <martin@gnome.org>
10564
10565         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10566         add the "value" parameter to the parameter list.
10567
10568         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10569         to our caller.
10570
10571 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10572
10573         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10574         the argument to an int, uint, long or ulong, per the spec.  Also
10575         catch negative constants in array creation.
10576
10577 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10578
10579         * class.cs: do not allow the same interface to appear twice in
10580         the definition list.
10581
10582 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10583
10584         * ecore.cs: don't use ldlen with System.Array.
10585
10586 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10587
10588         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10589
10590 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10591
10592         * modifiers.cs: produce correct field attributes for protected
10593         internal. Easy fix so miguel can work on ther harder stuff:-)
10594
10595 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10596
10597         * pending.cs: New file.  Move the code from class.cs here.
10598         Support clearning the pending flag for all methods (when not doing
10599         explicit interface implementation).
10600
10601 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10602
10603         * rootcontext.cs: added a couple more types needed to bootstrap.
10604
10605 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10606
10607         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10608         constructor in the type, instead of any constructor in the type
10609         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10610         a bug in the Mono runtime when applying the params attribute). 
10611
10612 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10613         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10614
10615 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10616
10617         * expression.cs (Unary.ResolveOperator): Use TypeManager
10618         to resolve the type.
10619
10620 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10621
10622         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10623         attached.
10624
10625         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10626         with each member too.
10627
10628         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10629         field builders too - this takes care of the enum member case.
10630
10631 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10632
10633         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10634         address-of operator on both value types and pointers.
10635
10636 2002-06-10  Martin Baulig  <martin@gnome.org>
10637
10638         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10639         PropertyBuilder to the `property_builders' list.
10640
10641         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10642         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10643         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10644         find any indexers which are inherited from an interface.
10645
10646 2002-06-09  Martin Baulig  <martin@gnome.org>
10647
10648         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10649         the same type as the constant if necessary.  There's also a test-130.cs
10650         for this.
10651
10652         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10653
10654         * typemanager.cs (TypeManager.ChangeType): Previously known as
10655         Enum.ChangeEnumType().
10656
10657 2002-06-09  Martin Baulig  <martin@gnome.org>
10658
10659         * expression.cs (Cast.TryReduce): Added support for consts.
10660
10661 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10662
10663         * class.cs (Accessor): Hold attributes information so we can pass
10664         it along.
10665
10666         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10667         Modify to pass in attributes attached to the methods.
10668
10669         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10670
10671         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10672         to handle the Accessor kind :-)
10673
10674         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10675
10676 2002-06-08  Martin Baulig  <martin@gnome.org>
10677
10678         * expression.cs (Unary.TryReduceNegative): Added support for
10679         ULongConstants.
10680
10681 2002-06-08  Martin Baulig  <martin@gnome.org>
10682
10683         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10684         name can't be found in the `defined_names' - the caller will do a
10685         MemberLookup in this case and thus find methods in System.Enum
10686         such as Enum.IsDefined().
10687
10688 2002-06-08  Martin Baulig  <martin@gnome.org>
10689
10690         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10691         Convert.ChangeType() which works with TypeBuilder created types.
10692         (Enum.LookupEnumValue, Enum.Define): Use it here.
10693
10694         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10695         `TypeBuilder.BaseType != null' check.
10696         (TypeContainer.FindMembers): Only lookup parent members if we
10697         actually have a parent.
10698         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10699         (ConstructorInitializer.Resolve): Likewise.
10700
10701         * interface.cs (Interface.FindMembers): Added
10702         `TypeBuilder.BaseType != null' check.
10703
10704         * rootcontext.cs (RootContext.ResolveCore): Added
10705         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10706         classes_second_stage.
10707
10708         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10709         debug_type and trace_type when compiling with --nostdlib.       
10710
10711 2002-06-07  Martin Baulig  <martin@gnome.org>
10712
10713         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10714         (AddField): Set it to true when adding a non-static field.
10715         (DefineType): Use `have_nonstatic_fields' to find out whether we
10716         have non-static fields, not `Fields != null'.
10717
10718 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10719
10720         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10721         dereferencing a null on the static-field code path)
10722
10723 2002-05-30  Martin Baulig  <martin@gnome.org>
10724
10725         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10726         to take command line arguments.  Use reflection to call the new
10727         custom `Initialize' function on the symbol writer and pass it the
10728         command line arguments.
10729
10730         * driver.cs (--debug-args): New command line argument to pass command
10731         line arguments to the symbol writer.
10732
10733 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10734
10735         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10736         the target type for indexers and properties.  Thanks to Joe for
10737         catching this.
10738
10739 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10740
10741         * typemanager.cs (MethodFlags): returns the method flags
10742         (Obsolete/ShouldIgnore) that control warning emission and whether
10743         the invocation should be made, or ignored. 
10744
10745         * expression.cs (Invocation.Emit): Remove previous hack, we should
10746         not do this on matching a base type, we should do this based on an attribute
10747
10748         Only emit calls to System.Diagnostics.Debug and
10749         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10750         on the command line.
10751
10752         * rootcontext.cs: Global settings for tracing and debugging.
10753
10754         * cs-tokenizer.cs (define): New utility function to track
10755         defines.   Set the global settings for TRACE and DEBUG if found.
10756
10757 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10758
10759         * interface.cs (Populate*): Pass in the TypeContainer as well as
10760         the DeclSpace as parameters so that we can create EmitContexts and
10761         then use that to apply attributes etc.
10762
10763         (PopulateMethod, PopulateEvent, PopulateProperty)
10764         (PopulateIndexer): Apply attributes everywhere.
10765
10766         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10767         etc.
10768
10769         (ApplyAttributes): Update accordingly.
10770
10771         We now apply interface attributes for all members too.
10772
10773 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10774
10775         * class.cs (Indexer.Define); Correctly check if we are explicit
10776         implementation (instead of checking the Name for a ".", we
10777         directly look up if the InterfaceType was specified).
10778
10779         Delay the creation of the PropertyBuilder.
10780
10781         Only create the PropertyBuilder if we are not an explicit
10782         interface implementation.   This means that explicit interface
10783         implementation members do not participate in regular function
10784         lookups, and hence fixes another major ambiguity problem in
10785         overload resolution (that was the visible effect).
10786
10787         (DefineMethod): Return whether we are doing an interface
10788         implementation. 
10789
10790         * typemanager.cs: Temporary hack until we get attributes in
10791         interfaces (Ravi is working on that) and we get IndexerName
10792         support in interfaces.
10793
10794         * interface.cs: Register the indexers as properties.
10795
10796         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10797         warning, I have verified that this is a bug in the .NET runtime
10798         (JavaScript suffers of the same problem).
10799
10800         * typemanager.cs (MemberLookup): When looking up members for
10801         interfaces, the parent of an interface is the implicit
10802         System.Object (so we succeed in searches of Object methods in an
10803         interface method invocation.  Example:  IEnumerable x;  x.ToString
10804         ()) 
10805
10806 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10807
10808         * class.cs (Event): Events should also register if they do
10809         implement the methods that an interface requires.
10810
10811         * typemanager.cs (MemberLookup); use the new GetInterfaces
10812         method. 
10813
10814         (GetInterfaces): The code used to lookup interfaces for a type is
10815         used in more than one place, factor it here. 
10816
10817         * driver.cs: Track the errors at the bottom of the file, we kept
10818         on going.
10819
10820         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10821         instance if the method we are calling is static!
10822
10823 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10824
10825         * attribute.cs (ApplyAttributes): Make this function filter out
10826         the IndexerName attribute (as that attribute in reality is never
10827         applied) and return the string constant for the IndexerName
10828         attribute. 
10829
10830         * class.cs (TypeContainer.Emit): Validate that all the indexers
10831         have the same IndexerName attribute, and if so, set the
10832         DefaultName attribute on the class. 
10833
10834         * typemanager.cs: The return value might contain other stuff (not
10835         only methods).  For instance, consider a method with an "Item"
10836         property and an Item method.
10837
10838         * class.cs: If there is a problem with the parameter types,
10839         return. 
10840
10841 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10842
10843         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10844         looks at user defined conversion after making a call to 
10845         StandardConversionExists - we need this for overload resolution.
10846
10847         * expression.cs : Update accordingly the various method calls.
10848
10849         This fixes 2 bugs filed against implicit user defined conversions 
10850
10851 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10852
10853         * statement.cs: Track the result of the assignment.
10854
10855 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10856
10857         * expression.cs (MemberAccess): Improved error reporting for
10858         inaccessible members.
10859
10860 2002-05-22  Martin Baulig  <martin@gnome.org>
10861
10862         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10863         itself with debugging support.
10864
10865 2002-05-22  Martin Baulig  <martin@gnome.org>
10866
10867         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10868         Removed, this isn't needed anymore.
10869
10870 2002-05-20  Martin Baulig  <martin@gnome.org>
10871
10872         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
10873         be underlying type for an enum.
10874
10875 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
10876
10877         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
10878         that splits out the loading of just the core types.
10879
10880         * rootcontext.cs (ResolveCore): Split the struct resolution in
10881         two, so we can load the enumeration underlying types before any
10882         enums are used.
10883
10884         * expression.cs (Is): Bandaid until we fix properly Switch (see
10885         bug #24985 for details).
10886
10887         * typemanager.cs (ImplementsInterface): The hashtable will contain
10888         a null if there are no interfaces implemented.
10889
10890 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
10891
10892         * cs-parser.jay (indexer_declarator): It is fine to have array
10893         parameters
10894
10895 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10896
10897         * typemanager.cs: (RegisterBuilder): New function used to register
10898         TypeBuilders that implement interfaces.  Since
10899         TypeBuilder.GetInterfaces (as usual) does not work with lame
10900         Reflection.Emit. 
10901         (AddUserType): register interfaces.
10902
10903         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10904         dealing with TypeBuilder.  Also, arrays are showing up as
10905         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10906         methods can not be invoked on them!
10907
10908         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10909         (ImplicitReferenceConversionExists): Split out from
10910         StandardConversionExists. 
10911
10912         * expression.cs (As): We were only implementing one of the three
10913         cases for the as operator.  We now implement them all.
10914         (Is): Implement the various other cases for Is as well.
10915
10916         * typemanager.cs (CACHE): New define used to control if we want or
10917         not the FindMembers cache.  Seems to have a negative impact on
10918         performance currently
10919
10920         (MemberLookup): Nested types have full acess to
10921         enclosing type members
10922
10923         Remove code that coped with instance/static returns for events, we
10924         now catch this in RealFindMembers.
10925
10926         (RealFindMembers): only perform static lookup if the instance
10927         lookup did not return a type or an event.  
10928
10929 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10930
10931         * assign.cs (CompoundAssign): We pass more semantic information
10932         now to Compound Assignments than we did before: now we have all
10933         the information at hand, and now we resolve the target *before* we
10934         do the expression expansion, which allows the "CacheValue" method
10935         to have the effect we intended (before, a [x] += 1 would generate
10936         two differen ArrayAccess expressions from the ElementAccess,
10937         during the resolution process).
10938
10939         (CompoundAssign.DoResolve): Resolve target and original_source here.
10940
10941 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10942
10943         * expression.cs (ArrayAccess): dropped debugging information. 
10944
10945         * typemanager.cs: Small bug fix: I was always returning i_members,
10946         instead of one of i_members or s_members (depending on which had
10947         the content).
10948
10949         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10950         method is invoked before any code generation takes place, and it
10951         is a mechanism to inform that the expression will be invoked more
10952         than once, and that the method should use temporary values to
10953         avoid having side effects
10954
10955         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10956
10957         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10958         implementation.
10959
10960         * expression.cs (Indirection, ArrayAccess): Add support for
10961         CacheTemporaries in these two bad boys. 
10962
10963         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10964         ldobj or ldind_ref.  
10965         (StoreFromPtr): Handle stobj as well.
10966
10967         * expression.cs (UnaryMutator): Share more code.
10968
10969         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10970         down: I was not tracking the Filter function as well, which
10971         was affecting the results of the cache.
10972
10973 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10974
10975         * attribute.cs: Remove the hack to handle the CharSet property on
10976         StructLayouts. 
10977
10978 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10979
10980         * attribute.cs (DoResolve): More uglyness, we now only try to
10981         resolve the attribute partially, to extract the CharSet
10982         information (only if we are a StructLayout attribute).  Otherwise 
10983
10984         (GetExtraTypeInfo): Add some code to conditionally kill in the
10985         future this.   I am more and more convinced that the .NET
10986         framework has special code to handle the attribute setting on
10987         certain elements.
10988
10989         * expression.cs (IsParamsMethodApplicable): Revert my previous
10990         foreach change here, it was wrong.
10991
10992 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10993
10994         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10995         (pp_expr): do not abort on unknown input, just return.
10996         (eval): abort if there are pending chars.
10997
10998         * attribute.cs (Attribute.Resolve): Positional parameters are
10999         optional.  Deal with that case.
11000
11001         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
11002         the Ansi/Unicode/Auto information for the type.
11003
11004         (TypeContainer.DefineType): instantiate the EmitContext here, as
11005         we will be using it during the type definition (to resolve
11006         attributes) and during the emit phase.
11007
11008         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11009         to pull type information out of the attributes
11010
11011         (Attribute.Resolve): track the constructor builder, and allow for
11012         multiple invocations (structs and classes will use this).
11013
11014         * ecore.cs (MemberLookupFinal): new version with all the
11015         parameters customizable.
11016
11017         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11018         constructors.  Return if the result value is null (as the error
11019         would have been flagged already by MemberLookupFinal)
11020
11021         Do not allow instances of abstract classes or interfaces to be
11022         created.
11023
11024         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11025         We have to compare the assembly property here when dealing with
11026         FamANDAssem and Assembly access modifiers, because we might be
11027         creating an assembly from *modules* (that means that we are not
11028         getting TypeBuilders for types defined in other modules that are
11029         part of this assembly).
11030
11031         (Method.Emit): If the method is marked abstract and has a body,
11032         emit an error. 
11033
11034         (TypeContainer.DefineMembers): If both the defined member and the
11035         parent name match are methods, then do not emit any warnings: let
11036         the Method.Define routine take care of flagging warnings.  But if
11037         there is a mismatch (method overrides something else, or method is
11038         overriwritten by something, then emit warning).
11039
11040         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11041         set to null, this means `do not check for the return type on the
11042         signature'. 
11043
11044         (Method.Define): set the return type for the method signature to
11045         null, so that we get methods with the same name and parameters and
11046         different return types.  This is used to flag warning 114 (you are
11047         hiding a method, and you probably want to use the new/override
11048         keywords instead).
11049
11050         * typemanager.cs (MemberLookup): Implemented proper access
11051         control, closing a long standing set of bug reports.  The problem
11052         was that the Framework only has two bits: Public and NonPublic,
11053         and NonPublic includes private and protected methods, but we need
11054         to enforce the FamANDAssem, FamOrAssem and Family. 
11055
11056 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11057
11058         * statement.cs (GotoCase): Return true: Ammounts to giving up
11059         knowledge on whether we return or not, and letting the other case
11060         be responsible for it.
11061
11062 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11063
11064         * driver.cs: Do not load directories for each file processed, only
11065         do it if there is a pattern.
11066
11067         * ecore.cs: Report readonly assigns here as well, as we might have
11068         been resolved only by MemberAccess.
11069
11070         (SimpleName.SimpleNameResolve): Also be useful for LValue
11071         resolution.   We need this to propagate assign to local readonly variables
11072
11073         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11074         do not want to reuse potential criteria memory.
11075
11076         * class.cs (MyEventBuilder): Set reflected_type;
11077
11078         * ecore.cs (Constantify): Added support for constifying bools.
11079
11080         (RootContext.LookupType): Added a cache for values looked up in
11081         the declaration space.
11082
11083         * typemanager.cs (FindMembers): Now is a front-end to
11084         RealFindMembers, and provides a two-level hashtable-based cache to
11085         the request.  
11086
11087         15% performance improvement: from 22.5 to 19.2 seconds.
11088
11089         * expression.cs (IsParamsMethodApplicable): use foreach.
11090         (Invocation.DoResolve): ditto.
11091         (New.DoResolve): ditto.
11092         (ArrayCreation.DoResolve): ditto.
11093
11094         * ecore.cs (FindMostEncompassingType): use foreach.
11095
11096         * delegate.cs (NewDelegate.DoResolve): Use foreach
11097
11098         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11099         (RemoveMethods): use foreach.
11100
11101         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11102         nested foreach statements instead of for, and also break out of
11103         the inner loop once a match is found.
11104
11105         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11106
11107 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11108
11109         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11110         we actually unwrap the expression to allow for extra information
11111         to be extracted. 
11112
11113         * expression.cs: Use Shr_Un on unsigned operations. 
11114
11115 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11116
11117         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11118         applicable operators was not being considered correctly. This closes
11119         the bug Miguel reported.
11120
11121 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11122
11123         * attribute.cs: check that the type derives from System.Attribute
11124         and report the correct error in that case (moved the duplicate code to
11125         its own method, too).
11126
11127 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11128
11129         * attribute.cs: lookup attribute type name as the spec says: first the
11130         bare attribute name and then name + "Attribute" (nant compiles with
11131         mcs after this fix).
11132
11133 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11134
11135         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11136         Because of the way we parse things, we should try to see if a
11137         UIntConstant can fit in an integer.
11138
11139 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11140
11141         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11142         when we are in an explicit context.
11143
11144         (ConvertReferenceExplicit): When converting from Iface type S to Class
11145         T make sure the rules are implemented as an OR.
11146
11147         * parameter.cs (ParameterType): Make it a property for now although the
11148         purpose really isn't anything immediate.
11149
11150         * expression.cs (Is*Applicable): Do better checking on the parameter type
11151         of a ref/out parameter. The ones from the system assemblies are already 
11152         marked with the correct type so we don't need to do any correction.
11153
11154         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11155         the object type is standard too so include that.
11156
11157 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11158
11159         * ecore.cs (StandardConversionExists): Augment with missing code:
11160         deal with IntConstant, LongConstants and Enumerations.
11161
11162         * assign.cs: Report the error, instead of failing silently
11163
11164         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11165         typecontainer that they are declared, because the
11166         typecontainer/namespace will have the list of using clauses that
11167         need to be applied.
11168
11169         Assembly Attributes were escaping the normal registration
11170         mechanism. 
11171
11172         (EmitCode): Apply attributes within an EmitContext that represents
11173         the container they were declared on.
11174
11175         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11176
11177 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11178
11179         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11180         Revamp completely - make much cleaner as we now operate only
11181         on a set of Types.
11182
11183         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11184         to implement the logic detailed in the spec more correctly.
11185
11186         (UserDefinedConversion): Update accordingly.
11187
11188 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11189
11190         * statement.cs: Return flow analysis information up.
11191
11192         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11193         and the default.
11194
11195         (token): Do not consume an extra character before calling
11196         decimal_digits.
11197
11198 2002-05-06  Piers Haken <piersh@friskit.com>
11199
11200         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11201
11202 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11203
11204         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11205         EmitContext during the instance constructor initializer
11206         resolution, to stop access to instance variables.
11207
11208         This is mandated by the spec, last paragraph of the `constructor
11209         initializers' section. 
11210
11211 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11212
11213         * cs-parser.jay, class.cs (Accessor): new class used to represent
11214         an accessor (get or set).  In the past we used `null' to represent
11215         a missing accessor.  But this is ambiguous because there was no
11216         way to tell in abstract indexers/properties if one of them was
11217         specified.
11218
11219         Now there is a way of addressing that.
11220
11221         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11222         instead of FindMembers.
11223
11224         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11225         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11226
11227         * attribute.cs: Treat indexers and properties as the same in terms
11228         of applying attributes
11229
11230         * ecore.cs (FindMostEncompassedType): Use statically initialized
11231         EmptyExpressions()s like we do elsewhere to avoid creating useless
11232         objects (and we take this out of the tight loop).
11233
11234         (GetConversionOperators): Move the code to extract the actual
11235         operators to a separate routine to clean things up.
11236
11237 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11238
11239         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11240         events are always registered FieldBuilders.
11241
11242         * class.cs (FieldBase): New class shared by Fields 
11243
11244         * delegate.cs: If we are a toplevel delegate, use our full name.
11245         If we are a nested delegate, then only use our tail name.
11246
11247 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11248
11249         * expression.cs (IsApplicable): Ensure that we add the "&" to
11250         ref/out types before comparing it with the type of the argument.
11251
11252         (IsParamsMethodApplicable): Ditto.
11253
11254         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11255         silly me ;-)
11256
11257         * delegate.cs : Handle the case when we have more than one applicable
11258         method. Flag an error only when we finish checking all.
11259
11260 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11261
11262         * expression.cs: Add support for boolean static initializers.
11263
11264 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11265
11266         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11267
11268         * parameter.cs (ComputeParameterTypes,
11269         ComputeAndDefineParameterTypes): Better error handling: now we
11270         clear the `types' cache if we fail during any of the type lookups.
11271         We also return the status code correctly to our caller
11272
11273         * delegate.cs: If we fail to define a delegate, abort the extra
11274         steps. 
11275
11276         * expression.cs (Binary.ResolveOperator): for
11277         operator==(object,object) and operator !=(object, object) we also
11278         have to verify that there is an implicit conversion from one to
11279         the other.
11280
11281         (ArrayAccess.DoResolve): Array Access can operate on
11282         non-variables. 
11283
11284 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11285
11286         * assign.cs (CompoundAssign): A new class used as a "flag" that
11287         the assignment actually is happening as part of a compound
11288         assignment operator.
11289
11290         During compound assignment, a few new rules exist to enable things
11291         like:
11292
11293         byte b |= 1 + 2
11294
11295         From the spec:
11296
11297         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11298         to the type of x) if y is implicitly convertible to the type of x,
11299         and the operator is a builtin operator and the return type of the
11300         operator is explicitly convertible to the type of x. 
11301
11302         * rootcontext.cs: Reset warning level to 2.  4 catches various
11303         "interesting" features in mcs, we must clean this up at some
11304         point, but currently am trying to kill other bugs ;-)
11305
11306         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11307         in container classes as well.  
11308
11309         * expression.cs (Binary.ResolveOperator): Handle string case
11310         before anything else (as operator overloading does emit an error
11311         before doing anything else).
11312
11313         This code could go away when we move to a table driven model, but
11314         i could not come up with a good plan last night.
11315
11316 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11317
11318         * typemanager.cs (CSharpName): reimplementation using regex.
11319         * class.cs: added null check for fields in Emit
11320         * rootcontext.cs: set warninglevel to 4
11321
11322 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11323
11324         * typemanager.cs (CSharpName): reimplemented with Lupus
11325         suggestion.
11326
11327 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11328
11329         * statement.cs (If): correclty implement Resolve, because we were
11330         not catching sem errors in there.  The same process is needed
11331         everywhere else. 
11332         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11333
11334
11335         (Statement.Warning_DeadCodeFound): Factorize code.
11336         (While): Report dead code here too.
11337
11338         (Statement): Added Resolve virtual method to allow
11339         for resolution split from the emit code.
11340
11341 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11342
11343         * statement.cs (EmitBoolExpression): No longer try to resolve the
11344         expression here.    
11345         (MakeBoolean): New utility function that resolve, implicitly
11346         converts to boolean and tags the expression. 
11347
11348
11349         (If, Do): Implement dead code elimination.
11350         (While): Implement loop inversion
11351
11352         (Do, While, For, If): Resolve the expression prior to calling our
11353         code generation.
11354
11355 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11356
11357         * class.cs:
11358           - added method Report28 (warning: program has more than one entry point)
11359           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11360           - modified method Method.Define, the part at the end of the method
11361
11362         * rootcontext.cs: added static public Location EntryPointLocation;
11363           
11364         * ../errors/cs0028.cs : Add test case for the above warning.              
11365
11366         * typemanager.cs:
11367           - modified method CSharpName to allow arrays of primitive type to
11368             be printed nicely (e.g. instead of System.Int32[][] it now prints
11369             int[][])
11370           - added method CSharpSignature: returns the signature of a method
11371             in string format to be used in reporting errors, warnings, etc.
11372
11373         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11374         with String.Empty.
11375
11376 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11377
11378         * delegate.cs (Define): Fix extremely silly bug where I was
11379         setting the type of the 'object' parameter of the BeginInvoke
11380         method to System.IAsyncResult instead of System.Object ;-)
11381
11382 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11383
11384         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11385         here. 
11386
11387         (Constructor.Emit): return if we fail to initialize the
11388         constructor.  Another door closed!  
11389
11390         * expression.cs (New.DoResolve): Improve error message (from -6 to
11391         1501).  Use DeclaredOnly lookup to find the exact constructor.
11392
11393         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11394         loop.  This is useful.
11395
11396         * cs-parser.jay: Adjust the default parameters so that destructors
11397         have the proper signature.
11398
11399 2002-04-26  Martin Baulig  <martin@gnome.org>
11400
11401         * driver.cs (LoadAssembly): If `assembly' contains any characters
11402         which are only valid in path names and not in assembly names
11403         (currently slash, backslash and point), use Assembly.LoadFrom ()
11404         instead of Assembly.Load () on the `assembly' (before iteration
11405         over the link_paths).
11406
11407 2002-04-26  Martin Baulig  <martin@gnome.org>
11408
11409         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11410
11411 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11412
11413         * class.cs (Property): use the new typemanager.MemberLookup
11414
11415         (TypeContainer.MemberLookup): Implement using the
11416         TypeManager.MemberLookup now. 
11417
11418         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11419         and return MemberInfos, so that these can be used without an
11420         EmitContext (what we had before).
11421
11422 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11423
11424         * expression.cs: Fix the case where the argument to params if the
11425         type of the params.  I omitted handling this before.   Fixed
11426
11427 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11428
11429         * driver.cs: Call BootCorlib_PopulateCoreType
11430
11431         * class.cs (Property.CheckBase): Check for properties only, not
11432         for all members. 
11433
11434         * interface.cs: Temporary hack: try/catch around the
11435         CustomAttributeBuilder, because I am getting an exception that I
11436         do not understand.
11437
11438         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11439         types whose definitions are required to be there (attributes are
11440         defined before standard types).
11441
11442         Compute definitions as we boot the various types, as they are used
11443         immediately (value_type class will need object_type, but if we do
11444         not initialize object_type, we will pass a null, which will let
11445         the runtime pick the System.Object from the existing corlib, which
11446         is not what we want).
11447
11448 2002-04-22  Patrik Torstensson <totte@labs2.com>
11449
11450         * cs-tokenizer.cs: fixed a number of trim() issues.
11451
11452 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11453
11454         * expression.cs (Argument.Type): Ensure that we return the correct
11455         type when we have out or ref parameters [in which case we 
11456         append a "&"].
11457
11458 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11459
11460         * class.cs (Property, Indexer): Allow extern modifier in there. 
11461
11462         * typemanager.cs (InitBaseTypes): Initializes object_type and
11463         value_type, since those will be used early on during the bootstrap
11464         process to compile corlib.
11465
11466         (InitCoreTypes): Move code from here to InitBaseTypes.
11467
11468 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11469
11470         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11471         single-dimension arrays as using the ldlen opcode.  
11472
11473         Daniel Lewis discovered this optimization.  
11474
11475         * typemanager.cs: Add signature for System.Array::get_Length
11476
11477 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11478
11479         * statement.cs: report the error when the foreach does not apply to an
11480         array nor a collection.
11481
11482 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11483
11484         * expression.cs: Add implicit conversions to the operator ~.
11485
11486         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11487
11488         * typemanager.cs: Locate the decimal constructor.
11489
11490 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11491
11492         * attribute.cs: use the new property of TypeOf.
11493         * expression.cs: added 'get' property around typearg.
11494
11495         These changes fix a build breaker reported by NickD. Is this the
11496         correct way to fix?  If not, please, revert my changes and make it
11497         work :-).
11498
11499 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11500
11501         * attribute.cs: Add support for typeof in attribute invocations.
11502         I am not sure that this is right though.
11503
11504 2002-04-14  Duncan Mak  <duncan@ximian.com>
11505
11506         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11507         Binary.Operator.Division case.
11508
11509 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11510
11511         * class.cs (DefineType): Ensure that we do a proper check on
11512         attribute types and also register it with the TypeManager.
11513
11514         (TypeContainer.Targets): The default for attribute types is
11515         AttributeTargets.All.
11516
11517         * attribute.cs (ApplyAttributes): Registering the attribute type
11518         is done elsewhere, not when we discover we have a Usage attribute.
11519
11520 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11521
11522         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11523         and get rid of is_delegate parameter.
11524
11525         * everywhere : update.
11526
11527 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11528
11529         * cs-parser.jay (compilation_unit): Revamp completely to use
11530         some new ideas that I got from Rhys' grammar to solve the problems
11531         with assembly level attributes.
11532
11533         (outer_declaration): New grammar production.
11534
11535         (attribute_sections): Add.
11536
11537         (opt_attributes): Base on attribute_sections
11538
11539         (namespace_declaration): Allow opt_attributes to tackle the case
11540         when we have assembly level attributes - we are clever in this
11541         regard now ;-)
11542
11543         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11544         attributes in the non-global context.
11545
11546         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11547         instead of SetGlobalAttributes.
11548
11549         * class.cs, rootcontext.cs : Ensure we define and generate 
11550         attribute types before anything else.
11551
11552         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11553         and flag the new error -20 for the case when the attribute type
11554         does not have valid targets specified. csc does not catch this.
11555
11556         * ../errors/errors.txt : update for error # -20
11557
11558 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11559
11560         * support.cs (InternalParameters.ParameterModifier): Do some null
11561         checking and return sane values.
11562
11563         * class.cs (Method.Define): If we are a PInvoke method, ensure
11564         that we are static and extern. Report error # 601
11565
11566         * ../errors/cs0601.cs : Add test case for the above error.
11567
11568 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11569
11570         * rootcontext.cs (attribute_types): We need to keep type of
11571         all attribute types separately and emit code for them first.
11572
11573         (RegisterAttribute) : Implement.
11574
11575         * class.cs (DefineType): Check if the current Type is a custom
11576         attribute type and register it accordingly.
11577
11578         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11579         adding the first attribute twice and rename to
11580
11581         (SetGlobalAttributes): this.
11582
11583         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11584         lookups.
11585
11586         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11587         if we are processing global arguments. Hmm, I am unsure of this.
11588
11589 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11590
11591         * expression.cs: added static array of strings to avoid calling
11592         Enum.ToString () for Operator in Binary. Significant recover of
11593         performance.
11594
11595 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11596
11597         * class.cs (FindMembers): Allow the Builders of the various
11598         members to be null.  If they are skip them.  This only happens
11599         during the PInvoke declaration.
11600
11601 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11602
11603         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11604         failure, so we do not keep going afterwards.
11605
11606         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11607         wanted to pass `false' as the `is_delegate' argument.  If this is
11608         the case, why not use delegate_type == null to mean `is_delegate =
11609         false' and anything else as is_delegate = true.
11610
11611 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11612
11613         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11614         code for the section, not the beginning of the tests.
11615
11616 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11617
11618         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11619
11620         * expression.cs (Binary): same.  Warn about errors where we have
11621         Enum/Enum in operator + as well.
11622
11623 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11624
11625         * statement.cs:
11626                 - added support for switch(bool)
11627                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11628                 - add TableSwitchEmit() to handle table-based switch statements
11629
11630 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11631
11632         * expression.cs (Invocation.OverloadResolve): Factor out code which
11633         does parameter compatibility checking with arguments so that we can 
11634         re-use the code even from Delegate.VerifyApplicability
11635
11636         (VerifyArgumentsCompat): Move above code here.
11637
11638         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11639         and instead make a call to the above method.
11640
11641 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11642
11643         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11644         We use it to keep track of classes which are attribute types.
11645
11646 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11647
11648         * delegate.cs (Delegate.Define): Correctly define the types in the
11649         presence of fixed and array parameters.
11650
11651         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11652         doing FindMembers.
11653
11654         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11655         include NonPublic after the first iteration.
11656
11657         * class.cs (Indexer.CheckBase): Only check if both parents are
11658         non-null. 
11659
11660         * cs-parser.jay (accessor_body): If empty, set to null.
11661
11662         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11663         same code path here to resolve constants names that we did have in
11664         MemberAccess.DoResolve.  There is too much code duplicated here.
11665
11666 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11667
11668         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11669
11670         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11671         to MakeUnionSet.
11672
11673         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11674         tokens, numbers and strings.
11675
11676         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11677         parenthesis.
11678
11679         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11680         asyncronous parameters and the regular parameters.  
11681
11682         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11683         specify the target directory.
11684
11685         * expression.cs: (This.DoResolve): Simplify
11686         (As.Emit): Optimize, do not generate IsInst if the expression is
11687         always of the given type.
11688
11689         (Is.DoResolve): Bug fix, we were reporting both always/never for
11690         the is expression.
11691
11692         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11693         creating too many unnecessary arrays.
11694
11695 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11696
11697         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11698         fields instead of rolling our own initializer.   Takes care of all
11699         implicit conversions, and drops unnecessary static checks/argument.
11700
11701 2002-03-31  Dick Porter  <dick@ximian.com>
11702
11703         * driver.cs: use the GetDirectories() return values properly, and
11704         use "/" as path separator.
11705
11706 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11707
11708         * expression.cs (Unary): Optimize - - expr into expr.
11709         (Binary): Optimize a + (-b) into a -b.
11710
11711         * codegen.cs (CodeGen): Made all methods static.
11712
11713 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11714
11715         * rootcontext.cs: 
11716
11717         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11718         TypeBuilder property.
11719
11720         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11721         instead. 
11722
11723         * tree.cs: Removed the various RecordXXXX, and replaced with a
11724         single RecordDecl.  Removed all the accessor methods, and just
11725         left a single access point Type 
11726
11727         * enum.cs: Rename DefineEnum to DefineType.
11728
11729         * decl.cs: New abstract method `DefineType' used to unify the
11730         Defines for Enumerations, Interfaces, TypeContainers and
11731         Delegates.
11732
11733         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11734         LookupBaseClasses method that used to live in class.cs and
11735         interface.cs here, and renamed to FindType.
11736
11737         * delegate.cs: Implement DefineType.  Take advantage of the
11738         refactored pattern for locating the parent builder without taking
11739         the parent_builder argument (which we know does not work if we are
11740         nested, and triggering a toplevel definition).
11741
11742 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11743
11744         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11745         accessibility of a member has changed during override and report
11746         an error if so.
11747
11748         * class.cs (Method.Define, Property.Define): Only complain on
11749         overrides if the method is private, any other accessibility is
11750         fine (and since we just checked the permission is the same, we are
11751         good to go).
11752
11753         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11754         and elif are processed always.  The other pre-processing
11755         directives are only processed if we are "taking" the path
11756
11757 2002-03-29  Martin Baulig  <martin@gnome.org>
11758
11759         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11760         current location is not Null.
11761
11762         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11763         a separate method so we can profile it.
11764
11765         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11766         `span.Seconds' are just seconds, but no minutes or hours.
11767         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11768
11769 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11770
11771         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11772         Remove the gratuitous set of Final:
11773
11774                                 // If an interface implementation, then we can set Final.
11775                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11776                                     implementing.DeclaringType.IsInterface)
11777                                         flags |= MethodAttributes.Final;
11778
11779         I do not know what I was smoking when I used that.
11780
11781
11782         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11783         step into fixing the name resolution issues for delegates and
11784         unifying the toplevel name resolution.
11785
11786 2002-03-28  Martin Baulig  <martin@gnome.org>
11787
11788         * class.cs (Method.Emit): If we have a symbol writer, call its
11789         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11790         tell it about the current method.
11791
11792         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11793         writer that we're going to emit the first byte of IL code for a new
11794         statement (a new source line).
11795         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11796         EmitContext.Mark() before emitting any code.
11797
11798         * location.cs (SymbolDocument): Return null when we're Null.
11799
11800         * statement.cs (Statement): Moved the `Location loc' variable here.
11801         (Statement.EmitBoolExpression): If we have a symbol writer, call
11802         ec.Mark() before emitting any code to tell it that we're at the
11803         beginning of a new statement.
11804         (StatementExpression): Added `Location' argument to the constructor.
11805         (Block): Added public readonly variable `StartLocation' and public
11806         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11807         (Block): Added constructor which takes a start and end location.
11808         (Block.SetEndLocation): New method. This sets the end location.
11809         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11810         local variables we create.
11811         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11812         each statement and do also mark the begin and end of the block.
11813
11814         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11815         tell it the current lexer.Location, use Location.Null for the end of the
11816         block.
11817         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11818         current block, set its end location using SetEndLocation().
11819         (statement_expression): StatementExpression constructor now takes the
11820         lexer.Location as additional argument.
11821         (for_statement, declare_local_variables): Likewise.
11822         (declare_local_variables): When creating a new implicit block, use the
11823         new Block constructor and pass it the lexer.Location.
11824
11825 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11826
11827         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11828         members also on the parent interfaces recursively.
11829
11830 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11831
11832         * report.cs: Use new formats, since Gonzalo finished the missing
11833         bits. 
11834
11835         * expression.cs (Binary.ResolveOperator): added missing operator|
11836         operator& and operator^ for bool/bool.
11837
11838         * cs-parser.jay: CheckDef now takes a Location argument that is
11839         used to report errors more precisly (instead of reporting the end
11840         of a definition, we try to track something which is a lot closer
11841         to the source of the problem).
11842
11843         * cs-tokenizer.cs: Track global token use, so we can properly flag
11844         the use of #define/#undef after the first token has been seen.
11845
11846         Also, rename the reportXXXX to Error_DescriptiveName
11847
11848         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11849         TypeContainer, so that Enum and Interface can use this too.
11850
11851         * class.cs (TypeContainer.LookupInterfaceOrClass,
11852         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11853         `builder' argument.  Typically this was used to pass the parent
11854         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11855         the definition).  
11856
11857         The problem is that a nested class could trigger the definition of
11858         a toplevel class, and the builder would be obviously wrong in that
11859         case. 
11860
11861         So we drop this argument, and we compute dynamically the
11862         TypeBuilder/ModuleBuilder (the correct information was available
11863         to us anyways from DeclSpace.Parent)
11864
11865         * interface.cs (Interface.DefineInterface): Drop builder
11866         parameter cleanup like class.cs
11867
11868         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11869         like class.cs
11870
11871         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
11872         values. 
11873
11874         (Try.Emit): Propagate the returns value from the statement.
11875
11876         (Return.Emit): Even if we are leavning 
11877
11878         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
11879
11880         * modifiers.cs: Fix the computation of MethodAttributes flags.
11881
11882 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
11883
11884         * driver.cs: allow compilation of files that start with '/'.
11885         Add a default case when checking the argument of --target.
11886
11887 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
11888
11889         * interface.cs: Implement the same search algorithm for types in
11890         the interface code.
11891
11892         * delegate.cs: Do not allow multiple definition.
11893
11894         * Recovered ChangeLog that got accidentally amputated
11895
11896         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11897
11898         * rootcontext.cs: Load manually enum to allow core classes to
11899         contain enumerations.
11900
11901         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11902         Update to new static methods in TypeManager.
11903
11904         * typemanager.cs (GetMethod, GetConstructor): Use our
11905         implementation of FindMembers to find the members, since during
11906         corlib compilation, the types are TypeBuilders and GetMethod and
11907         GetConstructor do not work.
11908
11909         Make all methods in TypeManager static.
11910
11911         (InitCodeHelpers): Split the functionality from
11912         the InitCodeTypes function.
11913
11914         * driver.cs: Call InitCodeHelpers after we have populated the
11915         types. 
11916
11917         * cs-parser.jay (delegate_declaration): we did not used to compute
11918         the delegate name correctly for void delegates.
11919
11920 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11921
11922         * rootcontext.cs (RootContext): Init the interface_resolve_order
11923         and type_container_resolve_order always.
11924
11925         (ResolveCore, BootstrapCorlib_ResolveClass,
11926         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11927         compiler when compiling with --nostdlib
11928
11929         * class.cs (TypeContainer.DefineType): Check that our parent is
11930         not null.  This test is most important when we are bootstraping
11931         the core types.
11932
11933         * codegen.cs: Split out the symbol writing code.
11934
11935 2002-03-25  Martin Baulig  <martin@gnome.org>
11936
11937         * driver.cs (-g): Made -g an alias for --debug.
11938
11939 2002-03-24  Martin Baulig  <martin@gnome.org>
11940
11941         * codegen.cs (SymbolWriter): New public variable. Returns the
11942         current symbol writer.
11943         (CodeGen): Added `bool want_debugging_support' argument to the
11944          constructor. If true, tell the ModuleBuild that we want debugging
11945         support and ask it for the ISymbolWriter.
11946         (Save): If we have a symbol writer, call it's Close() method after
11947         saving the assembly.
11948
11949         * driver.c (--debug): New command line argument to create a
11950         debugger information file.
11951
11952         * location.cs (SymbolDocument): New public property. Returns an
11953         ISymbolDocumentWriter object for the current source file or null
11954         if we don't have a symbol writer.
11955
11956 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11957
11958         * driver.cs (LoadAssembly): Correctly return when all the paths
11959         have been tried and not before.
11960
11961         * statement.cs (Switch.Emit): return the actual coverage for this
11962         statement (returns/not-returns)
11963
11964         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11965         switch of the statement if we are the last switch section.  That
11966         kills two problems: try/catch problems (we used to emit an empty
11967         nop at the end) and switch statements where all branches would
11968         return. 
11969
11970 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11971
11972         * driver.cs: Add default assemblies (the equivalent to the
11973         Microsoft CSC.RSP file)
11974
11975         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11976         also update tokens_seen and set it to false.
11977
11978         * driver.cs: Implement --recurse for Mike.
11979
11980         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11981         correctly splitting out the paths.
11982
11983 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11984
11985         * interface.cs (Interface.PopulateProperty): Instead of using
11986         `parent' as the declaration space for the set parameters, use
11987         `this' 
11988
11989         * support.cs (InternalParameters): InternalParameters constructor
11990         takes a DeclSpace instead of a TypeContainer.
11991
11992         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11993         types are being initialized, load the address of it before calling
11994         the function.  
11995
11996         (New): Provide a mechanism to disable the generation of local
11997         value type temporaries when the caller will be providing us with
11998         an address to store it.
11999
12000         (ArrayCreation.EmitDynamicInitializers): Use it.
12001
12002 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
12003
12004         * expression.cs (Invocation.EmitArguments): Only probe for array
12005         property if there is more than one argument.  Sorry about that.
12006
12007         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12008         empty param arrays.
12009
12010         * class.cs (Method.LabelParameters): Fix incorrect code path that
12011         prevented the `ParamArrayAttribute' from being applied to the
12012         params attribute.
12013
12014 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12015
12016         * support.cs (ReflectionParameters): Correctly compute whether the
12017         last argument is a params array.  Fixes the problem with
12018         string.Split ('a')
12019
12020         * typemanager.cs: Make the assemblies array always be non-null
12021         (empty, but non-null)
12022
12023         * tree.cs (RecordDecl): New function that abstracts the recording
12024         of names.  This reports error 101, and provides a pointer to the
12025         previous declaration.  Fixes a crash in the compiler.
12026
12027         * cs-parser.jay (constructor_declaration): Update to new grammar,
12028         and provide a constructor_body that can be empty.
12029
12030 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12031
12032         * driver.cs: Add support for --resources.
12033
12034         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12035         Make all types for the various array helper methods be integer.
12036
12037         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12038         CheckState to ConvCast.
12039
12040         (ConvCast): Now it takes a `checked' state argument, to avoid
12041         depending on the emit context for the conversion, and just using
12042         the resolve time setting.
12043
12044         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12045         instead of Invocation.EmitArguments.  We do not emit the original
12046         arguments, instead we emit those which have been converted to
12047         unsigned int expressions.
12048
12049         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12050
12051         * codegen.cs: ditto.
12052
12053         * expression.cs (LocalVariableReference): Drop the use of the
12054         Store function that depended on the variable index.
12055
12056         * statement.cs (VariableInfo): Drop the `Idx' property from this
12057         class, as this is not taking into account the indexes for
12058         temporaries tat we generate during the execution, getting the
12059         indexes wrong.
12060
12061         * class.cs: First emit class initializers, then call the parent
12062         constructor. 
12063
12064         * expression.cs (Binary): Fix opcode emision.
12065         (UnaryMutator.EmitCode): Support checked code generation
12066
12067         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12068         matches for events for both the Static and Instance scans,
12069         pointing to the same element.   Fix that.
12070
12071 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12072
12073         * rootcontext.cs (ResolveTree): Always set the
12074         interface_resolve_order, because nested interfaces will be calling
12075         into us.
12076
12077         * class.cs (GetInterfaceOrClass): Track the same resolution
12078         process used by TypeManager.LookupType.  This fixes the nested
12079         type lookups in class declarations (separate path from
12080         LookupType). 
12081
12082         (TypeContainer.DefineType): Also define nested interfaces.
12083         (TypeContainer.RegisterOrder): New public function used to
12084         register the order in which child interfaces need to be closed.
12085
12086         Nested interfaces need to be closed after their parents have been
12087         created. 
12088
12089         * interface.cs (InterfaceAttr): Put all the logic for computing
12090         the interface attribute here. 
12091
12092         (DefineInterface): Register our interface order with the
12093         RootContext or with the TypeContainer depending on the case.
12094
12095 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12096
12097         * cs-parser.jay: rework foreach statement to work with the new
12098         changes to the policy on SimpleNames.
12099
12100         * report.cs: support Stacktrace on warnings as well.
12101
12102         * makefile: drop --unsafe and /unsafe from the compile.
12103
12104 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12105
12106         * ecore.cs (StandardConversionExists): Modify to take an Expression
12107         as the first parameter. Ensure we do null -> reference type conversion
12108         checking.
12109
12110         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12111         temporary Expression objects.
12112
12113 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12114
12115         * interface.cs: workaround bug in method overloading resolution
12116         (there is already a bugzilla bug for it).
12117
12118 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12119
12120         We could also solve this problem by having a separate path for
12121         performing type lookups, instead of DoResolve, we could have a
12122         ResolveType entry point, and only participating pieces of the
12123         production (simplename, deref, array) would implement this. 
12124
12125         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12126         signal SimpleName to only resolve type names and not attempt to
12127         resolve anything else.
12128
12129         * expression.cs (Cast): Set the flag.
12130
12131         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12132
12133         * class.cs: Only report 108 if there is no `new' modifier.
12134
12135         * cs-parser.jay: rework foreach statement to work with the new
12136         changes to the policy on SimpleNames.
12137         
12138         * report.cs: support Stacktrace on warnings as well.
12139
12140         * makefile: drop --unsafe and /unsafe from the compile.
12141
12142 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12143
12144         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12145         lookups here, instead of doing that at parse time.  This means
12146         that our grammar will not introduce `LocalVariableReferences' as
12147         expressions at this point.  That solves the problem of code like
12148         this:
12149
12150         class X {
12151            static void Main ()
12152            { int X = 1;
12153             { X x = null }}}
12154
12155         This is only half the fix.  The full fix requires parameters to
12156         also be handled in this way.
12157
12158         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12159         makes the use more obvious of the DeclSpace.  The
12160         ec.TypeContainer.TypeBuilder is now only used to pull the
12161         TypeBuilder for it.
12162
12163         My theory is that I can get rid of the TypeBuilder completely from
12164         the EmitContext, and have typecasts where it is used (from
12165         DeclSpace to where it matters).  
12166
12167         The only pending problem is that the code that implements Aliases
12168         is on TypeContainer, and probably should go in DeclSpace.
12169
12170         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12171         lookups here, instead of doing that at parse time.  This means
12172         that our grammar will not introduce `LocalVariableReferences' as
12173         expressions at this point.  That solves the problem of code like
12174         this:
12175
12176         class X {
12177            static void Main ()
12178            { int X = 1;
12179             { X x = null }}}
12180
12181         This is only half the fix.  The full fix requires parameters to
12182         also be handled in this way.
12183
12184         * class.cs (Property.DefineMethod): When implementing an interface
12185         method, set newslot, when implementing an abstract method, do not
12186         set the flag (before we tried never setting it, or always setting
12187         it, which is the difference).
12188         (Indexer.DefineMethod): same.
12189         (Method.DefineMethod): same.
12190
12191         * ecore.cs: Only set the status used flag if we get back a Field.
12192
12193         * attribute.cs: Temporary hack, so Paolo can keep working.
12194
12195 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12196
12197         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12198         the unmanaged type in the case we have a MarshalAs attribute.
12199
12200         (Resolve): Handle the case when we are parsing the special MarshalAs
12201         attribute [we need to store the unmanaged type to use later]
12202
12203         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12204         MarshalAs Attribute.
12205
12206         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12207         on parameters and accordingly set the marshalling info.
12208
12209 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12210
12211         * class.cs: Optimizing slightly by removing redundant code after
12212         we switched to the `NoTypes' return value.
12213         (Property.DefineMethod): use NoTypes here too.
12214
12215         This fixes the bug I introduced in my last batch of changes.
12216
12217 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12218
12219         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12220
12221         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12222         Enums since those are types too. 
12223
12224         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12225
12226         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12227         thanks to a call during the lookup process.
12228
12229 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12230
12231         * statement.cs (Foreach): Lots of work to accomodate a particular
12232         kind of foreach statement that I had not kept in mind.  It is
12233         possible to have foreachs on classes that provide a GetEnumerator
12234         method that return objects that implement the "pattern" for using
12235         a foreach, there is no need to support GetEnumerator
12236         specifically. 
12237
12238         This is needed to compile nant.
12239
12240         * decl.cs: Only report 114 if the member is not `Finalize' and if
12241         the warning level is at least 2.
12242
12243         * class.cs: Moved the compare function from Method to
12244         MethodSignature. 
12245
12246         (MethodSignature.InheritableMemberSignatureCompare): Add new
12247         filter function that is used to extract inheritable methods from a
12248         class. 
12249
12250         (Method.Define): Use the new `inheritable_method_signature_filter'
12251         delegate
12252
12253         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12254         command. 
12255
12256 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12257
12258         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12259
12260         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12261
12262         * expression.cs: Pass location information to
12263         ConvertImplicitStandard. 
12264
12265         * class.cs: Added debugging code to track return values from
12266         interfaces. 
12267
12268 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12269
12270         * expression.cs (Is.DoResolve): If either side of the `is' is an
12271         interface, do not flag the warning.
12272
12273         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12274         for interfaces
12275
12276         * report.cs: Allow for --fatal to be used with --probe.
12277
12278         * typemanager.cs (NoTypes): Move the definition for the empty Type
12279         array here. 
12280
12281         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12282         properties. 
12283         (TypeContainer.DefineProxy): New function used to proxy to parent
12284         implementations when implementing interfaces.
12285         (TypeContainer.ParentImplements): used to lookup if our parent
12286         implements a public function that is required by an interface.
12287         (TypeContainer.VerifyPendingMethods): Hook this up.
12288
12289         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12290         `modules' and `assemblies' arraylists into arrays.  We only grow
12291         these are the very early start up of the program, so this improves
12292         the speedof LookupType (nicely measured).
12293
12294         * expression.cs (MakeByteBlob): Replaced unsafe code with
12295         BitConverter, as suggested by Paolo.
12296
12297         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12298         folding of string concatenation, but if either side is a string,
12299         and the other is not, then return null, and let the runtime use
12300         the concatenation on the string plus the object (using
12301         `Object.ToString'). 
12302
12303 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12304
12305         Constant Folding has been implemented now.
12306
12307         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12308         the error instead on types that are not supported in one's
12309         complement. 
12310
12311         * constant.cs (Constant and all children): New set of functions to
12312         perform implict and explicit conversions.
12313
12314         * ecore.cs (EnumConstant): Implement the new functions to perform
12315         conversion by proxying to the child expression.
12316
12317         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12318         own separate setting that can not be turned off from the command
12319         line using --unchecked or --checked and is only controlled using
12320         the checked/unchecked statements and expressions.  This setting is
12321         used by the constant folder to flag errors.
12322
12323         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12324         ConstantCheckState as well.   
12325
12326         During Resolve, they also have to flag the state, because the
12327         constant folder runs completely in the Resolve phase.
12328
12329         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12330         well.
12331
12332 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12333
12334         * cfold.cs: New file, this file contains the constant folder.
12335
12336         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12337         argument to track whether we are using the resulting address to
12338         load or store a value and provide better error messages. 
12339
12340         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12341         new AddressOf arguments.
12342
12343         * statement.cs (Foreach.EmitCollectionForeach): Update
12344
12345         * expression.cs (Argument.Emit): Call AddressOf with proper
12346         arguments to track usage.
12347
12348         (New.DoEmit): Call AddressOf with new arguments.
12349
12350         (Unary.Emit): Adjust AddressOf call.
12351
12352 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12353
12354         * cs-parser.jay (member_access): Change the case for pre-defined types
12355         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12356         this suggestion.
12357
12358         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12359         a method body.
12360
12361         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12362         essentially like methods and apply attributes like MethodImplOptions to them too.
12363
12364         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12365         not being null.
12366
12367         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12368         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12369         is the DeclSpace.
12370
12371         * Update code everywhere accordingly.
12372
12373         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12374
12375         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12376
12377 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12378
12379         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12380         try performing lookups against those instead of jumping straight into using
12381         the 'using' clauses.
12382
12383         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12384
12385         (LookupType): Perform lookups in implicit parents too.
12386
12387         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12388         sequence as RootContext.LookupType. 
12389
12390         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12391         the various cases of namespace lookups into this method.
12392
12393 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12394
12395         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12396         in positional arguments)
12397
12398         * class.cs (Operator): Update the AllowedModifiers to contain
12399         extern. 
12400
12401         * cs-parser.jay: Update operator declaration to allow for the
12402         operator body to be empty.
12403
12404         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12405         values. 
12406
12407 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12408
12409         * class.cs (Method.Emit): Label parameters.
12410
12411         * driver.cs: Return 1 or 0 as the program exit code.
12412
12413 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12414
12415         * expression.cs: Special case the `null' object when trying to
12416         auto-compute the type, as anything can be explicitly converted to
12417         that. 
12418
12419         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12420         spotting this Paolo.
12421
12422         (Expression.ImplicitNumericConversion): Perform comparissions of
12423         the type using the underlying type in the case of an enumeration
12424         rather than using the enumeration type for the compare.
12425
12426         Cope with the underlying == type case, which is not possible to
12427         catch before. 
12428
12429         (Expression.ConvertNumericExplicit): Perform comparissions of
12430         the type using the underlying type in the case of an enumeration
12431         rather than using the enumeration type for the compare.
12432
12433         * driver.cs: If the user does not supply an extension, assume .exe
12434
12435         * cs-parser.jay (if_statement): Rewrote so that we can track the
12436         location for the if statement.
12437
12438         * expression.cs (Binary.ConstantFold): Only concat strings when
12439         the operation is "+", not everything ;-)
12440
12441         * statement.cs (Statement.EmitBoolExpression): Take a location
12442         argument. 
12443         (If, While, Do): Track location.
12444
12445         * expression.cs (Binary.ResolveOperator): In the object + string
12446         case, I was missing a call to ConvertImplicit
12447
12448 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12449
12450         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12451         Location arguments. Ensure we use RootContext.LookupType to do our work
12452         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12453
12454         * interface.cs (PopulateMethod): Handle the type of the parameter being
12455         null gracefully.
12456
12457         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12458         have a params method with no fixed arguments and a call is made with no
12459         arguments.
12460
12461 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12462
12463         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12464         the verbatim-string-literal
12465
12466         * support.cs (InternalParameters.ParameterModifier): handle null
12467         fixed parameters.
12468         (InternalParameters.ParameterType): ditto.
12469
12470         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12471         duplicating the name of the variable parameter.
12472         (GetParameterByName): Fix bug where we were not looking up array
12473         paramters if they were the only present (thanks Paolo!).
12474         (GetParameterInfo): We only have an empty set of types if both
12475         fixed and array are set to null.
12476         (GetParameterInfo-idx): Handle FixedParameter == null
12477
12478         * cs-parser.jay: Handle the case where there is no catch
12479         statements (missing null test).
12480
12481 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12482
12483         * driver.cs (MainDriver): Be conservative on our command line
12484         handling.
12485
12486         Catch DirectoryNotFoundException when calling GetFiles.
12487
12488         (SplitPathAndPattern): Used to split the input specification into
12489         a path and a pattern that we can feed to Directory.GetFiles.
12490
12491 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12492
12493         * statement.cs (Fixed): Implement the last case of the Fixed
12494         statement (string handling).
12495
12496         * expression.cs (StringPtr): New class used to return a char * to
12497         a string;  Used by the Fixed statement.
12498
12499         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12500
12501         * expression.cs (Binary.ResolveOperator): Remove redundant
12502         MemberLookup pn parent type.
12503         Optimize union call, we do not need a union if the types are the same.
12504         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12505         type.
12506
12507         Specialize the use of MemberLookup everywhere, instead of using
12508         the default settings. 
12509
12510         (StackAlloc): Implement stackalloc keyword.
12511
12512         * cs-parser.jay: Add rule to parse stackalloc.
12513
12514         * driver.cs: Handle /h, /help, /?
12515
12516         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12517         before we supported unsafe code.
12518
12519         * makefile: add --unsafe to the self compilation of mcs.
12520
12521 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12522
12523         * expression.cs (PointerArithmetic): New class that is used to
12524         perform pointer arithmetic.
12525         (Binary.Resolve): Handle pointer arithmetic
12526         Handle pointer comparission.
12527         (ArrayPtr): Utility expression class that is used to take the
12528         address of an array.
12529
12530         (ElementAccess): Implement array access for pointers
12531
12532         * statement.cs (Fixed): Implement fixed statement for arrays, we
12533         are missing one more case before we are done.
12534
12535         * expression.cs (Indirection): Implement EmitAssign and set the
12536         ExprClass to Variable.  This allows pointer dereferences to be
12537         treated as variables, and to have values assigned to them.
12538
12539         * ecore.cs (Expression.StoreFromPtr): New utility function to
12540         store values dereferencing.
12541
12542 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12543
12544         * expression.cs (Binary.ResolveOperator): Ensure that we are
12545         not trying to operate on a void type - this fixes the reported
12546         bug.
12547
12548         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12549         the parent implementation is sealed.
12550
12551         * ../errors/cs0239.cs : Add.
12552
12553         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12554
12555         * typemanager.cs (unverifiable_code_type): Corresponds to 
12556         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12557         which have unsafe code in them.
12558
12559         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12560         unsafe context.
12561
12562 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12563
12564         * cs-tokenizer.cs: Add support for @"litreal strings"
12565
12566         Make tokenizer accept pre-processor directives
12567         on any column (remove the old C-like limitation). 
12568
12569         * rootcontext.cs (EmitCode): Emit any global attributes.
12570         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12571
12572         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12573
12574         * cs-parser.jay: Add support for global attributes.  
12575
12576 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12577
12578         * expression.cs (Indirection): New helper class.  Unary will
12579         create Indirection classes to be able to implement the
12580         IMemoryLocation interface on it.
12581
12582 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12583
12584         * cs-parser.jay (fixed_statement): reference the right statement.
12585
12586         * statement.cs (Fixed.Emit): Finish implementing the fixed
12587         statement for the &x case.
12588
12589 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12590
12591         * class.cs (Property.Define, Method.Define): Remove newslot when
12592         `implementing'.  
12593
12594         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12595         wrong.  NewSlot should only be used if the `new' keyword is present.
12596
12597         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12598         locating our system dir.  Sorry about this.
12599
12600 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12601
12602         * driver.cs (GetSystemDir): Compute correctly the location of our
12603         system assemblies.  I was using the compiler directory instead of
12604         the library directory.
12605
12606 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12607
12608         * expression.cs (BetterFunction): Put back in what Miguel commented out
12609         since it is the correct fix. The problem is elsewhere ;-)
12610
12611         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12612         parameters of the parms method are themselves compatible or not !
12613
12614         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12615         to check that a class implements an interface before saying that an implicit
12616         conversion was allowed. Use ImplementsInterface to do the checking.
12617
12618 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12619
12620         * class.cs (Method.Define): Track whether we are an explicit
12621         implementation or not.  And only call DefineMethodOverride if we
12622         are an explicit implementation.
12623
12624         (Property.DefineMethod): Ditto.
12625
12626 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12627
12628         * expression.cs (BetterFunction): Catch hideous bug which was
12629          preventing us from detecting ambiguous calls due to implicit casts i.e
12630         cs0121.
12631
12632 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12633
12634         * support.cs (Pair): Remove un-needed method.  I figured why I was
12635         getting the error in cs-parser.jay, the variable in a foreach loop
12636         is readonly, and the compiler does not really treat this as a variable.
12637
12638         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12639         instead of EQUALS in grammar.  
12640
12641         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12642
12643         * expression.cs (Unary.DoResolve): Check whether the argument is
12644         managed or not.
12645
12646 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12647
12648         * support.cs: Api for Pair to set a value.  Despite the fact that
12649         the variables are public the MS C# compiler refuses to compile
12650         code that accesses the field if the variable is part of a foreach
12651         statement. 
12652
12653         * statement.cs (Fixed): Begin implementation of the fixed
12654         statement.
12655
12656         (Block.AddVariable): Return the VariableInfo on success and null
12657         on failure instead of true/false. 
12658
12659         * cs-parser.jay (foreach): Catch errors on variables already
12660         defined (we were ignoring this value before) and properly unwind
12661         the block hierarchy
12662
12663         (fixed_statement): grammar for the fixed statement.
12664
12665 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12666
12667         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12668         pointer types to be incretemented.
12669
12670         (SizeOf): Implement.
12671
12672         * cs-parser.jay (pointer_member_access): Implement
12673         expr->IDENTIFIER production.
12674
12675         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12676         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12677         on safe contexts.
12678
12679         (Unary): Implement indirection.
12680
12681         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12682         use in non-unsafe context).
12683
12684         (SimpleName.DoResolve): Check for pointers in field access on safe
12685         contexts. 
12686
12687         (Expression.LoadFromPtr): Factor the load-indirect code in this
12688         function.  This was duplicated in UnboxCast and ParameterReference
12689
12690 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12691
12692         * expression.cs (ComposedCast): report an error if a pointer cast
12693         is used in a safe region.
12694
12695         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12696         pointer type casts in unsafe context.
12697
12698         * codegen.cs (EmitContext): Set up IsUnsafe.
12699
12700         * cs-parser.jay (non_expression_type): Add productions for pointer
12701         casts. 
12702
12703         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12704         code.  We should not use force into static mode if the method is
12705         not virtual.  Fixes bug in MIS
12706
12707         * statement.cs (Do.Emit, While.Emit, For.Emit,
12708         Statement.EmitBoolExpression): Add support to Do and While to
12709         propagate infinite loop as `I do return' semantics.
12710
12711         Improve the For case to also test for boolean constants.
12712
12713         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12714         to the list of attributes we can add.
12715
12716         Remove `EmitContext' argument.
12717
12718         * class.cs (Method.Define): Apply parameter attributes.
12719         (Constructor.Define): Apply parameter attributes.
12720         (MethodCore.LabelParameters): Move here the core of labeling
12721         parameters. 
12722
12723         * support.cs (ReflectionParameters.ParameterModifier,
12724         InternalParameters.ParameterModifier): Use IsByRef on the type and
12725         only return the OUT bit for these parameters instead of in/out/ref
12726         flags.
12727
12728         This is because I miss-understood things.  The ParameterInfo.IsIn
12729         and IsOut represent whether the parameter has the [In] and [Out]
12730         attributes set.  
12731
12732 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12733
12734         * ecore.cs (FieldExpr.Emit): Release temporaries.
12735
12736         * assign.cs (LocalTemporary.Release): new function.
12737
12738         * codegen.cs (EmitContext.GetTemporaryStorage,
12739         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12740         temporary storage.  Now we can "put back" localbuilders when we
12741         are done with them
12742
12743 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12744
12745         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12746         need to make a copy of the variable to generate verifiable code.
12747
12748 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12749
12750         * driver.cs: Compute dynamically the system directory.
12751
12752         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12753         Slower, but more generally useful.  Used by the abstract
12754         registering implementation. 
12755
12756         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12757         the rules for the special rule on Type/instances.  First check if
12758         we have the same name, and if so, try that special static path
12759         rather than the instance path.
12760
12761 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12762
12763         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12764         for, while and if.
12765
12766         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12767         Enum, ValueType, Delegate or Array for non-corlib compiles.
12768
12769         * cs-tokenizer.cs: Catch long identifiers (645)
12770
12771         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12772         piece of code.
12773
12774         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12775         fix, we were returning too early, so we were not registering
12776         pending methods from abstract classes.
12777
12778         Do not register pending methods if the class is abstract.
12779
12780         * expression.cs (Conditional.DoResolve): Report circular implicit
12781         conversions when we neecd to compute it for conditional
12782         expressions. 
12783
12784         (Is.DoResolve): If the expression is always of the provided type,
12785         flag warning 183.  If the expression can not ever be of the
12786         provided type flag warning 184.
12787
12788         * class.cs: Catch 169 as well.
12789
12790         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12791         read. 
12792
12793 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12794
12795         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12796
12797 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12798
12799         * interface.cs: (PopulateMethod): Check for pointers being defined
12800         only if the unsafe context is active.
12801         (PopulateProperty): ditto.
12802         (PopulateIndexer): ditto.
12803
12804         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12805         specified.  If pointers are present, make sure that they are
12806         present in an unsafe context.
12807         (Constructor, Constructor.Define): ditto.
12808         (Field, Field.Define): ditto.
12809         (Property, Property.Define): ditto.
12810         (Event, Event.Define): ditto.
12811
12812         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12813         hashtable if there are classes or structs defined.
12814
12815         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12816         code, as the constant resolution moved.
12817
12818         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12819         the metadata, so we can flag error 133. 
12820
12821         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12822         pointer is being declared in an unsafe context.
12823
12824 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12825
12826         * modifiers.cs (Modifiers.Check): Require a Location argument.
12827         Report error 227 for Unsafe use.
12828
12829         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12830
12831         * statement.cs (For.Emit): If the test is null, then report that
12832         we do `return', as we wont reach anything afterwards.
12833
12834         (Switch.SwitchGoverningType): Track the expression that matched
12835         the conversion.
12836
12837         * driver.cs: Allow negative numbers as an error code to flag.
12838
12839         * cs-parser.jay: Handle 1551.
12840
12841         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12842
12843 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12844
12845         * cs-parser.jay: Report 1518 (type declaration can only contain
12846         class, struct, interface, enum or delegate)
12847
12848         (switch_label): Report 1523 (keywords `case' or `default' must
12849         preced code)
12850
12851         (opt_switch_sections): Report 1522 (empty switch)
12852
12853         * driver.cs: Report 1515 (response file specified multiple times)
12854         Report 1516 (Source file specified multiple times).
12855
12856         * expression.cs (Argument.Resolve): Signal 1510
12857
12858         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12859         access not allowed in static code)
12860
12861 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12862
12863         * typemanager.cs (IsPointerType): Utility method which we are going
12864         to need a lot.
12865
12866         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12867         the object type, so we take care of that.
12868
12869         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12870
12871         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
12872         added to non-params parameters :-)
12873
12874         * typemanager.cs (CSharpName): Include 'void' type too. 
12875
12876         (void_ptr_type): Include in the set of core types.
12877
12878         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
12879         duplicating code.
12880
12881         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
12882         an unsafe context.
12883
12884         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
12885         completely forgotten about it.
12886
12887 2002-01-10  Ravi Pratap  <ravi@ximian.com>
12888
12889         * cs-parser.jay (pointer_type): Add. This begins our implementation
12890         of parsing rules for unsafe code.
12891
12892         (unsafe_statement): Implement.
12893
12894         (embedded_statement): Modify to include the above.
12895
12896         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12897
12898         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12899         if the current context is an unsafe one.
12900
12901         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12902         are handled differently, we need separate rules for them.
12903
12904         (local_variable_declaration): Update to use local_variable_pointer_type
12905         to allow variable declarations of unmanaged pointer types.
12906
12907         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12908         in unsafe contexts.
12909
12910         * ../errors/cs0214.cs : Add.
12911
12912 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12913
12914         * makefile: remove 'response' file when cleaning.
12915
12916 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12917
12918         * cs-parser.jay: Report 1524.
12919
12920 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12921
12922         * typemanager.cs (RegisterMethod): drop checking if we have
12923         registered this from here
12924
12925 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12926
12927         * class.cs (Method.EmitDestructor): Implement calling our base
12928         destructor. 
12929
12930         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12931         value of InFinally.
12932
12933         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12934         this routine and will wrap the call in a try/catch block.  Deal
12935         with the case.
12936
12937 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12938
12939         * ecore.cs (Expression.MemberLookup): instead of taking a
12940         parameter `same_type' that was used to tell whether we could
12941         access private members we compute our containing type from the
12942         EmitContext.
12943
12944         (FieldExpr): Added partial support for volatile fields.  This does
12945         not work for volatile fields exposed from assemblies, as I can not
12946         figure out how to extract the modreq from it.
12947
12948         Updated all the source files to use this.
12949
12950         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12951         because it is referenced by MemberLookup very often. 
12952
12953 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12954
12955         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12956         TypeBuilder.GetCustomAttributes to retrieve what we need.
12957
12958         Get rid of redundant default_member_attr_type as this is the same as
12959         default_member_type which already exists.
12960
12961         * interface.cs, attribute.cs : Update accordingly.
12962
12963 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12964
12965         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12966         work for TYpeBuilders though.  Ravi, can you please fix this?
12967
12968         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12969
12970         * expression.cs (Argument.Emit): Handle the case of ref objects
12971         being passed to ref functions;  
12972
12973         (ParameterReference.EmitLoad): Loads the content of the pointer
12974         without dereferencing.
12975
12976 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12977
12978         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12979
12980 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12981
12982         * class.cs (Indexer.DefineMethod): Incorporate the interface
12983         type in the name of the method if we are doing explicit interface
12984         implementation.
12985
12986         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12987
12988         (BetterConversion): Fix extremely trivial bug where we were referring to
12989         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12990         again !
12991
12992         * ../errors/bug16.cs : Add although we have fixed it.
12993
12994 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12995
12996         * expression.cs (BaseIndexer): Begin implementation.
12997
12998         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12999
13000         * cs-parser.jay (indexer_declarator): Use qualified_identifier
13001         production directly to remove a shift/reduce, and implement
13002         explicit interface implementation.
13003
13004         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13005         after a floating point suffix.
13006
13007         * expression.cs (DoNumericPromotions): Improved the conversion for
13008         uint/uint.  If we have a constant, we avoid doing a typecast to a
13009         larger type.
13010
13011         * class.cs (Indexer): Implement explicit interface implementation
13012         for indexers.
13013
13014 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13015
13016         * class.cs: make the default instance constructor public and hidebysig.
13017
13018 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13019
13020         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13021         so we can call it from elsewhere.
13022
13023         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13024         we emit it internally if the class has a defined indexer; otherwise the user
13025         emits it by decorating the class definition with the DefaultMemberAttribute.
13026
13027         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13028         attribute is not used on a type which defines an indexer.
13029
13030         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13031         character when we skip whitespace.
13032
13033         * ../errors/cs0646.cs : Add.
13034
13035 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13036
13037         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13038         again. 
13039
13040         * makefile: Add practical target `mcs3.exe' which builds the third
13041         generation compiler. 
13042
13043         * expression.cs (New): Fix structures constructor calling.
13044
13045         * class.cs (Property, Method, Indexer): Emit Final flag on the
13046         method if we are an interface implementation and we are not
13047         abstract. 
13048
13049         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13050         whether this property is referencing a `base' method.
13051
13052         * expression.cs (Invocation.EmitCall): take an extra argument:
13053         is_base, this is used to determine whether the `call' or
13054         `callvirt' opcode should be used.
13055
13056
13057         * delegate.cs: update EmitCall.
13058
13059         * class.cs (Method.Define): Set NewSlot for the cases where we are
13060         not implementing an interface method.
13061
13062         (Property.Define): ditto.
13063
13064 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13065
13066         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13067         'r'.  Allows mcs to parse itself fully.
13068
13069 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13070
13071         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13072         of the number of initializers that require the InitializeArray method.
13073
13074         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13075         update the above field where necessary.
13076
13077         (MakeByteBlob): Update accordingly.
13078
13079         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13080         greater than 2.
13081
13082         (EmitDynamicInitializers): Update in accordance with the new optimization.
13083
13084         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13085         same OpCode applies.
13086
13087         * cs-parser.jay : Fix some glaring errors I introduced.
13088
13089 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13090
13091         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13092         so that we can check for name clashes there too.
13093
13094         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13095         for interface indexers.
13096
13097         * interfaces.cs (Define): Emit the default member attribute.
13098
13099         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13100         variable was being referred to while setting the value ;-)
13101
13102 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13103
13104         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13105         byte-by-byte information when we know the data is zero.
13106
13107         Make the block always a multiple of 4, because
13108         DefineInitializedData has a bug.
13109
13110         * assign.cs: Fix, we should assign from the temporary, not from
13111         the source. 
13112
13113         * expression.cs (MakeByteBlob): Fix my incorrect code.
13114
13115 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13116
13117         * typemanager.cs (EnumToUnderlying): This function is used to get
13118         the underlying type from an enumeration, because it does not
13119         always work. 
13120
13121         * constant.cs: Use the I4_S form for values between -128 and 127.
13122
13123         * statement.cs (Block.LookupLabel): Looks up a label.
13124         (Block): Drop support for labeled blocks.
13125
13126         (LabeledStatement): New kind of statement that represents a label
13127         only.
13128
13129         (Goto): Finally implement this bad boy.
13130
13131         * cs-parser.jay: Update to reflect new mechanism to implement
13132         labels.
13133
13134 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13135
13136         * codegen.cs (EmitContext.This): a codegen property that keeps the
13137         a single instance of this instead of creating many different this
13138         instances. 
13139
13140         * delegate.cs (Delegate.DoResolve): Update to use the property;
13141
13142         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13143
13144         * expression.cs (BaseAccess.DoResolve): Ditto.
13145
13146 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13147
13148         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13149         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13150
13151         (InitCoreTypes): Update accordingly.
13152
13153         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13154         so we can quickly store the state.
13155
13156         (ApplyAttributes): Set the correct implementation flags
13157         for InternalCall methods.
13158
13159 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13160
13161         * expression.cs (EmitCall): if a method is not virtual, then do
13162         not use callvirt on it.
13163
13164         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13165         user defined stuff) requires the use of stobj, which takes an
13166         address on the stack instead of an array and an index.  So emit
13167         the Ldelema operation for it.
13168
13169         (EmitStoreOpcode): Use stobj for valuetypes.
13170
13171         (UnaryMutator.EmitCode): Use the right 1 value depending on
13172         whether we are dealing with int64/uint64, float or doubles.
13173
13174         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13175         constructors that I implemented last night.
13176
13177         (Constructor.IsDefault): Fix to work properly for static
13178         constructors.
13179
13180         * cs-parser.jay (CheckDef): report method signature errors.
13181         Update error number 103 to be 132.
13182
13183         * decl.cs: New AdditionResult enumeration value: MethodExists.
13184         Although we do this check for methods later on in the semantic
13185         analysis, catching repeated default constructors is so easy that
13186         we catch these here. 
13187
13188         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13189         promotions code.
13190
13191         (ParameterReference.EmitAssign, Emit): handle
13192         bools as bytes.
13193
13194         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13195         (ArrayAccess.EmitStoreOpcode): ditto.
13196
13197         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13198
13199         * expression.cs (MakeByteBlob): Complete all the missing types
13200         (uint, short, ushort, byte, sbyte)
13201
13202         * class.cs: Only init instance field initializers on instance
13203         constructors. 
13204
13205         Rename `constructors' to instance_constructors. 
13206
13207         (TypeContainer.AddConstructor): Only add constructors to the list
13208         if it is not static.
13209
13210         Make sure that we handle default_static_constructor independently
13211         everywhere where we handle instance_constructors
13212
13213 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13214
13215         * class.cs: Do not lookup or create a base initializer for a
13216         static constructor.
13217
13218         (ConstructorInitializer.Resolve): use the proper type to lookup
13219         for constructors.
13220
13221         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13222
13223         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13224         in DeclSpace. 
13225
13226         * decl.cs: CloseType is now an virtual method, the default
13227         implementation just closes this type.
13228
13229 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13230
13231         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13232         to PreserveSig by default. Also emit HideBySig on such methods.
13233
13234         Basically, set the defaults to standard values.
13235
13236         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13237         argument, if candidate is better, it can't be worse than the best !
13238
13239         (Invocation): Re-write bits to differentiate between methods being
13240         applicable in their expanded form and their normal form - for params
13241         methods of course.
13242
13243         Get rid of use_standard everywhere as only standard conversions are allowed
13244         in overload resolution. 
13245
13246         More spec conformance.
13247
13248 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13249
13250         * driver.cs: Add --timestamp, to see where the compiler spends
13251         most of its time.
13252
13253         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13254         `this' in static code.
13255
13256         (SimpleName.DoResolve): Implement in terms of a helper function
13257         that allows static-references to be passed upstream to
13258         MemberAccess.
13259
13260         (Expression.ResolveWithSimpleName): Resolve specially simple
13261         names when called by MemberAccess to implement the special
13262         semantics. 
13263
13264         (Expression.ImplicitReferenceConversion): Handle conversions from
13265         Null to reference types before others, as Null's type is
13266         System.Object. 
13267
13268         * expression.cs (Invocation.EmitCall): Handle the special case of
13269         calling methods declared on a reference type from a ValueType
13270         (Base classes System.Object and System.Enum)
13271
13272         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13273         the left hand side is a TypeExpr, not on every enumeration. 
13274
13275         (Binary.Resolve): If types are reference types, then do a cast to
13276         object on operators != and == of both arguments.
13277
13278         * typemanager.cs (FindMembers): Extract instance and static
13279         members if requested.
13280
13281         * interface.cs (PopulateProperty): Use void_type instead of null
13282         as the return type for the setter method.
13283
13284         (PopulateIndexer): ditto.
13285
13286 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13287
13288         * support.cs (ReflectionParameters): Fix minor bug where we
13289         were examining the wrong parameter for the ParamArray attribute.
13290
13291         Cope with requests for the type of the parameter at position
13292         greater than the params parameter's. We now return the element
13293         type of the params array as that makes more sense.
13294
13295         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13296         accordingly as we no longer have to extract the element type
13297         ourselves.
13298
13299         (Invocation.OverloadResolve): Update.
13300
13301 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13302
13303         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13304         against IEnumerator, test whether the return value is a descendant
13305         of the IEnumerator interface.
13306
13307         * class.cs (Indexer.Define): Use an auxiliary method to implement
13308         the other bits of the method definition.  Begin support for
13309         explicit interface implementation.
13310
13311         (Property.DefineMethod): Use TypeManager.void_type instead of null
13312         for an empty return value.
13313
13314 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13315
13316         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13317         dealing with a FieldExpr which is composed of a FieldBuilder, in
13318         the code path we did extract the constant, but we should have
13319         obtained the underlying value to be able to cast it (otherwise we
13320         end up in an infinite loop, this is what Ravi was running into).
13321
13322         (ArrayCreation.UpdateIndices): Arrays might be empty.
13323
13324         (MemberAccess.ResolveMemberAccess): Add support for section
13325         14.5.4.1 that deals with the special case of E.I when E is a type
13326         and something else, that I can be a reference to a static member.
13327
13328         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13329         handle a particular array type to create byte blobs, it is just
13330         something we dont generate byteblobs for.
13331
13332         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13333         arguments. 
13334
13335         * location.cs (Push): remove the key from the hashtable that we
13336         are about to add.   This happens for empty files.
13337
13338         * driver.cs: Dispose files after we have parsed them.
13339
13340         (tokenize): new function that only runs the tokenizer on its
13341         input, for speed testing.
13342
13343 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13344
13345         * class.cs (Event.Define): Define the private field only if there
13346         are no accessors defined.
13347
13348         * expression.cs (ResolveMemberAccess): If there is no associated
13349         field with the event, that means we have an event defined with its
13350         own accessors and we should flag error cs0070 since transforming
13351         ourselves into a field is not valid in that case.
13352
13353         * ecore.cs (SimpleName.DoResolve): Same as above.
13354
13355         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13356         and charset to sane values.
13357
13358 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13359
13360         * assign.cs (DoResolve): Perform check on events only if they 
13361         are being accessed outside the declaring type.
13362
13363         * cs-parser.jay (event_declarations): Update rules to correctly
13364         set the type of the implicit parameter etc.
13365
13366         (add_accessor, remove_accessor): Set current local parameters.
13367
13368         * expression.cs (Binary): For delegate addition and subtraction,
13369         cast the return value from the method into the appropriate delegate
13370         type.
13371
13372 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13373
13374         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13375         of these as the workaround is unnecessary.
13376
13377         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13378         delegate data - none of that is needed at all.
13379
13380         Re-write bits to extract the instance expression and the delegate method
13381         correctly.
13382
13383         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13384         on delegates too.
13385
13386         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13387         of attaching attributes instead of duplicating code everywhere.
13388
13389         * everywhere : Update code to do attribute emission using the above method.
13390
13391 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13392
13393         * expression.cs (IsParamsMethodApplicable): if there are not
13394         parameters, return immediately.
13395
13396         * ecore.cs: The 0 literal can be implicity converted to an enum
13397         type. 
13398
13399         (SimpleName.DoResolve): First lookup the type, then lookup the
13400         members. 
13401
13402         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13403         want to get its address.  If the InstanceExpression is not
13404         addressable, store the result in a temporary variable, then get
13405         the address of it.
13406
13407         * codegen.cs: Only display 219 errors on warning level or above. 
13408
13409         * expression.cs (ArrayAccess): Make it implement the
13410         IMemoryLocation interface.
13411
13412         (Binary.DoResolve): handle the operator == (object a, object b)
13413         and operator != (object a, object b) without incurring into a
13414         BoxedCast (because 5 != o should never be performed).
13415
13416         Handle binary enumerator operators.
13417
13418         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13419         value type, otherwise use Ldelem_ref.
13420
13421         Use precomputed names;
13422
13423         (AddressOf): Implement address of
13424
13425         * cs-parser.jay (labeled_statement): Fix recursive block
13426         addition by reworking the production.
13427
13428         * expression.cs (New.DoEmit): New has a special case:
13429                 
13430                  If we are dealing with a ValueType, we have a few
13431                  situations to deal with:
13432                 
13433                     * The target of New is a ValueType variable, that is
13434                       easy, we just pass this as the variable reference
13435                 
13436                     * The target of New is being passed as an argument,
13437                       to a boxing operation or a function that takes a
13438                       ValueType.
13439                 
13440                       In this case, we need to create a temporary variable
13441                       that is the argument of New.
13442
13443
13444 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13445
13446         * rootcontext.cs (LookupType): Check that current_type is not null before
13447         going about looking at nested types.
13448
13449         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13450         not implement the IAssignMethod interface any more.
13451
13452         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13453         where we tranform them into FieldExprs if they are being resolved from within
13454         the declaring type.
13455
13456         * ecore.cs (SimpleName.DoResolve): Do the same here.
13457
13458         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13459
13460         * ../errors/bug10.cs : Add.
13461
13462         * ../errors/cs0070.cs : Add.
13463
13464         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13465
13466         * assign.cs : Get rid of EventIsLocal everywhere.
13467
13468 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13469
13470         * ecore.cs (ConvertIntLiteral): finished the implementation.
13471
13472         * statement.cs (SwitchLabel): Convert the value we are using as a
13473         key before looking up the table.
13474
13475 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13476
13477         * codegen.cs (EmitTopBlock): Require a Location argument now.
13478
13479         * cs-parser.jay (constructor_declarator): We need to setup
13480         current_local_parameters before we parse the
13481         opt_constructor_initializer, to allow the variables to be bound
13482         to the constructor arguments.
13483
13484         * rootcontext.cs (LookupType): First lookup nested classes in our
13485         class and our parents before we go looking outside our class.
13486
13487         * expression.cs (ConstantFold): Extract/debox the values at the
13488         beginnning. 
13489
13490         * rootcontext.cs (EmitCode): Resolve the constants first before we
13491         resolve the types.  This is not really needed, but it helps debugging.
13492
13493         * statement.cs: report location.
13494
13495         * cs-parser.jay: pass location to throw statement.
13496
13497         * driver.cs: Small bug fix.
13498
13499         * report.cs: Updated format to be 4-zero filled digits.
13500
13501 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13502
13503         * expression.cs (CheckIndices): Fix minor bug where the wrong
13504         variable was being referred to ;-)
13505
13506         (DoEmit): Do not call EmitStaticInitializers when the 
13507         underlying type is System.Object.
13508
13509 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13510
13511         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13512         and do the usual workaround for SRE.
13513
13514         * class.cs (MyEventBuilder.EventType): New member to get at the type
13515         of the event, quickly.
13516
13517         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13518
13519         * assign.cs (Assign.DoResolve): Handle the case when the target
13520         is an EventExpr and perform the necessary checks.
13521
13522         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13523         interface.
13524
13525         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13526
13527         (EventExpr): Set the type in the constructor itself since we 
13528         are meant to be born fully resolved.
13529
13530         (EventExpr.Define): Revert code I wrote earlier.
13531                 
13532         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13533         instance expression is null. The instance expression is a This in that case
13534         or a null, depending on whether it is a static method or not.
13535
13536         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13537         refers to more than one method.
13538
13539         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13540         and accordingly flag errors.
13541
13542 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13543
13544         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13545
13546 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13547
13548         * location.cs (ToString): Provide useful rutine.
13549
13550 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13551
13552         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13553         objects, return the actual integral boxed.
13554
13555         * statement.cs (SwitchLabel): define an ILLabel for each
13556         SwitchLabel. 
13557
13558         (Switch.CheckSwitch): If the value is a Literal, extract
13559         the underlying literal.
13560
13561         Also in the unused hashtable we had, add the SwitchLabel so we can
13562         quickly look this value up.
13563
13564         * constant.cs: Implement a bunch of new constants.  Rewrite
13565         Literal based on this.  Made changes everywhere to adapt to this.
13566
13567         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13568         dereferencing array only once, and also copes with enumrations.
13569
13570         bytes are two bytes wide, not one.
13571
13572         (Cast): Perform constant conversions.
13573
13574         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13575         wrappers to the literals here.
13576
13577         * expression.cs (DoNumericPromotions): long literals can converted
13578         to ulong implicity (this is taken care of elsewhere, but I was
13579         missing this spot).
13580
13581         * ecore.cs (Expression.Literalize): Make the return type Literal,
13582         to improve type checking.
13583
13584         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13585
13586 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13587
13588         * literal.cs: Revert code from ravi that checked the bounds.  The
13589         bounds are sane by the definition of the type itself. 
13590
13591         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13592         need to actually look up in our parent hierarchy for interfaces
13593         implemented. 
13594
13595         * const.cs: Use the underlying type for enumerations
13596
13597         * delegate.cs: Compute the basename for the delegate creation,
13598         that should fix the delegate test case, and restore the correct
13599         Type Lookup semantics in rootcontext
13600
13601         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13602         referencing a nested type with the Reflection API is using the "+"
13603         sign. 
13604
13605         * cs-parser.jay: Do not require EOF token at the end.
13606
13607 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13608
13609         * rootcontext.cs (LookupType): Concatenate type names with
13610         a '.' instead of a '+' The test suite passes again.
13611
13612         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13613         field of the enumeration.
13614
13615         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13616         the case when the member is an EventExpr.
13617
13618         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13619         static has an associated instance expression.
13620
13621         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13622
13623         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13624
13625         * class.cs (Event.Define): Register event and perform appropriate checks
13626         for error #111.
13627
13628         We define the Add and Remove methods even if the use provides none because
13629         in that case, we provide default implementations ourselves.
13630
13631         Define a private field of the type of the event. This is done by the CSC compiler
13632         and we should be doing it too ;-)
13633
13634         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13635         More methods we use in code we generate.
13636
13637         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13638         is important.
13639
13640         (InitCoreTypes): Update accordingly for the above.
13641
13642         * class.cs (Event.Emit): Generate code for default accessors that we provide
13643
13644         (EmitDefaultMethod): Do the job in the above.
13645
13646         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13647         appropriate place.
13648
13649 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13650
13651         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13652         builders even if we were missing one.
13653
13654         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13655         pass the Basename as our class name instead of the Name.  The
13656         basename will be correctly composed for us.
13657
13658         * parameter.cs (Paramters): Now takes a Location argument.
13659
13660         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13661         make all the code call directly LookupType in RootContext and take
13662         this chance to pass the Location information everywhere.
13663
13664         * Everywhere: pass Location information.
13665
13666 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13667
13668         * class.cs (Constructor.Define): Updated way of detecting the
13669         length of the parameters.
13670
13671         (TypeContainer.DefineType): Use basename as the type name for
13672         nested types.
13673
13674         (TypeContainer.Define): Do not recursively define types here, as
13675         definition is taken care in order by the RootContext.
13676
13677         * tree.cs: Keep track of namespaces in a per-file basis.
13678
13679         * parameter.cs (Parameter.ComputeSignature): Update to use
13680         DeclSpace. 
13681
13682         (Parameters.GetSignature): ditto.
13683
13684         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13685         instead of a TypeContainer.
13686
13687         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13688         resolve names.  Because we need to be resolve in our context, not
13689         our parents.
13690
13691         * driver.cs: Implement response files.
13692
13693         * class.cs (TypeContainer.DefineType): If we are defined, do not
13694         redefine ourselves.
13695
13696         (Event.Emit): Emit the code for add/remove handlers.
13697         (Event.Define): Save the MethodBuilders for add/remove.
13698
13699         * typemanager.cs: Use pair here too.
13700
13701         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13702         DictionaryEntry requires the first argument to be non-null.  
13703
13704         (enum_declaration): Compute full name for registering the
13705         enumeration.
13706
13707         (delegate_declaration): Instead of using
13708         formal_parameter_list, use opt_formal_parameter_list as the list
13709         can be empty.
13710
13711         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13712         (EventParsing): New property that controls whether `add' and
13713         `remove' are returned as tokens or identifiers (for events);
13714
13715 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13716
13717         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13718         use MyEventBuilder only and let it wrap the real builder for us.
13719
13720         (MyEventBuilder): Revamp constructor etc.
13721
13722         Implement all operations that we perform on EventBuilder in precisely the same
13723         way here too.
13724
13725         (FindMembers): Update to use the EventBuilder member.
13726
13727         (Event.Emit): Update accordingly.
13728
13729 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13730
13731         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13732         by calling the appropriate methods.
13733
13734         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13735         useful.
13736
13737         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13738
13739 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13740
13741         * delegate.cs (Delegate.Populate): Check that the return type
13742         and various parameters types are indeed accessible.
13743
13744         * class.cs (Constructor.Define): Same here.
13745
13746         (Field.Define): Ditto.
13747
13748         (Event.Define): Ditto.
13749
13750         (Operator.Define): Check that the underlying Method defined itself
13751         correctly - so it's MethodBuilder should not be null.
13752
13753         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13754         expression happens to be null.
13755
13756         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13757         members but as of now we don't seem to be able to do anything really useful with it.
13758
13759         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13760         not the EventBuilder.
13761
13762 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13763
13764         * cs-tokenizer.cs: Add support for defines.
13765         Add support for #if, #elif, #else, #endif
13766
13767         (eval_var): evaluates a variable.
13768         (eval): stubbed for evaluating functions.
13769
13770         * cs-parser.jay: Pass the defines information
13771
13772         * driver.cs: Add --define command line option.
13773
13774         * decl.cs: Move MemberCore here.
13775
13776         Make it the base class for DeclSpace.  This allows us to catch and
13777         report 108 and 109 for everything now.
13778
13779         * class.cs (TypeContainer.Define): Extract all the members
13780         before populating and emit the warning 108 (new keyword required
13781         to override) instead of having each member implement this.
13782
13783         (MemberCore.Define): New abstract method, we will be using this in
13784         the warning reporting engine in Populate.
13785
13786         (Operator.Define): Adjust to new MemberCore protocol. 
13787
13788         * const.cs (Const): This does not derive from Expression, it is a
13789         temporary object we use to create fields, it is a MemberCore. 
13790
13791         * class.cs (Method.Define): Allow the entry point to be in a
13792         specific class.
13793
13794         * driver.cs: Rewrite the argument handler to clean it up a bit.
13795
13796         * rootcontext.cs: Made it just an auxiliary namespace feature by
13797         making everything static.
13798
13799         * driver.cs: Adapt code to use RootContext type name instead of
13800         instance variable.
13801
13802         * delegate.cs: Remove RootContext argument.
13803
13804         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13805         argument. 
13806
13807         * class.cs (Event.Define): The lookup can fail.
13808
13809         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13810
13811         * expression.cs: Resolve the this instance before invoking the code.
13812
13813 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13814
13815         * cs-parser.jay: Add a production in element_access that allows
13816         the thing to become a "type" reference.  This way we can parse
13817         things like "(string [])" as a type.
13818
13819         Note that this still does not handle the more complex rules of
13820         casts. 
13821
13822
13823         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13824
13825         * ecore.cs: (CopyNewMethods): new utility function used to
13826         assemble the list of methods from running FindMembers.
13827
13828         (MemberLookup): Rework FindMembers so that 
13829
13830 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13831
13832         * class.cs (TypeContainer): Remove Delegates who fail to be
13833         defined.
13834
13835         * delegate.cs (Populate): Verify that we dont get null return
13836         values.   TODO: Check for AsAccessible.
13837
13838         * cs-parser.jay: Use basename to emit error 574 (destructor should
13839         have the same name as container class), not the full name.
13840
13841         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13842         possible representation.  
13843
13844         Also implements integer type suffixes U and L.
13845
13846 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13847
13848         * expression.cs (ArrayCreation.DoResolve): We need to do the
13849         argument resolution *always*.
13850
13851         * decl.cs: Make this hold the namespace.  Hold the root context as
13852         well.
13853         (LookupType): Move here.
13854
13855         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13856
13857         * location.cs (Row, Name): Fixed the code, it was always returning
13858         references to the first file.
13859
13860         * interface.cs: Register properties defined through interfaces.
13861
13862         * driver.cs: Add support for globbing on the command line
13863
13864         * class.cs (Field): Make it derive from MemberCore as well.
13865         (Event): ditto.
13866
13867 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13868
13869         * class.cs (Event::Define): Check that the type of the event is a delegate
13870         type else flag error #66.
13871
13872         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
13873         same.
13874
13875         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
13876         values of EntryPoint, CharSet etc etc.
13877
13878         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
13879
13880         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
13881         be null and we should ignore this. I am not sure if this is really clean. Apparently,
13882         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
13883         which needs this to do its work.
13884
13885         * ../errors/cs0066.cs : Add.
13886
13887 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
13888
13889         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
13890         helper functions.
13891
13892         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13893         clears out the parameters field.
13894         (MemberSignatureCompare): Cleanup
13895
13896         (MemberCore): New base class used to share code between MethodCore
13897         and Property.
13898
13899         (RegisterRequiredImplementations) BindingFlags.Public requires
13900         either BindingFlags.Instace or Static.  Use instance here.
13901
13902         (Property): Refactored code to cope better with the full spec.
13903
13904         * parameter.cs (GetParameterInfo): Return an empty array instead
13905         of null on error.
13906
13907         * class.cs (Property): Abstract or extern properties have no bodies.
13908
13909         * parameter.cs (GetParameterInfo): return a zero-sized array.
13910
13911         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13912         method modifier validation to the typecontainer so we can reuse
13913         this on properties.
13914
13915         (MethodCore.ParameterTypes): return an empty sized array of types.
13916
13917         (Property.Define): Test property modifier validity.
13918
13919         Add tests for sealed/override too.
13920
13921         (Method.Emit): abstract or extern methods have no bodies.
13922
13923 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13924
13925         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13926         thing.
13927
13928         (Method::Define, ::Emit): Modify accordingly.
13929
13930         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13931
13932         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13933
13934         * makefile: Pass in /unsafe.
13935
13936 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13937
13938         * class.cs (MakeKey): Kill routine.
13939
13940         * class.cs (TypeContainer.Define): Correctly define explicit
13941         method implementations (they require the full interface name plus
13942         the method name).
13943
13944         * typemanager.cs: Deply the PtrHashtable here and stop using the
13945         lame keys.  Things work so much better.
13946
13947         This of course broke everyone who depended on `RegisterMethod' to
13948         do the `test for existance' test.  This has to be done elsewhere.
13949
13950         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13951         the object stupid Equals method (because, that like fails all over
13952         the place).  We still do not use it.
13953
13954         * class.cs (TypeContainer.SetRequiredInterface,
13955         TypeContainer.RequireMethods): Killed these two routines and moved
13956         all the functionality to RegisterRequiredImplementations.
13957
13958         (TypeContainer.RegisterRequiredImplementations): This routine now
13959         registers all the implementations required in an array for the
13960         interfaces and abstract methods.  We use an array of structures
13961         which can be computed ahead of time to reduce memory usage and we
13962         also assume that lookups are cheap as most classes will not
13963         implement too many interfaces.
13964
13965         We also avoid creating too many MethodSignatures.
13966
13967         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13968         clear the "pending" bit if we find that there are problems with
13969         the declaration.
13970
13971         (TypeContainer.VerifyPendingMethods): Update to report errors of
13972         methods that look like implementations but are not.
13973
13974         (TypeContainer.Define): Add support for explicit interface method
13975         implementation. 
13976
13977 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13978
13979         * typemanager.cs: Keep track of the parameters here instead of
13980         being a feature of the TypeContainer.
13981
13982         * class.cs: Drop the registration of parameters here, as
13983         InterfaceMethods are also interface declarations.
13984
13985         * delegate.cs: Register methods with the TypeManager not only with
13986         the TypeContainer.  This code was buggy.
13987
13988         * interface.cs: Full registation here.
13989
13990 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13991
13992         * expression.cs: Remove reducer for binary expressions, it can not
13993         be done this way.
13994
13995         * const.cs: Put here the code that used to go into constant.cs
13996
13997         * constant.cs: Put here the code for constants, this is a new base
13998         class for Literals.
13999
14000         * literal.cs: Make Literal derive from Constant.
14001
14002 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
14003
14004         * statement.cs (Return.Emit): Report error 157 if the user
14005         attempts to return from a finally block.
14006
14007         (Return.Emit): Instead of emitting a return, jump to the end of
14008         the function.
14009
14010         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14011         LocalBuilder to store the result of the function.  ReturnLabel is
14012         the target where we jump.
14013
14014
14015 2001-12-09  Radek Doulik  <rodo@ximian.com>
14016
14017         * cs-parser.jay: remember alias in current namespace
14018
14019         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14020         namespaces
14021
14022         * class.cs (LookupAlias): lookup alias in my_namespace
14023
14024         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14025         aliases hashtable
14026         (LookupAlias): lookup alias in this and if needed in parent
14027         namespaces
14028
14029 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14030
14031         * support.cs: 
14032
14033         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14034         making things static.  I need this to avoid passing the
14035         TypeContainer when calling ParameterType.
14036
14037         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14038         that did string manipulation to compute the type and then call
14039         GetType.  Use Parameter.ParameterType instead.
14040
14041         * cs-tokenizer.cs: Consume the suffix for floating values.
14042
14043         * expression.cs (ParameterReference): figure out whether this is a
14044         reference parameter or not.  Kill an extra variable by computing
14045         the arg_idx during emission.
14046
14047         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14048         function that returns whether a parameter is an out/ref value or not.
14049
14050         (Parameter.ParameterType): The type of the parameter (base,
14051         without ref/out applied).
14052
14053         (Parameter.Resolve): Perform resolution here.
14054         (Parameter.ExternalType): The full type (with ref/out applied).
14055
14056         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14057         support for expressions on the using statement.
14058
14059 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14060
14061         * statement.cs (Using.EmitLocalVariableDecls): Split the
14062         localvariable handling of the using statement.
14063
14064         (Block.EmitMeta): Keep track of variable count across blocks.  We
14065         were reusing slots on separate branches of blocks.
14066
14067         (Try.Emit): Emit the general code block, we were not emitting it. 
14068
14069         Check the type of the declaration to be an IDisposable or
14070         something that can be implicity converted to it. 
14071
14072         Emit conversions if required.
14073
14074         * ecore.cs (EmptyExpression): New utility class.
14075         (Expression.ImplicitConversionExists): New utility function.
14076
14077 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14078
14079         * statement.cs (Using): Implement.
14080
14081         * expression.cs (LocalVariableReference): Support read only variables.
14082
14083         * statement.cs: Remove the explicit emit for the Leave opcode.
14084         (VariableInfo): Add a readonly field.
14085
14086 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14087
14088         * ecore.cs (ConvCast): new class used to encapsulate the various
14089         explicit integer conversions that works in both checked and
14090         unchecked contexts.
14091
14092         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14093         properly generate the overflow opcodes.
14094
14095 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14096
14097         * statement.cs: The correct type for the EmptyExpression is the
14098         element_type, not the variable type.  Ravi pointed this out.
14099
14100 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14101
14102         * class.cs (Method::Define): Handle PInvoke methods specially
14103         by using DefinePInvokeMethod instead of the usual one.
14104
14105         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14106         above to do the task of extracting information and defining the method.
14107
14108 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14109
14110         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14111         of the condition for string type.
14112
14113         (Emit): Move that here. 
14114
14115         (ArrayCreation::CheckIndices): Keep string literals in their expression
14116         form.
14117
14118         (EmitDynamicInitializers): Handle strings appropriately.
14119
14120 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14121
14122         * codegen.cs (EmitContext): Replace multiple variables with a
14123         single pointer to the current Switch statement.
14124
14125         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14126         EmitContext.
14127
14128 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14129
14130         * statement.cs 
14131
14132         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14133         default'.
14134
14135         (Foreach.Emit): Foreach on arrays was not setting
14136         up the loop variables (for break/continue).
14137
14138         (GotoCase): Semi-implented.
14139
14140 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14141
14142         * attribute.cs (CheckAttribute): Handle system attributes by using
14143         Attribute.GetAttributes to examine information we need.
14144
14145         (GetValidPlaces): Same here.
14146
14147         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14148
14149         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14150
14151         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14152
14153         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14154
14155         (Method::Emit): Handle the case when we are a PInvoke method.
14156
14157 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14158
14159         * expression.cs: Use ResolveWithSimpleName on compound names.
14160
14161 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14162
14163         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14164         before trying to reduce it.
14165
14166         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14167
14168         * constant.cs (LookupConstantValue): Implement.
14169
14170         (EmitConstant): Use the above in emitting the constant.
14171
14172         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14173         that are user-defined by doing a LookupConstantValue on them.
14174
14175         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14176         too, like above.
14177
14178 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14179
14180         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14181
14182         (BaseAccess.DoResolve): Implement.
14183
14184         (MemberAccess.DoResolve): Split this routine into a
14185         ResolveMemberAccess routine that can be used independently
14186
14187 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14188
14189         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14190         As that share bits of the implementation.  Is returns a boolean,
14191         while As returns the Type that is being probed.
14192
14193 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14194
14195         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14196         instead of a Literal - much easier.
14197
14198         (EnumInTransit): Remove - utterly useless :-)
14199
14200         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14201
14202         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14203
14204         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14205         chain when we have no associated expression.
14206
14207 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14208
14209         * constant.cs (Define): Use Location while reporting the errror.
14210
14211         Also emit a warning when 'new' is used and there is no inherited
14212         member to hide.
14213
14214         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14215         populated.
14216
14217         (LookupEnumValue): Implement to lookup an enum member's value and define it
14218         if necessary.
14219
14220         (Populate): Re-write accordingly to use the above routine.
14221
14222 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14223
14224         * expression.cs (This): Fix prototype for DoResolveLValue to
14225         override the base class DoResolveLValue.
14226
14227         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14228         declarations) 
14229
14230         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14231         (we need to load the address of the field here).  This fixes
14232         test-22. 
14233
14234         (FieldExpr.DoResolveLValue): Call the DoResolve
14235         function to initialize the Instance expression.
14236
14237         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14238         correctly the GetEnumerator operation on a value type.
14239
14240         * cs-parser.jay: Add more simple parsing error catches.
14241
14242         * statement.cs (Switch): Add support for string switches.
14243         Handle null specially.
14244
14245         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14246
14247 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14248
14249         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14250
14251         (declare_local_constant): New helper function.
14252
14253         * statement.cs (AddConstant): Keep a separate record of constants
14254
14255         (IsConstant): Implement to determine if a variable is a constant.
14256
14257         (GetConstantExpression): Implement.
14258
14259         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14260
14261         * statement.cs (IsVariableDefined): Re-write.
14262
14263 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14264
14265         * class.cs (TypeContainer::FindMembers): Look for constants
14266         in the case when we are looking for MemberTypes.Field
14267
14268         * expression.cs (MemberAccess::DoResolve): Check that in the
14269         case we are a FieldExpr and a Literal, we are not being accessed
14270         by an instance reference.
14271
14272         * cs-parser.jay (local_constant_declaration): Implement.
14273
14274         (declaration_statement): Implement for constant declarations.
14275
14276 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14277
14278         * statement.cs (Switch): Catch double defaults.
14279
14280         (Switch): More work on the switch() statement
14281         implementation.  It works for integral values now, need to finish
14282         string support.
14283
14284
14285 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14286
14287         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14288         integer literals into other integer literals.  To be used by
14289         switch. 
14290
14291 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14292
14293         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14294         some memory.
14295
14296         (EmitDynamicInitializers): Cope with the above since we extract data
14297         directly from ArrayData now.
14298
14299         (ExpectInitializers): Keep track of whether initializers are mandatory
14300         or not.
14301
14302         (Bounds): Make it a hashtable to prevent the same dimension being 
14303         recorded for every element in that dimension.
14304
14305         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14306         from being found.
14307
14308         Also fix bug which was causing the indices to be emitted in the reverse
14309         order.
14310
14311 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14312
14313         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14314         unfinished.  They do not work, because the underlying code is
14315         sloppy.
14316
14317 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14318
14319         * cs-parser.jay: Remove bogus fixme.
14320
14321         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14322         on Switch statement.
14323
14324 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14325
14326         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14327         the same. 
14328
14329         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14330         parameter. Apparently, any expression is allowed. 
14331
14332         (ValidateInitializers): Update accordingly.
14333
14334         (CheckIndices): Fix some tricky bugs thanks to recursion.
14335
14336         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14337         I was being completely brain-dead.
14338
14339         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14340         and re-write acordingly.
14341
14342         (DelegateInvocation): Re-write accordingly.
14343
14344         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14345
14346         (MakeByteBlob): Handle types more correctly.
14347
14348         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14349         initialization from expressions but it is incomplete because I am a complete
14350         Dodo :-|
14351
14352 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14353
14354         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14355         on If.  Basically, we have to return `true' (ie, we do return to
14356         our caller) only if both branches of the if return.
14357
14358         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14359         short-circuit operators, handle them as short circuit operators. 
14360
14361         (Cast.DoResolve): Resolve type.
14362         (Cast.Cast): Take an expression as the target type.
14363
14364         * cs-parser.jay (cast_expression): Remove old hack that only
14365         allowed a limited set of types to be handled.  Now we take a
14366         unary_expression and we resolve to a type during semantic
14367         analysis.
14368
14369         Use the grammar productions from Rhys to handle casts (this is
14370         not complete like Rhys syntax yet, we fail to handle that corner
14371         case that C# has regarding (-x), but we will get there.
14372
14373 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14374
14375         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14376         field which is an array type.
14377
14378         * cs-parser.jay (declare_local_variables): Support array initialization too.
14379
14380         * typemanager.cs (MakeKey): Implement.
14381
14382         (everywhere): Use the above appropriately.
14383
14384         * cs-parser.jay (for_statement): Update for array initialization while
14385         declaring variables.
14386
14387         * ecore.cs : The error message was correct, it's the variable's names that
14388         were misleading ;-) Make the code more readable.
14389
14390         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14391         the correct type etc.
14392
14393         (ConvertExplicit): Handle Enum types by examining the underlying type.
14394
14395 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14396
14397         * parameter.cs (GetCallingConvention): Always return
14398         CallingConventions.Standard for now.
14399
14400 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14401
14402         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14403         and `r' after calling DoNumericPromotions.
14404
14405         * ecore.cs: Fix error message (the types were in the wrong order).
14406
14407         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14408         BindingFlags.Instance as well 
14409
14410         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14411         implicit int literal conversion in an empty cast so that we
14412         propagate the right type upstream.
14413
14414         (UnboxCast): new class used to unbox value types.
14415         (Expression.ConvertExplicit): Add explicit type conversions done
14416         by unboxing.
14417
14418         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14419         the target type before applying the implicit LongLiterals to ULong
14420         literal cast.
14421
14422 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14423
14424         * cs-parser.jay (for_statement): Reworked the way For works: now
14425         we declare manually any variables that are introduced in
14426         for_initializer to solve the problem of having out-of-band code
14427         emition (that is what got for broken).
14428
14429         (declaration_statement): Perform the actual variable declaration
14430         that used to be done in local_variable_declaration here.
14431
14432         (local_variable_declaration): Do not declare anything, just pass
14433         the information on a DictionaryEntry
14434
14435 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14436
14437         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14438         re-write of the logic to now make it recursive.
14439
14440         (UpdateIndices): Re-write accordingly.
14441
14442         Store element data in a separate ArrayData list in the above methods.
14443
14444         (MakeByteBlob): Implement to dump the array data into a byte array.
14445
14446 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14447
14448         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14449         into CheckIndices.
14450
14451         * constant.cs (Define): Implement.
14452
14453         (EmitConstant): Re-write fully.
14454
14455         Pass in location info.
14456
14457         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14458         respectively.
14459
14460         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14461         DictionaryEntry since we need location info too.
14462
14463         (constant_declaration): Update accordingly.
14464
14465         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14466         code into another method : UpdateIndices.
14467
14468 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14469
14470         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14471         some type checking etc.
14472
14473 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14474
14475         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14476         bits to provide dimension info if the user skips doing that.
14477
14478         Update second constructor to store the rank correctly.
14479
14480 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14481
14482         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14483         and try to implement.
14484
14485         * ../errors/cs0150.cs : Add.
14486
14487         * ../errors/cs0178.cs : Add.
14488
14489 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14490
14491         * statement.cs: Implement foreach on multi-dimensional arrays. 
14492
14493         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14494         name of the params argument.
14495
14496         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14497         initializing the array.
14498
14499         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14500         we can use this elsewhere.
14501
14502         * statement.cs: Finish implementation of foreach for single
14503         dimension arrays.
14504
14505         * cs-parser.jay: Use an out-of-band stack to pass information
14506         around, I wonder why I need this.
14507
14508         foreach_block: Make the new foreach_block the current_block.
14509
14510         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14511         function used to return a static Parameters structure.  Used for
14512         empty parameters, as those are created very frequently.
14513
14514         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14515
14516 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14517
14518         * interface.cs : Default modifier is private, not public. The
14519         make verify test passes again.
14520
14521 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14522
14523         * support.cs (ReflectionParameters): Fix logic to determine
14524         whether the last parameter is a params one. Test 9 passes again.
14525
14526         * delegate.cs (Populate): Register the builders we define with
14527         RegisterParameterForBuilder. Test 19 passes again.
14528
14529         * cs-parser.jay (property_declaration): Reference $6 instead
14530         of $$ to get at the location.
14531
14532         (indexer_declaration): Similar stuff.
14533
14534         (attribute): Ditto.
14535
14536         * class.cs (Property): Register parameters for the Get and Set methods
14537         if they exist. Test 23 passes again.
14538
14539         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14540         call to EmitArguments as we are sure there aren't any params arguments. 
14541         Test 32 passes again.
14542
14543         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14544         IndexOutOfRangeException. 
14545
14546         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14547         Test 33 now passes again.
14548
14549 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14550
14551         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14552         broke a bunch of things.  Will have to come up with a better way
14553         of tracking locations.
14554
14555         * statement.cs: Implemented foreach for single dimension arrays.
14556
14557 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14558
14559         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14560         an error.  This removes the lookup from the critical path.
14561
14562         * cs-parser.jay: Removed use of temporary_loc, which is completely
14563         broken. 
14564
14565 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14566
14567         * support.cs (ReflectionParameters.ParameterModifier): Report
14568         whether the argument is a PARAMS argument or not.
14569
14570         * class.cs: Set the attribute `ParamArrayAttribute' on the
14571         parameter argument.
14572
14573         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14574         and cons_param_array_attribute (ConstructorInfo for
14575         ParamArrayAttribute)., 
14576
14577         * codegen.cs: Emit the return using the `Return' statement, that
14578         way we can report the error correctly for missing return values. 
14579
14580         * class.cs (Method.Emit): Clean up.
14581
14582         * expression.cs (Argument.Resolve): Take another argument: the
14583         location where this argument is used.  Notice that this is not
14584         part of the "Argument" class as to reduce the size of the
14585         structure (we know the approximate location anyways).
14586
14587         Test if the argument is a variable-reference, if not, then
14588         complain with a 206.
14589
14590         (Argument.Emit): Emit addresses of variables.
14591
14592         (Argument.FullDesc): Simplify.
14593
14594         (Invocation.DoResolve): Update for Argument.Resolve.
14595
14596         (ElementAccess.DoResolve): ditto.
14597
14598         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14599         method should be virtual, as this method is always virtual.
14600
14601         (NewDelegate.DoResolve): Update for Argument.Resolve.
14602
14603         * class.cs (ConstructorInitializer.DoResolve): ditto.
14604
14605         * attribute.cs (Attribute.Resolve): ditto.
14606
14607 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14608
14609         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14610
14611         * expression.cs (ParameterReference): Drop IStackStorage and implement
14612         IAssignMethod instead. 
14613
14614         (LocalVariableReference): ditto.
14615
14616         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14617         IAssignMethod instead. 
14618
14619 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14620
14621         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14622         enumerations that are used in heavily used structures derive from
14623         byte in a laughable and pathetic attempt to reduce memory usage.
14624         This is the kind of pre-optimzations that you should not do at
14625         home without adult supervision.
14626
14627         * expression.cs (UnaryMutator): New class, used to handle ++ and
14628         -- separatedly from the other unary operators.  Cleans up the
14629         code, and kills the ExpressionStatement dependency in Unary.
14630
14631         (Unary): Removed `method' and `Arguments' from this class, making
14632         it smaller, and moving it all to SimpleCall, so I can reuse this
14633         code in other locations and avoid creating a lot of transient data
14634         strucutres when not required.
14635
14636         * cs-parser.jay: Adjust for new changes.
14637
14638 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14639
14640         * enum.cs (Enum.Populate): If there is a failure during
14641         definition, return
14642
14643         * cs-parser.jay (opt_enum_base): we used to catch type errors
14644         here, but this is really incorrect.  The type error should be
14645         catched during semantic analysis.
14646
14647 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14648
14649         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14650         current_local_parameters as expected since I, in my stupidity, had forgotten
14651         to do this :-)
14652
14653         * attribute.cs (GetValidPlaces): Fix stupid bug.
14654
14655         * class.cs (Method::Emit): Perform check on applicability of attributes.
14656
14657         (Constructor::Emit): Ditto.
14658
14659         (Field::Emit): Ditto.
14660
14661         (Field.Location): Store location information.
14662
14663         (Property, Event, Indexer, Operator): Ditto.
14664
14665         * cs-parser.jay (field_declaration): Pass in location for each field.
14666
14667         * ../errors/cs0592.cs : Add.
14668
14669 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14670
14671         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14672
14673         (InitCoreTypes): Update accordingly.
14674
14675         (RegisterAttrType, LookupAttr): Implement.
14676
14677         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14678         info about the same.
14679
14680         (Resolve): Update to populate the above as necessary.
14681
14682         (Error592): Helper.
14683
14684         (GetValidPlaces): Helper to the above.
14685
14686         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14687
14688         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14689
14690 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14691
14692         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14693
14694         * ../errors/cs0617.cs : Add.
14695
14696 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14697
14698         * enum.cs (Emit): Rename to Populate to be more consistent with what
14699         we expect it to do and when exactly it is called.
14700
14701         * class.cs, rootcontext.cs : Update accordingly.
14702
14703         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14704         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14705
14706         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14707
14708         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14709         of a fieldinfo using the above, when dealing with a FieldBuilder.
14710
14711 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14712
14713         * ../errors/cs0031.cs : Add.
14714
14715         * ../errors/cs1008.cs : Add.
14716
14717         * ../errrors/cs0543.cs : Add.
14718
14719         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14720         enum type.
14721
14722         (FindMembers): Implement.
14723
14724         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14725         enums and delegates too.
14726
14727         (enum_types): Rename to builder_to_enum.
14728
14729         (delegate_types): Rename to builder_to_delegate.
14730
14731         * delegate.cs (FindMembers): Implement.
14732
14733 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14734
14735         * typemanager.cs (IsEnumType): Implement.
14736
14737         * enum.cs (Emit): Re-write parts to account for the underlying type
14738         better and perform checking etc.
14739
14740         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14741         of the underlying type.
14742
14743         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14744         value
14745
14746         * enum.cs (error31): Helper to report error #31.
14747
14748         * cs-parser.jay (enum_declaration): Store location of each member too.
14749
14750         * enum.cs (member_to_location): New hashtable. 
14751
14752         (AddEnumMember): Update location hashtable.
14753
14754         (Emit): Use the location of each member while reporting errors.
14755
14756 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14757
14758         * cs-parser.jay: A for_initializer if is a
14759         local_variable_declaration really ammount to have an implicit
14760         block with the variable declaration and no initializer for for.
14761
14762         * statement.cs (For.Emit): Cope with null initializers.
14763
14764         This fixes the infinite loop on for initializers.
14765
14766 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14767
14768         * enum.cs: More cleanup.
14769
14770         * ecore.cs: Remove dead code.
14771
14772         * class.cs (Property.Emit): More simplification.
14773         (Event.Emit): ditto.
14774
14775         Reworked to have less levels of indentation.
14776
14777 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14778
14779         * class.cs (Property): Emit attributes.
14780
14781         (Field): Ditto.
14782
14783         (Event): Ditto.
14784
14785         (Indexer): Ditto.
14786
14787         (Operator): Ditto.
14788
14789         * enum.cs (Emit): Ditto.
14790
14791         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14792         Enums too.
14793
14794         * class.cs (Field, Event, etc.): Move attribute generation into the
14795         Emit method everywhere.
14796
14797         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14798         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14799         as we had no way of defining nested enums !
14800
14801         * rootcontext.cs : Adjust code accordingly.
14802
14803         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14804
14805 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14806
14807         * expression.cs (EvalConstantExpression): Move into ecore.cs
14808
14809         * enum.cs (Enum): Rename some members and make them public and readonly
14810         according to our convention.
14811
14812         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14813         nothing else.
14814
14815         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14816
14817         (Enum::Emit): Write a simple version for now which doesn't try to compute
14818         expressions. I shall modify this to be more robust in just a while.
14819
14820         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14821
14822         (TypeContainer::CloseType): Create the Enum types too.
14823
14824         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14825
14826         * expression.cs (EvalConstantExpression): Get rid of completely.
14827
14828         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14829         user-defined values and other cases.
14830
14831         (IsValidEnumLiteral): Helper function.
14832
14833         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14834         out there in the case we had a literal FieldExpr.
14835
14836         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14837
14838         (Literalize): Revamp a bit to take two arguments.
14839
14840         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14841
14842 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14843
14844         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14845
14846         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14847
14848         (Resolve): Use the above to ensure we have proper initializers.
14849
14850 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14851
14852         * expression.cs (Expression::EvalConstantExpression): New method to 
14853         evaluate constant expressions.
14854
14855         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14856
14857 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14858
14859         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14860         in an array.
14861
14862         (Binary.ResolveOperator): Handle operator != (object a, object b)
14863         and operator == (object a, object b);
14864
14865         (Binary.DoNumericPromotions): Indicate whether the numeric
14866         promotion was possible.
14867
14868         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14869         Implement.  
14870
14871         Made the ArrayAccess implement interface IAssignMethod instead of
14872         IStackStore as the order in which arguments are passed reflects
14873         this.
14874
14875         * assign.cs: Instead of using expr.ExprClass to select the way of
14876         assinging, probe for the IStackStore/IAssignMethod interfaces.
14877
14878         * typemanager.cs: Load InitializeArray definition.
14879
14880         * rootcontext.cs (RootContext.MakeStaticData): Used to define
14881         static data that can be used to initialize arrays. 
14882
14883 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
14884
14885         * expression.cs: Handle operator== and operator!= for booleans.
14886
14887         (Conditioal.Reduce): Implement reducer for the ?: operator.
14888
14889         (Conditional.Resolve): Implement dead code elimination.
14890
14891         (Binary.Resolve): Catch string literals and return a new
14892         concatenated string.
14893
14894         (Unary.Reduce): Implement reduction of unary expressions.
14895
14896         * ecore.cs: Split out the expression core handling here.
14897
14898         (Expression.Reduce): New method used to perform constant folding
14899         and CSE.  This is needed to support constant-expressions. 
14900
14901         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14902         targets, and optimize for !x.
14903
14904 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14905
14906         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14907         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14908         set custom atttributes.
14909
14910         * literal.cs (Literal::GetValue): New abstract method to return the actual
14911         value of the literal, cast as an object.
14912
14913         (*Literal): Implement GetValue method.
14914
14915         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14916         expressions to the arraylist but objects of type Argument.
14917
14918         * class.cs (TypeContainer::Emit): Emit our attributes too.
14919
14920         (Method::Emit, Constructor::Emit): Ditto.
14921
14922         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14923         to be ignoring earlier.
14924
14925 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14926
14927         * attribute.cs (AttributeSection::Define): Implement to do the business
14928         of constructing a CustomAttributeBuilder.
14929
14930         (Attribute): New trivial class. Increases readability of code.  
14931
14932         * cs-parser.jay : Update accordingly.
14933
14934         (positional_argument_list, named_argument_list, named_argument): New rules
14935
14936         (attribute_arguments): Use the above so that we are more correct.
14937
14938 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14939
14940         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14941         to perform all checks for a method with a params parameter.
14942
14943         (Invocation::OverloadResolve): Update to use the above method and therefore
14944         cope correctly with params method invocations.
14945
14946         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14947         params too.
14948
14949         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14950         constructors in our parent too because we can't afford to miss out on 
14951         protected ones ;-)
14952
14953         * attribute.cs (AttributeSection): New name for the class Attribute
14954
14955         Other trivial changes to improve readability.
14956
14957         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14958         use the new class names.
14959
14960 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14961
14962         * class.cs (Method::Define): Complete definition for params types too
14963
14964         (Indexer::Define): Ditto.
14965
14966         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14967         Cope everywhere with a request for info about the array parameter.
14968
14969 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14970
14971         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14972
14973         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14974         local_variable_type to extract the string corresponding to the type.
14975
14976         (local_variable_type): Fixup the action to use the new helper method.
14977
14978         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14979         go.
14980
14981         * expression.cs : Clean out code which uses the above.
14982
14983 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14984
14985         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14986         and bale out if necessary by returning a false.
14987
14988         (RegisterProperty): Ditto.
14989
14990         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14991         and print out appropriate error messages.
14992
14993         * interface.cs (everywhere): Ditto.
14994
14995         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14996         location to constructor.
14997
14998         * class.cs (Property, Event, Indexer): Update accordingly.
14999
15000         * ../errors/cs111.cs : Added.
15001
15002         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
15003         of a method, as laid down by the spec.
15004
15005         (Invocation::OverloadResolve): Use the above method.
15006
15007 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15008
15009         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15010         now take a TypeContainer and a Parameters object.
15011
15012         (ParameterData): Modify return type of ParameterModifier method to be 
15013         Parameter.Modifier and not a string.
15014
15015         (ReflectionParameters, InternalParameters): Update accordingly.
15016
15017         * expression.cs (Argument::GetParameterModifier): Same here.
15018
15019         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15020         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15021         symbol in it at all so maybe this is only for now.
15022
15023 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15024
15025         * support.cs (InternalParameters): Constructor now takes an extra argument 
15026         which is the actual Parameters class.
15027
15028         (ParameterDesc): Update to provide info on ref/out modifiers.
15029
15030         * class.cs (everywhere): Update call to InternalParameters to pass in
15031         the second argument too.
15032
15033         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15034         to return the modifier info [ref/out etc]
15035
15036         (InternalParameters, ReflectionParameters): Implement the above.
15037
15038         * expression.cs (Argument::ParameterModifier): Similar function to return
15039         info about the argument's modifiers.
15040
15041         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15042         too.
15043
15044         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15045         a new SetFormalParameters object which we pass to InternalParameters.
15046
15047 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15048
15049         * expression.cs (NewArray): Merge into the ArrayCreation class.
15050
15051 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15052
15053         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15054         NewUserdefinedArray into one as there wasn't much of a use in having
15055         two separate ones.
15056
15057         * expression.cs (Argument): Change field's name to ArgType from Type.
15058
15059         (Type): New readonly property which returns the proper type, taking into 
15060         account ref/out modifiers.
15061
15062         (everywhere): Adjust code accordingly for the above.
15063
15064         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15065         whether we are emitting for a ref or out parameter.
15066
15067         * expression.cs (Argument::Emit): Use the above field to set the state.
15068
15069         (LocalVariableReference::Emit): Update to honour the flag and emit the
15070         right stuff.
15071
15072         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15073
15074         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15075
15076         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15077
15078         (ReflectionParameters, InternalParameters): Implement the above method.
15079
15080         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15081         reporting errors.
15082
15083         (Invocation::FullMethodDesc): Ditto. 
15084
15085 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15086
15087         * cs-parser.jay: Add extra production for the second form of array
15088         creation. 
15089
15090         * expression.cs (ArrayCreation): Update to reflect the above
15091         change. 
15092
15093         * Small changes to prepare for Array initialization.
15094
15095 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15096
15097         * typemanager.cs (ImplementsInterface): interface might be null;
15098         Deal with this problem;
15099
15100         Also, we do store negative hits on the cache (null values), so use
15101         this instead of calling t.GetInterfaces on the type everytime.
15102
15103 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15104
15105         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15106
15107         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15108         split functionality out into different classes.
15109
15110         (New::FormArrayType): Move into NewBuiltinArray.
15111
15112         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15113         quite useless.
15114
15115         (NewBuiltinArray): New class to handle creation of built-in arrays.
15116
15117         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15118         account creation of one-dimensional arrays.
15119
15120         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15121
15122         (NewUserdefinedArray::DoResolve): Implement.
15123
15124         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15125
15126         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15127         we maintain inside the TypeManager. This is necessary to perform lookups on the
15128         module builder.
15129
15130         (LookupType): Update to perform GetType on the module builders too.     
15131
15132         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15133
15134         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15135
15136 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15137
15138         * expression.cs (New::DoResolve): Implement guts of array creation.
15139
15140         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15141
15142 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15143
15144         * expression.cs: Fix bug I introduced lsat night that broke
15145         Delegates. 
15146
15147         (Expression.Resolve): Report a 246 error (can not resolve name)
15148         if we find a SimpleName in the stream.
15149
15150         (Expression.ResolveLValue): Ditto.
15151
15152         (Expression.ResolveWithSimpleName): This function is a variant of
15153         ResolveName, this one allows SimpleNames to be returned without a
15154         warning.  The only consumer of SimpleNames is MemberAccess
15155
15156 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15157
15158         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15159         might arrive here.  I have my doubts that this is correct.
15160
15161         * statement.cs (Lock): Implement lock statement.
15162
15163         * cs-parser.jay: Small fixes to support `lock' and `using'
15164
15165         * cs-tokenizer.cs: Remove extra space
15166
15167         * driver.cs: New flag --checked, allows to turn on integer math
15168         checking. 
15169
15170         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15171         Threading.Monitor.Exit 
15172
15173 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15174
15175         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15176         Expression Class to be IndexerAccess.
15177
15178         Notice that Indexer::DoResolve sets the eclass to Value.
15179
15180 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15181
15182         * class.cs (TypeContainer::Emit): Emit code for indexers.
15183
15184         * assign.cs (IAssignMethod): New interface implemented by Indexers
15185         and Properties for handling assignment.
15186
15187         (Assign::Emit): Simplify and reuse code. 
15188
15189         * expression.cs (IndexerAccess, PropertyExpr): Implement
15190         IAssignMethod, clean up old code. 
15191
15192 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15193
15194         * typemanager.cs (ImplementsInterface): New method to determine if a type
15195         implements a given interface. Provides a nice cache too.
15196
15197         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15198         method.
15199
15200         (ConvertReferenceExplicit): Ditto.
15201
15202         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15203         various methods, with correct names etc.
15204
15205         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15206         Operator.UnaryNegation.
15207
15208         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15209         we have a unary plus or minus operator.
15210
15211         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15212         UnaryMinus.
15213
15214         * everywhere : update accordingly.
15215
15216         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15217         respectively.
15218
15219         * class.cs (Method::Define): For the case where we are implementing a method
15220         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15221         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15222
15223 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15224
15225         * interface.cs (FindMembers): Implement to work around S.R.E
15226         lameness.
15227
15228         * typemanager.cs (IsInterfaceType): Implement.
15229
15230         (FindMembers): Update to handle interface types too.
15231
15232         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15233         use IsAssignableFrom as that is not correct - it doesn't work.
15234
15235         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15236         and accordingly override EmitStatement.
15237
15238         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15239         using the correct logic :-)
15240
15241 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15242
15243         * ../errors/cs-11.cs : Add to demonstrate error -11 
15244
15245 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15246
15247         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15248         then pass this as a hint to ResolveLValue.
15249
15250         * expression.cs (FieldExpr): Add Location information
15251
15252         (FieldExpr::LValueResolve): Report assignment to readonly
15253         variable. 
15254
15255         (Expression::ExprClassFromMemberInfo): Pass location information.
15256
15257         (Expression::ResolveLValue): Add new method that resolves an
15258         LValue. 
15259
15260         (Expression::DoResolveLValue): Default invocation calls
15261         DoResolve. 
15262
15263         (Indexers): New class used to keep track of indexers in a given
15264         Type. 
15265
15266         (IStackStore): Renamed from LValue, as it did not really describe
15267         what this did.  Also ResolveLValue is gone from this interface and
15268         now is part of Expression.
15269
15270         (ElementAccess): Depending on the element access type
15271
15272         * typemanager.cs: Add `indexer_name_type' as a Core type
15273         (System.Runtime.CompilerServices.IndexerNameAttribute)
15274
15275         * statement.cs (Goto): Take a location.
15276
15277 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15278
15279         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15280         if two delegates are compatible.
15281
15282         (NewDelegate::DoResolve): Update to take care of the case when
15283         we instantiate a delegate from another delegate.
15284
15285         * typemanager.cs (FindMembers): Don't even try to look up members
15286         of Delegate types for now.
15287
15288 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15289
15290         * delegate.cs (NewDelegate): New class to take care of delegate
15291         instantiation.
15292
15293         * expression.cs (New): Split the delegate related code out into 
15294         the NewDelegate class.
15295
15296         * delegate.cs (DelegateInvocation): New class to handle delegate 
15297         invocation.
15298
15299         * expression.cs (Invocation): Split out delegate related code into
15300         the DelegateInvocation class.
15301
15302 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15303
15304         * expression.cs (New::DoResolve): Implement delegate creation fully
15305         and according to the spec.
15306
15307         (New::DoEmit): Update to handle delegates differently.
15308
15309         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15310         because of which we were printing out arguments in reverse order !
15311
15312         * delegate.cs (VerifyMethod): Implement to check if the given method
15313         matches the delegate.
15314
15315         (FullDelegateDesc): Implement.
15316
15317         (VerifyApplicability): Implement.
15318
15319         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15320         delegate invocations too.
15321
15322         (Invocation::Emit): Ditto.
15323
15324         * ../errors/cs1593.cs : Added.
15325
15326         * ../errors/cs1594.cs : Added.
15327
15328         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15329
15330 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15331
15332         * typemanager.cs (intptr_type): Core type for System.IntPtr
15333
15334         (InitCoreTypes): Update for the same.
15335
15336         (iasyncresult_type, asynccallback_type): Ditto.
15337
15338         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15339         correct.
15340
15341         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15342         too.
15343
15344         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15345         the builders for the 4 members of a delegate type :-)
15346
15347         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15348         type.
15349
15350         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15351
15352         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15353
15354 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15355
15356         * statement.cs (Break::Emit): Implement.   
15357         (Continue::Emit): Implement.
15358
15359         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15360         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15361         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15362         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15363         end loop
15364
15365         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15366         properties that track the label for the current loop (begin of the
15367         loop and end of the loop).
15368
15369 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15370
15371         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15372         use of emitting anything at all.
15373
15374         * class.cs, rootcontext.cs : Get rid of calls to the same.
15375
15376         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15377
15378         (Populate): Define the constructor correctly and set the implementation
15379         attributes.
15380
15381         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15382         have been defined.
15383
15384         (AddDelegateType): Implement.
15385
15386         (IsDelegateType): Implement helper method.
15387
15388         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15389
15390         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15391         and accordingly handle it.
15392
15393         * delegate.cs (Populate): Take TypeContainer argument.
15394         Implement bits to define the Invoke method. However, I still haven't figured out
15395         how to take care of the native int bit :-(
15396
15397         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15398         Qualify the name of the delegate, not its return type !
15399
15400         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15401         conversion.
15402
15403         (StandardConversionExists): Checking for array types turns out to be recursive.
15404
15405         (ConvertReferenceExplicit): Implement array conversion.
15406
15407         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15408
15409 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15410
15411         * cs-parser.jay (delegate_declaration): Store the fully qualified
15412         name as it is a type declaration.
15413
15414         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15415         readonly.
15416
15417         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15418         as TypeContainer::DefineType.
15419
15420         (Populate): Method in which all the definition of the various methods (Invoke)
15421         etc is done.
15422
15423         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15424         see.
15425
15426         (CloseDelegate): Finally creates the delegate.
15427
15428         * class.cs (TypeContainer::DefineType): Update to define delegates.
15429         (Populate, Emit and CloseType): Do the same thing here too.
15430
15431         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15432         delegates in all these operations.
15433
15434 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15435
15436         * expression.cs: LocalTemporary: a new expression used to
15437         reference a temporary that has been created.
15438
15439         * assign.cs: Handle PropertyAccess back here, so that we can
15440         provide the proper semantic access to properties.
15441
15442         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15443         a few more explicit conversions. 
15444
15445         * modifiers.cs: `NEW' modifier maps to HideBySig.
15446
15447         * expression.cs (PropertyExpr): Make this into an
15448         ExpressionStatement, and support the EmitStatement code path. 
15449
15450         Perform get/set error checking, clean up the interface.
15451
15452         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15453         them into toplevel access objects.
15454
15455 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15456
15457         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15458         SRE.
15459
15460         * typemanager.cs: Keep track here of our PropertyBuilders again to
15461         work around lameness in SRE.
15462
15463 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15464
15465         * expression.cs (LValue::LValueResolve): New method in the
15466         interface, used to perform a second resolution pass for LValues. 
15467
15468         (This::DoResolve): Catch the use of this in static methods.
15469
15470         (This::LValueResolve): Implement.
15471
15472         (This::Store): Remove warning, assigning to `this' in structures
15473         is 
15474
15475         (Invocation::Emit): Deal with invocation of
15476         methods on value types.  We need to pass the address to structure
15477         methods rather than the object itself.  (The equivalent code to
15478         emit "this" for structures leaves the entire structure on the
15479         stack instead of a pointer to it). 
15480
15481         (ParameterReference::DoResolve): Compute the real index for the
15482         argument based on whether the method takes or not a `this' pointer
15483         (ie, the method is static).
15484
15485         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15486         value types returned from functions when we need to invoke a
15487         method on the sturcture.
15488
15489
15490 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15491
15492         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15493         defining the type in the Modulebuilder or Typebuilder. This is to take
15494         care of nested types which need to be defined on the TypeBuilder using
15495         DefineNestedMethod.
15496
15497         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15498         methods in RootContext, only ported to be part of TypeContainer.
15499
15500         (TypeContainer::GetInterfaceOrClass): Ditto.
15501
15502         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15503
15504         * interface.cs (Interface::DefineInterface): New method. Does exactly
15505         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15506         too.
15507
15508         (Interface::GetInterfaces): Move from RootContext here and port.
15509
15510         (Interface::GetInterfaceByName): Same here.
15511
15512         * rootcontext.cs (ResolveTree): Re-write.
15513
15514         (PopulateTypes): Re-write.
15515
15516         * class.cs (TypeContainer::Populate): Populate nested types too.
15517         (TypeContainer::Emit): Emit nested members too.
15518
15519         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15520         instead just use the name argument passed in as it is already fully
15521         qualified.
15522
15523         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15524         to TypeContainer mapping to see if a type is user-defined.
15525
15526         * class.cs (TypeContainer::CloseType): Implement. 
15527
15528         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15529         the default constructor.
15530
15531         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15532         twice.
15533
15534         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15535
15536         * interface.cs (CloseType): Create the type here.
15537
15538         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15539         the hierarchy.
15540
15541         Remove all the methods which are now in TypeContainer.
15542
15543 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15544
15545         * delegate.cs (Define): Re-write bits to define the delegate
15546         correctly.
15547
15548 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15549
15550         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15551
15552         * expression.cs (ImplicitReferenceConversion): handle null as well
15553         as a source to convert to any reference type.
15554
15555         * statement.cs (Return): Perform any implicit conversions to
15556         expected return type.  
15557
15558         Validate use of return statement.  
15559
15560         * codegen.cs (EmitContext): Pass the expected return type here.
15561
15562         * class.cs (Method, Constructor, Property): Pass expected return
15563         type to EmitContext.
15564
15565 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15566
15567         * expression.cs: Make DoResolve take an EmitContext instead of a
15568         TypeContainer.
15569
15570         Replaced `l' and `location' for `loc', for consistency.
15571
15572         (Error, Warning): Remove unneeded Tc argument.
15573
15574         * assign.cs, literal.cs, constant.cs: Update to new calling
15575         convention. 
15576
15577         * codegen.cs: EmitContext now contains a flag indicating whether
15578         code is being generated in a static method or not.
15579
15580         * cs-parser.jay: DecomposeQI, new function that replaces the old
15581         QualifiedIdentifier.  Now we always decompose the assembled
15582         strings from qualified_identifier productions into a group of
15583         memberaccesses.
15584
15585 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15586
15587         * rootcontext.cs: Deal with field-less struct types correctly now
15588         by passing the size option to Define Type.
15589
15590         * class.cs: Removed hack that created one static field. 
15591
15592 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15593
15594         * statement.cs: Moved most of the code generation here. 
15595
15596 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15597
15598         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15599         seem very right.
15600
15601         (ElementAccess): Remove useless bits for now - keep checks as the spec
15602         says.
15603
15604 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15605
15606         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15607         and start performing checks according to the spec.
15608
15609 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15610
15611         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15612         rank_specifiers instead.
15613
15614         (rank_specifiers): Change the order in which the rank specifiers are stored
15615
15616         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15617
15618         * expression.cs (ElementAccess): Implement the LValue interface too.
15619
15620 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15621
15622         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15623         except that user defined conversions are not included.
15624
15625         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15626         perform the conversion of the return type, if necessary.
15627
15628         (New::DoResolve): Check whether we are creating an array or an object
15629         and accordingly do the needful.
15630
15631         (New::Emit): Same here.
15632
15633         (New::DoResolve): Implement guts of array creation.
15634
15635         (New::FormLookupType): Helper function.
15636
15637 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15638
15639         * codegen.cs: Removed most of the code generation here, and move the
15640         corresponding code generation bits to the statement classes. 
15641
15642         Added support for try/catch/finalize and throw.
15643
15644         * cs-parser.jay: Added support for try/catch/finalize.
15645
15646         * class.cs: Catch static methods having the flags override,
15647         virtual or abstract.
15648
15649         * expression.cs (UserCast): This user cast was not really doing
15650         what it was supposed to do.  Which is to be born in fully resolved
15651         state.  Parts of the resolution were being performed at Emit time! 
15652
15653         Fixed this code.
15654
15655 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15656
15657         * expression.cs: Implicity convert the result from UserCast.
15658
15659 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15660
15661         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15662         prevented it from working correctly. 
15663
15664         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15665         merely ConvertImplicit.
15666
15667 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15668
15669         * typemanager.cs: Make the LookupTypeContainer function static,
15670         and not per-instance.  
15671
15672         * class.cs: Make static FindMembers (the one that takes a Type
15673         argument). 
15674
15675         * codegen.cs: Add EmitForeach here.
15676
15677         * cs-parser.jay: Make foreach a toplevel object instead of the
15678         inline expansion, as we need to perform semantic analysis on it. 
15679
15680 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15681
15682         * expression.cs (Expression::ImplicitUserConversion): Rename to
15683         UserDefinedConversion.
15684
15685         (Expression::UserDefinedConversion): Take an extra argument specifying 
15686         whether we look for explicit user conversions too.
15687
15688         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15689
15690         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15691
15692         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15693         with the appropriate arguments.
15694
15695         * cs-parser.jay (cast_expression): Record location too.
15696
15697         * expression.cs (Cast): Record location info.
15698
15699         (Expression::ConvertExplicit): Take location argument.
15700
15701         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15702         to determine if we are doing explicit conversions.
15703
15704         (UserCast::Emit): Update accordingly.
15705
15706         (Expression::ConvertExplicit): Report an error if everything fails.
15707
15708         * ../errors/cs0030.cs : Add.
15709
15710 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15711
15712         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15713         virtual and newslot bits. 
15714
15715         * class.cs (TypeContainer::RegisterRequiredImplementations):
15716         Record methods we need.
15717
15718         (TypeContainer::MakeKey): Helper function to make keys for
15719         MethodBases, since the Methodbase key is useless.
15720
15721         (TypeContainer::Populate): Call RegisterRequiredImplementations
15722         before defining the methods.   
15723
15724         Create a mapping for method_builders_to_methods ahead of time
15725         instead of inside a tight loop.
15726
15727         (::RequireMethods):  Accept an object as the data to set into the
15728         hashtable so we can report interface vs abstract method mismatch.
15729
15730 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15731
15732         * report.cs: Make all of it static.
15733
15734         * rootcontext.cs: Drop object_type and value_type computations, as
15735         we have those in the TypeManager anyways.
15736
15737         Drop report instance variable too, now it is a global.
15738
15739         * driver.cs: Use try/catch on command line handling.
15740
15741         Add --probe option to debug the error reporting system with a test
15742         suite. 
15743
15744         * report.cs: Add support for exiting program when a probe
15745         condition is reached.
15746
15747 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15748
15749         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15750         we do a forcible conversion regardless of type, to check if 
15751         ForceConversion returns a null.
15752
15753         (Binary::error19): Use location to report error.
15754
15755         (Unary::error23): Use location here too.
15756
15757         * ../errors/cs0019.cs : Check in.
15758
15759         * ../errors/cs0023.cs : Check in.
15760
15761         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15762         case of a non-null MethodInfo object with a length of 0 !
15763
15764         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15765         an applicable member - according to the spec :-)
15766         Also fix logic to find members in base types.
15767
15768         (Unary::ResolveOperator): Same here.
15769
15770         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15771         as I was getting thoroughly confused between this and error19 :-)
15772
15773         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15774         (::FindMostEncompassedType): Implement.
15775         (::FindMostEncompassingType): Implement.
15776         (::StandardConversionExists): Implement.
15777
15778         (UserImplicitCast): Re-vamp. We now need info about most specific
15779         source and target types so that we can do the necessary conversions.
15780
15781         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15782         mathematical union with no duplicates.
15783
15784 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15785
15786         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15787         in order from base classes to child classes, so that we can in
15788         child classes look up in our parent for method names and
15789         attributes (required for handling abstract, virtual, new, override
15790         constructs: we need to instrospect our base class, and if we dont
15791         populate the classes in order, the introspection might be
15792         incorrect.  For example, a method could query its parent before
15793         the parent has any methods and would determine that the parent has
15794         no abstract methods (while it could have had them)).
15795
15796         (RootContext::CreateType): Record the order in which we define the
15797         classes.
15798
15799 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15800
15801         * class.cs (TypeContainer::Populate): Also method definitions can
15802         fail now, keep track of this.
15803
15804         (TypeContainer::FindMembers): Implement support for
15805         DeclaredOnly/noDeclaredOnly flag.
15806
15807         (Constructor::Emit) Return the ConstructorBuilder.
15808
15809         (Method::Emit) Return the MethodBuilder. 
15810         Check for abstract or virtual methods to be public.
15811
15812         * rootcontext.cs (RootContext::CreateType): Register all the
15813         abstract methods required for the class to be complete and the
15814         interface methods that must be implemented. 
15815
15816         * cs-parser.jay: Report error 501 (method requires body if it is
15817         not marked abstract or extern).
15818
15819         * expression.cs (TypeOf::Emit): Implement.
15820
15821         * typemanager.cs: runtime_handle_type, new global type.
15822
15823         * class.cs (Property::Emit): Generate code for properties.
15824
15825 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15826
15827         * expression.cs (Unary::ResolveOperator): Find operators on base type
15828         too - we now conform exactly to the spec.
15829
15830         (Binary::ResolveOperator): Same here.
15831
15832         * class.cs (Operator::Define): Fix minor quirk in the tests.
15833
15834         * ../errors/cs0215.cs : Added.
15835
15836         * ../errors/cs0556.cs : Added.
15837
15838         * ../errors/cs0555.cs : Added.
15839
15840 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15841
15842         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15843         single integer which is really efficient
15844
15845 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15846
15847         *  expression.cs (Expression::ImplicitUserConversion): Use location
15848         even in the case when we are examining True operators.
15849  
15850         * class.cs (Operator::Define): Perform extensive checks to conform
15851         with the rules for operator overloading in the spec.
15852
15853         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15854         some of the other conversions mentioned in the spec.
15855
15856         * typemanager.cs (array_type): New static member for the System.Array built-in
15857         type.
15858
15859         (cloneable_interface): For System.ICloneable interface.
15860
15861         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15862         we start resolving the tree and populating types.
15863
15864         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15865  
15866 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15867
15868         * expression.cs (Expression::ExprClassFromMemberInfo,
15869         Expression::Literalize): Create literal expressions from
15870         FieldInfos which are literals.
15871
15872         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
15873         type casts, because they were wrong.  The test suite in tests
15874         caught these ones.
15875
15876         (ImplicitNumericConversion): ushort to ulong requires a widening
15877         cast. 
15878
15879         Int32 constant to long requires widening cast as well.
15880
15881         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
15882         for integers because the type on the stack is not i4.
15883
15884 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
15885
15886         * expression.cs (report118): require location argument. 
15887
15888         * parameter.cs: Do not dereference potential null value.
15889
15890         * class.cs: Catch methods that lack the `new' keyword when
15891         overriding a name.  Report warnings when `new' is used without
15892         anything being there to override.
15893
15894         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15895
15896         * class.cs: Only add constructor to hashtable if it is non-null
15897         (as now constructors can fail on define).
15898
15899         (TypeManager, Class, Struct): Take location arguments.
15900
15901         Catch field instance initialization in structs as errors.
15902
15903         accepting_filter: a new filter for FindMembers that is static so
15904         that we dont create an instance per invocation.
15905
15906         (Constructor::Define): Catch errors where a struct constructor is
15907         parameterless 
15908
15909         * cs-parser.jay: Pass location information for various new
15910         constructs. 
15911
15912         * delegate.cs (Delegate): take a location argument.
15913
15914         * driver.cs: Do not call EmitCode if there were problesm in the
15915         Definition of the types, as many Builders wont be there. 
15916
15917         * decl.cs (Decl::Decl): Require a location argument.
15918
15919         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15920         into integers, and find the most appropiate integer for it.
15921
15922         * literal.cs: Implement ULongLiteral.
15923
15924         * rootcontext.cs: Provide better information about the location of
15925         failure when CreateType fails.
15926
15927 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15928
15929         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15930         as well.
15931
15932         * expression.cs (Binary::CheckShiftArguments): Add missing type
15933         computation.
15934         (Binary::ResolveOperator): Add type to the logical and and logical
15935         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15936         before.
15937
15938         (Binary::DoNumericPromotions): In the case where either argument
15939         is ulong (and most signed types combined with ulong cause an
15940         error) perform implicit integer constant conversions as well.
15941
15942 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15943
15944         * expression.cs (UserImplicitCast): Method should always be
15945         non-null. 
15946         (Invocation::BetterConversion): Simplified test for IntLiteral.
15947
15948         (Expression::ImplicitNumericConversion): Split this routine out.
15949         Put the code that performs implicit constant integer conversions
15950         here. 
15951
15952         (Expression::Resolve): Become a wrapper around DoResolve so we can
15953         check eclass and type being set after resolve.
15954
15955         (Invocation::Badness): Remove this dead function
15956
15957         (Binary::ResolveOperator): Do not compute the expensive argumnets
15958         unless we have a union for it.
15959
15960         (Probe::Emit): Is needs to do an isinst and then
15961         compare against null.
15962
15963         (::CanConvert): Added Location argument.  If the Location argument
15964         is null (Location.Null), then we do not report errors.  This is
15965         used by the `probe' mechanism of the Explicit conversion.  We do
15966         not want to generate an error for something that the user
15967         explicitly requested to be casted.  But the pipeline for an
15968         explicit cast first tests for potential implicit casts.
15969
15970         So for now, if the Location is null, it means `Probe only' to
15971         avoid adding another argument.   Might have to revise this
15972         strategy later.
15973
15974         (ClassCast): New class used to type cast objects into arbitrary
15975         classes (used in Explicit Reference Conversions).
15976
15977         Implement `as' as well.
15978
15979         Reverted all the patches from Ravi below: they were broken:
15980
15981                 * The use of `level' as a mechanism to stop recursive
15982                   invocations is wrong.  That was there just to catch the
15983                   bug with a strack trace but not as a way of addressing
15984                   the problem.
15985
15986                   To fix the problem we have to *understand* what is going
15987                   on and the interactions and come up with a plan, not
15988                   just get things going.
15989
15990                 * The use of the type conversion cache that I proposed
15991                   last night had an open topic: How does this work across
15992                   protection domains.  A user defined conversion might not
15993                   be public in the location where we are applying the
15994                   conversion, a different conversion might be selected
15995                   (ie, private A->B (better) but public B->A (worse),
15996                   inside A, A->B applies, but outside it, B->A will
15997                   apply).
15998
15999                 * On top of that (ie, even if the above is solved),
16000                   conversions in a cache need to be abstract.  Ie, `To
16001                   convert from an Int to a Short use an OpcodeCast', not
16002                   `To convert from an Int to a Short use the OpcodeCast on
16003                   the variable 5' (which is what this patch was doing).
16004
16005 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16006
16007         * expression.cs (Invocation::ConversionExists): Re-write to use
16008         the conversion cache
16009
16010         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16011         cache all conversions done, not just user-defined ones.
16012
16013         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16014         to determine if a conversion exists instead of acutually trying to 
16015         perform the conversion. It's faster too.
16016
16017         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16018         and only then attempt the implicit conversion.
16019
16020 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16021
16022         * expression.cs (ConvertImplicit): Use a cache for conversions
16023         already found. Check level of recursion and bail out if necessary.
16024
16025 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16026
16027         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16028         Export standard methods that we expect for string operations.
16029
16030         * statement.cs (Block::UsageWarning): Track usage of variables and
16031         report the errors for not used variables.
16032
16033         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16034         operator. 
16035
16036 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16037
16038         * codegen.cs: remove unnneded code 
16039
16040         * expression.cs: Removed BuiltinTypeAccess class
16041
16042         Fix the order in which implicit conversions are
16043         done.  
16044
16045         The previous fixed dropped support for boxed conversions (adding a
16046         test to the test suite now)
16047
16048         (UserImplicitCast::CanConvert): Remove test for source being null,
16049         that code is broken.  We should not feed a null to begin with, if
16050         we do, then we should track the bug where the problem originates
16051         and not try to cover it up here.
16052
16053         Return a resolved expression of type UserImplicitCast on success
16054         rather than true/false.  Ravi: this is what I was talking about,
16055         the pattern is to use a static method as a "constructor" for
16056         objects. 
16057
16058         Also, do not create arguments until the very last minute,
16059         otherwise we always create the arguments even for lookups that
16060         will never be performed. 
16061
16062         (UserImplicitCast::Resolve): Eliminate, objects of type
16063         UserImplicitCast are born in a fully resolved state. 
16064
16065         * typemanager.cs (InitCoreTypes): Init also value_type
16066         (System.ValueType). 
16067
16068         * expression.cs (Cast::Resolve): First resolve the child expression.
16069
16070         (LValue): Add new method AddressOf to be used by
16071         the `&' operator.  
16072
16073         Change the argument of Store to take an EmitContext instead of an
16074         ILGenerator, because things like FieldExpr need to be able to call
16075         their children expression to generate the instance code. 
16076
16077         (Expression::Error, Expression::Warning): Sugar functions for
16078         reporting errors.
16079
16080         (Expression::MemberLookup): Accept a TypeContainer instead of a
16081         Report as the first argument.
16082
16083         (Expression::ResolvePrimary): Killed.  I still want to improve
16084         this as currently the code is just not right.
16085
16086         (Expression::ResolveMemberAccess): Simplify, but it is still
16087         wrong. 
16088
16089         (Unary::Resolve): Catch errors in AddressOf operators.
16090
16091         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16092         index to a byte for the short-version, or the compiler will choose
16093         the wrong Emit call, which generates the wrong data.
16094
16095         (ParameterReference::Emit, ::Store): same.
16096
16097         (FieldExpr::AddressOf): Implement.
16098
16099         * typemanager.cs: TypeManager: made public variable instead of
16100         property.
16101
16102         * driver.cs: document --fatal.
16103
16104         * report.cs (ErrorMessage, WarningMessage): new names for the old
16105         Error and Warning classes.
16106
16107         * cs-parser.jay (member_access): Turn built-in access to types
16108         into a normal simplename
16109
16110 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16111
16112         * expression.cs (Invocation::BetterConversion): Fix to cope
16113         with q being null, since this was introducing a bug.
16114
16115         * expression.cs (ConvertImplicit): Do built-in conversions first.
16116
16117 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16118
16119         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16120
16121 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16122
16123         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16124         I had introduced long ago (what's new ?).
16125
16126         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16127         the work of all the checking. 
16128         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16129         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16130
16131         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16132         that is the right way. 
16133
16134         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16135         overloading resolution. Use everywhere instead of cutting and pasting code.
16136
16137         (Binary::ResolveOperator): Use MakeUnionSet.
16138
16139         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16140         we have to convert to bool types. Not complete yet.
16141
16142 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16143
16144         * typemanager.cs (TypeManager::CSharpName): support ushort.
16145
16146         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16147         to provide an expression that performsn an implicit constant int
16148         conversion (section 6.1.6).
16149         (Expression::ConvertImplicitRequired): Reworked to include
16150         implicit constant expression conversions.
16151
16152         (Expression::ConvertNumericExplicit): Finished.
16153
16154         (Invocation::Emit): If InstanceExpression is null, then it means
16155         that we perform a call on this.
16156
16157 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16158
16159         * expression.cs (Unary::Emit): Remove some dead code.
16160         (Probe): Implement Resolve and Emit for `is'.
16161         (Expression::ConvertImplicitRequired): Attempt to do constant
16162         expression conversions here.  Maybe should be moved to
16163         ConvertImplicit, but I am not sure.
16164         (Expression::ImplicitLongConstantConversionPossible,
16165         Expression::ImplicitIntConstantConversionPossible): New functions
16166         that tell whether is it possible to apply an implicit constant
16167         expression conversion.
16168
16169         (ConvertNumericExplicit): Started work on explicit numeric
16170         conversions.
16171
16172         * cs-parser.jay: Update operator constants.
16173
16174         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16175         (Parameters::GetSignature): Hook up VerifyArgs here.
16176         (Parameters::VerifyArgs): Verifies that no two arguments have the
16177         same name. 
16178
16179         * class.cs (Operator): Update the operator names to reflect the
16180         ones that the spec expects (as we are just stringizing the
16181         operator names).
16182
16183         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16184         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16185         previous usage did only work for our methods.
16186         (Expression::ConvertImplicit): Handle decimal implicit numeric
16187         conversions as well.
16188         (Expression::InternalTypeConstructor): Used to invoke constructors
16189         on internal types for default promotions.
16190
16191         (Unary::Emit): Implement special handling for the pre/post
16192         increment/decrement for overloaded operators, as they need to have
16193         the same semantics as the other operators.
16194
16195         (Binary::ResolveOperator): ditto.
16196         (Invocation::ConversionExists): ditto.
16197         (UserImplicitCast::Resolve): ditto.
16198
16199 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16200
16201         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16202         operator, return after emitting body. Regression tests pass again !
16203
16204         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16205         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16206         (Invocation::OverloadResolve): Ditto.
16207         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16208
16209         * everywhere : update calls to the above methods accordingly.
16210
16211 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16212
16213         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16214
16215         * expression.cs (ExpressionStatement): New base class used for
16216         expressions that can appear in statements, so that we can provide
16217         an alternate path to generate expression that do not leave a value
16218         on the stack.
16219
16220         (Expression::Emit, and all the derivatives): We no longer return
16221         whether a value is left on the stack or not.  Every expression
16222         after being emitted leaves a single value on the stack.
16223
16224         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16225         facilties of ExpressionStatement if possible.
16226
16227         * cs-parser.jay: Update statement_expression.
16228
16229 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16230
16231         * driver.cs: Change the wording of message
16232
16233 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16234
16235         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16236         the type of the expression to the return type of the method if
16237         we have an overloaded operator match ! The regression tests pass again !
16238         (Unary::ResolveOperator): Ditto.
16239
16240         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16241         to find "op_Implicit", not "implicit" ;-)
16242         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16243         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16244
16245         * everywhere : Correct calls to the above accordingly.
16246
16247         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16248         (ConvertImplicit): Do user-defined conversion if it exists.
16249
16250 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16251
16252         * assign.cs: track location.
16253         (Resolve): Use implicit conversions on assignment.
16254
16255         * literal.cs: Oops.  Not good, Emit of short access values should
16256         pass (Bytes) or the wrong argument will be selected.
16257
16258         * expression.cs (Unary::Emit): Emit code for -expr.
16259
16260         (Unary::ResolveOperator): Handle `Substract' for non-constants
16261         (substract from zero from the non-constants).
16262         Deal with Doubles as well. 
16263
16264         (Expression::ConvertImplicitRequired): New routine that reports an
16265         error if no implicit conversion exists. 
16266
16267         (Invocation::OverloadResolve): Store the converted implicit
16268         expressions if we make them
16269
16270 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16271
16272         * class.cs (ConstructorInitializer): Take a Location argument.
16273         (ConstructorBaseInitializer): Same here.
16274         (ConstructorThisInitializer): Same here.
16275
16276         * cs-parser.jay : Update all calls accordingly.
16277
16278         * expression.cs (Unary, Binary, New): Take location argument.
16279         Update accordingly everywhere.
16280
16281         * cs-parser.jay : Update all calls to the above to take a location
16282         argument.
16283
16284         * class.cs : Ditto.
16285
16286 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16287
16288         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16289         (Invocation::BetterConversion): Same here
16290         (Invocation::ConversionExists): Ditto.
16291
16292         (Invocation::ConversionExists): Implement.
16293
16294 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16295
16296         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16297         Also take an additional TypeContainer argument.
16298
16299         * All over : Pass in TypeContainer as argument to OverloadResolve.
16300
16301         * typemanager.cs (CSharpName): Update to check for the string type and return
16302         that too.
16303
16304         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16305         a given method.
16306
16307 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16308
16309         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16310         (Invocation::BetterFunction): Implement.
16311         (Invocation::BetterConversion): Implement.
16312         (Invocation::ConversionExists): Skeleton, no implementation yet.
16313
16314         Okay, things work fine !
16315
16316 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16317
16318         * typemanager.cs: declare and load enum_type, delegate_type and
16319         void_type. 
16320
16321         * expression.cs (Expression::Emit): Now emit returns a value that
16322         tells whether a value is left on the stack or not.  This strategy
16323         might be reveted tomorrow with a mechanism that would address
16324         multiple assignments.
16325         (Expression::report118): Utility routine to report mismatches on
16326         the ExprClass.
16327
16328         (Unary::Report23): Report impossible type/operator combination
16329         utility function.
16330
16331         (Unary::IsIncrementableNumber): Whether the type can be
16332         incremented or decremented with add.
16333         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16334         complemented. 
16335         (Unary::ResolveOperator): Implement ++, !, ~,
16336
16337         (Invocation::Emit): Deal with new Emit convetion.
16338
16339         * All Expression derivatives: Updated their Emit method to return
16340         whether they leave values on the stack or not.
16341
16342         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16343         stack for expressions that are statements. 
16344
16345 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16346
16347         * expression.cs (LValue): New interface.  Must be implemented by
16348         LValue objects.
16349         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16350         LValue interface.
16351
16352         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16353         interface for generating code, simplifies the code.
16354
16355 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16356
16357         * expression.cs (everywhere): Comment out return statements in ::Resolve
16358         methods to avoid the warnings.
16359
16360 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16361
16362         * driver.cs (parse): Report error 2001 if we can not open the
16363         source file.
16364
16365         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16366         not resolve it.
16367
16368         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16369         object. 
16370
16371         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16372         otherwise nested blocks end up with the same index.
16373
16374         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16375
16376         * expression.cs:  Instead of having FIXMEs in the Resolve
16377         functions, throw exceptions so it is obvious that we are facing a
16378         bug. 
16379
16380         * cs-parser.jay (invocation_expression): Pass Location information.
16381
16382         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16383         Use a basename for those routines because .NET does not like paths
16384         on them. 
16385
16386         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16387         already defined.
16388
16389 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16390
16391         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16392         are loading the correct data types (throws an exception if not).
16393         (TypeManager::InitCoreTypes): Use CoreLookupType
16394
16395         * expression.cs (Unary::ResolveOperator): return the child
16396         expression for expressions which are just +expr.
16397         (Unary::ResolveOperator): Return negative literals for -LITERAL
16398         expressions (otherwise they are Unary {Literal}).
16399         (Invocation::Badness): Take into account `Implicit constant
16400         expression conversions'.
16401
16402         * literal.cs (LongLiteral): Implement long literal class.
16403         (IntLiteral): export the `Value' of the intliteral. 
16404
16405 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16406
16407         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16408
16409         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16410         instead of 'Operator'
16411
16412         * expression.cs (Binary::ResolveOperator): Update accordingly.
16413         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16414         and 'Minus'
16415
16416         * cs-parser.jay (unary_expression): Update to use the new names.
16417
16418         * gen-treedump.cs (GetUnary): Same here.
16419
16420         * expression.cs (Unary::Resolve): Implement.
16421         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16422         operators are found instead of making noise ;-)
16423         (Unary::ResolveOperator): New method to do precisely the same thing which
16424         Binary::ResolveOperator does for Binary expressions.
16425         (Unary.method, .Arguments): Add.
16426         (Unary::OperName): Implement.   
16427         (Unary::ForceConversion): Copy and Paste !
16428
16429         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16430         a unary operator.
16431
16432         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16433         for the inbuilt operators. Only overloading works for now ;-)
16434
16435 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16436
16437         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16438         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16439
16440         * expression.cs (This::Emit): Implement. 
16441         (This::Resolve): Implement.
16442         (TypeOf:Resolve): Implement.
16443         (Expression::ResolveSimpleName): Add an implicit this to instance
16444         field references. 
16445         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16446         Bind instance variable to Field expressions.
16447         (FieldExpr::Instance): New field used to track the expression that
16448         represents the object instance.
16449         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16450         binding 
16451         (FieldExpr::Emit): Implement.
16452
16453         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16454         the last instruction contains a return opcode to avoid generating
16455         the last `ret' instruction (this generates correct code, and it is
16456         nice to pass the peverify output).
16457
16458         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16459         initializer for static and instance variables.
16460         (Constructor::Emit): Allow initializer to be null in the case of
16461         static constructors.  Only emit initializer for instance
16462         constructors. 
16463
16464         (TypeContainer::FindMembers): Return a null array if there are no
16465         matches.
16466
16467         Also fix the code for the MemberTypes.Method branch, as it was not
16468         scanning that for operators (or tried to access null variables before).
16469
16470         * assign.cs (Assign::Emit): Handle instance and static fields. 
16471
16472         * TODO: Updated.
16473
16474         * driver.cs: Stop compilation if there are parse errors.
16475
16476         * cs-parser.jay (constructor_declaration): Provide default base
16477         initializer for non-static constructors.
16478         (constructor_declarator): Do not provide a default base
16479         initializers if none was specified.
16480         Catch the fact that constructors should not have parameters.
16481
16482         * class.cs: Do not emit parent class initializers for static
16483         constructors, that should be flagged as an error.
16484
16485 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16486
16487         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16488         Move back code into TypeContainer::Populate.
16489
16490 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16491
16492         * class.cs (TypeContainer::AddConstructor): Fix the check to
16493         compare against Name, not Basename. 
16494         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16495
16496         * cs-parser.jay : Update accordingly.
16497
16498         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16499         for methods, don't forget to look into the operators too.
16500         (RegisterMethodBuilder): Helper method to take care of this for
16501         methods, constructors and operators.
16502         (Operator::Define): Completely revamp.
16503         (Operator.OperatorMethod, MethodName): New fields.
16504         (TypeContainer::Populate): Move the registering of builders into
16505         RegisterMethodBuilder.
16506         (Operator::Emit): Re-write.
16507
16508         * expression.cs (Binary::Emit): Comment out code path to emit method
16509         invocation stuff for the case when we have a user defined operator. I am
16510         just not able to get it right !
16511
16512 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16513
16514         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16515         argument. 
16516
16517         (Expression::MemberLookup): Provide a version that allows to
16518         specify the MemberTypes and BindingFlags. 
16519
16520         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16521         so it was not fetching variable information from outer blocks.
16522
16523         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16524         Beforefieldinit as it was buggy.
16525
16526         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16527         that Ravi put here.  
16528
16529         * class.cs (Constructor::Emit): Only emit if block is not null.
16530         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16531         deal with this by semantically definining it as if the user had
16532         done it.
16533
16534         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16535         constructors as we now "emit" them at a higher level.
16536
16537         (TypeContainer::DefineDefaultConstructor): Used to define the
16538         default constructors if none was provided.
16539
16540         (ConstructorInitializer): Add methods Resolve and Emit. 
16541
16542         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16543
16544 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16545
16546         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16547         the default constructor builder with our hashtable for methodbuilders
16548         to methodcores.
16549
16550         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16551         and argument_count is 0 in which case we have a match.
16552         (Binary::ResolveOperator): More null checking and miscellaneous coding
16553         style cleanup.
16554
16555 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16556
16557         * rootcontext.cs (IsNameSpace): Compare against null.
16558
16559         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16560
16561         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16562         and Unary::Operator.
16563
16564         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16565         accordingly.
16566
16567         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16568         we have overloaded operators.
16569         (Binary::ResolveOperator): Implement the part which does the operator overload
16570         resolution.
16571
16572         * class.cs (Operator::Emit): Implement.
16573         (TypeContainer::Emit): Emit the operators we have too.
16574
16575         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16576         the case when we have a user-defined operator.
16577
16578 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16579
16580         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16581
16582 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16583
16584         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16585         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16586         (Constructor::Emit): Implement.
16587         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16588         if we have no work to do. 
16589         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16590         Emit method.
16591
16592         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16593         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16594
16595         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16596         of parent.parent.
16597
16598 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16599
16600         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16601         in the source.
16602         (Tree::RecordNamespace): Method to do what the name says ;-)
16603         (Tree::Namespaces): Property to get at the namespaces hashtable.
16604
16605         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16606         keep track.
16607
16608         * rootcontext.cs (IsNamespace): Fixed it :-)
16609
16610 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16611
16612         * class.cs (TypeContainer::FindMembers): Add support for
16613         constructors. 
16614         (MethodCore): New class that encapsulates both the shared aspects
16615         of a Constructor and a Method.  
16616         (Method, Constructor): Factored pieces into MethodCore.
16617
16618         * driver.cs: Added --fatal which makes errors throw exceptions.
16619         Load System assembly as well as part of the standard library.
16620
16621         * report.cs: Allow throwing exceptions on errors for debugging.
16622
16623         * modifiers.cs: Do not use `parent', instead use the real type
16624         container to evaluate permission settings.
16625
16626         * class.cs: Put Ravi's patch back in.  He is right, and we will
16627         have to cope with the
16628
16629 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16630
16631         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16632         FamORAssem, not FamANDAssem.
16633
16634 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16635
16636         * driver.cs: Added --parse option that only parses its input files
16637         and terminates.
16638
16639         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16640         incorrect.  IsTopLevel is not used to tell whether an object is
16641         root_types or not (that can be achieved by testing this ==
16642         root_types).  But to see if this is a top-level *class* (not
16643         necessarly our "toplevel" container). 
16644
16645 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16646
16647         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16648         parent instead of a direct call to GetType.
16649
16650 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16651
16652         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16653         Modifiers.TypeAttr. This should just be a call to that method.
16654
16655         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16656         object so that we can determine if we are top-level or not.
16657
16658         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16659         TypeContainer too.
16660
16661         * enum.cs (Enum::Define): Ditto.
16662
16663         * modifiers.cs (FieldAttr): Re-write.
16664
16665         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16666         (TypeContainer::HaveStaticConstructor): New property to provide access
16667         to precisely that info.
16668
16669         * modifiers.cs (MethodAttr): Re-write.
16670         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16671
16672         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16673         of top-level types as claimed.
16674
16675 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16676
16677         * expression.cs (MemberLookup): Fruitless attempt to lookup
16678         constructors.  Maybe I need to emit default constructors?  That
16679         might be it (currently .NET emits this for me automatically).
16680         (Invocation::OverloadResolve): Cope with Arguments == null.
16681         (Invocation::EmitArguments): new function, shared by the new
16682         constructor and us.
16683         (Invocation::Emit): Handle static and instance methods.  Emit
16684         proper call instruction for virtual or non-virtual invocations.
16685         (New::Emit): Implement.
16686         (New::Resolve): Implement.
16687         (MemberAccess:Resolve): Implement.
16688         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16689         to track instances.
16690         (FieldExpr::Resolve): Set type.
16691
16692         * support.cs: Handle empty arguments.
16693                 
16694         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16695         SimpleLookup): Auxiliary routines to help parse a qualifier
16696         identifier.  
16697
16698         Update qualifier_identifier rule.
16699
16700         * codegen.cs: Removed debugging messages.
16701
16702         * class.cs: Make this a global thing, this acts just as a "key" to
16703         objects that we might have around.
16704
16705         (Populate): Only initialize method_builders_to_methods once.
16706
16707         * expression.cs (PropertyExpr): Initialize type from the
16708         PropertyType. 
16709
16710         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16711         Resolve pattern.  Attempt to implicitly convert value to boolean.
16712         Emit code.
16713
16714         * expression.cs: Set the type for the int32/int32 argument case.
16715         (Binary::ResolveOperator): Set the return type to boolean for
16716         comparission operators
16717
16718         * typemanager.cs: Remove debugging print code.
16719
16720         (Invocation::Resolve): resolve type.
16721
16722         * class.cs: Allocate a MemberInfo of the correct size, as the code
16723         elsewhere depends on the test to reflect the correct contents.
16724
16725         (Method::) Keep track of parameters, due to System.Reflection holes
16726
16727         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16728         mapping here.
16729
16730         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16731         of the exact size and return that.
16732
16733         (Class::LookupMethodByBuilder): New function that maps
16734         MethodBuilders to its methods.  Required to locate the information
16735         on methods because System.Reflection bit us again.
16736
16737         * support.cs: New file, contains an interface ParameterData and
16738         two implementations: ReflectionParameters and InternalParameters
16739         used to access Parameter information.  We will need to grow this
16740         as required.
16741
16742         * expression.cs (Invocation::GetParameterData): implement a cache
16743         and a wrapper around the ParameterData creation for methods. 
16744         (Invocation::OverloadResolve): Use new code.
16745
16746 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16747
16748         * class.cs (TypeContainer::EmitField): Remove and move into 
16749         (Field::Define): here and modify accordingly.
16750         (Field.FieldBuilder): New member.
16751         (TypeContainer::Populate): Update accordingly.
16752         (TypeContainer::FindMembers): Implement.
16753
16754 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16755
16756         * statement.cs: (VariableInfo::VariableType): New field to be
16757         initialized with the full type once it is resolved. 
16758
16759 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16760
16761         * parameter.cs (GetParameterInfo): Use a type cache to compute
16762         things only once, and to reuse this information
16763
16764         * expression.cs (LocalVariableReference::Emit): Implement.
16765         (OpcodeCast::Emit): fix.
16766
16767         (ParameterReference::Resolve): Implement.
16768         (ParameterReference::Emit): Implement.
16769
16770         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16771         that are expressions need to stay as Expressions.
16772
16773         * typemanager.cs (CSharpName): Returns the C# name of a type if
16774         possible. 
16775
16776         * expression.cs (Expression::ConvertImplicit): New function that
16777         implements implicit type conversions.
16778
16779         (Expression::ImplicitReferenceConversion): Implements implicit
16780         reference conversions.
16781
16782         (EmptyCast): New type for transparent casts.
16783
16784         (OpcodeCast): New type for casts of types that are performed with
16785         a sequence of bytecodes.
16786
16787         (BoxedCast): New type used for casting value types into reference
16788         types.  Emits a box opcode.
16789
16790         (Binary::DoNumericPromotions): Implements numeric promotions of
16791         and computation of the Binary::Type.
16792
16793         (Binary::EmitBranchable): Optimization.
16794
16795         (Binary::Emit): Implement code emission for expressions.
16796
16797         * typemanager.cs (TypeManager): Added two new core types: sbyte
16798         and byte.
16799
16800 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16801
16802         * class.cs (TypeContainer::FindMembers): Method which does exactly
16803         what Type.FindMembers does, only we don't have to use reflection. No
16804         implementation yet.
16805
16806         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16807         typecontainer objects as we need to get at them.
16808         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16809
16810         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16811         typecontainer object.
16812
16813         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16814         of just a Report object.
16815
16816 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16817
16818         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16819         "remove_"
16820         (TypeContainer::Populate): Now define the delegates of the type too.
16821         (TypeContainer.Delegates): Property to access the list of delegates defined
16822         in the type.
16823
16824         * delegates.cs (Delegate::Define): Implement partially.
16825
16826         * modifiers.cs (TypeAttr): Handle more flags.
16827
16828 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16829
16830         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16831         and not <=
16832         (Operator::Define): Re-write logic to get types by using the LookupType method
16833         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16834         (Indexer::Define): Ditto.
16835         (Event::Define): Ditto.
16836         (Property::Define): Ditto.
16837
16838 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16839
16840         * class.cs (TypeContainer::Populate): Now define operators too. 
16841         (TypeContainer.Operators): New property to access the list of operators
16842         in a type.
16843         (Operator.OperatorMethodBuilder): New member to hold the method builder
16844         for the operator we are defining.
16845         (Operator::Define): Implement.
16846
16847 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16848
16849         * class.cs (Event::Define): Make the prefixes of the accessor methods
16850         addOn_ and removeOn_ 
16851
16852         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16853         of the location being passed in too. Ideally, this should go later since all
16854         error reporting should be done through the Report object.
16855
16856         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16857         (Populate): Iterate thru the indexers we have and define them too.
16858         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16859         for the get and set accessors.
16860         (Indexer::Define): Implement.
16861
16862 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16863
16864         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16865         my previous implementation, did not work.
16866
16867         * typemanager.cs: Add a couple of missing types (the longs).
16868
16869         * literal.cs: Use TypeManager.bool_type instead of getting it.
16870
16871         * expression.cs (EventExpr): New kind of expressions.
16872         (Expressio::ExprClassFromMemberInfo): finish
16873
16874 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
16875
16876         * assign.cs: Emit stores to static fields differently.
16877
16878 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16879
16880         * Merge in changes and adjust code to tackle conflicts. Backed out my
16881         code in Assign::Resolve ;-) 
16882
16883 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16884
16885         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
16886         instead Report.Error and also pass in the location.
16887         (CSharpParser::Lexer): New readonly property to return the reference
16888         to the Tokenizer object.
16889         (declare_local_variables): Use Report.Error with location instead of plain 
16890         old error.
16891         (CheckDef): Ditto.
16892
16893         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16894         (Operator.CheckBinaryOperator): Ditto.
16895
16896         * cs-parser.jay (operator_declarator): Update accordingly.
16897
16898         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16899         (CheckBinaryOperator): Same here.
16900
16901         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16902         on the name without any prefixes of namespace names etc. This is because we
16903         already might have something already fully qualified like 
16904         'System.Console.WriteLine'
16905
16906         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16907
16908 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16909
16910         * cs-tokenizer.cs (location): Return a string which also contains
16911         the file name.
16912
16913         * expression.cs (ElementAccess): New class for expressions of the
16914         type 'element access.'
16915         (BaseAccess): New class for expressions of the type 'base access.'
16916         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16917         respectively.
16918
16919         * cs-parser.jay (element_access): Implement action.
16920         (base_access): Implement actions.
16921         (checked_expression, unchecked_expression): Implement.
16922
16923         * cs-parser.jay (local_variable_type): Correct and implement.
16924         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16925
16926         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16927
16928         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16929         name and the specifiers.
16930
16931         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16932
16933         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16934         making them all public ;-)
16935
16936         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16937         class anyways.
16938
16939 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16940
16941         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16942         PropertyExprs.
16943         (FieldExpr, PropertyExprs): New resolved expressions.
16944         (SimpleName::MemberStaticCheck): Perform static checks for access
16945         to non-static fields on static methods. Maybe this should be
16946         generalized for MemberAccesses. 
16947         (SimpleName::ResolveSimpleName): More work on simple name
16948         resolution. 
16949
16950         * cs-parser.jay (primary_expression/qualified_identifier): track
16951         the parameter index.
16952
16953         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16954         (EmitContext::EmitBoolExpression): Chain to expression generation
16955         instead of temporary hack.
16956         (::EmitStatementExpression): Put generic expression code generation.
16957
16958         * assign.cs (Assign::Emit): Implement variable assignments to
16959         local variables, parameters and fields.
16960
16961 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16962
16963         * statement.cs (Block::GetVariableInfo): New method, returns the
16964         VariableInfo for a variable name in a block.
16965         (Block::GetVariableType): Implement in terms of GetVariableInfo
16966
16967         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16968         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16969
16970 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16971
16972         * cs-parser.jay (operator_declaration): Continue on my quest : update
16973         to take attributes argument.
16974         (event_declaration): Ditto.
16975         (enum_declaration): Ditto.
16976         (indexer_declaration): Ditto.
16977
16978         * class.cs (Operator::Operator): Update constructor accordingly.
16979         (Event::Event): Ditto.
16980
16981         * delegate.cs (Delegate::Delegate): Same here.
16982
16983         * enum.cs (Enum::Enum): Same here.
16984
16985 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16986
16987         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16988
16989         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16990
16991         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16992         being passed around as an arraylist.
16993         (Attributes::AddAttribute): Method to add attribute sections.
16994
16995         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16996         (struct_declaration): Update accordingly.
16997         (constant_declaration): Update.
16998         (field_declaration): Update.
16999         (method_header): Update.
17000         (fixed_parameter): Update.
17001         (parameter_array): Ditto.
17002         (property_declaration): Ditto.
17003         (destructor_declaration): Ditto.
17004
17005         * class.cs (Struct::Struct): Update constructors accordingly.
17006         (Class::Class): Ditto.
17007         (Field::Field): Ditto.
17008         (Method::Method): Ditto.
17009         (Property::Property): Ditto.
17010         (TypeContainer::OptAttribute): update property's return type.
17011
17012         * interface.cs (Interface.opt_attributes): New member.
17013         (Interface::Interface): Update to take the extra Attributes argument.
17014
17015         * parameter.cs (Parameter::Parameter): Ditto.
17016
17017         * constant.cs (Constant::Constant): Ditto.
17018
17019         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17020         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17021         the attributes as a parameter.
17022         (InterfaceProperty): Update constructor call.
17023         (InterfaceEvent): Ditto.
17024         (InterfaceMethod): Ditto.
17025         (InterfaceIndexer): Ditto.
17026
17027         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17028         pass the attributes too.
17029         (interface_event_declaration): Ditto.
17030         (interface_property_declaration): Ditto.
17031         (interface_method_declaration): Ditto.
17032         (interface_declaration): Ditto.
17033
17034 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17035
17036         * class.cs (Method::Define): Track the "static Main" definition to
17037         create an entry point. 
17038
17039         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17040         EntryPoint if we find it. 
17041
17042         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17043         (EmitContext::ig): Make this variable public.
17044
17045         * driver.cs: Make the default output file be the first file name
17046         with the .exe extension.  
17047
17048         Detect empty compilations
17049
17050         Handle various kinds of output targets.  Handle --target and
17051         rename -t to --dumper.
17052
17053         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17054         methods inherited from Expression return now an Expression.  This
17055         will is used during the tree rewriting as we resolve them during
17056         semantic analysis.
17057
17058         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17059         the spec.  Missing entirely is the information about
17060         accessability of elements of it.
17061
17062         (Expression::ExprClassFromMemberInfo): New constructor for
17063         Expressions that creates a fully initialized Expression based on
17064         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17065         a Type.
17066
17067         (Invocation::Resolve): Begin implementing resolution of invocations.
17068
17069         * literal.cs (StringLiteral):  Implement Emit.
17070
17071 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17072
17073         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17074         member.
17075
17076 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17077
17078         * cs-parser.jay (attribute_arguments): Implement actions.
17079         (attribute): Fix bug in production. Implement action.
17080         (attribute_list): Implement.
17081         (attribute_target): Implement.
17082         (attribute_target_specifier, opt_target_specifier): Implement
17083         (CheckAttributeTarget): New method to check if the attribute target
17084         is valid.
17085         (attribute_section): Implement.
17086         (opt_attributes): Implement.
17087
17088         * attribute.cs : New file to handle attributes.
17089         (Attribute): Class to hold attribute info.
17090
17091         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17092         (attribute_section): Modify production to use 2 different rules to 
17093         achieve the same thing. 1 s/r conflict down !
17094         Clean out commented, useless, non-reducing dimension_separator rules.
17095
17096         * class.cs (TypeContainer.attributes): New member to hold list
17097         of attributes for a type.
17098         (Struct::Struct): Modify to take one more argument, the attribute list.
17099         (Class::Class): Ditto.
17100         (Field::Field): Ditto.
17101         (Method::Method): Ditto.
17102         (Property::Property): Ditto.
17103
17104         * cs-parser.jay (struct_declaration): Update constructor call to
17105         pass in the attributes too.
17106         (class_declaration): Ditto.
17107         (constant_declaration): Ditto.
17108         (field_declaration): Ditto.
17109         (method_header): Ditto.
17110         (fixed_parameter): Ditto.
17111         (parameter_array): Ditto.
17112         (property_declaration): Ditto.
17113
17114         * constant.cs (Constant::Constant): Update constructor similarly.
17115         Use System.Collections.
17116
17117         * parameter.cs (Parameter::Parameter): Update as above.
17118
17119 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17120
17121         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17122         (TypeContainer.delegates): New member to hold list of delegates.
17123
17124         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17125         this time as I seem to be on crack ;-)
17126
17127 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17128
17129         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17130         tell whether an identifier represents a namespace.
17131
17132         * expression.cs (NamespaceExpr): A namespace expression, used only
17133         temporarly during expression resolution.
17134         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17135         utility functions to resolve names on expressions.
17136
17137 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17138
17139         * codegen.cs: Add hook for StatementExpressions. 
17140
17141         * class.cs: Fix inverted test for static flag in methods.
17142
17143 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17144
17145         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17146         to make it coincide with MS' number.
17147         (Operator::CheckBinaryOperator): Ditto.
17148
17149         * ../errors/errors.txt : Remove error numbers added earlier.
17150
17151         * ../errors/cs1019.cs : Test case for error # 1019
17152
17153         * ../errros/cs1020.cs : Test case for error # 1020
17154
17155         * cs-parser.jay : Clean out commented cruft.
17156         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17157         used anywhere - non-reducing rule.
17158         (namespace_declarations): Non-reducing rule - comment out.
17159
17160         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17161         with TypeContainer::AddEnum.
17162
17163         * delegate.cs : New file for delegate handling classes.
17164         (Delegate): Class for declaring delegates.
17165
17166         * makefile : Update.
17167
17168         * cs-parser.jay (delegate_declaration): Implement.
17169
17170 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17171
17172         * class.cs (Event::Define): Implement.
17173         (Event.EventBuilder): New member.
17174
17175         * class.cs (TypeContainer::Populate): Update to define all enums and events
17176         we have.
17177         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17178         readonly fields for all these cases ?
17179
17180 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17181
17182         * class.cs (Property): Revamp to use the convention of making fields readonly.
17183         Accordingly modify code elsewhere.
17184
17185         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17186         the Define method of the Property class.
17187
17188         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17189         trivial bug.
17190         (TypeContainer::Populate): Update to define all the properties we have. Also
17191         define all enumerations.
17192
17193         * enum.cs (Define): Implement.
17194
17195 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17196
17197         * cs-parser.jay (overloadable_operator): The semantic value is an
17198         enum of the Operator class.
17199         (operator_declarator): Implement actions.
17200         (operator_declaration): Implement.
17201
17202         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17203         validity of definitions.
17204         (Operator::CheckBinaryOperator): Static method to check for binary operators
17205         (TypeContainer::AddOperator): New method to add an operator to a type.
17206
17207         * cs-parser.jay (indexer_declaration): Added line to actually call the
17208         AddIndexer method so it gets added ;-)
17209
17210         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17211         already taken care of by the MS compiler ?  
17212
17213 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17214
17215         * class.cs (Operator): New class for operator declarations.
17216         (Operator::OpType): Enum for the various operators.
17217
17218 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17219
17220         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17221         ostensibly handle this in semantic analysis.
17222
17223         * cs-parser.jay (general_catch_clause): Comment out
17224         (specific_catch_clauses, specific_catch_clause): Ditto.
17225         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17226         (catch_args, opt_catch_args): New productions.
17227         (catch_clause): Rewrite to use the new productions above
17228         (catch_clauses): Modify accordingly.
17229         (opt_catch_clauses): New production to use in try_statement
17230         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17231         and re-write the code in the actions to extract the specific and
17232         general catch clauses by being a little smart ;-)
17233
17234         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17235         Hooray, try and catch statements parse fine !
17236
17237 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17238
17239         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17240         string from the hashtable of variables.
17241
17242         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17243         I end up making that mistake ;-)
17244         (catch_clauses): Fixed gross error which made Key and Value of the 
17245         DictionaryEntry the same : $1 !!
17246
17247 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17248
17249         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17250
17251         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17252         when the add and remove accessors are specified. 
17253
17254 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17255
17256         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17257         information about indexer_declarator.
17258         (indexer_declarator): Implement actions.
17259         (parsing_indexer): New local boolean used to keep track of whether
17260         we are parsing indexers or properties. This is necessary because 
17261         implicit_parameters come into picture even for the get accessor in the 
17262         case of an indexer.
17263         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17264
17265         * class.cs (Indexer): New class for indexer declarations.
17266         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17267         (TypeContainer::indexers): New member to hold list of indexers for the
17268         type.
17269
17270 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17271
17272         * cs-parser.jay (add_accessor_declaration): Implement action.
17273         (remove_accessor_declaration): Implement action.
17274         (event_accessors_declaration): Implement
17275         (variable_declarators): swap statements for first rule - trivial.
17276
17277         * class.cs (Event): New class to hold information about event
17278         declarations.
17279         (TypeContainer::AddEvent): New method to add an event to a type
17280         (TypeContainer::events): New member to hold list of events.
17281
17282         * cs-parser.jay (event_declaration): Implement actions.
17283
17284 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17285
17286         * cs-parser.jay (dim_separators): Implement. Make it a string
17287         concatenating all the commas together, just as they appear.
17288         (opt_dim_separators): Modify accordingly
17289         (rank_specifiers): Update accordingly. Basically do the same
17290         thing - instead, collect the brackets here.
17291         (opt_rank_sepcifiers): Modify accordingly.
17292         (array_type): Modify to actually return the complete type string
17293         instead of ignoring the rank_specifiers.
17294         (expression_list): Implement to collect the expressions
17295         (variable_initializer): Implement. We make it a list of expressions
17296         essentially so that we can handle the array_initializer case neatly too.
17297         (variable_initializer_list): Implement.
17298         (array_initializer): Make it a list of variable_initializers
17299         (opt_array_initializer): Modify accordingly.
17300
17301         * expression.cs (New::NType): Add enumeration to help us
17302         keep track of whether we have an object/delegate creation
17303         or an array creation.
17304         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17305         members to hold data about array creation.
17306         (New:New): Modify to update NewType
17307         (New:New): New Overloaded contructor for the array creation
17308         case.
17309
17310         * cs-parser.jay (array_creation_expression): Implement to call
17311         the overloaded New constructor.
17312
17313 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17314
17315         * class.cs (TypeContainer::Constructors): Return member
17316         constructors instead of returning null.
17317
17318 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17319
17320         * typemanager.cs (InitCoreTypes): Initialize the various core
17321         types after we have populated the type manager with the user
17322         defined types (this distinction will be important later while
17323         compiling corlib.dll)
17324
17325         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17326         on Expression Classification.  Now all expressions have a method
17327         `Resolve' and a method `Emit'.
17328
17329         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17330         generation from working.     Also add some temporary debugging
17331         code. 
17332
17333 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17334
17335         * codegen.cs: Lots of code generation pieces.  This is only the
17336         beginning, will continue tomorrow with more touches of polish.  We
17337         handle the fundamentals of if, while, do, for, return.  Others are
17338         trickier and I need to start working on invocations soon.
17339
17340         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17341         s.InitStatement. 
17342
17343         * codegen.cs (EmitContext): New struct, used during code
17344         emission to keep a context.   Most of the code generation will be
17345         here. 
17346
17347         * cs-parser.jay: Add embedded blocks to the list of statements of
17348         this block.  So code generation proceeds in a top down fashion.
17349
17350 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17351
17352         * statement.cs: Add support for multiple child blocks.
17353
17354 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17355
17356         * codegen.cs (EmitCode): New function, will emit the code for a
17357         Block of code given a TypeContainer and its ILGenerator. 
17358
17359         * statement.cs (Block): Standard public readonly optimization.
17360         (Block::Block constructors): Link children. 
17361         (Block::Child): Child Linker.
17362         (Block::EmitVariables): Emits IL variable declarations.
17363
17364         * class.cs: Drop support for MethodGroups here, delay until
17365         Semantic Analysis.
17366         (Method::): Applied the same simplification that I did before, and
17367         move from Properties to public readonly fields.
17368         (Method::ParameterTypes): Returns the parameter types for the
17369         function, and implements a cache that will be useful later when I
17370         do error checking and the semantic analysis on the methods is
17371         performed.
17372         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17373         and made a method, optional argument tells whether this is a class
17374         or a structure to apply the `has-this' bit.
17375         (Method::GetCallingConvention): Implement, returns the calling
17376         convention. 
17377         (Method::Define): Defines the type, a second pass is performed
17378         later to populate the methods.
17379
17380         (Constructor::ParameterTypes): implement a cache similar to the
17381         one on Method::ParameterTypes, useful later when we do semantic
17382         analysis. 
17383
17384         (TypeContainer::EmitMethod):  New method.  Emits methods.
17385
17386         * expression.cs: Removed MethodGroup class from here.
17387
17388         * parameter.cs (Parameters::GetCallingConvention): new method.
17389
17390 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17391
17392         * class.cs (TypeContainer::Populate): Drop RootContext from the
17393         argument. 
17394
17395         (Constructor::CallingConvention): Returns the calling convention.
17396         (Constructor::ParameterTypes): Returns the constructor parameter
17397         types. 
17398
17399         (TypeContainer::AddConstructor): Keep track of default constructor
17400         and the default static constructor.
17401
17402         (Constructor::) Another class that starts using `public readonly'
17403         instead of properties. 
17404
17405         (Constructor::IsDefault): Whether this is a default constructor. 
17406
17407         (Field::) use readonly public fields instead of properties also.
17408
17409         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17410         track of static constructors;  If none is used, turn on
17411         BeforeFieldInit in the TypeAttributes. 
17412
17413         * cs-parser.jay (opt_argument_list): now the return can be null
17414         for the cases where there are no arguments. 
17415
17416         (constructor_declarator): If there is no implicit `base' or
17417         `this', then invoke the default parent constructor. 
17418
17419         * modifiers.cs (MethodAttr): New static function maps a set of
17420         modifiers flags into a MethodAttributes enum
17421         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17422         MethodAttr, TypeAttr to represent the various mappings where the
17423         modifiers are used.
17424         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17425
17426 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17427
17428         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17429         method arguments.
17430
17431         * interface.cs (PopulateIndexer): Implemented the code generator
17432         for interface indexers.
17433
17434 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17435
17436         * interface.cs (InterfaceMemberBase): Now we track the new status
17437         here.  
17438
17439         (PopulateProperty): Implement property population.  Woohoo!  Got
17440         Methods and Properties going today. 
17441
17442         Removed all the properties for interfaces, and replaced them with
17443         `public readonly' fields. 
17444
17445 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17446
17447         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17448         initialize their hashtables/arraylists only when they are needed
17449         instead of doing this always.
17450
17451         * parameter.cs: Handle refs and out parameters.
17452
17453         * cs-parser.jay: Use an ArrayList to construct the arguments
17454         instead of the ParameterCollection, and then cast that to a
17455         Parameter[] array.
17456
17457         * parameter.cs: Drop the use of ParameterCollection and use
17458         instead arrays of Parameters.
17459
17460         (GetParameterInfo): Use the Type, not the Name when resolving
17461         types. 
17462
17463 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17464
17465         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17466         and instead use public readonly fields.
17467
17468         * class.cs: Put back walking code for type containers.
17469
17470 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17471
17472         * class.cs (MakeConstant): Code to define constants.
17473
17474         * rootcontext.cs (LookupType): New function.  Used to locate types 
17475
17476
17477 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17478
17479         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17480         this System.Reflection code is.  Kudos to Microsoft
17481
17482         * typemanager.cs: Implement a type cache and avoid loading all
17483         types at boot time.  Wrap in LookupType the internals.  This made
17484         the compiler so much faster.  Wow.  I rule!
17485
17486         * driver.cs: Make sure we always load mscorlib first (for
17487         debugging purposes, nothing really important).
17488
17489         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17490         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17491
17492         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17493         on namespaces that have been imported using the `using' keyword.
17494
17495         * class.cs (TypeContainer::TypeAttr): Virtualize.
17496         (Class::TypeAttr): Return attributes suitable for this bad boy.
17497         (Struct::TypeAttr): ditto.
17498         Handle nested classes.
17499         (TypeContainer::) Remove all the type visiting code, it is now
17500         replaced with the rootcontext.cs code
17501
17502         * rootcontext.cs (GetClassBases): Added support for structs. 
17503
17504 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17505
17506         * interface.cs, statement.cs, class.cs, parameter.cs,
17507         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17508         Drop use of TypeRefs, and use strings instead.
17509
17510 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17511
17512         * rootcontext.cs: 
17513
17514         * class.cs (Struct::Struct): set the SEALED flags after
17515         checking the modifiers.
17516         (TypeContainer::TypeAttr): new property, returns the
17517         TypeAttributes for a class.  
17518
17519         * cs-parser.jay (type_list): Oops, list production was creating a
17520         new list of base types.
17521
17522         * rootcontext.cs (StdLib): New property.
17523         (GetInterfaceTypeByName): returns an interface by type name, and
17524         encapsulates error handling here.
17525         (GetInterfaces): simplified.
17526         (ResolveTree): Encapsulated all the tree resolution here.
17527         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17528         types. 
17529
17530         * driver.cs: Add support for --nostdlib, to avoid loading the
17531         default assemblies.
17532         (Main): Do not put tree resolution here. 
17533
17534         * rootcontext.cs: Beginning of the class resolution.
17535
17536 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17537
17538         * rootcontext.cs: Provide better error reporting. 
17539
17540         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17541
17542         * rootcontext.cs (CreateInterface): Handle the case where there
17543         are no parent interfaces.
17544
17545         (CloseTypes): Routine to flush types at the end.
17546         (CreateInterface): Track types.
17547         (GetInterfaces): Returns an array of Types from the list of
17548         defined interfaces.
17549
17550         * typemanager.c (AddUserType): Mechanism to track user types (puts
17551         the type on the global type hash, and allows us to close it at the
17552         end). 
17553
17554 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17555
17556         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17557         RecordInterface instead.
17558
17559         * cs-parser.jay: Updated to reflect changes above.
17560
17561         * decl.cs (Definition): Keep track of the TypeBuilder type that
17562         represents this type here.  Not sure we will use it in the long
17563         run, but wont hurt for now.
17564
17565         * driver.cs: Smaller changes to accomodate the new code.
17566
17567         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17568         when done. 
17569
17570         * rootcontext.cs (CreateInterface):  New method, used to create
17571         the System.TypeBuilder type for interfaces.
17572         (ResolveInterfaces): new entry point to resolve the interface
17573         hierarchy. 
17574         (CodeGen): Property, used to keep track of the code generator.
17575
17576 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17577
17578         * cs-parser.jay: Add a second production for delegate_declaration
17579         with `VOID'.
17580
17581         (enum_body): Put an opt_comma here instead of putting it on
17582         enum_body or enum_member_declarations so we can handle trailing
17583         commas on enumeration members.  Gets rid of a shift/reduce.
17584
17585         (type_list): Need a COMMA in the middle.
17586
17587         (indexer_declaration): Tell tokenizer to recognize get/set
17588
17589         * Remove old targets.
17590
17591         * Re-add the parser target.
17592
17593 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17594
17595         * cs-parser.jay: Add precendence rules for a number of operators
17596         ot reduce the number of shift/reduce conflicts in the grammar.
17597
17598 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17599
17600         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17601         and put it here.
17602
17603         Get rid of old crufty code.
17604
17605         * rootcontext.cs: Use this to keep track of the parsed
17606         representation and the defined types available to the program. 
17607
17608         * gen-treedump.cs: adjust for new convention.
17609
17610         * type.cs: Split out the type manager, and the assembly builder
17611         from here. 
17612
17613         * typemanager.cs: the type manager will live here now.
17614
17615         * cil-codegen.cs: And the code generator here. 
17616
17617 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17618
17619         * makefile: Fixed up for easy making.
17620
17621 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17622
17623         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17624         the 
17625
17626         (unary_expression): Expand pre_increment_expression and
17627         post_decrement_expression to reduce a shift/reduce.
17628
17629 2001-07-11  Simon Cozens
17630
17631         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17632
17633         Improve allow_keyword_as_indent name.
17634
17635 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17636
17637         * Adjustments for Beta2. 
17638
17639 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17640
17641         * decl.cs: Added `Define' abstract method.
17642         (InTransit): new property, used to catch recursive definitions. 
17643
17644         * interface.cs: Implement `Define'. 
17645
17646         * modifiers.cs: Map Modifiers.constants to
17647         System.Reflection.TypeAttribute flags.
17648
17649         * class.cs: Keep track of types and user-defined types.
17650         (BuilderInit): New method for creating an assembly
17651         (ResolveType): New function to launch the resolution process, only
17652         used by interfaces for now.
17653
17654         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17655         that are inserted into the name space. 
17656
17657 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17658
17659         * ARGH.  I have screwed up my tree so many times due to the use of
17660         rsync rather than using CVS.  Going to fix this at once. 
17661
17662         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17663         load types.
17664
17665 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17666
17667         * Experiment successful: Use System.Type rather that our own
17668         version of Type.  
17669
17670 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17671
17672         * cs-parser.jay: Removed nsAliases from here.
17673
17674         Use new namespaces, handle `using XXX;' 
17675
17676         * namespace.cs: Reimplemented namespace handling, use a recursive
17677         definition of the class.  Now we can keep track of using clauses
17678         and catch invalid using clauses.
17679
17680 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17681
17682         * gen-treedump.cs: Adapted for all the renaming.
17683
17684         * expression.cs (Expression): this class now has a Type property
17685         which returns an expression Type.
17686
17687         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17688         `Type', as this has a different meaning now in the base
17689
17690 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17691
17692         * interface.cs, class.cs: Removed from all the sources the
17693         references to signature computation, as we can not do method
17694         signature computation during the parsing time, as we are not
17695         trying to solve at that point distinguishing:
17696
17697         class X {
17698                 void a (Blah x) {}
17699                 void a (NS.Blah x) {}
17700         }
17701
17702         Which depending on the context might be valid or not, as we do not
17703         know if Blah is the same thing as NS.Blah at that point.
17704
17705         * Redid everything so the code uses TypeRefs now instead of
17706         Types.  TypeRefs are just temporary type placeholders, that need
17707         to be resolved.  They initially have a pointer to a string and the
17708         current scope in which they are used.  This is used later by the
17709         compiler to resolve the reference to an actual Type. 
17710
17711         * DeclSpace is no longer a CIR.Type, and neither are
17712         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17713         are all DeclSpaces, but no Types. 
17714
17715         * type.cs (TypeRefManager): This implements the TypeRef manager,
17716         which keeps track of all the types that need to be resolved after
17717         the parsing has finished. 
17718
17719 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17720
17721         * ARGH.  We are going to have to store `foreach' as a class rather
17722         than resolving it, as we need to verify error 1579 after name
17723         resolution.   *OR* we could keep a flag that says `This request to
17724         IEnumerator comes from a foreach statement' which we can then use
17725         to generate the error.
17726
17727 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17728
17729         * class.cs (TypeContainer.AddMethod): we now add methods to the
17730         MethodGroup instead of the method hashtable.  
17731
17732         * expression.cs: Add MethodGroup abstraction, which gets us one
17733         step closer to the specification in the way we handle method
17734         declarations.  
17735
17736         * cs-parser.jay (primary_expression): qualified_identifier now
17737         tried to match up an identifier to a local variable reference or
17738         to a parameter reference.
17739
17740         current_local_parameters is now a parser global variable that
17741         points to the current parameters for the block, used during name
17742         lookup.
17743
17744         (property_declaration): Now creates an implicit `value' argument to
17745         the set accessor.
17746
17747 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17748
17749         * parameter.cs: Do not use `param' arguments as part of the
17750         signature, per the spec.
17751
17752 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17753
17754         * decl.cs: Base class for classes, structs and interfaces.  This
17755         is the "Declaration Space" 
17756
17757         * cs-parser.jay: Use CheckDef for checking declaration errors
17758         instead of having one on each function.
17759
17760         * class.cs: Factor out some code for handling error handling in
17761         accordance to the "Declarations" section in the "Basic Concepts"
17762         chapter in the ECMA C# spec.
17763
17764         * interface.cs: Make all interface member classes derive from
17765         InterfaceMemberBase.
17766
17767 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17768
17769         * Many things: all interfaces are parsed and generated in
17770         gen-treedump.  Support for member variables, constructors,
17771         destructors, properties, constants is there.
17772
17773         Beginning of the IL backend, but very little done, just there for
17774         testing purposes. 
17775
17776 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17777
17778         * cs-parser.jay: Fix labeled statement.
17779
17780         * cs-tokenizer.cs (escape): Escape " and ' always.
17781         ref_line, ref_name: keep track of the line/filename as instructed
17782         by #line by the compiler.
17783         Parse #line.
17784
17785 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17786
17787         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17788         to match the values in System.CodeDOM.
17789
17790         Divid renamed to Divide.
17791
17792         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17793         statements. 
17794         (Statements.set): remove.
17795
17796         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17797         statements. 
17798
17799         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17800         falseStatements always have valid values. 
17801
17802         * cs-parser.jay: Use System.CodeDOM now.
17803