2004-10-11 Martin Baulig <martin@ximian.com>
[mono.git] / mcs / gmcs / ChangeLog
1 2004-10-11  Martin Baulig  <martin@ximian.com>
2
3         * report.cs: Don't make --fatal abort on warnings, we have
4         -warnaserror for that.
5
6 2004-10-11  Martin Baulig  <martin@ximian.com>
7
8         * typemanager.cs
9         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
10         (TypeManager.IsEqual): Call ourself recursively instead of using
11         Type.IsEqual(). 
12
13 2004-10-11  Martin Baulig  <martin@ximian.com>
14
15         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
16         on our own type parameters, not on the ones we inherit from a containing
17         class.
18
19         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
20         the comparision.
21
22         * generic.cs (TypeParameter.Define): We may only be called once.
23
24         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
25         instead of TypeManager.IsEqual().
26
27 2004-09-28  Martin Baulig  <martin@ximian.com>
28
29         * generic.cs
30         (GenericConstraints.EffectiveBaseClass): New public property.
31         (TypeParameter.GenericConstraints): New public property.
32         (ConstructedType.CheckConstraints): Improved.
33
34         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
35         (Convert.TypeParameterConversion): New private method; use this in
36         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
37         for all conversions related to type parameters.
38
39 2004-09-24  Martin Baulig  <martin@ximian.com>
40
41         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
42         type parameter conversions for type parameters which are known to
43         be reference types.
44
45 2004-09-24  Martin Baulig  <martin@ximian.com>
46
47         * generic.cs (GenericConstraints): Added `IsReferenceType' and
48         `IsValueType' properties.
49
50         * support.cs (ReflectionConstraints): Use
51         Type.GetGenericParameterConstraints() instead of the old hack.
52
53 2004-09-24  Martin Baulig  <martin@ximian.com>
54
55         * generic.cs (GenericConstraints): Moved here and made it an
56         abstract class.
57
58         * support.cs (GenericConstraints): Moved to generic.cs.
59
60 2004-09-24  Martin Baulig  <martin@ximian.com>
61
62         * support.cs
63         (ReflectionConstraints): Un-nested this class and made it public.
64
65         * typemanager.cs
66         (TypeManager.GetTypeParameterConstraints): New public method.
67         (TypeManager.HasConstructorConstraint): Use the attributes.
68
69 2004-09-24  Martin Baulig  <martin@ximian.com>
70
71         * support.cs (GenericConstraints): Replaced `HasConstructor',
72         `IsReferenceType' and `IsValueType' with `Attributes'.
73         (ReflectionParameters.ReflectionConstraints): Removed the Create()
74         method and made the .ctor public.
75
76         * generic.cs (Constraints.Attributes): New public property.
77         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
78         `IsReferenceType' -> `HasReferenceTypeConstraint' and
79         `IsValueType' -> `HasValueTypeConstraint'.
80
81 2004-09-23  Martin Baulig  <martin@ximian.com>
82
83         * generic.cs (Constraints): Reflect latest runtime changes.
84
85 2004-09-23  Martin Baulig  <martin@ximian.com>
86
87         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
88         (Convert.ImplicitReferenceConversionExists): Likewise.
89
90 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
91
92         * class.cs (Operator.Define): Add error 448 and 559 report.
93         
94 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
95
96         * class.cs (MemberBase.IsTypePermitted): New protected
97         method for checking error CS0610.
98
99 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
100
101         * class.cs (TypeContainer.HasExplicitLayout): New property
102         Returns whether container has StructLayout attribute set Explicit.
103         (FieldMember): New abstract class for consts and fields.
104         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
105         (Field): Reuse FieldMember.
106
107         * const.cs (Const): Reuse FieldMember.
108
109         * rootcontext.cs: EmitConstants call moved to class.
110
111 2004-09-22  Martin Baulig  <martin@ximian.com>
112
113         Marek and me just fixed one of our oldest bugs: #28562 :-)
114
115         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
116
117         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
118         we're an EnumConstant, just return that.
119         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
120         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
121         to get the value which'll actually be written into the attribute.
122         However, we have to use GetValue() to access the attribute's value
123         in the compiler.        
124
125 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
126
127         * constant.cs (Constant.IsNegative): New abstract property
128         IsNegative.
129
130         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
131         (StackAlloc.DoResolve): Reused IsNegative.
132
133 2004-09-22  Martin Baulig  <martin@ximian.com>
134
135         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
136         public method; like LookupTypeContainer, but also works for
137         generic instances.
138
139         * report.cs (Report.SymbolRelatedToPreviousError): Use
140         TypeManager.LookupGenericTypeContainer().       
141
142 2004-09-22  Martin Baulig  <martin@ximian.com>
143
144         Thanks to Peter Sestoft for this bug report.
145
146         * expression.cs (Conditional): If both the `trueExpr' and the
147         `falseExpr' is a NullLiteral, return a NullLiteral.
148
149 2004-09-22  Martin Baulig  <martin@ximian.com>
150
151         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
152         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
153         for the "get_Current" call.
154
155 2004-09-21  Martin Baulig  <martin@ximian.com>
156
157         * convert.cs (Convert.ImplicitReferenceConversion): When
158         converting to an interface type, first check whether we're
159         converting from a reference type.
160
161 2004-09-14  Martin Baulig  <martin@ximian.com>
162
163         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
164
165 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
166
167         Fixed bug #61902
168         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
169         called and is obsolete then this member suppress message
170         when call is inside next [Obsolete] method or type.
171
172         * expression.cs: Use TestObsoleteMethodUsage member.
173
174 2004-09-14  Martin Baulig  <martin@ximian.com>
175
176         * genericparser.cs: Removed.
177
178 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
179
180         * class.cs (MethodCore.CheckBase): Fix bug #65757.
181
182 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
183
184         * attribute.cs (Attribute.Resolve): Add error 653 report.
185
186         * class.cs (Class.ApplyAttributeBuilder): Add error 641
187         report.
188         (Method.ApplyAttributeBuilder): Add error 685 report.
189         (Operator.Define): Add error 564 report.
190
191         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
192
193         * expression.cs (Invocation.DoResolve): Add error
194         245 and 250 report.
195
196         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
197         error 674 report.
198
199 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
200
201         * class.cs (ConstructorInitializer.Resolve):
202         Wrong error number (515->516).
203
204 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
205
206         * class.cs (Indexer.Define): Add error 631 report.
207
208 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
209
210         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
211
212 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
213
214         * expression.cs (Probe.DoResolve): Add error CS0241 report.
215
216 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
217
218         * cs-parser.jay: Added error CS0241 report.
219
220 2004-09-10  Raja R Harinath  <rharinath@novell.com>
221
222         * cs-parser.jay (fixed_statement): Introduce a scope for the
223         declaration in the 'fixed' statement.
224
225 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
226
227         * cs-parser.jay: Added CS0230 error report.
228
229 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
230
231         * cs-parser.jay: Added errors CS0231 and CS0257 report.
232
233 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
234
235         * expression.cs (Argument.Resolve): Added error CS0192 and
236         CS0199 report.
237
238 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
239
240         C# 2.0 #pragma warning feature
241
242         * cs-tokenizer.cs (PreProcessPragma): New method; 
243         Handles #pragma directive.
244
245         * report.cs (WarningRegions): New class; Support
246         class for #pragma warning directive. It tests whether
247         warning is enabled for a given line.
248
249 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
250
251         * const.cs: Add more descriptive error report, tahnks to
252         Sebastien. 
253
254 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
255
256         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
257
258 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
259
260         * expression.cs: Apply patch from Ben: Remove dead code from
261         ArrayCreation, and remove the TurnintoConstant call in const.cs,
262         as that code just threw an exception anwyays.
263
264         * const.cs: Remove the call to the turnintoconstant, for details
265         see bug: #63144
266         
267         * literal.cs: The type of the null-literal is the null type;  So
268         we use a placeholder type (literal.cs:System.Null, defined here)
269         for it.
270
271         * expression.cs (Conditional.DoResolve): Remove some old code that
272         is no longer needed, conversions have been fixed.
273
274         (ArrayCreationExpression.DoResolve): Return false if we fail to
275         resolve the inner expression.
276
277 2004-09-07  Raja R Harinath  <rharinath@novell.com>
278
279         Fix test-290.cs.
280         * cs-parser.jay (delegate_declaration): Record a delegate
281         declaration as a type declaration.
282         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
283
284 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
285
286         * parameter.cs: Do not crash if the type can not be resolved. 
287
288         * expression.cs: Report errors with unsafe pointers, fixes #64896
289
290 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
291
292         * expression.cs: Pointer arith always needs to do a conv.i
293         if the operand is a long. fix 65320
294
295 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
296
297         Fixed cs0619-37.cs, cs0619-38.cs
298
299         * enum.cs (GetObsoleteAttribute): Removed.
300
301         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
302         on Enum member is double staged. The first is tested member
303         and then enum.
304
305 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
306
307         Fixed #56986, #63631, #65231
308
309         * class.cs: (TypeContainer.AddToMemberContainer): New method,
310         adds member to name container.
311         (TypeContainer.AddToTypeContainer): New method, adds type to
312         name container.
313         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
314         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
315         AddOperator): Simplified by reusing AddToMemberContainer.
316         (TypeContainer.UserDefinedStaticConstructor): Changed to property
317         instead of field.
318         (Method.CheckForDuplications): Fixed implementation to test all
319         possibilities.
320         (MemberBase): Detection whether member is explicit interface
321         implementation is now in constructor.
322         (MemberBase.UpdateMemberName): Handles IndexerName.
323         (Accessor): Changed to keep also location information.
324         (AbstractPropertyEventMethod): Is derived from MemberCore.
325         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
326         will be emited or not.
327         (PropertyBase.AreAccessorsDuplicateImplementation):
328         Tests whether accessors are not in collision with some method.
329         (Operator): Is derived from MethodCore to simplify common
330         operations.
331
332         * decl.cs (Flags.TestMethodDuplication): Test for duplication
333         must be performed.
334         (DeclSpace.AddToContainer): Adds the member to defined_names
335         table. It tests for duplications and enclosing name conflicts.
336
337         * enum.cs (EnumMember): Clean up to reuse the base structures
338
339 2004-09-03  Martin Baulig  <martin@ximian.com>
340
341         Merged latest changes into gmcs.  Please keep this comment in
342         here, it makes it easier for me to see what changed in MCS since
343         the last time I merged.
344
345 2004-09-03  Martin Baulig  <martin@ximian.com>
346
347         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
348         into TypeContainer, to make partial classes work again.
349
350 2004-09-03  Martin Baulig  <martin@ximian.com>
351
352         * rootcontext.cs (RootContext.V2): Removed.
353
354 2004-03-23  Martin Baulig  <martin@ximian.com>
355
356         * expression.cs (Invocation.OverloadResolve): Added `bool
357         may_fail' argument and use it instead of the Location.IsNull() hack.
358
359 2004-09-09  Martin Baulig  <martin@ximian.com>
360
361         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
362
363 2004-09-09  Martin Baulig  <martin@ximian.com>
364
365         * generic.cs (TypeParameter.DefineType): Added support for
366         explicit interface methods.
367
368 2004-09-09  Martin Baulig  <martin@ximian.com>
369
370         * README.Changes: New document.  Started to list important changes
371         between MCS and GMCS here.
372
373 2004-09-08  Martin Baulig  <martin@ximian.com>
374
375         * class.cs
376         (TypeContainer.CheckRecursiveDefinition): New protected method.
377         (TypeContainer.DefineType): Move the CS0146 check into
378         CheckRecursiveDefinition().     
379
380 2004-09-06  Martin Baulig  <martin@ximian.com>
381
382         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
383         types for the constructor constraint.
384
385 2004-09-03  Martin Baulig  <martin@ximian.com>
386
387         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
388         into TypeContainer, to make partial classes work again.
389
390 2004-09-03  Martin Baulig  <martin@ximian.com>
391
392         * rootcontext.cs (RootContext.V2): Removed.
393
394 2004-03-23  Martin Baulig  <martin@ximian.com>
395
396         * expression.cs (Invocation.OverloadResolve): Added `bool
397         may_fail' argument and use it instead of the Location.IsNull() hack.
398
399 2004-09-03  Martin Baulig  <martin@ximian.com>
400
401         Merged latest changes into gmcs.  Please keep this comment in
402         here, it makes it easier for me to see what changed in MCS since
403         the last time I merged.
404
405 2004-09-03  Raja R Harinath  <rharinath@novell.com>
406
407         Fix #61128.
408         * expression.cs (BetterConversion): Don't allow either conversion 
409         to be null.  Remove redundant implicit conversion test when 'q ==
410         null' -- when this function is invoked, we already know that the
411         implicit conversion exists.
412         (BetterFunction): Assume that 'best' is non-null.  Remove
413         redundant reimplementation of IsApplicable when 'best' is null.
414         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
415         number of arguments.
416         (IsAncestralType): Extract from OverloadResolve.
417         (OverloadResolve): Make robust to the MethodGroupExpr being
418         unsorted.  Implement all the logic of Section 14.5.5.1, and
419         support overloading of methods from multiple applicable types.
420         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
421
422         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
423         (RealError, Warning): Append type of report to related symbol.
424
425 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
426
427         * enum.cs: Fixed CLS-Compliance checks for enum members.
428         Error tests cs3008-8.cs, cs3014-8.cs
429
430 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
431
432         Fixed bug #62342, #63102
433         * class.cs: ImplementIndexer uses member.IsExplicitImpl
434         like ImplementMethod.
435
436 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
437
438         * attribute.cs (Attribute.GetAttributeArgumentExpression):
439         Fixed bug #65170.
440
441 2004-09-02  Martin Baulig  <martin@ximian.com>
442
443         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
444         TypeManager.GetArgumentTypes() rather than calling GetParameters()
445         on the MethodBase.
446
447 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
448
449         C# 2.0 Static classes implemented
450
451         * class.cs (TypeContainer): instance_constructors,
452         initialized_fields, initialized_static_fields,
453         default_constructor, base_inteface_types are protected to be
454         accessible from StaticClass.
455         (TypeContainer.DefineDefaultConstructor): New virtual method
456         for custom default constructor generating
457         (StaticClass): New class to handle "Static classes" feature.
458
459         * cs-parser.jay: Handle static keyword on class like instance
460         of StaticClass.
461
462         * driver.cs: Added "/langversion" command line switch with two
463         options (iso-1, default).
464
465 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
466
467         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
468
469 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
470
471         * delegate.cs: Style.
472
473 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
474
475         * delegate.cs: Add seperate instance expr field for miguel.
476
477 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
478
479         * PointerArithmetic (Resolve): make sure we are not doing
480         pointer arith on void*. Also, make sure we are resolved
481         by not setting eclass until resolve.
482
483         All callers: Make sure that PointerArithmetic gets resolved.
484
485 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
486
487         * ArrayCreation (LookupType): If the type does not resolve 
488         to an array, give an error.
489
490 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
491
492         * statement.cs (Try.Resolve): Fixed bug #64222
493
494 2004-08-27  Martin Baulig  <martin@ximian.com>
495
496         * class.cs
497         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
498         crash here.     
499
500 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
501
502         * ecore.cs (Constantify): Get underlying type via
503         System.Enum.GetUnderlyingType to avoid StackOverflow on the
504         Windows in special cases.
505
506 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
507
508         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
509         for obtaining also private methods.
510         (GetRemoveMethod): Used GetRemoveMethod (true)
511         for obtaining also private methods.
512
513 2004-09-02  Martin Baulig  <martin@ximian.com>
514
515         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
516         TypeManager.GetArgumentTypes() rather than calling GetParameters()
517         on the MethodBase.
518
519 2004-08-27  Martin Baulig  <martin@ximian.com>
520
521         * class.cs
522         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
523         crash here.     
524
525 2004-08-25  Martin Baulig  <martin@ximian.com>
526
527         * support.cs (ReflectionParameters..ctor): If this is a generic
528         method, retrieve and store its type parameters.
529         (InternalParameters..ctor): Added `TypeParameter[]' argument.
530         (ReflectionParameters.GenericConstraints): The argument specifies
531         the type parameter, not the method parameter.
532         (InternalParameters.GenericConstraints): Likewise.
533
534         * generic.cs (TypeParameter.DefineType): Correctly handle
535         constraints wrt. generic methods in interfaces and their
536         implementations.        
537
538 2004-08-24  Martin Baulig  <martin@ximian.com>
539
540         * generic.cs (TypeParameter.IsSubclassOf): New public method.
541         (Constraints.IsSubclassOf): New internal method.
542
543         * typemanager.cs (TypeManager.FindMembers): Added special support
544         for GenericTypeParameterBuilder's.      
545         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
546         type parameters.
547
548 2004-08-24  Martin Baulig  <martin@ximian.com>
549
550         * typemanager.cs
551         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
552         this for accessibility checks.
553         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
554         IsNestedFamilyAccessible.
555         (TypeManager.IsSubclassOf): New method, do what the name actually
556         says.   
557
558 2004-08-24  Martin Baulig  <martin@ximian.com>
559
560         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
561         as a SimpleName, include the generic arity.
562
563 2004-08-24  Martin Baulig  <martin@ximian.com>
564
565         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
566         MethodAttributes.HideBySig for operators.
567
568 2004-08-23  Martin Baulig  <martin@ximian.com>
569
570         Back to the old error reporting system :-)
571
572         * report.cs (Message): Removed.
573         (Report.MessageData, ErrorData, WarningData): Removed.
574         (Report.Error, Warning): Back to the old system.
575
576 2004-08-23  Martin Baulig  <martin@ximian.com>
577
578         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
579
580         * class.cs (TypeContainer.ParentContainer): New public virtual
581         method; replaces the explicit interface implementation.
582         (ClassPart.ParentContainer): Override.
583
584 2004-08-23  Martin Baulig  <martin@ximian.com>
585
586         * statement.cs (Switch): Added support for constant switches; see
587         #59428 or test-285.cs.
588
589 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
590
591         Fixed bug #62740.
592         * statement.cs (GetEnumeratorFilter): Removed useless
593         logic because C# specs is strict. GetEnumerator must be
594         public.
595
596 2004-08-22  Martin Baulig  <martin@ximian.com>
597
598         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
599         a switch and may break, reset the barrier.  Fixes #59867.
600
601 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
602
603         CLS-Compliance speed up (~5% for corlib)
604
605         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
606         New method. Tests container for CLS-Compliant names
607
608         * class.cs (TypeContainer.VerifyClsName): New method.
609         Checks whether container name is CLS Compliant.
610         (Constructor): Implements IMethodData.
611
612         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
613         low-case table for CLS Compliance test.
614         (MemberCache.VerifyClsParameterConflict): New method.
615         Checks method parameters for CS3006 error.
616
617         * enum.cs (EnumMember): Is derived from MemberCore.
618         (Enum.VerifyClsName): Optimized for better performance.
619
620 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
621
622         * report.cs: Renamed Error_T to Error and changed all
623         references.
624
625 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
626
627         * class.cs (TypeContainer.IndexerArrayList): New inner class
628         container for indexers.
629         (TypeContainer.DefaultIndexerName): New constant for default
630         indexer name. Replaced all "Item" with this constant.
631         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
632
633         * typemanager.cs (TypeManager.default_member_ctor): Cache here
634         DefaultMemberAttribute constructor.
635
636 2004-08-05  Martin Baulig  <martin@ximian.com>
637
638         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
639         Fix bug #59429.
640
641 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
642
643         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
644         multi platforms problem.
645
646         * compiler.csproj: Included shared files.
647
648 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
649
650         Fix bug 60333, 55971 in the more general way
651         * attribute.cs (Attribute.GetAttributeArgumentExpression):
652         Added arg_type argument for constant conversion.
653         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
654
655 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
656
657         Fix bug #59760
658         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
659         OperatorArrayList, MethodCoreArrayList for typecontainer
660         containers. Changed class member types to these new types.
661         (MethodArrayList.DefineMembers): Added test for CS0659.
662
663 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
664
665         * cfold.cs: Synchronize the folding with the code in expression.cs
666         Binary.DoNumericPromotions for uint operands.
667
668         * attribute.cs: Revert patch from Raja, it introduced a regression
669         while building Blam-1.2.1 (hard to isolate a test case).
670
671 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
672
673         Fix for #55382
674         * class.cs:
675         (TypeContainer.Define): Renamed to DefineContainerMembers because of
676         name collision.
677         (MethodCore.parent_method): New member. The method we're overriding
678         if this is an override method.
679         (MethodCore.CheckBase): Moved from Method class and made common.
680         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
681         private.
682         (MethodCore.CheckForDuplications): New abstract method. For custom
683         member duplication search in a container
684         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
685         method and its return type.
686         (Event.conflict_symbol): New member. Symbol with same name in the
687         parent class.
688
689         * decl.cs:
690         (MemberCache.FindMemberWithSameName): New method. The method
691         is looking for conflict with inherited symbols.
692
693 2004-08-04  Martin Baulig  <martin@ximian.com>
694
695         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
696
697         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
698
699 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
700
701         * report.cs (Message): New enum for better error, warning reference in
702         the code.
703         (MessageData): New inner abstract class. It generally handles printing of
704         error and warning messages.
705         Removed unused Error, Warning, Message methods.
706
707 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
708
709         Fix for cs0592-8.cs test
710         * attribute.cs
711         (Attributable.ValidAttributeTargets): Made public.
712         (Attribute.ExplicitTarget): New member for explicit target value.
713         (Attribute.CheckTargets): Now we translate explicit attribute
714         target to Target here.
715
716 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
717
718         * ecore.cs (MethodGroupExpr): new IsBase property.
719
720         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
721
722         * delegate.cs (DelegateCreation): store a MethodGroupExpr
723         rather than an instance expr.
724
725         (DelegateCreation.Emit): Use the method group rather than
726         the instance expression. Also, if you have base.Foo as the
727         method for a delegate, make sure to emit ldftn, not ldftnvirt.
728
729         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
730
731         (NewDelegate.DoResolve): Only check for the existance of Invoke
732         if the method is going to be needed. Use MethodGroupExpr.
733
734         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
735
736         * expression.cs: For pointer arith., make sure to use
737         the size of the type, not the size of the pointer to
738         the type.
739
740 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
741
742         Fix for #60722
743         * class.cs (Class): Added error CS0502 test.
744
745 2004-08-03  John Luke  <jluke@cfl.rr.com>
746             Raja R Harinath  <rharinath@novell.com>
747
748         Fix for #60997.
749         * attribute.cs (Attribute.complained_before): New flag.
750         (Attribute.ResolveType, Attribute.Resolve),
751         (Attribute.DefinePInvokeMethod): Set it.
752         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
753         
754 2004-08-03  Martin Baulig  <martin@ximian.com>
755
756         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
757         use a user-defined operator; we still need to do numeric
758         promotions in case one argument is a builtin type and the other
759         one has an implicit conversion to that type.  Fixes #62322.
760
761 2004-08-18  Martin Baulig  <martin@ximian.com>
762
763         * class.cs (Method.Define): Use the correct method name when
764         creating the MethodBuilder for a generic method.
765
766 2004-08-17  Martin Baulig  <martin@ximian.com>
767
768         * generic.cs (Constraints): Support type parameter constraints.
769
770 2004-08-16  Martin Baulig  <martin@ximian.com>
771
772         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
773         (Token.GENERIC_DIMENSION): New token; this is returned if we
774         encounter an unbound generic type in a typeof() expression.
775
776         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
777         this token is only generated while parsing a typeof() expression.
778         (typeof_expression): Removed the old unbound_type hack.
779
780         * generic.cs (TypeArguments.IsUnbound): New public property.
781
782         * decl.cs (MemberName): Added support for unbound types.
783
784 2004-08-14  Martin Baulig  <martin@ximian.com>
785
786         * typemanager.cs
787         (TypeManager.IsEqualGenericInstance): New static method.
788         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
789         just used to check accessibility, so follow the rules of 26.1.6.        
790
791         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
792         ConstructedType instead of a TypeExpression if we have type arguments.
793
794         * cs-parser.jay (typeof_expression): Support unbound generic types.
795
796         * ecore.cs (UnboundTypeExpression): New public class.
797
798 2004-08-12  Martin Baulig  <martin@ximian.com>
799
800         * typemanager.cs (TypeManager.IsNestedChildOf): Use
801         TypeManager.IsEqual() rather than `=='.
802
803         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
804         generic instances as well.
805
806 2004-08-12  Martin Baulig  <martin@ximian.com>
807
808         * expression.cs (Invocation.InferType): We can only infer method
809         type parameters.  Fixes #62647.
810
811 2004-08-11  Martin Baulig  <martin@ximian.com>
812
813         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
814         before resolving the base classes.
815
816 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
817
818         * Makefile: install .mdb file too.
819
820 2004-08-05  Martin Baulig  <martin@ximian.com>
821
822         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
823         initializer, the current type is just the TypeBuilder, not the
824         instantiated generic type.
825         (FieldExpr.IsFieldInitializer): New public property.
826
827 2004-08-04  Martin Baulig  <martin@ximian.com>
828
829         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
830
831         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
832
833 2004-08-03  Martin Baulig  <martin@ximian.com>
834
835         * class.cs (MethodData.Define): If we're an explicit
836         implementation, remove the generic arity from the type name.
837
838 2004-08-03  Martin Baulig  <martin@ximian.com>
839
840         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
841         use a user-defined operator; we still need to do numeric
842         promotions in case one argument is a builtin type and the other
843         one has an implicit conversion to that type.  Fixes #62322.
844
845 2004-08-02  Martin Baulig  <martin@ximian.com>
846
847         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
848         `TypeExpr[]' array.
849         (TypeContainer.GetClassBases): Return the unexpanded list of
850         interfaces; we expand them later.
851         (TypeContainer.DefineType): After creating the TypeBuilder, call
852         TypeManager.ExpandInterfaces() to get an expanded and resolved
853         list of interfaces.
854
855         * ecore.cs (TypeExpr.GetInterfaces): Removed
856
857         * generics.cs (Constraints.InterfaceConstraints): Remove.
858         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
859         register the interface constraints.
860
861         * typemanager.cs
862         (TypeManager.AddUserType): Removed the `ifaces' argument.
863         (TypeManager.AddTypeParameter): Likewise.
864         (TypeManager.AddUserInterface): Removed, was unused.
865         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
866         `TypeExpr[]' array for the interfaces.
867         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
868         has been defined, returns a list of the resolved interfaces types.
869         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
870         (TypeManager.GetExplicitInterfaces): Likewise.  
871
872 2004-08-02  Martin Baulig  <martin@ximian.com>
873
874         * expression.cs (Invocation.EmitCall): If we're invoking a method
875         on a type parameter, use the new `Constrained' prefix opcode.
876
877 2004-08-02  Martin Baulig  <martin@ximian.com>
878
879         * statement.cs (LocalInfo.Flags): Added `IsThis'.
880         (LocalInfo.IsThis): New public property.
881         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
882
883 2004-08-01  Martin Baulig  <martin@ximian.com>
884
885         * class.cs (TypeContainer.GetClassBases): Don't set the default
886         here since we may get called from GetPartialBases().
887         (TypeContainer.DefineType): If GetClassBases() didn't return a
888         parent, use the default one.
889
890 2004-07-30  Martin Baulig  <martin@ximian.com>
891
892         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
893
894         * class.cs (SourceMethod): New public class, derive from the
895         symbol writer's ISourceMethod.
896         (Method): Use the new symbol writer API.
897
898         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
899         as argument and use the new symbol writer.
900
901         * location.cs
902         (SourceFile): Implement the symbol writer's ISourceFile.
903         (Location.SymbolDocument): Removed.
904         (Location.SourceFile): New public property.
905
906         * symbolwriter.cs: Use the new symbol writer API.
907
908 2004-07-30  Raja R Harinath  <rharinath@novell.com>
909
910         * Makefile (install-local): Remove.  Functionality moved to
911         executable.make.
912
913 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
914
915         * Makefile: Install mcs.exe.config file together with mcs.exe.
916         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
917         correct runtime version.
918         
919 2004-07-25  Martin Baulig  <martin@ximian.com>
920
921         * class.cs
922         (TypeContainer.RegisterOrder): Removed, this was unused.
923         (TypeContainer, interface_order): Removed.
924         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
925         TypeContainer as argument since we can also be called with a
926         `PartialContainer' for a partial class/struct/interface.
927         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
928         of checking whether we're an `Interface' - we could be a
929         `PartialContainer'.
930         (PartialContainer.Register): Override; call
931         AddClass()/AddStruct()/AddInterface() on our parent.
932
933         * cs-parser.jay (interface_member_declaration): Add things to the
934         `current_container', not the `current_class'.
935
936         * rootcontext.cs (RegisterOrder): The overloaded version which
937         takes an `Interface' was unused, removed.
938
939         * typemanager.cs (TypeManager.LookupInterface): Return a
940         `TypeContainer', not an `Interface'.
941         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
942         contain a `PartialContainer' for an interface, so check it's
943         `Kind' to figure out what it is.
944
945 2004-07-25  Martin Baulig  <martin@ximian.com>
946
947         * class.cs (Class.DefaultTypeAttributes): New public constant.
948         (Struct.DefaultTypeAttributes): Likewise.
949         (Interface.DefaultTypeAttributes): Likewise.
950         (PartialContainer.TypeAttr): Override this and add the
951         DefaultTypeAttributes.
952
953 2004-07-25  Martin Baulig  <martin@ximian.com>
954
955         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
956         we can just use the `Parent' field instead.
957
958 2004-07-25  Martin Baulig  <martin@ximian.com>
959
960         * class.cs (TypeContainer.Emit): Renamed to EmitType().
961
962 2004-07-25  Martin Baulig  <martin@ximian.com>
963
964         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
965         our parts before defining any methods.
966         (TypeContainer.VerifyImplements): Make this virtual.
967         (ClassPart.VerifyImplements): Override and call VerifyImplements()
968         on our PartialContainer.
969
970 2004-07-25  Martin Baulig  <martin@ximian.com>
971
972         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
973
974         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
975         argument, we can just use the `Parent' field instead.
976
977         * class.cs
978         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
979         (MemberBase.DoDefine): Likewise.
980
981 2004-07-24  Martin Baulig  <martin@ximian.com>
982
983         * decl.cs (MemberCore.Parent): New public field.
984         (DeclSpace.Parent): Moved to MemberCore.
985
986         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
987         (MemberBase.ctor): Added TypeContainer argument, pass it to our
988         parent's .ctor.
989         (FieldBase, Field, Operator): Likewise.
990         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
991         (EventField, Event): Likewise.
992
993 2004-07-23  Martin Baulig  <martin@ximian.com>
994
995         * class.cs (PartialContainer): New public class.
996         (ClassPart): New public class.
997         (TypeContainer): Added support for partial classes.
998         (TypeContainer.GetClassBases): Splitted some of the functionality
999         out into GetNormalBases() and GetPartialBases().
1000
1001         * cs-tokenizer.cs (Token.PARTIAL): New token.
1002         (Tokenizer.consume_identifier): Added some hacks to recognize
1003         `partial', but only if it's immediately followed by `class',
1004         `struct' or `interface'.
1005
1006         * cs-parser.jay: Added support for partial clases.
1007
1008 2004-07-23  Martin Baulig  <martin@ximian.com>
1009
1010         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1011         a `DeclSpace' and also made it readonly.
1012         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1013         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1014         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1015
1016         * cs-parser.jay: Pass the `current_class', not the
1017         `current_container' (at the moment, this is still the same thing)
1018         to a new Method, Property, Event, Indexer or Constructor.
1019
1020 2004-07-23  Martin Baulig  <martin@ximian.com>
1021
1022         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1023         and removed the `current_interface' one.
1024         (struct_declaration, class_declaration, interface_declaration):
1025         Set `current_class' to the newly created class/struct/interface;
1026         set their `Bases' and call Register() before parsing their body.
1027
1028 2004-07-23  Martin Baulig  <martin@ximian.com>
1029
1030         * class.cs (Kind): New public enum.
1031         (TypeContainer): Made this class abstract.
1032         (TypeContainer.Kind): New public readonly field.
1033         (TypeContainer.CheckDef): New public method; moved here from
1034         cs-parser.jay.
1035         (TypeContainer.Register): New public abstract method.
1036         (TypeContainer.GetPendingImplementations): New public abstract
1037         method.
1038         (TypeContainer.GetClassBases): Removed the `is_class' and
1039         `is_iface' parameters.
1040         (TypeContainer.DefineNestedTypes): Formerly known as
1041         DoDefineType().
1042         (ClassOrStruct): Made this class abstract.
1043
1044         * tree.cs (RootTypes): New public type. 
1045
1046 2004-07-20  Martin Baulig  <martin@ximian.com>
1047
1048         * tree.cs (Tree.RecordNamespace): Removed.
1049         (Tree.Namespaces): Removed.
1050
1051         * rootcontext.cs (RootContext.IsNamespace): Removed.
1052
1053         * cs-parser.jay (namespace_declaration): Just create a new
1054         NamespaceEntry here.
1055
1056 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
1057
1058         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
1059         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
1060         entry to make sure it runs in the correct runtime version.
1061         
1062 2004-07-18  Martin Baulig  <martin@ximian.com>
1063
1064         * generic.cs (ConstructedType.CheckConstraints): Improved
1065         constraints checking.
1066
1067 2004-07-18  Martin Baulig  <martin@ximian.com>
1068
1069         * expression.cs (Invocation.BetterMethod): Call
1070         TypeManager.TypeToCoreType() on all types and removed my previous
1071         hack; we're already doig the right thing here.
1072
1073 2004-07-17  Martin Baulig  <martin@ximian.com>
1074
1075         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
1076
1077 2004-07-16  Martin Baulig  <martin@ximian.com>
1078
1079         * iterators.cs: Added generics support.
1080
1081 2004-07-16  Martin Baulig  <martin@ximian.com>
1082
1083         * iterators.cs: Rewrote this.  We're now using one single Proxy
1084         class for both the IEnumerable and the IEnumerator interface and
1085         `Iterator' derives from Class so we can use the high-level API.
1086
1087         * class.cs (TypeContainer.AddIterator): New method.
1088         (TypeContainer.DoDefineType): New protected virtual method, which
1089         is called from DefineType().
1090         (TypeContainer.DoDefineMembers): Call DefineType() and
1091         DefineMembers() on all our iterators.
1092         (TypeContainer.Emit): Call Emit() on all our iterators.
1093         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1094
1095         * codegen.cs (EmitContext.CurrentIterator): New public field.
1096
1097 2004-07-15  Martin Baulig  <martin@ximian.com>
1098
1099         * typemanager.cs
1100         (TypeManager.not_supported_exception_type): New type.   
1101
1102 2004-07-14  Martin Baulig  <martin@ximian.com>
1103
1104         * typemanager.cs
1105         (TypeManager.generic_ienumerable_type): New type.
1106         (TypeManager.generic_ienumerator_type): New type.
1107
1108         * rootcontext.cs
1109         (RootContext.interfaces_first_stage): Added
1110         "System.Collections.Generic.IEnumerator`1" and
1111         "System.Collections.Generic.IEnumerable`1".     
1112
1113 2004-07-14  Martin Baulig  <martin@ximian.com>
1114
1115         * iterators.cs: Use real error numbers.
1116
1117 2004-07-14  Martin Baulig  <martin@ximian.com>
1118
1119         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1120         requires this to be a System.Collection.IEnumerable and not a
1121         class implementing that interface.
1122         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1123
1124 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1125
1126         * class.cs: Fixed previous fix, it broke some error tests.
1127
1128 2004-07-12  Martin Baulig  <martin@ximian.com>
1129
1130         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1131         Fixes #61293.
1132
1133 2004-07-14  Martin Baulig  <martin@ximian.com>
1134
1135         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
1136         an exclamation mark (!) for the generic arity to reflect the
1137         latest spec changes; ie. use "System.Collections.Generic.IList`1".
1138
1139 2004-07-13  Martin Baulig  <martin@ximian.com>
1140
1141         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
1142         specifiers being part of a type argument.
1143
1144 2004-07-13  Martin Baulig  <martin@ximian.com>
1145
1146         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
1147         name for generic types.
1148
1149 2004-07-13  Martin Baulig  <martin@ximian.com>
1150
1151         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
1152         bit to fix #60119.
1153
1154 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1155
1156         * assign.cs (LocalTemporary): Add new argument: is_address,If
1157         `is_address' is true, then the value that we store is the address
1158         to the real value, and not the value itself.
1159         
1160         * ecore.cs (PropertyExpr): use the new local temporary
1161         stuff to allow us to handle X.Y += z (where X is a struct)
1162
1163 2004-07-08  Martin Baulig  <martin@ximian.com>
1164
1165         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1166         not always return, just like we're doing in Using.Resolve().
1167
1168 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1169
1170         * cs-parser.jay (fixed_statement): flag this as Pinned.
1171
1172 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1173
1174         * typemanager.cs (TypeManager): Removed MakePinned method, this
1175         mechanism is replaced with the .NET 2.x compatible mechanism of
1176         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1177
1178         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1179         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1180         `IsFixed' property which has a different meaning.
1181
1182 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1183
1184         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1185         visible from inside a nested class, not just the names of the
1186         immediately enclosing class.
1187         Fix for bug #60730.
1188
1189 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1190
1191         * expression.cs (BetterConversion): Remove buggy special-case
1192         handling of "implicit constant expression conversions".  At this
1193         point, we already know that the conversion is possible -- we're
1194         only checking to see which is better.
1195
1196 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1197
1198         * cs-parser.jay: Added error CS0210 test.
1199
1200 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1201
1202         * cs-parser.jay: Added error CS0134 test.
1203
1204 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1205
1206         Fix bug #52507
1207         * cs-parser.jay: Added error CS0145 test.
1208
1209 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1210
1211         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1212
1213 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1214         
1215         * expression.cs (StackAlloc.Resolve): The argument may not
1216         be a constant; deal with this case.
1217         
1218 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1219
1220         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1221         GetIndexerAttributeValue.
1222         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1223
1224         * class.cs (Indexer.Define): Added error tests for CS0415,
1225         CS0609.
1226
1227 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1228
1229         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1230         property code.
1231
1232 2004-06-23  Martin Baulig  <martin@ximian.com>
1233
1234         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1235         neither return nor throw, reset the barrier as well.  Fixes #60457.
1236
1237 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1238
1239         * class.cs : EventAttributes is now set to None by default.
1240           This fixes bug #60459.
1241
1242 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1243
1244         Fix bug #60219
1245         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1246         Don't throw exception but return null (it's sufficient now).
1247
1248 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1249
1250         * typemanager.cs (GetArgumentTypes): Faster implementation.
1251
1252 2004-06-18  Martin Baulig  <martin@ximian.com>
1253
1254         * attribute.cs (Attribute.Resolve): Check whether we're an
1255         EmptyCast which a Constant child.  Fixes #60333.
1256
1257 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1258
1259         * statement.cs (EmitCollectionForeach): Account for the fact that
1260         not all valuetypes are in areas which we can take the address of.
1261         For these variables, we store to a temporary variable. Also, make
1262         sure that we dont emit a `callvirt' on a valuetype method.
1263
1264 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1265
1266         * expression.cs (StackAlloc.DoReSolve): Added test for
1267         negative parameter (CS0247).
1268
1269 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1270
1271         Fix bug #59792
1272         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1273
1274 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1275
1276         Fix bug #59781
1277         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1278         ulong.
1279
1280 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1281
1282         Fix bug #58254 & cs1555.cs, cs1556.cs
1283         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1284
1285 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1286
1287         * cs-parser.jay: Added error CS1669 test for indexers.
1288
1289 2004-06-18  Martin Baulig  <martin@ximian.com>
1290
1291         * generics.cs (GenericMethod.ctor): Don't take an Attributes
1292         argument.  Fixes #60441.
1293
1294 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
1295         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
1296         The name needs to have the actual name of the method in order
1297         for other tests (such as the one in OverloadResolve for Invoke
1298         on a delegate) to work. As well, it does not really help
1299         error reporting because the method group had multiple methods.
1300         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
1301         Make profiling work.
1302         
1303 2004-06-13  Martin Baulig  <martin@ximian.com>
1304
1305         * cs-parser.jay: Don't allow generic attributes.
1306
1307 2004-06-13  Martin Baulig  <martin@ximian.com>
1308
1309         * class.cs (MemberBase.DoDefineBase): New protected method.
1310         (MemberBase.DoDefine): Compute the `flags' in the new
1311         DoDefineBase() which must be called first.
1312         (Method.Define): Call DoDefineBase() first so we have the flags
1313         when defining the generic method.
1314
1315         * cs-parser.jay (interface_method_declaration): Support generic methods.
1316
1317 2004-06-13  Martin Baulig  <martin@ximian.com>
1318
1319         * decl.cs (TypeName): Removed.
1320         (MemberName): Removed TypeName and MemberNow; now we just have
1321         MemberName.
1322
1323         * cs-parser.jay: Don't distinguish between type arguments and type
1324         parameters in the grammar and simplified the rules a bit.  The
1325         reduce/reduce conflicts are now gone (except the one we inherited
1326         from mcs).
1327
1328 2004-06-11  Martin Baulig  <martin@ximian.com>
1329
1330         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1331         call this twice: for params and varargs methods.
1332
1333 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1334
1335         * class.cs:
1336         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1337
1338 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1339
1340         * attribute.cs (Attribute.GetValidTargets): Made public.
1341
1342         * class.cs: 
1343         (AbstractPropertyEventMethod): New class for better code sharing.
1344         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1345         CS1667 report.
1346         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1347
1348 2004-06-09  Martin Baulig  <martin@ximian.com>
1349
1350         * cs-parser.jay: Removed a reduce/reduce conflict.
1351
1352 2004-06-03  Martin Baulig  <martin@ximian.com>
1353
1354         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
1355         GetSimpleName() and return a SimpleName.
1356
1357         * ecore.cs (SimpleName.Arguments): New public field.
1358         (SimpleName): Added overloaded ctor which takes an additional
1359         TypeArguments argument.
1360         (SimpleName.SimpleNameResolve): Added support for generic methods.
1361         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
1362         formerly in MemberAccess.DoResolve(), but we also need it in
1363         SimpleNameResolve().
1364
1365         * expression.cs (MemberAccess.DoResolve): Use the new
1366         MethodGroupExpr.ResolveGeneric().       
1367
1368 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1369
1370         * decl.cs: If possible, use lookuptypedirect here. We can only do
1371         this if there is no `.' after the namespace. Avoids using
1372         LookupType, which does lots of slow processing.
1373         (FindNestedType) New method, does what it says :-).
1374         * namespace.cs: use LookupTypeDirect.
1375         * rootcontext.cs: use membercache, if possible.
1376         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1377
1378 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1379
1380         * expression.cs:
1381         According to the spec, 
1382
1383         In a member access of the form E.I, if E is a single identifier,
1384         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1385         field, property, localvariable, or parameter with the same type as
1386         the meaning of E as a type-name (§3.8), then both possible
1387         meanings of E are permitted.
1388
1389         We did not check that E as a simple-name had the same type as E as
1390         a type name.
1391
1392         This trivial check gives us 5-7% on bootstrap time.
1393
1394 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1395
1396         * expression.cs (Invocation.OverloadResolve): Avoid the
1397         use of hashtables and boxing here by allocating on demand.
1398
1399 2004-05-30  Martin Baulig  <martin@ximian.com>
1400
1401         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1402         we're doing a silent lookup.  Don't try to lookup nested types in
1403         TypeManager.object_type (thanks to Ben Maurer).
1404
1405 2004-05-30  Martin Baulig  <martin@ximian.com>
1406
1407         Committing a patch from Ben Maurer.
1408
1409         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1410
1411 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1412
1413         * convert.cs: add a trivial cache for overload operator resolution.
1414
1415 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
1416
1417         * attribute.cs
1418         (AttributeTester.GetObsoleteAttribute): Returns instance of
1419         ObsoleteAttribute when type is obsolete.
1420
1421         * class.cs
1422         (TypeContainer.VerifyObsoleteAttribute): Override.
1423         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1424         (MethodCode.VerifyObsoleteAttribute): Override.
1425         (MemberBase.VerifyObsoleteAttribute): Override.
1426
1427         * decl.cs
1428         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1429         and report proper error.
1430
1431         *delegate.cs
1432         (Delegate.VerifyObsoleteAttribute): Override.
1433
1434         * ecore.cs
1435         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1436         and report proper error.
1437         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1438
1439         * enum.cs
1440         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1441         and enum member.
1442
1443         * expression.cs
1444         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1445         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1446         Added test for ObsoleteAttribute.
1447
1448         * statement.cs
1449         (Catch): Derived from Statement.
1450
1451 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1452
1453         * decl.cs: If possible, use lookuptypedirect here. We can only do
1454         this if there is no `.' after the namespace. Avoids using
1455         LookupType, which does lots of slow processing.
1456         (FindNestedType) New method, does what it says :-).
1457         * namespace.cs: use LookupTypeDirect.
1458         * rootcontext.cs: use membercache, if possible.
1459         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1460
1461 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1462
1463         * expression.cs:
1464         According to the spec, 
1465
1466         In a member access of the form E.I, if E is a single identifier,
1467         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1468         field, property, localvariable, or parameter with the same type as
1469         the meaning of E as a type-name (§3.8), then both possible
1470         meanings of E are permitted.
1471
1472         We did not check that E as a simple-name had the same type as E as
1473         a type name.
1474
1475         This trivial check gives us 5-7% on bootstrap time.
1476
1477 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1478
1479         Fixed bug #59071 & cs0160.cs
1480         * statement.cs (Try.Resolve): Check here whether order of catch
1481         clauses matches their dependencies.
1482
1483 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1484
1485         Fixed bug #58624
1486         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
1487         unsafe type.
1488
1489 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1490
1491         * expression.cs (Invocation.OverloadResolve): Avoid the
1492         use of hashtables and boxing here by allocating on demand.
1493
1494 2004-05-30  Martin Baulig  <martin@ximian.com>
1495
1496         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1497         we're doing a silent lookup.  Don't try to lookup nested types in
1498         TypeManager.object_type (thanks to Ben Maurer).
1499
1500 2004-05-30  Martin Baulig  <martin@ximian.com>
1501
1502         Committing a patch from Ben Maurer.
1503
1504         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
1505
1506 2004-05-29  Martin Baulig  <martin@ximian.com>
1507
1508         * class.cs (IMethodData.ShouldIgnore): New method.
1509
1510         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1511         `Location' argument, we don't need it anywhere.  Use
1512         `IMethodData.ShouldIgnore ()' instead of
1513         `MethodData.GetMethodFlags ()'.
1514         (TypeManager.AddMethod): Removed.
1515         (TypeManager.AddMethod2): Renamed to AddMethod.
1516
1517 2004-05-29  Martin Baulig  <martin@ximian.com>
1518
1519         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1520
1521         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1522         converting from a class type S to an interface type and we already
1523         have an object on the stack, don't box it again.  Fixes #52578.
1524
1525 2004-05-29  Martin Baulig  <martin@ximian.com>
1526
1527         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1528         Added support for `params' parameters.  Fixes #59267.
1529
1530 2004-05-29  Martin Baulig  <martin@ximian.com>
1531
1532         * literal.cs (NullPointer): Provide a private .ctor which sets
1533         `type' to TypeManager.object_type.  Fixes #59048.
1534
1535 2004-05-29  Martin Baulig  <martin@ximian.com>
1536
1537         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1538         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1539
1540         * ecore.cs (EventExpr.instance_expr): Make the field private.
1541
1542 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1543
1544         Fixed bug #50080 & cs0214-2.cs
1545         * expression.cs (Cast.DoResolve): Check unsafe context here.
1546         
1547         * statement.cs (Resolve.DoResolve): Likewise.
1548
1549 2004-05-26  Martin Baulig  <martin@ximian.com>
1550
1551         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1552
1553         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1554         (RootContext.LookupType): Pass down the `silent' flag.
1555
1556 2004-05-25  Martin Baulig  <martin@ximian.com>
1557
1558         * expression.cs
1559         (MethodGroupExpr.IdenticalTypeName): New public property.
1560         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1561         expression actually refers to a type.
1562
1563 2004-05-25  Martin Baulig  <martin@ximian.com>
1564
1565         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1566         for #56176 and made it actually work.
1567
1568 2004-05-25  Martin Baulig  <martin@ximian.com>
1569
1570         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1571         (FieldExpr, PropertyExpr): Override and implement
1572         CacheTemporaries.  Fixes #52279.
1573
1574 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1575
1576         * location.cs: In the new compiler listing a file twice is a
1577         warning, not an error.
1578
1579 2004-05-24  Martin Baulig  <martin@ximian.com>
1580
1581         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1582         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1583
1584 2004-05-24  Martin Baulig  <martin@ximian.com>
1585
1586         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1587         walking the `using' list.  Fixes #53921.
1588
1589 2004-05-24  Martin Baulig  <martin@ximian.com>
1590
1591         * const.cs (Const.LookupConstantValue): Added support for
1592         EmptyCast's; fixes #55251.
1593
1594 2004-05-24  Martin Baulig  <martin@ximian.com>
1595
1596         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1597         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1598         which does the CS0135 check.  The reason is that we first need to
1599         check whether the variable actually exists.
1600
1601 2004-05-24  Martin Baulig  <martin@ximian.com>
1602
1603         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1604         than RootContext.LookupType() to find the explicit interface
1605         type.  Fixes #58584.
1606
1607 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1608
1609         * Makefile: Simplify.  Use executable.make.
1610         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1611
1612 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1613
1614         * decl.cs:
1615         * enum.cs:
1616         Use the invariant culture when doing String.Compare for CLS case
1617         sensitivity.
1618         
1619 2004-05-23  Martin Baulig  <martin@ximian.com>
1620
1621         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1622         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1623
1624         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1625
1626 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1627
1628         * class.cs (MemberBase.Define): Reuse MemberType member for 
1629         resolved type. Other methods can use it too.
1630
1631 2004-05-23  Martin Baulig  <martin@ximian.com>
1632
1633         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1634         the variable also exists in the current block (otherwise, we need
1635         to report a CS0103).  Fixes #58670.
1636
1637 2004-05-23  Martin Baulig  <martin@ximian.com>
1638
1639         * flowanalysis.cs (Reachability.Reachable): Compute this
1640         on-the-fly rather than storing it as a field.
1641
1642 2004-05-23  Martin Baulig  <martin@ximian.com>
1643
1644         * flowanalysis.cs (Reachability.And): Manually compute the
1645         resulting `barrier' from the reachability.      
1646        
1647 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1648
1649         Fix bug #57835
1650         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1651         instance of ObsoleteAttribute when symbol is obsolete.
1652
1653         * class.cs
1654         (IMethodData): Extended interface for ObsoleteAttribute support.
1655
1656 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1657
1658         * attribute.cs: Fix bug #55970
1659
1660 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1661
1662         Fix bug #52705
1663         * attribute.cs
1664         (GetObsoleteAttribute): New method. Creates the instance of
1665         ObsoleteAttribute.
1666         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1667         ObsoleteAttribute when member is obsolete.
1668         (AttributeTester.Report_ObsoleteMessage): Common method for
1669         Obsolete error/warning reporting.
1670
1671         * class.cs
1672         (TypeContainer.base_classs_type): New member for storing parent type.
1673
1674         * decl.cs
1675         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1676         for this MemberCore.
1677
1678 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1679
1680         * attribute.cs, const.cs: Fix bug #58590
1681
1682 2004-05-21  Martin Baulig  <martin@ximian.com>
1683
1684         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1685         out parameters if the end of the method is unreachable.  Fixes
1686         #58098. 
1687
1688 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1689
1690         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1691         Hari was right, why extra method.
1692
1693 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1694
1695         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1696
1697 2004-05-20  Martin Baulig  <martin@ximian.com>
1698
1699         * delegate.cs: Convert this file to Unix mode - like the original
1700         version in mcs is.
1701
1702 2004-05-20  Martin Baulig  <martin@ximian.com>
1703
1704         * attribute.cs: Convert this file to Unix mode - like the original
1705         version in mcs is.
1706
1707 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1708
1709        Fix bug #58688 (MCS does not report error when the same attribute
1710        is assigned twice)
1711
1712        * attribute.cs (Attribute.Emit): Distinction between null and default.
1713
1714 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1715
1716        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1717        of a top-level attribute without an attribute target.
1718        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1719        Make non-static.
1720        (Attribute.Conditional_GetConditionName), 
1721        (Attribute.Obsolete_GetObsoleteMessage): Update.
1722        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1723        part of ScanForIndexerName.
1724        (Attribute.CanIgnoreInvalidAttribute): New function.
1725        (Attribute.ScanForIndexerName): Move to ...
1726        (Attributes.ScanForIndexerName): ... here.
1727        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1728        (Attributes.Search): New internal variant that can choose not to
1729        complain if types aren't resolved.  The original signature now
1730        complains.
1731        (Attributes.GetClsCompliantAttribute): Use internal variant, with
1732        complaints suppressed.
1733        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1734        only if it not useful.
1735        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1736        top-level for attributes that are shared between the assembly
1737        and a top-level class.
1738        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1739        * class.cs: Update to reflect changes.
1740        (DefineIndexers): Fuse loops.
1741        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1742        a couple more variants of attribute names.
1743
1744 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1745
1746         Fix bug #52585 (Implemented explicit attribute declaration)
1747
1748         * attribute.cs:
1749         (Attributable.ValidAttributeTargets): New abstract method. It gets
1750         list of valid attribute targets for explicit target declaration.
1751         (Attribute.Target): It holds target itself.
1752         (AttributeSection): Removed.
1753         (Attribute.CheckTargets): New method. It checks whether attribute
1754         target is valid for the current element.
1755
1756         * class.cs:
1757         (EventProperty): New class. For events that are declared like
1758         property (with add and remove accessors).
1759         (EventField): New class. For events that are declared like field.
1760         class.cs
1761
1762         * cs-parser.jay: Implemented explicit attribute target declaration.
1763
1764         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1765         Override ValidAttributeTargets.
1766
1767         * parameter.cs:
1768         (ReturnParameter): Class for applying custom attributes on 
1769         the return type.
1770         (ParameterAtribute): New class. Class for applying custom
1771         attributes on the parameter type.
1772
1773 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1774
1775         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1776         definitions. 
1777
1778         (Method): Allow UNSAFE here.
1779
1780         * modifiers.cs: Support unsafe reporting.
1781
1782 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1783
1784         * decl.cs: Fix bug #58478.
1785
1786 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1787
1788         * statement.cs: When checking for unreachable code on an EmptyStatement,
1789         set the location. Fixes bug #58488.
1790
1791 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1792
1793         * driver.cs: Add -pkg handling.
1794
1795         From Gonzalo: UseShelLExecute=false
1796
1797 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1798
1799         * attribute.cs:
1800         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1801         for attribute.
1802         (Attribute.IsClsCompliaceRequired): Moved to base for better
1803         accesibility.
1804         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1805         when attribute is AttributeUsageAttribute.
1806         (Attribute.GetValidTargets): Simplified.
1807         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1808         attribute for this type.
1809         (Attribute.ApplyAttributes): Method renamed to Emit and make
1810         non-static.
1811         (GlobalAttributeSection): New class for special handling of global
1812         attributes (assembly, module).
1813         (AttributeSection.Emit): New method.
1814
1815         * class.cs: Implemented Attributable abstract methods.
1816         (MethodCore.LabelParameters): Moved to Parameter class.
1817         (Accessor): Is back simple class.
1818         (PropertyMethod): Implemented Attributable abstract class.
1819         (DelegateMethod): Implemented Attributable abstract class.
1820         (Event): New constructor for disctintion between normal Event
1821         and Event with accessors.
1822
1823         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1824
1825         * codegen.cs, const.cs, decl.cs, delegate.cs:
1826         (CommonAssemblyModulClass): Implemented Attributable abstract class
1827         and simplified.
1828
1829         * enum.cs: Implement IAttributeSupport interface.
1830         (EnumMember): New class for emum members. Implemented Attributable
1831         abstract class
1832
1833         * parameter.cs:
1834         (ParameterBase): Is abstract.
1835         (ReturnParameter): New class for easier [return:] attribute handling.
1836
1837         * typemanager.cs: Removed builder_to_attr.
1838
1839 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1840
1841         Fix bug #57151.
1842         * attribute.cs (Attribute.GetPositionalValue): New function.
1843         * class.cs (TypeContainer.VerifyMembers): New function.
1844         (TypeContainer.Emit): Use it.
1845         (ClassOrStruct): New base class for Class and Struct.
1846         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1847         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1848         class.
1849         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1850         then each non-static field should have a FieldOffset attribute.
1851         Otherwise, none of the fields should have a FieldOffset attribute.
1852         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1853         and FieldOffset attributes.
1854         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1855         (TypeManager.field_offset_attribute_type): New core types.
1856         (TypeManager.InitCoreTypes): Initialize them.
1857
1858 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1859
1860         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1861         Return correct type.
1862         From bug #58270.
1863
1864 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1865
1866         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1867         be implicitly converted to ulong.
1868         
1869         * expression.cs: The logic for allowing operator &, | and ^ worked
1870         was wrong, it worked before because we did not report an error in
1871         an else branch.  Fixes 57895.
1872
1873         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1874         allow volatile fields to be reference types.
1875
1876 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1877
1878         * driver.cs: Add support for /debug-
1879
1880 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1881
1882         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1883         Add a 'complain' parameter to silence errors.
1884         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1885         silently overlooked type-resolutions.
1886         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1887         to reflect changes.
1888         (Attributes.Search): New function.
1889         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1890         (Attributes.GetAttributeFullName): Remove hack.
1891         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1892         Update to reflect changes.
1893         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1894         Use Attributes.Search instead of nested loops.
1895
1896 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1897
1898         * decl.cs:
1899         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1900         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1901         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1902
1903         * report.cs: (Report.Warning): Renamed to Warning_T because of
1904         parameter collision.
1905
1906 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1907
1908         * expression.cs (MemberAccess.ResolveMemberAccess):
1909         Exit with non-zero status after Report.Error.
1910         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1911         Likewise.
1912         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1913
1914 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1915
1916         * support.cs: Don't hang when the file is empty.
1917
1918 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1919
1920         * support.cs: In SeekableStreamReader, compute the preamble size of the
1921           underlying stream. Position changes should take into account that initial
1922           count of bytes.
1923
1924 2004-05-03  Todd Berman  <tberman@sevenl.net>
1925
1926         * driver.cs: remove unused GetSysVersion function.
1927
1928 2004-05-03  Todd Berman  <tberman@sevenl.net>
1929
1930         * driver.cs: Remove the hack from saturday, as well as the hack
1931         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1932         link_paths to get that bit proper.
1933
1934 2004-05-01  Todd Berman  <tberman@sevenl.net>
1935
1936         * driver.cs: Try a LoadFrom before a Load, this checks the current
1937         path. This is currently a bug in mono that is be fixed, however, this
1938         provides a workaround for now. This will be removed when the bug
1939         is fixed.
1940
1941 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1942
1943         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1944         incomplete key pairs (#57941).
1945
1946 2004-05-01  Todd Berman  <tberman@sevenl.net>
1947
1948         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1949         from the GAC
1950
1951 2004-04-30  Jackson Harper  <jackson@ximian.com>
1952
1953         * codegen.cs: Open keys readonly.
1954         
1955 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1956
1957         * typemanager.cs: don't report cyclic struct layout when a struct
1958         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1959         which has 2 Pango.Rectangle fields.
1960
1961 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1962
1963         * expression.cs: Handle IntPtr comparisons with IL code
1964         rather than a method call.
1965
1966 2004-04-29  Martin Baulig  <martin@ximian.com>
1967
1968         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1969         the list of PropertyInfo's in class hierarchy and find the
1970         accessor.  Fixes #56013.
1971
1972 2004-04-29  Martin Baulig  <martin@ximian.com>
1973
1974         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
1975
1976 2004-04-29  Martin Baulig  <martin@ximian.com>
1977
1978         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1979
1980         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
1981
1982 2004-04-29  Martin Baulig  <martin@ximian.com>
1983
1984         * class.cs (ConstructorInitializer.Resolve): Check whether the
1985         parent .ctor is accessible.  Fixes #52146.
1986
1987 2004-04-29  Martin Baulig  <martin@ximian.com>
1988
1989         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
1990
1991         * statement.cs (Using.EmitLocalVariableDecls): Use
1992         TypeManager.idisposable_type, not typeof (IDisposable).
1993         (Foreach.EmitCollectionForeach): Added support for valuetypes.
1994
1995 2004-04-29  Martin Baulig  <martin@ximian.com>
1996
1997         * class.cs (Event.Define): Don't emit the field and don't set
1998         RTSpecialName and SpecialName for events on interfaces.  Fixes
1999         #57703. 
2000
2001 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2002
2003         Refactor Attribute.ApplyAttributes.
2004         * attribute.cs (Attributable): New base class for objects that can
2005         have Attributes applied on them.
2006         (Attribute): Make AttributeUsage fields public.
2007         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2008         (Attribute.IsInternalCall): New property.
2009         (Attribute.UsageAttr): Convert to a public read-only property.
2010         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2011         (Attribute.ResolveType, Attribute.Resolve)
2012         (Attribute.ScanForIndexerName): Update to reflect changes.
2013         (Attribute.CheckAttributeTarget): Re-format.
2014         (Attribute.ApplyAttributes): Refactor, to various
2015         Attributable.ApplyAttributeBuilder methods.
2016         * decl.cs (MemberCore): Make Attributable.
2017         * class.cs (Accessor): Make Attributable.
2018         (MethodData.ApplyAttributes): Use proper attribute types, not
2019         attribute names.
2020         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2021         (TypeContainer.ApplyAttributeBuilder)
2022         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2023         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2024         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2025         (Operator.ApplyAttributeBuilder): New factored-out methods.
2026         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2027         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2028         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2029         * parameter.cs (ParameterBase): New Attributable base class
2030         that can also represent Return types.
2031         (Parameter): Update to the changes.
2032
2033 2004-04-29  Jackson Harper  <jackson@ximian.com>
2034
2035         * driver.cs: Prefer the corlib system version when looking for
2036         assemblies in the GAC. This is still a hack, but its a better hack
2037         now.
2038         
2039 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2040
2041         * decl.cs, enum.cs: Improved error 3005 reporting.
2042   
2043         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2044         (related_symbols): New private member for list of symbols
2045         related to reported error/warning.
2046         
2047         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2048
2049 2004-04-29  Martin Baulig  <martin@ximian.com>
2050
2051         * ecore.cs (Expression.Constantify): If we're an enum and
2052         TypeManager.TypeToCoreType() doesn't give us another type, use
2053         t.UnderlyingSystemType.  Fixes #56178.  
2054
2055 2004-04-29  Martin Baulig  <martin@ximian.com>
2056
2057         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2058         interfaces and for each interface, only add members directly
2059         declared in that interface.  Fixes #53255.
2060
2061 2004-04-28  Martin Baulig  <martin@ximian.com>
2062
2063         * expression.cs (ConditionalLogicalOperator): Use a temporary
2064         variable for `left' to avoid that we evaluate it more than once;
2065         bug #52588.
2066
2067 2004-04-28  Martin Baulig  <martin@ximian.com>
2068
2069         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2070         `void[]' (CS1547).
2071
2072 2004-04-28  Martin Baulig  <martin@ximian.com>
2073
2074         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2075         void (CS1547).
2076
2077         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2078         whether the type is not void (CS1547).
2079
2080 2004-04-28  Martin Baulig  <martin@ximian.com>
2081
2082         * expression.cs (Unary.DoResolveLValue): Override this and report
2083         CS0131 for anything but Operator.Indirection.
2084
2085 2004-04-28  Martin Baulig  <martin@ximian.com>
2086
2087         Committing a patch from Ben Maurer; see bug #50820.
2088
2089         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2090         check for classes.
2091
2092         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2093         classes.        
2094
2095 2004-04-28  Martin Baulig  <martin@ximian.com>
2096
2097         Committing a patch from Ben Maurer; see bug #50820.
2098
2099         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2100         check for classes.
2101
2102         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2103         classes.        
2104
2105 2004-04-28  Martin Baulig  <martin@ximian.com>
2106
2107         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2108         (Block.AddLabel): Call DoLookupLabel() to only search in the
2109         current block.
2110
2111 2004-04-28  Martin Baulig  <martin@ximian.com>
2112
2113         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2114         comparing StringConstants and NullLiterals in Equality and Inequality.
2115
2116 2004-04-28  Jackson Harper  <jackson@ximian.com>
2117
2118         * driver.cs: Attempt to load referenced assemblies from the
2119         GAC. This is the quick and dirty version of this method that
2120         doesnt take into account versions and just takes the first
2121         canidate found. Will be good enough for now as we will not have more
2122         then one version installed into the GAC until I update this method.
2123
2124 2004-04-28  Martin Baulig  <martin@ximian.com>
2125
2126         * typemanager.cs (TypeManager.CheckStructCycles): New public
2127         static method to check for cycles in the struct layout.
2128
2129         * rootcontext.cs (RootContext.PopulateTypes): Call
2130         TypeManager.CheckStructCycles() for each TypeContainer.
2131         [Note: We only need to visit each type once.]
2132
2133 2004-04-28  Martin Baulig  <martin@ximian.com>
2134
2135         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2136
2137         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2138         success and added `out object value'.  Use a `bool resolved' field
2139         to check whether we've already been called rather than
2140         `ConstantValue != null' since this breaks for NullLiterals.
2141
2142 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2143
2144         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2145         setting of this flag, since the 'set' method may be non-public.
2146
2147 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2148
2149         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2150         check on current_vector.Block.
2151
2152 2004-04-27  Martin Baulig  <martin@ximian.com>
2153
2154         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2155         a field initializer.  Fixes #56459.
2156
2157 2004-04-27  Martin Baulig  <martin@ximian.com>
2158
2159         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2160         we're not attempting to use an indexer.  Fixes #52154.
2161
2162 2004-04-27  Martin Baulig  <martin@ximian.com>
2163
2164         * statement.cs (Return): Don't create a return label if we don't
2165         need it; reverts my change from January 20th.  Thanks to Ben
2166         Maurer for this.
2167
2168 2004-04-27  Martin Baulig  <martin@ximian.com>
2169
2170         According to the spec, `goto' can only leave a nested scope, but
2171         never enter it.
2172
2173         * statement.cs (Block.LookupLabel): Only lookup in the current
2174         block, don't recurse into parent or child blocks.
2175         (Block.AddLabel): Check in parent and child blocks, report
2176         CS0140/CS0158 if we find a duplicate.
2177         (Block): Removed this indexer for label lookups.
2178         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2179         this already does the error reporting for us.
2180
2181         * flowanalysis.cs
2182         (FlowBranching.UsageVector.Block): New public variable; may be null.
2183         (FlowBranching.CreateSibling): Added `Block' argument.
2184         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2185         label for the target of a `goto' and check whether we're not
2186         leaving a `finally'.
2187
2188 2004-04-27  Martin Baulig  <martin@ximian.com>
2189
2190         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2191         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2192         just for returns).
2193
2194 2004-04-27  Martin Baulig  <martin@ximian.com>
2195
2196         * statement.cs (Block.AddLabel): Also check for implicit blocks
2197         and added a CS0158 check.
2198
2199 2004-04-27  Martin Baulig  <martin@ximian.com>
2200
2201         * flowanalysis.cs (FlowBranchingLoop): New class.
2202         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2203         UsageVector's instead of an ArrayList.
2204         (FlowBranching.Label): Likewise.
2205         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2206         (FlowBranching.AddBreakVector): New method.
2207
2208 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2209
2210         * attribute.cs: Small regression fix: only convert the type if we
2211         the type is different, fixes System.Drawing build.
2212
2213 2004-04-27  Martin Baulig  <martin@ximian.com>
2214
2215         * attribute.cs (Attribute.Resolve): If we have a constant value
2216         for a named field or property, implicity convert it to the correct
2217         type.
2218
2219 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2220
2221         * statement.cs (Block.Block): Implicit blocks share
2222         'child_variable_names' fields with parent blocks.
2223         (Block.AddChildVariableNames): Remove.
2224         (Block.AddVariable): Mark variable as "used by a child block" in
2225         every surrounding block.
2226         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2227         been used in a child block, complain about violation of "Invariant
2228         meaning in blocks" rule.
2229         * cs-parser.jay (declare_local_variables): Don't use
2230         AddChildVariableNames.
2231         (foreach_statement): Don't create an implicit block: 'foreach'
2232         introduces a scope.
2233
2234 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2235
2236         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2237         converting from 0L to ulong.  Fixes 57522.
2238
2239 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2240
2241         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2242         derived class hides via 'new' keyword field from base class (test-242.cs).
2243         TODO: Handle this in the more general way.
2244         
2245         * class.cs (CheckBase): Ditto.
2246
2247 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2248
2249         * decl.cs (caching_flags): New member for storing cached values
2250         as bit flags.
2251         (MemberCore.Flags): New enum where bit flags for caching_flags
2252         are defined.
2253         (MemberCore.cls_compliance): Moved to caching_flags.
2254         (DeclSpace.Created): Moved to caching_flags.
2255
2256         * class.cs: Use caching_flags instead of DeclSpace.Created
2257         
2258 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2259
2260         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2261         if we are only a derived class, not a nested class.
2262
2263         * typemanager.cs: Same as above, but do this at the MemberLookup
2264         level (used by field and methods, properties are handled in
2265         PropertyExpr).   Allow for the qualified access if we are a nested
2266         method. 
2267
2268 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2269
2270         * class.cs: Refactoring.
2271         (IMethodData): New inteface; Holds links to parent members
2272         to avoid member duplication (reduced memory allocation).
2273         (Method): Implemented IMethodData interface.
2274         (PropertyBase): New inner classes for get/set methods.
2275         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2276         (Event): New inner classes for add/remove methods.
2277         (Event.DelegateMethod): Implemented IMethodData interface.
2278
2279         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2280         EmitContext (related to class.cs refactoring).
2281
2282 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2283
2284         * delegate.cs (Delegate.VerifyApplicability): If the number of
2285         arguments are the same as the number of parameters, first try to
2286         verify applicability ignoring  any 'params' modifier on the last
2287         parameter.
2288         Fixes #56442.
2289
2290 2004-04-08  Martin Baulig  <martin@ximian.com>
2291
2292         Merged latest changes into gmcs.  Please keep this comment in
2293         here, it makes it easier for me to see what changed in MCS since
2294         the last time I merged.
2295
2296 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2297
2298         * class.cs (TypeContainer.AddIndexer): Use
2299         'ExplicitInterfaceName' to determine if interface name was
2300         explicitly specified.  'InterfaceType' is not initialized at this time.
2301         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2302         Indexers array is already in the required order.  Initialize
2303         'IndexerName' only if there are normal indexers.
2304         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2305         (TypeContainer.Emit): Emit DefaultMember attribute only if
2306         IndexerName is initialized.
2307         Fixes #56300.
2308
2309 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2310
2311         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2312         Fixes #57007
2313
2314 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2315
2316         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2317         attributes.
2318         Fix for #56456.
2319
2320         * attribute.cs (Attribute.Resolve): Check for duplicate named
2321         attributes.
2322         Fix for #56463.
2323
2324 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2325
2326         * iterators.cs (MarkYield): track whether we are in an exception,
2327         and generate code accordingly.  Use a temporary value to store the
2328         result for our state.
2329
2330         I had ignored a bit the interaction of try/catch with iterators
2331         since their behavior was not entirely obvious, but now it is
2332         possible to verify that our behavior is the same as MS .NET 2.0
2333
2334         Fixes 54814
2335
2336 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2337
2338         * iterators.cs: Avoid creating temporaries if there is no work to
2339         do. 
2340
2341         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2342         Enumerations, use TypeManager.EnumToUnderlying and call
2343         recursively. 
2344
2345         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2346         bug #57013
2347
2348         (This.Emit): Use EmitContext.EmitThis to emit our
2349         instance variable.
2350
2351         (This.EmitAssign): Ditto.
2352
2353         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2354         codepaths, we will move all the functionality into
2355         Mono.CSharp.This 
2356
2357         (FieldExpr.EmitAssign): Ditto.
2358
2359         This fixes several hidden bugs that I uncovered while doing a code
2360         review of this today.
2361
2362         * codegen.cs (EmitThis): reworked so the semantics are more clear
2363         and also support value types "this" instances.
2364
2365         * iterators.cs: Changed so that for iterators in value types, we
2366         do not pass the value type as a parameter.  
2367
2368         Initialization of the enumerator helpers is now done in the caller
2369         instead of passing the parameters to the constructors and having
2370         the constructor set the fields.
2371
2372         The fields have now `assembly' visibility instead of private.
2373
2374 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2375
2376         * expression.cs (Argument.Resolve): Check if fields passed as ref
2377         or out are contained in a MarshalByRefObject.
2378
2379         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2380         another compiler type.
2381
2382 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2383
2384         * class.cs (Indexer.Define): use the new name checking method.
2385         Also, return false on an error.
2386         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2387         (is_identifier_[start/part]_character): make static.
2388
2389 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2390
2391         * expression.cs (Binary.ResolveOperator): Do no append strings
2392         twice: since we can be invoked more than once (array evaluation)
2393         on the same concatenation, take care of this here.  Based on a fix
2394         from Ben (bug #56454)
2395
2396 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2397
2398         * codegen.cs: Fix another case where CS1548 must be reported (when 
2399         delay-sign isn't specified and no private is available #56564). Fix
2400         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2401         error when MCS is used on the MS runtime and we need to delay-sign 
2402         (which seems unsupported by AssemblyBuilder - see #56621).
2403
2404 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2405
2406         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2407         (TypeManager.ComputeNamespaces): Faster implementation for
2408         Microsoft runtime.
2409
2410         * compiler.csproj: Updated AssemblyName to mcs.
2411
2412 2004-05-11  Jackson Harper  <jackson@ximian.com>
2413
2414         * Makefile: Preserve MONO_PATH
2415         
2416 2004-05-11  Jackson Harper  <jackson@ximian.com>
2417
2418         * Makefile: Use mono and mcs to build gmcs
2419         
2420 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
2421
2422         * codegen.cs: Add patch from Robert Shade
2423         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
2424         sync with mcs.
2425
2426 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
2427
2428         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2429         incomplete key pairs (#57941).
2430
2431 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2432
2433         * codegen.cs: Fix another case where CS1548 must be reported (when 
2434         delay-sign isn't specified and no private is available #56564). Fix
2435         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2436         error when MCS is used on the MS runtime and we need to delay-sign 
2437         (which seems unsupported by AssemblyBuilder - see #56621).
2438
2439 2004-04-29  Jackson Harper  <jackson@ximian.com>
2440
2441         * Makefile: Set MONO_PATH to use the bootstrap corlib
2442         * driver.cs: Check the GAC for referenced assemblies.
2443                 
2444 2004-04-29  Martin Baulig  <martin@ximian.com>
2445
2446         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
2447
2448 2004-04-07  Martin Baulig  <martin@ximian.com>
2449
2450         * expression.cs (Binary.ResolveOperator): Added special case for
2451         Equality/Inequality between a type parameter and a null literal.
2452
2453 2004-04-07  Martin Baulig  <martin@ximian.com>
2454
2455         * convert.cs: Check null literal -> type parameter conversions.
2456
2457 2004-04-07  Martin Baulig  <martin@ximian.com>
2458
2459         * generic.cs (ConstructedType.CheckConstraints): Enforce the
2460         `class' and `struct' constraints.
2461
2462 2004-04-07  Martin Baulig  <martin@ximian.com>
2463
2464         * generic.cs (SpecialConstraint): New public enum.
2465         (Constraints.Resolve): Added support for the `class' and `struct'
2466         constraints.
2467
2468         * cs-parser.jay (type_parameter_constraint): Added support for the
2469         `class' and `struct' constraints.
2470
2471 2004-04-07  Martin Baulig  <martin@ximian.com>
2472
2473         * support.cs (GenericConstraints): Replaced `Types' by
2474         `ClassConstraint' and `InterfaceConstraints'; added
2475         `HasClassConstraint'.   
2476
2477 2004-04-07  Martin Baulig  <martin@ximian.com>
2478
2479         * generic.cs
2480         (Constraints.InterfaceConstraints): New public property.
2481         (Constraints.Types): Make this property public
2482         (TypeParameter): Implement IMemberContainer.
2483         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
2484         instead of a TypeBuilder/MethodBuilder; pass the interface
2485         constraints to TypeManager.AddTypeParameter().
2486         (TypeParameter.DefineType): Just take an EmitContext and no
2487         TypeBuilder/MethodBuilder.  Use the new public API.
2488
2489         * typemanager.cs (TypeManager.AddTypeParameter): Added
2490         `TypeExpr[]' argument; add the interfaces to the
2491         `builder_to_ifaces' hash.
2492         (TypeManager.LookupMemberContainer): For
2493         GenericTypeParameterBuilders, get the TypeParameter from the
2494         `builder_to_type_param'.
2495         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
2496         the TypeParameter and call FindMembers on it.
2497
2498 2004-04-07  Martin Baulig  <martin@ximian.com>
2499
2500         * class.cs
2501         (MethodCore.GenericMethod): Moved this field here from Method.
2502         (MethodCore.IsDuplicateImplementation): Take the number of type
2503         parameters into account if we're a generic method.
2504
2505         * expression.cs (Invocation.InferTypeArguments): Don't return true
2506         if `arguments' is null; we still need to check whether we actually
2507         don't need to infer anything in this case.
2508         (MemberAccess): Merged the functionality from GenericMemberAccess
2509         into this class.
2510
2511         * generic.cs (GenericMemberAccess): Removed.
2512
2513 2004-04-05  Martin Baulig  <martin@ximian.com>
2514
2515         * decl.cs (MemberCore): For generic classes, interfaces and
2516         structs, `Name' now includes the number of type parameters
2517         ("Stack!1.Node!1").
2518         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
2519         encode the number of type arguments in the type name.
2520
2521         * expression.cs (Expression.MemberLookup): Removed the
2522         `num_type_args' argument; we now encode the number of type
2523         arguments in the type name.
2524
2525         * ecore.cs (SimpleName): Encode the number of type arguments in
2526         the type name itself.
2527
2528         * generic.cs (ConstructedType): Likewise.
2529
2530         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
2531         `MemberName'; we now include the number of type parameters in the
2532         type name.
2533
2534         * typemanager.cs (TypeManager.CheckGeneric): Removed.
2535         (TypeManager.MemberLookup): Removed the
2536         `num_type_args' argument; we now encode the number of type
2537         arguments in the type name.     
2538
2539 2004-04-03  Martin Baulig  <martin@ximian.com>
2540
2541         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
2542         (MemberCore.MemberName): Moved here from MemberBase.
2543         (DeclSpace.SetParameterInfo): Just take the constraints as an
2544         ArrayList; we already have the type parameters in our
2545         `MemberName'; also do the CS0080 reporting here.
2546
2547         * cs-parser.jay (struct_declaration): Use `member_name' instead of
2548         `IDENTIFIER opt_type_parameter_list'; when constructing our
2549         `MemberName', it'll already include our type parameters.
2550         (class_declaration, interface_declaration): Likewise.
2551         (delegate_declaration): Likewise.
2552         (MakeName): Take a MemberName and return a MemberName.
2553         The following two changes are required to avoid shift/reduce conflicts:
2554         (member_name): Don't include a TypeName anymore; ie. this is now
2555         just 'IDENTIFIER opt_type_parameter_list'.
2556         (property_declaration, event_declaration): Use a
2557         `namespace_or_type_name' instead of a `member_name'.            
2558
2559 2004-04-03  Martin Baulig  <martin@ximian.com>
2560
2561         * decl.cs (MemberName): Renamed to `TypeName' and created a new
2562         `MemberName' class.
2563         (TypeName): Formerly known as MemberName.
2564
2565         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
2566         instead of a `MemberName'.
2567
2568         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
2569         (member_name): New rule; create a MemberName.
2570
2571 2004-04-02  Martin Baulig  <martin@ximian.com>
2572
2573         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
2574         (CS0305 and CS0308).
2575
2576 2004-04-02  Martin Baulig  <martin@ximian.com>
2577
2578         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
2579         support for nested types.
2580
2581 2004-04-02  Martin Baulig  <martin@ximian.com>
2582
2583         * ecore.cs (IAlias): New public interface.
2584         (TypeExpr, TypeExpression): Implement IAlias.
2585         (TypeAliasExpression): New public class.
2586
2587         * namespace.cs (Namespace): Implement IAlias.
2588         (Namespace.Lookup): Return an IAlias instead on an object.
2589         (Namespace.DefineName): Take an IAlias instead of an object.
2590         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
2591         an object.
2592         (NamespaceEntry.UsingAlias): Take a Membername instead of an
2593         Expression.
2594         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
2595         object.
2596         (NamespaceEntry.Lookup): Likewise.
2597
2598         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
2599         instead of a Type.      
2600
2601         * decl.cs (DeclSpace): Implement IAlias.
2602         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
2603
2604         * generic.cs (ConstructedType): Improved error checking.
2605
2606 2004-04-02  Martin Baulig  <martin@ximian.com>
2607
2608         * convert.cs: Added type parameter conversions.
2609
2610         * ecore.cs
2611         (UnboxCast.Emit): Emit an `unbox.any' for type params.
2612         (ClassCast.Emit): If the source type is a type parameter, box it.
2613         If the target type is a type parameter, emit an `unbox.any'
2614         instead of a `classcast'.1      
2615
2616 2004-04-01  Martin Baulig  <martin@ximian.com>
2617
2618         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
2619
2620 2004-04-01  Martin Baulig  <martin@ximian.com>
2621
2622         * generic.cs (ConstructedType.CheckConstraints): Use
2623         Convert.ImplicitStandardConversionExists(); user-defined implicit
2624         conversions are not allowed according to the spec.
2625
2626 2004-03-30  Martin Baulig  <martin@ximian.com>
2627
2628         * expression.cs (New): Added support for type parameters.
2629
2630         * typemanager.cs
2631         (TypeManager.activator_type): New public static field.
2632         (TypeManager.activator_create_instance): Likewise.
2633
2634 2004-03-30  Martin Baulig  <martin@ximian.com>
2635
2636         * typemanager.cs (TypeManager.HasConstructorConstraint): New
2637         public method.
2638
2639 2004-03-30  Martin Baulig  <martin@ximian.com>
2640
2641         * generic.cs (ConstructedType.CheckConstraints): Actually follow
2642         the spec here: the argument type must be convertible to the
2643         constraints.
2644
2645 2004-03-30  Martin Baulig  <martin@ximian.com>
2646
2647         * generic.cs
2648         (TypeParameter.Define, TypeParameter.DefineMethod): Call
2649         TypeManager.AddTypeParameter().
2650         (ConstructedType.CheckConstraints): Re-enable this and actually
2651         check whether we have a constructor constraint.
2652
2653         * typemanager.cs
2654         (TypeManager.builder_to_type_param): New static field.
2655         (TypeManager.AddTypeParameter): New static method.
2656         (TypeManager.LookupTypeParameter): New public method.
2657
2658 2004-03-30  Martin Baulig  <martin@ximian.com>
2659
2660         * generic.cs (TypeParameter.DefineType): Return a boolean and use
2661         the new API to actually define the constructor constraint.
2662
2663         * typemanager.cs
2664         (TypeManager.new_constraint_attr_type): New static field.
2665         (TypeManager.InitCoreTypes): Initialize it.
2666
2667 2004-03-30  Martin Baulig  <martin@ximian.com>
2668
2669         * generic.cs (Constraints): Completed error checking, use correct
2670         error numbers.
2671
2672 2004-03-29  Martin Baulig  <martin@ximian.com>
2673
2674         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
2675
2676         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2677         public version which takes a `ParameterData pd' instead of an
2678         `ArrayList args'.
2679
2680 2004-03-29  Martin Baulig  <martin@ximian.com>
2681
2682         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
2683         not a MethodInfo.       
2684
2685 2004-03-29  Martin Baulig  <martin@ximian.com>
2686
2687         * expression.cs (Argument.ResolveMethodGroup): If we're a
2688         ConstructedType, call GetMemberAccess() on it.  
2689
2690 2004-03-29  Martin Baulig  <martin@ximian.com>
2691
2692         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
2693         (MethodCore.CheckGenericOverride): When overriding a generic
2694         method, check whether the constraints match.
2695
2696         * support.cs (GenericConstraints): New public interface.
2697         (ParameterData.GenericConstraints): New public method.
2698
2699         * parameter.cs (Parameter.Resolve): Check whether we're a generic
2700         method parameter and compute our constraints if appropriate.
2701         (Parameter.GenericConstraints): New public property.
2702
2703         * generic.cs (Constraints): Implement GenericConstraints.
2704
2705 2004-03-29  Martin Baulig  <martin@ximian.com>
2706
2707         * decl.cs (MemberCache.FindMemberToOverride): Use
2708         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
2709
2710 2004-03-29  Martin Baulig  <martin@ximian.com>
2711
2712         * generic.cs (GenericMethod.Define): Resolve our type parameters.
2713
2714 2004-03-29  Martin Baulig  <martin@ximian.com>
2715
2716         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
2717         not allowed on non-generic declarations").
2718
2719 2004-03-29  Martin Baulig  <martin@ximian.com>
2720
2721         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2722         public version of this method.
2723
2724         * class.cs (MethodCore.IsDuplicateImplementation): Use
2725         Invocation.InferTypeArguments() to check this.
2726
2727 2004-03-29  Martin Baulig  <martin@ximian.com>
2728
2729         * convert.cs: Use TypeManager.IsDelegateType() instead of
2730         comparing types correctly.
2731
2732 2004-03-29  Martin Baulig  <martin@ximian.com>
2733
2734         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
2735         types directly to make it work for generic instances.
2736
2737         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
2738
2739 2004-03-29  Martin Baulig  <martin@ximian.com>
2740
2741         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
2742         support for arrays.     
2743
2744 2004-03-24  Martin Baulig  <martin@ximian.com>
2745
2746         * decl.cs (DeclSpace.FindType): Also use
2747         TypeManager.CheckGeneric() for types from the using clauses.
2748
2749 2004-03-23  Martin Baulig  <martin@ximian.com>
2750
2751         * expression.cs (Invocation.OverloadResolve): Added `bool
2752         may_fail' argument and use it instead of the Location.IsNull() hack.
2753
2754 2004-03-23  Martin Baulig  <martin@ximian.com>
2755
2756         * expression.cs (Invocation.InferType): Use correct type inference
2757         rules here.     
2758
2759 2004-03-23  Martin Baulig  <martin@ximian.com>
2760
2761         * ecore.cs (MethodGroupExpr.Name): Use
2762         TypeManager.CSharpSignature() instead of just the name.
2763
2764         * expression.cs (Invocation.OverloadResolve): Provide better error
2765         reporting.
2766         (Invocation.DoResolve): OverloadResolve() never returns null
2767         without reporting an error, so removed the error -6 reporting here.
2768
2769 2004-03-23  Martin Baulig  <martin@ximian.com>
2770
2771         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
2772         generic methods.
2773
2774         * cs-parser.jay (delegate_declaration): Support generic delegates.
2775
2776         * delegate.cs: Support generic delegates.
2777
2778 2004-03-22  Martin Baulig  <martin@ximian.com>
2779
2780         * expression.cs (Invocation.InferParamsTypeArguments): New static
2781         method; does type inference for params arguments.
2782
2783 2004-03-21  Martin Baulig  <martin@ximian.com>
2784
2785         * typemanager.cs (TypeManager.IsGenericMethod): New public static
2786         method; checks whether a method is a generic method.    
2787
2788         * expression.cs (Invocation.InferTypeArguments): New static method;
2789         infer type arguments for generic method invocation.
2790
2791         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
2792         property; we set this to true if we're resolving a generic method
2793         invocation and the user specified type arguments, ie. we're not
2794         doing type inference.
2795
2796 2004-03-20  Martin Baulig  <martin@ximian.com>
2797
2798         * class.cs (MethodData.DeclaringType): New public property.
2799         (MethodData.Define): Set DeclaringType here.
2800         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
2801         instead of OperatorMethodBuilder.DeclaringType.
2802
2803 2004-03-20  Martin Baulig  <martin@ximian.com>
2804
2805         * cs-tokenizer.cs (xtoken): Return a special
2806         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
2807
2808         * cs-parser.jay (default_value_expression): Switch to the new
2809         syntax (14.5.13).
2810
2811 2004-03-19  Martin Baulig  <martin@ximian.com>
2812
2813         * decl.cs (MemberName): New class.  We use this to "construct"
2814         namespace_or_type_name's.
2815
2816         * generics.cs (TypeArguments.GetDeclarations): New public method;
2817         returns the type arguments as a string[] and reports a CS0081 if
2818         one of them is not an identifier.
2819
2820         * class.cs (MemberBase): The .ctor now takes the name as a
2821         MemberName instead of a string.
2822         (MemberBase.ExplicitInterfaceName): Changed type from string to
2823         Expression.
2824         (MemberBase.DoDefine): If we're an explicit implementation, the
2825         InterfaceType may be a generic instance.
2826
2827         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
2828         (namespace_name): Call MemberName.GetName () to transform the
2829         MemberName into a string and ensure we don't have any type
2830         arguments.
2831         (type_name): Call MemberName.GetTypeExpression() to transfrom the
2832         MemberName into an expression.
2833         (method_header): Use namespace_or_type_name instead of member_name.     
2834
2835 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2836
2837         * rootcontext.cs: Add new types to the boot resolution.
2838
2839         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2840         MulticastDelegate is not allowed.
2841
2842         * typemanager.cs: Add new types to lookup: System.TypedReference
2843         and ArgIterator.
2844
2845         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2846         check for TypedReference or ArgIterator, they are not allowed. 
2847
2848         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2849         makes us properly catch 1510 in some conditions (see bug 56016 for
2850         details). 
2851
2852 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2853
2854         * CryptoConvert.cs: update from corlib version
2855         with endian fixes.
2856
2857 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2858
2859         * class.cs (Indexer.Define): Check indexername declaration
2860
2861 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2862
2863         * attribute.cs (IsClsCompliant): Fixed problem with handling
2864         all three states (compliant, not-compliant, undetected).
2865
2866 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2867
2868         * attribute.cs (Attribute): Location is now public.
2869         (Resolve): Store resolved arguments (pos_values) in attribute class.
2870         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2871         (GetClsCompliantAttributeValue): New method that gets
2872         CLSCompliantAttribute value.
2873         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2874         if exists else null.
2875         (AttributeTester): New class for CLS-Compliant verification routines.
2876
2877         * class.cs (Emit): Add CLS-Compliant verification.
2878         (Method.GetSignatureForError): Implemented.
2879         (Constructor.GetSignatureForError): Implemented
2880         (Constructor.HasCompliantArgs): Returns if constructor has
2881         CLS-Compliant arguments.
2882         (Constructor.Emit): Override.
2883         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2884         is needed to test only parameters.
2885         (FieldBase.GetSignatureForError): Implemented.
2886         (TypeContainer): New member for storing base interfaces.
2887         (TypeContainer.FindMembers): Search in base interfaces too.
2888
2889         * codegen.cs (GetClsComplianceAttribute): New method that gets
2890         assembly or module CLSCompliantAttribute value.
2891         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2892         for assembly.
2893         (ModuleClass.Emit): Add error 3012 test.
2894
2895         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2896
2897         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2898         state for all decl types.
2899         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2900         if CLS-Compliant tests are required.
2901         (IsClsCompliaceRequired): New method. Analyze whether code
2902         must be CLS-Compliant.
2903         (IsExposedFromAssembly): New method. Returns true when MemberCore
2904         is exposed from assembly.
2905         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2906         value or gets cached value.
2907         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2908         is explicitly marked with CLSCompliantAttribute.
2909         (IsIdentifierClsCompliant): New abstract method. This method is
2910         used to testing error 3005.
2911         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2912         for identifier and parameters CLS-Compliant testing.
2913         (VerifyClsCompliance): New method. The main virtual method for
2914         CLS-Compliant verifications.
2915         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2916         null. I don't know why is null (too many public members !).
2917         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2918         and get value of first CLSCompliantAttribute that found.
2919
2920         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2921         (VerifyClsCompliance): Override and add extra tests.
2922
2923         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2924         clscheck- disable CLS-Compliant verification event if assembly is has
2925         CLSCompliantAttribute(true).
2926
2927         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2928         ApllyAttribute is now called in emit section as in the other cases.
2929         Possible future Emit integration.
2930         (IsIdentifierClsCompliant): New override.
2931         (VerifyClsCompliance): New override.
2932         (GetEnumeratorName): Returns full enum name.
2933
2934         * parameter.cs (GetSignatureForError): Implemented.
2935
2936         * report.cs (WarningData): New struct for Warning message information.
2937         (LocationOfPreviousError): New method.
2938         (Warning): New method. Reports warning based on the warning table.
2939         (Error_T): New method. Reports error based on the error table.
2940
2941         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2942         verifications are done here.
2943
2944         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2945
2946         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2947         CLSCompliantAttribute.
2948         (all_imported_types): New member holds all imported types from other
2949         assemblies.
2950         (LoadAllImportedTypes): New method fills static table with exported types
2951         from all referenced assemblies.
2952         (Modules): New property returns all assembly modules.
2953
2954 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2955
2956         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2957         throwing a parser error.
2958
2959         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2960         which removes the hardcoded get_/set_ prefixes for properties, as
2961         IL allows for the properties to be named something else.  
2962
2963         Bug #56013
2964
2965         * expression.cs: Do not override operand before we know if it is
2966         non-null.  Fix 56207
2967
2968 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2969
2970         * typemanager.cs: support for pinned variables.
2971
2972 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2973
2974         * decl.cs, typemanager.cs: Avoid using an arraylist
2975         as a buffer if there is only one result set.
2976
2977 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2978
2979         * expression.cs: Make sure you cant call a static method
2980         with an instance expression, bug #56174.
2981
2982 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
2983
2984         * class.cs (IsDuplicateImplementation): Improve error reporting to
2985         flag 663 (method only differs in parameter modifier).
2986
2987         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
2988         in preprocessor directives.
2989
2990         * location.cs (LookupFile): Allow for the empty path.
2991
2992         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
2993         better approach for some of that patch, but its failing with the
2994         CharSet enumeration.  For now try/catch will do.
2995
2996         * typemanager.cs: Do not crash if a struct does not have fields.
2997         Fixes 56150.
2998
2999 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3000
3001         * expression.cs: cs0213, cant fix a fixed expression.
3002         fixes 50231.
3003
3004 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3005
3006         * cs-parser.jay: detect invalid embeded statements gracefully.
3007         bug #51113.
3008
3009 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3010
3011         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3012         As a regex:
3013         s/
3014         the invocation type may not be a subclass of the tye of the item/
3015         The type of the item must be a subclass of the invocation item.
3016         /g
3017
3018         Fixes bug #50820.
3019
3020 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3021
3022         * attribute.cs: Added methods to get a string and a bool from an
3023         attribute. Required to information from AssemblyKeyFileAttribute,
3024         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3025         * codegen.cs: Modified AssemblyName creation to include support for
3026         strongnames. Catch additional exceptions to report them as CS1548.
3027         * compiler.csproj: Updated include CryptoConvert.cs.
3028         * compiler.csproj.user: Removed file - user specific configuration.
3029         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3030         Mono.Security assembly. The original class is maintained and tested in
3031         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3032         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3033         like CSC 8.0 (C# v2) supports.
3034         * Makefile: Added CryptoConvert.cs to mcs sources.
3035         * rootcontext.cs: Added new options for strongnames.
3036
3037 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3038
3039         * driver.cs: For --expect-error, report error code `2'
3040         if the program compiled with no errors, error code `1' if
3041         it compiled with an error other than the one expected.
3042
3043 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3044
3045         * compiler.csproj: Updated for Visual Studio .NET 2003.
3046         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3047         * compiler.sln: Updated for Visual Studio .NET 2003.
3048
3049 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3050
3051         * expression.cs: Fix bug #47234. We basically need to apply the
3052         rule that we prefer the conversion of null to a reference type
3053         when faced with a conversion to 'object' (csc behaviour).
3054
3055 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3056
3057         * statement.cs: Shorter form for foreach, eliminates
3058         a local variable. r=Martin.
3059
3060 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3061
3062         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3063         checks if we can use brtrue/brfalse to test for 0.
3064         * expression.cs: use the above in the test for using brtrue/brfalse.
3065         cleanup code a bit.
3066
3067 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3068
3069         * expression.cs: Rewrite string concat stuff. Benefits:
3070
3071         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3072         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3073         rather than a concat chain.
3074
3075         * typemanager.cs: Add lookups for more concat overloads.
3076
3077 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3078
3079         * expression.cs: Emit shorter il code for array init.
3080
3081         newarr
3082         dup
3083         // set 1
3084
3085         // set 2
3086
3087         newarr
3088         stloc.x
3089
3090         ldloc.x
3091         // set 1
3092
3093         ldloc.x
3094         // set 2
3095
3096 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3097
3098         * statement.cs: Before, two switch blocks would be merged if the
3099         total size of the blocks (end_item - begin_item + 1) was less than
3100         two times the combined sizes of the blocks.
3101
3102         Now, it will only merge if after the merge at least half of the
3103         slots are filled.
3104
3105         fixes 55885.
3106
3107 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3108
3109         * class.cs : csc build fix for GetMethods(). See bug #52503.
3110
3111 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3112
3113         * expression.cs: Make sure fp comparisons work with NaN.
3114         This fixes bug #54303. Mig approved this patch a long
3115         time ago, but we were not able to test b/c the runtime
3116         had a related bug.
3117
3118 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3119
3120         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3121
3122 2004-03-19  Martin Baulig  <martin@ximian.com>
3123
3124         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
3125         two overloads may unify for some type parameter substitutions and
3126         report a CS0408 if appropriate.
3127
3128 2004-03-19  Martin Baulig  <martin@ximian.com>
3129
3130         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3131         error here and not in our caller.
3132
3133 2004-03-19  Martin Baulig  <martin@ximian.com>
3134
3135         * interface.cs: Completely killed this file.
3136         (Interface): We're now a TypeContainer and live in class.cs.
3137
3138         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3139         argument; we're now also called for interfaces.
3140         (TypeContainer.DefineMembers): Allow this method being called
3141         multiple times.
3142         (TypeContainer.GetMethods): New public method; formerly known as
3143         Interface.GetMethod().  This is used by PendingImplementation.
3144         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3145         it's now private and non-static.
3146         (Interface): Moved this here; it's now implemented similar to
3147         Class and Struct.
3148         (Method, Property, Event, Indexer): Added `bool is_interface'
3149         argument to their .ctor's.
3150         (MemberBase.IsInterface): New public field.
3151
3152         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3153         instances instead of InterfaceMethod, InterfaceProperty, etc.
3154         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3155         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3156
3157 2004-03-19  Martin Baulig  <martin@ximian.com>
3158
3159         * class.cs (MethodCore.IsDuplicateImplementation): New private
3160         method which does the CS0111 checking.
3161         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3162         Use IsDuplicateImplementation().
3163
3164 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3165
3166         * decl.cs (FindMemberToOverride): New method to find the correct
3167         method or property to override in the base class.
3168         * class.cs
3169             - Make Method/Property use the above method to find the
3170               version in the base class.
3171             - Remove the InheritableMemberSignatureCompare as it is now
3172               dead code.
3173
3174         This patch makes large code bases much faster to compile, as it is
3175         O(n) rather than O(n^2) to do this validation.
3176
3177         Also, it fixes bug 52458 which is that nested classes are not
3178         taken into account when finding the base class member.
3179
3180         Reviewed/Approved by Martin.
3181
3182 2004-03-17  Martin Baulig  <martin@ximian.com>
3183
3184         * expression.cs (MemberAccess.DoResolve): Take the parent's number
3185         of type arguments into account; use the `real_num_type_args'
3186         approach like in DoResolveAsTypeStep().
3187
3188         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
3189         nested types.
3190
3191 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3192
3193         * interface.cs: In all interface classes removed redundant
3194         member initialization.
3195
3196 2004-03-16  Martin Baulig  <martin@ximian.com>
3197
3198         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3199
3200 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3201
3202         * decl.cs (DefineTypeAndParents): New helper method to define a
3203         type's containers before the type itself is defined;  This is a
3204         bug exposed by the recent changes to Windows.Forms when an
3205         implemented interface was defined inside a class that had not been
3206         built yet.   
3207
3208         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3209
3210         (Check): Loop correctly to report errors modifiers
3211         (UNSAFE was not in the loop, since it was the same as TOP).
3212
3213         * interface.cs: Every interface member now takes a ModFlags,
3214         instead of a "is_new" bool, which we set on the base MemberCore. 
3215
3216         Every place where we called "UnsafeOk" in the interface, now we
3217         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3218         the unsafe settings from the member declaration instead of the
3219         container interface. 
3220
3221         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3222
3223         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3224         `set_indexer_name' to the pending bits (one per type).
3225
3226         We fixed a bug today that was picking the wrong method to
3227         override, since for properties the existing InterfaceMethod code
3228         basically ignored the method name.  Now we make sure that the
3229         method name is one of the valid indexer names.
3230
3231 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
3232  
3233         * support.cs (SeekableStreamReader): Keep track of stream byte
3234         positions and don't mix them with character offsets to the buffer.
3235
3236         Patch from Gustavo Giráldez
3237
3238 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
3239
3240         * interface.cs (InterfaceSetGetBase): Removed double member
3241         initialization, base class does it as well.
3242
3243 2004-03-13  Martin Baulig  <martin@ximian.com>
3244
3245         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3246         when compiling corlib.
3247
3248 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3249
3250         * convert.cs (ExplicitConversion): We were reporting an error on
3251         certain conversions (object_type source to a value type, when the
3252         expression was `null') before we had a chance to pass it through
3253         the user defined conversions.
3254
3255         * driver.cs: Replace / and \ in resource specifications to dots.
3256         Fixes 50752
3257
3258         * class.cs: Add check for duplicate operators.  Fixes 52477
3259
3260 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3261
3262         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3263         that are in the middle of the statements, not only at the end.
3264         Fixes #54987
3265
3266         * class.cs (TypeContainer.AddField): No longer set the
3267         `HaveStaticConstructor' flag, now we call it
3268         `UserDefineStaticConstructor' to diferentiate the slightly
3269         semantic difference.
3270
3271         The situation is that we were not adding BeforeFieldInit (from
3272         Modifiers.TypeAttr) to classes that could have it.
3273         BeforeFieldInit should be set to classes that have no static
3274         constructor. 
3275
3276         See:
3277
3278         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3279
3280         And most importantly Zoltan's comment:
3281
3282         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3283
3284         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3285          before its static fields are used', i.e. initialization does not need
3286          to be triggered by the first access to the type. Setting this flag
3287          helps the JIT to compile better code, since it can run the static
3288          constructor at JIT time, and does not need to generate code to call it
3289          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3290          this flag for lots of classes like String. 
3291          
3292          csc sets this flag if the type does not have an explicit static 
3293          constructor. The reasoning seems to be that if there are only static
3294          initalizers for a type, and no static constructor, then the programmer
3295          does not care when this initialization happens, so beforefieldinit
3296          can be used.
3297          
3298          This bug prevents the AOT compiler from being usable, since it 
3299          generates so many calls to mono_runtime_class_init that the AOT code
3300          is much slower than the JITted code. The JITted code is faster, 
3301          because it does not generate these calls if the vtable is type is
3302          already initialized, which is true in the majority of cases. But the
3303          AOT compiler can't do this."
3304
3305 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3306
3307         * class.cs (MethodData.Emit): Refactor the code so symbolic
3308         information is generated for destructors;  For some reasons we
3309         were taking a code path that did not generate symbolic information
3310         before. 
3311
3312 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3313
3314         * class.cs: Create a Constructor.CheckBase method that
3315         takes care of all validation type code. The method
3316         contains some code that was moved from Define.
3317
3318         It also includes new code that checks for duplicate ctors.
3319         This fixes bug #55148.
3320
3321 2004-03-09  Joshua Tauberer <tauberer@for.net>
3322
3323         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3324         a { ... }-style array creation invokes EmitStaticInitializers
3325         which is not good for reference-type arrays.  String, decimal
3326         and now null constants (NullCast) are not counted toward
3327         static initializers.
3328
3329 2004-03-05  Martin Baulig  <martin@ximian.com>
3330
3331         * location.cs (SourceFile.HasLineDirective): New public field;
3332         specifies whether the file contains or is referenced by a "#line"
3333         directive.
3334         (Location.DefineSymbolDocuments): Ignore source files which
3335         either contain or are referenced by a "#line" directive.        
3336
3337 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3338
3339         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3340         direct access to our parent, so check the method inline there.
3341
3342 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3343
3344         * expression.cs (Invocation.EmitCall): Miguel's last commit
3345         caused a regression. If you had:
3346
3347             T t = null;
3348             t.Foo ();
3349
3350         In Foo the implict this would be null.
3351
3352 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3353
3354         * expression.cs (Invocation.EmitCall): If the method is not
3355         virtual, do not emit a CallVirt to it, use Call.
3356
3357         * typemanager.cs (GetFullNameSignature): Improve the method to
3358         cope with ".ctor" and replace it with the type name.
3359
3360         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3361         as an argument the ConstructorBuilder where it is being defined,
3362         to catch the recursive constructor invocations.
3363
3364 2004-03-16  Martin Baulig  <martin@ximian.com>
3365
3366         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
3367         ConstructedType, call ResolveType() on it to get the type rather
3368         than just using `expr.Type'.
3369
3370 2004-03-16  Martin Baulig  <martin@ximian.com>
3371
3372         * generics.cs (ConstructedType.GetMemberAccess): Take the
3373         EmitContext instead on the TypeExpr and use
3374         ec.TypeContainer.CurrentType/ec.ContainerType.
3375
3376 2004-03-16  Martin Baulig  <martin@ximian.com>
3377
3378         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
3379         parameters before aliases.
3380
3381 2004-03-16  Martin Baulig  <martin@ximian.com>
3382
3383         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
3384         New oublic function; checks whether two generic instances may become
3385         equal under some instantiations (26.3.1).
3386
3387         * class.cs (TypeContainer.Define): Call
3388         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
3389         error.
3390
3391 2004-03-16  Martin Baulig  <martin@ximian.com>
3392
3393         * class.cs (TypeContainer.GetClassBases): Moved
3394         Error_TypeParameterAsBase() here and also check whether the base
3395         class is not an attribute.
3396
3397 2004-03-16  Martin Baulig  <martin@ximian.com>
3398
3399         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3400
3401 2004-03-16  Martin Baulig  <martin@ximian.com>
3402
3403         * class.cs (Error_TypeParameterAsBase): Use correct error number
3404         here (CS0689).  
3405
3406 2004-03-16  Martin Baulig  <martin@ximian.com>
3407
3408         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
3409         for generics.
3410
3411         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
3412         error reporting.
3413
3414 2004-03-15  Martin Baulig  <martin@ximian.com>
3415
3416         * typemanager.cs (TypeManager.GetFullName): New public method.
3417         (TypeManager.MemberLookup): Added `int_num_type_arguments'
3418         argument; only return members with the correct number of type
3419         arguments.
3420         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
3421         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
3422         whether the number of type arguments matches.
3423
3424         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
3425         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
3426
3427         * expression.cs (MemberAccess): Added public `NumTypeArguments'
3428         field; it's set by the protected .ctor when we're actually a
3429         GenericMemberAccess.
3430         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
3431         arguments and pass it to MemberLookupFinal ().
3432
3433         * ecore.cs (Expression.MemberLookup): Added `int
3434         num_type_arguments' argument; only return members with the correct
3435         number of type arguments.
3436         (Expression.MemberLookupFailed): Check whether the MemberLookup
3437         failed because we did not have the correct number of type
3438         arguments; report CS0305 in this case.
3439
3440         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
3441         `e.ResolveAsTypeTerminal()' already did so.
3442
3443 2004-03-15  Martin Baulig  <martin@ximian.com>
3444
3445         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
3446         we're a ConstructedType; in this case, the caller must report an
3447         error (for instance CS0131).
3448
3449         * generic.cs (TypeArguments): Added Location argument to the .ctor.
3450         (TypeArguments.Resolve): Actually report errors here.
3451
3452 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3453
3454         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3455         `set_indexer_name' to the pending bits (one per type).
3456
3457         We fixed a bug today that was picking the wrong method to
3458         override, since for properties the existing InterfaceMethod code
3459         basically ignored the method name.  Now we make sure that the
3460         method name is one of the valid indexer names.
3461
3462 2004-03-15  Martin Baulig  <martin@ximian.com>
3463
3464         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
3465         for generic instances.
3466
3467 2004-03-13  Martin Baulig  <martin@ximian.com>
3468
3469         * class.cs (TypeContainer.DefineType): Call
3470         TypeManager.AddUserType() immediately after creating the
3471         TypeBuilder; pass all type parameters when creating the
3472         CurrentType.
3473
3474         * decl.cs (DeclSpace.FindNestedType): New public method.
3475         (DeclSpace.FindType): Added `int num_type_args' argument; only
3476         return types with the correct number of type parameters.
3477         (DeclSpace.CountTypeParams): New public property.
3478
3479         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
3480         the number of type parameters; defaults to zero.
3481
3482         * generic.cs (TypeArguments.Count): New public property.
3483         (ConstructedType.DoResolveAsTypeStep): First call
3484         ds.FindNestedType() to find out whether we're nested in the
3485         current generic type; in this case, we inherit all type parameters
3486         from the current class.
3487
3488         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
3489         num_type_args' argument.
3490         (RootContext.LookupType): Added overloaded version which takes the
3491         number of type arguments; only return types with the correct
3492         number of type arguments.
3493
3494         * typemanager.cs (TypeManager.CheckGeneric): New public function;
3495         checks whether `Type t' has `int num_type_args'.
3496
3497 2004-03-13  Martin Baulig  <martin@ximian.com>
3498
3499         * generic.cs (GenericMethod.DefineType): New method; calls
3500         DefineType() on all the type parameters.
3501
3502         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
3503         (MethodData.Define): If we're a generic method, call
3504         GenericMethod.DefineType() to define the type parameters.       
3505
3506 2004-03-10  Martin Baulig  <martin@ximian.com>
3507
3508         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
3509         instead of IsAssignableFrom.    
3510
3511 2004-03-10  Martin Baulig  <martin@ximian.com>
3512
3513         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
3514
3515         * support.cs (ParameterData.HasArrayParameter): New property.
3516         (ReflectionParameters.ctor): Take a MethodBase instead of a
3517         ParameterInfo[].  If we have any type parameters, get the generic
3518         method definition and ask it whether we have variable arguments.
3519
3520 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3521
3522         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3523         routines to check if a type is an enumerable/enumerator allow
3524         classes that implement the IEnumerable or IEnumerator interfaces.
3525
3526         * class.cs (Property, Operator): Implement IIteratorContainer, and
3527         implement SetYields.
3528
3529         (Property.Define): Do the block swapping for get_methods in the
3530         context of iterators.   We need to check if Properties also
3531         include indexers or not.
3532
3533         (Operator): Assign the Block before invoking the
3534         OperatorMethod.Define, so we can trigger the Iterator code
3535         replacement. 
3536
3537         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3538         Property and Operator classes are not created when we parse the
3539         declarator but until we have the block completed, so we use a
3540         singleton SimpleIteratorContainer.Simple to flag whether the
3541         SetYields has been invoked.
3542
3543         We propagate this setting then to the Property or the Operator to
3544         allow the `yield' to function.
3545
3546 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3547
3548         * codegen.cs: Implemented attribute support for modules.
3549         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3550         Assembly/Module functionality.
3551
3552         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3553         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3554         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3555
3556 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3557
3558         * interface.cs (FindMembers): The operation is performed on all base
3559         interfaces and not only on the first. It is required for future CLS Compliance patch.
3560
3561 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3562
3563         * statement.cs, codegen.cs:
3564         This patch deals with patterns such as:
3565
3566         public class List : IEnumerable {
3567
3568                 public MyEnumerator GetEnumerator () {
3569                         return new MyEnumerator(this);
3570                 }
3571
3572                 IEnumerator IEnumerable.GetEnumerator () {
3573                         ...
3574                 }
3575                 
3576                 public struct MyEnumerator : IEnumerator {
3577                         ...
3578                 }
3579         }
3580
3581         Before, there were a few things we did wrong:
3582         1) we would emit callvirt on a struct, which is illegal
3583         2) we emited ldarg when we needed to emit ldarga
3584         3) we would mistakenly call the interface methods on an enumerator
3585         type that derived from IEnumerator and was in another assembly. For example:
3586
3587         public class MyEnumerator : IEnumerator
3588
3589         Would have the interface methods called, even if there were public impls of the
3590         method. In a struct, this lead to invalid IL code.
3591
3592 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3593
3594         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3595           renamed to Emit.
3596
3597         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3598
3599 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3600
3601         * cs-parser.jay: Fix small regression: we were not testing V2
3602         compiler features correctly.
3603
3604         * interface.cs: If the emit context is null, then create one
3605
3606 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3607
3608         * decl.cs (GetSignatureForError): New virtual method to get full name
3609           for error messages.
3610
3611         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3612           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3613
3614         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3615           Duplicated members and code in these classes has been removed.
3616           Better encapsulation in these classes.
3617
3618 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3619
3620         * assign.cs (Assign.DoResolve): When dealing with compound
3621         assignments, there is a new rule in ECMA C# 2.4 (might have been
3622         there before, but it is documented here) that states that in:
3623
3624         a op= b;
3625
3626         If b is of type int, and the `op' is a shift-operator, then the
3627         above is evaluated as:
3628
3629         a = (int) a op b 
3630
3631         * expression.cs (Binary.ResolveOperator): Instead of testing for
3632         int/uint/long/ulong, try to implicitly convert to any of those
3633         types and use that in pointer arithmetic.
3634
3635         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3636         method to print information for from the type, not from the
3637         null-method we were given.
3638
3639 2004-02-01  Duncan Mak  <duncan@ximian.com>
3640
3641         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3642         parsing for cmd, fixes bug #53694.
3643
3644 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3645
3646         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3647         in the member name duplication tests. Property and operator name duplication
3648         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3649
3650 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3651
3652         * interface.cs (PopulateMethod): Fixed crash when interface method
3653         returns not existing type (error test cs0246-3.cs).
3654
3655 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3656
3657         * cs-parser.jay (interface_accessors): Re-write actions to also
3658         store attributes attached to get and set methods. Fix spelling
3659         while at it.
3660
3661         (inteface_property_declaration): Modify accordingly.
3662
3663         (InterfaceAccessorInfo): New helper class to store information to pass
3664         around between rules that use interface_accessors.
3665
3666         * interface.cs (Emit): Apply attributes on the get and set
3667         accessors of properties and indexers too.
3668
3669         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3670         right MethodBuilder when applying attributes to the get and set accessors.
3671
3672 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3673
3674         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3675
3676 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3677
3678         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3679
3680 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3681
3682         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3683         changes that treat `yield' specially when present before `break'
3684         or `return' tokens.
3685
3686         * cs-tokenizer.cs: yield is no longer a keyword.
3687
3688 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3689
3690         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3691         setting for default constructors.
3692         For default constructors are almost every time set wrong Modifier. The
3693         generated IL code has been alright. But inside mcs this values was
3694         wrong and this was reason why several of my CLS Compliance tests
3695         failed.
3696
3697 2004-02-27  Martin Baulig  <martin@ximian.com>
3698
3699         * generics.cs (ConstructedType.ResolveType): Make the nested type
3700         stuff actually work.
3701
3702 2004-02-25  Martin Baulig  <martin@ximian.com>
3703
3704         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
3705         property; returns the type parameters just from the current type,
3706         ie. with the ones from outer classes.
3707         (DeclSpace.LookupGeneric): First search in the current class, then
3708         in outer classes.
3709         (DeclSpace.initialize_type_params): When hiding a type parameter
3710         from an outer class, put it into the `type_param_list' anyways.
3711
3712         * expression.cs (MemberAccess.expr): Made this field protected.
3713
3714         * class.cs (TypeContainer.Define): The `CurrentType' just contains
3715         the type parameters from the current class.
3716
3717         * generic.cs (ConstructedType.ResolveType): Support nested generic
3718         types by taking the type parameters which we inherit from outer
3719         classes into account.
3720         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
3721         support for nested generic types.
3722
3723 2004-02-23  Martin Baulig  <martin@ximian.com>
3724
3725         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
3726         field and check whether we're nested inside a generic type.
3727         (DeclSpace.ResolveType): If we're resolving to a generic type
3728         definition, create a ConstructedType and return its resolved type.
3729         (DeclSpace.initialize_type_params): New private method;
3730         initializes the `type_param_list' field from the type parameters
3731         from this and all enclosing classes.
3732         (DeclSpace.TypeParameters): Call initialize_type_params() unless
3733         we're already initialized.
3734
3735 2004-02-23  Martin Baulig  <martin@ximian.com>
3736
3737         * class.cs (Method.Define): Create the generic method before
3738         calling DoDefine().
3739         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
3740         the TypeContainer one); we use this for generic methods.
3741
3742         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
3743         parent's TypeBuilder.
3744
3745 2004-02-18  Martin Baulig  <martin@ximian.com>
3746
3747         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
3748         to check for equality.
3749
3750 2004-02-05  Martin Baulig  <martin@ximian.com>
3751
3752         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
3753         `ec.TypeContainer.CurrentType', use it instead of
3754         `ec.ContainerType' to check whether we're in the type's ctor.
3755
3756 2004-01-29  Martin Baulig  <martin@ximian.com>
3757
3758         * expression.cs (Invocation.DoResolve): If we're a
3759         `ConstructedType', then we're actually a generic method, so
3760         rewrite the expr as a GenericMemberAccess.
3761
3762         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
3763         here; manually parse it into a string.
3764
3765 2004-01-28  Martin Baulig  <martin@ximian.com>
3766
3767         * typemanager.cs (TypeManager.IsEqual): New static method.
3768         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
3769         check for equality instead of using `=='.
3770
3771 2004-01-26  Martin Baulig  <martin@ximian.com>
3772
3773         * decl.cs (DeclSpace.CurrentType): New public field.
3774
3775         * expression.cs (This.ResolveBase): If we have an
3776         `ec.TypeContainer.CurrentType', use it instead of
3777         `ec.ContainerType'.
3778
3779         * class.cs (TypeContainer.DefineType): If we're a generic type,
3780         create the `CurrentType' (unresolved).
3781         (TypeContainer.GenericType): New private field.
3782         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
3783         it and store it in `GenericType' before creating the MemberCache.
3784         (TypeContainer.GetMembers): If we have a `GenericType', call
3785         TypeManager.FindMembers() on it.
3786
3787         * interface.cs (Interface.GenericType): New private field.
3788         (Interface.DefineType): If we're a generic type, create the
3789         `CurrentType' (unresolved).
3790         (Interface.DefineMembers): If we have a `CurrentType', resolve it
3791         and store it in `GenericType' before creating the MemberCache.
3792         (Interface.GetMembers): If we have a `GenericType', call
3793         TypeManager.FindMembers() on it.
3794
3795 2004-01-22  Martin Baulig  <martin@ximian.com>
3796
3797         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3798         not a QualifiedIdentifier.  This is what `type_name_expression'
3799         was previously doing.
3800         (type_name_expression): Removed; the code is now in
3801         `namespace_or_type_name'.
3802         (qualified_identifier): Removed, use `namespace_or_type_name'
3803         instead.
3804         (QualifiedIdentifier): Removed this class.      
3805
3806 2004-01-22  Martin Baulig  <martin@ximian.com>
3807
3808         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3809         not a string as alias name.
3810
3811 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3812
3813         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3814         #52730 bug, and instead compute correctly the need to use a
3815         temporary variable when requesting an address based on the
3816         static/instace modified of the field and the constructor.
3817  
3818 2004-01-21  Martin Baulig  <martin@ximian.com>
3819
3820         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3821         class and namespace before looking up aliases.  Fixes #52517.
3822
3823 2004-01-21  Martin Baulig  <martin@ximian.com>
3824
3825         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3826         assinged in a 'try'; fixes exception4.cs.
3827
3828 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3829         * class.cs : Implemented parameter-less constructor for TypeContainer
3830
3831         * decl.cs: Attributes are now stored here. New property OptAttributes
3832
3833         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3834
3835         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3836
3837 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3838
3839         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3840           (CSharpSignature): New method for indexer and property signature.
3841
3842 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3843
3844         * pending.cs (IsVirtualFilter): Faster implementation.
3845
3846 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3847
3848         * typemanager.cs: Avoid inclusion of same assembly more than once.
3849
3850 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3851
3852         * cs-parser.jay: Fixed problem where the last assembly attribute
3853           has been applied also to following declaration (class, struct, etc.)
3854           
3855 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3856
3857         * class.cs: Added error CS0538, CS0539 reporting.
3858         Fixed crash on Microsoft runtime when field type is void.
3859
3860         * cs-parser.jay: Added error CS0537 reporting.
3861
3862         * pending.cs: Added error CS0535 reporting.
3863         Improved error report for errors CS0536, CS0534.
3864
3865 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3866
3867         Merge a few bits from the Anonymous Method MCS tree.
3868
3869         * statement.cs (ToplevelBlock): New class for toplevel methods,
3870         will hold anonymous methods, lifted variables.
3871
3872         * cs-parser.jay: Create toplevel blocks for delegates and for
3873         regular blocks of code. 
3874
3875 2004-01-20  Martin Baulig  <martin@ximian.com>
3876
3877         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3878         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3879         and `NeedExplicitReturn'; added `IsLastStatement'.
3880         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3881         have a `ReturnLabel' or we're not unreachable.
3882
3883         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3884         child's reachability; don't just override ours with it.  Fixes
3885         #58058 (lluis's example).
3886         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3887         InFinally(), InLoop(), InSwitch() and
3888         BreakCrossesTryCatchBoundary() methods.
3889
3890         * statement.cs (Return): Do all error checking in Resolve().
3891         Unless we are the last statement in a top-level block, always
3892         create a return label and jump to it.
3893         (Break, Continue): Do all error checking in Resolve(); also make
3894         sure we aren't leaving a `finally'.
3895         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3896         statement in a top-level block.
3897         (Block.Flags): Added `IsDestructor'.
3898         (Block.IsDestructor): New public property.
3899
3900 2004-01-20  Martin Baulig  <martin@ximian.com>
3901
3902         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3903
3904 2004-01-20  Martin Baulig  <martin@ximian.com>
3905
3906         * statement.cs (Statement.ResolveUnreachable): New public method.
3907         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3908         (Block.Resolve): Resolve unreachable statements.
3909
3910 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3911
3912         * expression.cs: We need to fix the case where we do
3913         not have a temp variable here.
3914
3915         * assign.cs: Only expression compound assignments need
3916         temporary variables.
3917
3918 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3919
3920         * flowanalysis.cs: Reduce memory allocation in a few ways:
3921           - A block with no variables should not allocate a bit
3922             vector for itself.
3923           - A method with no out parameters does not need any tracking
3924             for assignment of the parameters, so we need not allocate
3925             any data for it.
3926           - The arrays:
3927                 public readonly Type[] VariableTypes;
3928                 public readonly string[] VariableNames;
3929             Are redundant. The data is already stored in the variable
3930             map, so we need not allocate another array for it.
3931           - We need to add alot of checks for if (params | locals) == null
3932             due to the first two changes.
3933
3934 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3935
3936         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3937         implement IMemoryLocation, we store a copy on a local variable and
3938         take the address of it.  Patch from Benjamin Jemlich
3939
3940         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3941         to use a special "type_name_expression" rule which reduces the
3942         number of "QualifiedIdentifier" classes created, and instead
3943         directly creates MemberAccess expressions.
3944
3945 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3946
3947         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3948         that fixes #52853.  Null literal assignment to ValueType
3949
3950         * class.cs (MethodData.Emit): Instead of checking the name of the
3951         method to determine if its a destructor, create a new derived
3952         class from Method called Destructor, and test for that.  
3953
3954         * cs-parser.jay: Create a Destructor object instead of a Method.  
3955
3956         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3957
3958         Fixes: 52933
3959
3960 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3961
3962         * expression.cs (Binary.ResolveOperator): Perform an implicit
3963         conversion from MethodGroups to their delegate types on the
3964         Addition operation.
3965
3966         * delegate.cs: Introduce a new class DelegateCreation that is the
3967         base class for `NewDelegate' and `ImplicitDelegateCreation',
3968         factor some code in here.
3969
3970         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
3971         conversion from MethodGroups to compatible delegate types. 
3972
3973         * ecore.cs (Expression.Resolve): Do not flag error 654
3974         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
3975         we allow conversions from MethodGroups to delegate types now.
3976
3977         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
3978         assignments in v2 either.
3979
3980 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
3981
3982         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
3983         static read-only fields in ctors.
3984
3985         Applied patch from Benjamin Jemlich 
3986
3987         * expression.cs (UnaryMutator): Avoid leaking local variables. 
3988
3989 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
3990
3991         * cs-tokenizer.cs (IsCastToken): Allow the various native types
3992         here to return true, as they can be used like this:
3993
3994                 (XXX) int.MEMBER ()
3995
3996         Fixed 49836 and all the other dups
3997
3998 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
3999
4000         * driver.cs: Implement /win32res and /win32icon.
4001
4002 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4003
4004         * cs-parser.jay: Add a rule to improve error handling for the
4005         common mistake of placing modifiers after the type.
4006
4007 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4008
4009         * cs-parser.jay (interface_event_declaration): Catch
4010         initialization of events on interfaces, and report cs0068
4011
4012         * cs-parser.jay (interface_event_declaration): Catch
4013         initialization of events. 
4014
4015         * ecore.cs: Better report missing constructors.
4016
4017         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4018         the error reporting done in the wrong place.  Fix.
4019
4020         * expression.cs (Binary.ResolveOperator): Catch the 
4021         operator + (E x, E y) error earlier, and later allow for implicit
4022         conversions in operator +/- (E e, U x) from U to the underlying
4023         type of E.
4024
4025         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4026         52596, if the container class is abstract, the default constructor
4027         is protected otherwise its public (before, we were always public).
4028
4029         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4030         fixed statement.
4031
4032         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4033         Jemlich that fixes bug #52597, MCS was generating invalid code for
4034         idisposable structs.   Thanks to Ben for following up with this
4035         bug as well.
4036
4037 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4038
4039         * driver.cs: Allow assemblies without code to be generated, fixes
4040         52230.
4041
4042 2004-01-07  Nick Drochak <ndrochak@gol.com>
4043
4044         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4045
4046 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4047
4048         * cs-parser.jay: Add rules to improve error reporting if fields or
4049         methods are declared at the namespace level (error 116)
4050
4051         * Add rules to catch event add/remove
4052
4053 2004-01-04  David Sheldon <dave-mono@earth.li>
4054
4055   * expression.cs: Added matching ")" to error message for 
4056   CS0077
4057
4058 2004-01-03 Todd Berman <tberman@gentoo.org>
4059
4060         * ecore.cs, attribute.cs:
4061         Applying fix from #52429.
4062
4063 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4064
4065         * ecore.cs, expression.cs, statement.cs:
4066         Total rewrite of how we handle branching. We
4067         now handle complex boolean expressions with fewer
4068         jumps. As well if (x == 0) no longer emits a ceq.
4069
4070         if (x is Foo) is much faster now, because we generate
4071         better code.
4072
4073         Overall, we get a pretty big improvement on our benchmark
4074         tests. The code we generate is smaller and more readable.
4075
4076         I did a full two-stage bootstrap. The patch was reviewed
4077         by Martin and Miguel.
4078
4079 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4080
4081         * cs-parser.jay: Make primary_expression not take a QI.
4082         we dont need this because the member_access rule covers
4083         us here. So we replace the rule with just IDENTIFIER.
4084
4085         This has two good effects. First, we remove a s/r conflict.
4086         Second, we allocate many fewer QualifiedIdentifier objects.
4087
4088 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4089
4090         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4091         set the correct information via SRE. This prevents
4092         hanging on the MS runtime. Fixes #29374.
4093
4094 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4095
4096         * convert.cs: correctly handle conversions to value types
4097         from Enum and ValueType as unboxing conversions.
4098
4099         Fixes bug #52569. Patch by Benjamin Jemlich.
4100
4101 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4102
4103         * expression.cs (BetterConversion): Prefer int -> uint
4104         over int -> ulong (csc's behaviour). This fixed bug #52046.
4105
4106 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4107
4108         * decl.cs (MemberCache.FindMembers): now returns a
4109         MemberInfo [].
4110
4111         * typemanager.cs: In general, go with with ^^.
4112         (CopyNewMethods): take an IList.
4113         (RealMemberLookup): Only allocate an arraylist
4114         if we copy from two sets of methods.
4115
4116         This change basically does two things:
4117         1) Fewer array lists allocated due to CopyNewMethods.
4118         2) the explicit cast in MemberList costed ALOT.
4119
4120 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4121
4122         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4123         a hashtable to avoid needless string allocations when an identifier is
4124         used more than once (the common case).
4125
4126 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4127
4128         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4129         is broken, it will not return anything. So, we
4130         have to use the information we have in mcs to
4131         do the task.
4132
4133         * typemanager.cs: Add a cache for GetInterfaces,
4134         since this will now be used more often (due to ^^)
4135
4136         (GetExplicitInterfaces) New method that gets the
4137         declared, not effective, interfaces on a type
4138         builder (eg, if you have interface IFoo, interface
4139         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4140         { IBar }.
4141
4142         This patch makes MCS able to bootstrap itself on
4143         Windows again.
4144
4145 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4146
4147         * expression.cs: Remove the Nop's that Miguel put
4148         in by mistake.
4149
4150 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4151
4152         * report.cs, codegen.cs: Give the real stack trace to
4153         the error when an exception is thrown.
4154
4155 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4156
4157         * decl.cs: only allocate hashtables for ifaces if 
4158         it is an iface!
4159
4160 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4161
4162         * expression.cs: fix the error from cs0121-2.cs
4163         (a parent interface has two child interfaces that
4164         have a function with the same name and 0 params
4165         and the function is called through the parent).
4166
4167 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4168
4169         * class.cs, rootcontext.cs, typmanager.cs: do not
4170         leak pointers.
4171
4172 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4173
4174         * codegen.cs: remove stack for the ec flow branching.
4175         It is already a linked list, so no need.
4176
4177 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4178
4179         * Makefile: Allow custom profiler here.
4180
4181 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4182
4183         * typemanager.cs (LookupType):
4184           - Use a static char [], because split takes
4185             a param array for args, so it was allocating
4186             every time.
4187           - Do not store true in a hashtable, it boxes.
4188
4189 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4190
4191         * flowanalysis.cs: bytify common enums.
4192
4193 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4194
4195         * modifiers.cs: Add a new set of flags for the
4196         flags allowed on explicit interface impls.
4197         * cs-parser.jay: catch the use of modifiers in
4198         interfaces correctly.
4199         * class.cs: catch private void IFoo.Blah ().
4200
4201         All related to bug #50572.
4202
4203 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4204
4205         * decl.cs: Rewrite the consistant accessability checking.
4206         Accessability is not linear, it must be implemented in
4207         a tableish way. Fixes #49704.
4208
4209 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4210
4211         * expression.cs: Handle negation in a checked context.
4212         We must use subtraction from zero. Fixes #38674.
4213
4214 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4215
4216         * class.cs: Ignore static void main in DLLs.
4217         * rootcontext.cs: Handle the target type here,
4218         since we are have to access it from class.cs
4219         * driver.cs: account for the above.
4220
4221 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4222
4223         * report.cs: Give line numbers and files if available.
4224
4225 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4226
4227         * driver.cs: Implement /addmodule.
4228
4229         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4230         ModuleBuilders.
4231
4232 2003-12-20  Martin Baulig  <martin@ximian.com>
4233
4234         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4235         (FieldBase.IsAssigned): Removed this field.
4236         (FieldBase.SetAssigned): New public method.
4237         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4238
4239 2003-12-20  Martin Baulig  <martin@ximian.com>
4240
4241         * expression.cs (LocalVariableReference.DoResolve): Don't set
4242         `vi.Used' if we're called from DoResolveLValue().
4243
4244         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4245         returns the usage vector it just merged into the current one -
4246         pass this one to UsageWarning().
4247         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4248         of the `EmitContext', don't call this recursively on our children.
4249
4250 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4251
4252         * driver.cs: Implement /target:module.
4253
4254 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4255
4256         * support.cs (CharArrayHashtable): New helper class.
4257
4258         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4259         char arrays, not strings, so we can avoid creating a string in
4260         consume_identifier if the identifier is a keyword.
4261
4262 2003-12-16  Martin Baulig  <martin@ximian.com>
4263
4264         * statement.cs (LocalInfo.Assigned): Removed this property.
4265         (LocalInfo.Flags): Removed `Assigned'.
4266         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4267         and uses flow analysis.
4268         (Block.UsageWarning): Made this method private.
4269         (Block.Resolve): Call UsageWarning() if appropriate.
4270
4271         * expression.cs (LocalVariableReference.DoResolve): Always set
4272         LocalInfo.Used here.
4273
4274 2003-12-13  Martin Baulig  <martin@ximian.com>
4275
4276         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4277         any value here; we're now using flow analysis to figure out
4278         whether a statement/block returns a value.
4279
4280 2003-12-13  Martin Baulig  <martin@ximian.com>
4281
4282         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4283         working again.
4284         (FlowBranching.MergeFinally): Don't call
4285         `branching.CheckOutParameters()' here, this is called in
4286         MergeTopBlock().
4287         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4288         when adding the `finally' vector.       
4289
4290 2003-12-13  Martin Baulig  <martin@ximian.com>
4291
4292         * flowanalysis.cs
4293         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4294         actually work and also fix #48962.
4295
4296 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4297
4298         * decl.cs: Do not check System.Object for nested types,
4299         since we know it does not have any. Big bang for buck:
4300
4301         BEFORE:
4302            Run 1:   8.35 seconds
4303            Run 2:   8.32 seconds
4304            corlib:  17.99 seconds
4305         AFTER:
4306            Run 1:   8.17 seconds
4307            Run 2:   8.17 seconds
4308            corlib:  17.39 seconds
4309
4310 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4311
4312         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4313         time we are returning 0 members, so we save alot here.
4314
4315 2003-12-11  Martin Baulig  <martin@ximian.com>
4316
4317         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4318         `MergeChild()', also just take the `FlowBranching' as argument;
4319         call Merge() on it and return the result.
4320         (FlowBranching.Merge): We don't need to do anything if we just
4321         have one sibling.
4322
4323 2003-12-11  Martin Baulig  <martin@ximian.com>
4324
4325         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4326         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4327         Maurer for this idea.
4328
4329 2003-12-11  Martin Baulig  <martin@ximian.com>
4330
4331         * flowanalysis.cs (MergeResult): This class is now gone; we now
4332         use the `UsageVector' for this.  The reason for this is that if a
4333         branching just has one sibling, we don't need to "merge" them at
4334         all - that's the next step to do.
4335         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4336         `MergeResult'.
4337
4338 2003-12-11  Martin Baulig  <martin@ximian.com>
4339
4340         Reworked flow analyis and made it more precise and bug-free.  The
4341         most important change is that we're now using a special `Reachability'
4342         class instead of having "magic" meanings of `FlowReturns'.  I'll
4343         do some more cleanups and optimizations and also add some more
4344         documentation this week.
4345
4346         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4347         largely reworked this class.
4348         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4349         the new `Reachability' class instead of having "magic" values here.
4350         (FlowBranching): We're now using an instance of `Reachability'
4351         instead of having separate `Returns', `Breaks' etc. fields.
4352
4353         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4354         based on flow analysis; ignore the return value of block.Emit ().
4355
4356 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4357
4358         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4359         if they are private.
4360
4361 2003-12-09  Martin Baulig  <martin@ximian.com>
4362
4363         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4364         call them directly on the UsageVector.
4365
4366 2003-12-09  Martin Baulig  <martin@ximian.com>
4367
4368         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4369         Changed return type from `FlowReturns' to `Reachability'.
4370
4371 2003-12-09  Martin Baulig  <martin@ximian.com>
4372
4373         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4374         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4375         `Reachable' fields with a single `Reachability' one.
4376
4377 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4378
4379         * class.cs (FindMembers): Remove foreach's.
4380
4381         Bootstrap times:
4382
4383         BEFORE
4384                 Run 1:   8.74 seconds
4385                 Run 2:   8.71 seconds
4386
4387         AFTER
4388                 Run 1:   8.64 seconds
4389                 Run 2:   8.58 seconds
4390
4391
4392 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4393
4394         * cs-parser.jay:
4395         * gen-treedump.cs:
4396         * statement.cs:
4397         This patch does a few things:
4398                 1. EmptyStatement is now a singleton, so it is never reallocated.
4399                 2. All blah is EmptyStatement constructs have been changed to
4400                    blah == EmptyStatement.Value, which is much faster and valid
4401                    now that EmptyStatement is a singleton.
4402                 3. When resolving a block, rather than allocating a new array for
4403                    the non-empty statements, empty statements are replaced with
4404                    EmptyStatement.Value
4405                 4. Some recursive functions have been made non-recursive.
4406         Mainly the performance impact is from (3), however (1) and (2) are needed for
4407         this to work. (4) does not make a big difference in normal situations, however
4408         it makes the profile look saner.
4409
4410         Bootstrap times:
4411
4412         BEFORE
4413         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4414         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4415         Total memory allocated: 56397 KB
4416
4417         AFTER
4418         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4419         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4420         Total memory allocated: 55666 KB
4421
4422 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4423
4424         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4425         than the hashtable in a hashtable version
4426
4427         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4428         we always end up concating a string. This results in a huge perf
4429         loss, because many strings have to be tracked by the GC. In this
4430         patch, we first use a hashtable that works with two keys, so that
4431         the strings do not need to be concat'ed.
4432
4433         Bootstrap times:
4434         BEFORE
4435                 Run 1:   8.74 seconds
4436                 Run 2:   8.71 seconds
4437
4438         AFTER
4439                 Run 1:   8.65 seconds
4440                 Run 2:   8.56 seconds
4441
4442 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4443
4444         * Makefile: Add a new target `do-time' that does a quick and simple
4445         profile, leaving easy to parse output.
4446
4447 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4448
4449         * codegen.cs (Init): Create the dynamic assembly with 
4450         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4451
4452 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4453
4454         * support.cs: Make the PtrHashtable use only one
4455         instance of its comparer.
4456
4457 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4458
4459         * typemanager.cs: Fix lookup of GetNamespaces.
4460
4461 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4462
4463         * expression.cs: Removed redundant line.
4464
4465         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4466         ArrayLists, use for loops with bounds.  
4467
4468         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4469         arraylist.
4470
4471         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4472         arraylists, use for loop with bounds.
4473
4474         The above three changes give us a 0.071 second performance
4475         improvement out of 3.294 seconds down to 3.223.  On my machine
4476         the above changes reduced the memory usage by 1,387 KB during
4477         compiler bootstrap.
4478
4479         * cs-parser.jay (QualifiedIdentifier): New class used to represent
4480         QualifiedIdentifiers.  Before we created a new string through
4481         concatenation, and mostly later on, the result would be
4482         manipulated by DecomposeQI through string manipulation.
4483
4484         This reduced the compiler memory usage for bootstrapping from
4485         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
4486         compile times in 0.05 seconds.
4487
4488 2003-11-28  Dick Porter  <dick@ximian.com>
4489
4490         * support.cs: Do string compares with the Invariant culture.
4491
4492         * rootcontext.cs: 
4493         * gen-treedump.cs: 
4494         * expression.cs: 
4495         * driver.cs: 
4496         * decl.cs: 
4497         * codegen.cs: 
4498         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4499         the comparison is done with the Invariant culture.
4500
4501 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4502
4503         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4504         GetEnumerator method.
4505
4506         (ProbeCollectionType): Iterate starting at the most specific type
4507         upwards looking for a GetEnumerator
4508
4509         * expression.cs: Shift count can be up to 31 for int/uint and 63
4510         for long/ulong.
4511
4512 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4513
4514         * statement.cs (Block.LookupLabel): Also look for the label on the
4515         children blocks.  Use a hash table to keep track of visited
4516         nodes. 
4517
4518         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4519         we actually did transform the other operand, otherwise fall back
4520         to the common codepath that casts to long.
4521
4522         * cs-tokenizer.cs: Use the same code pattern as the int case.
4523         Maybe I should do the parsing myself, and avoid depending on the
4524         Parse routines to get this done.
4525
4526 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4527
4528         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4529         which fixes bug 51347.  This time test it.
4530
4531         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4532         attributes for example can not tell the difference between these.
4533         The difference was only a syntax feature of the language. 
4534
4535         * attribute.cs: Apply attributes to delegates.
4536
4537         * delegate.cs: Call the apply attributes method.
4538
4539 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4540
4541         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4542         comparing 0 vs Byte.MinValue, not the value
4543
4544         (ImplicitConversionRequired): When reporting a conversion error,
4545         use error 31 to print out the constant error instead of the
4546         simpler 29.
4547
4548         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4549         which fixes bug 51347.
4550
4551 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4552
4553         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4554         which fixes the -warnaserror command line option.
4555
4556 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4557
4558         * cfold.cs (DoNumericPromotions): During constant folding of
4559         additions on UIntConstant, special case intconstants with
4560         IntConstants like we do on the expression binary operator. 
4561
4562 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4563
4564         * convert.cs (ImplicitReferenceConversion): We were missing a case
4565         (System.Enum are not value types or class types, so we need to
4566         classify them separatedly).
4567
4568         * driver.cs: We do not support error 2007.
4569
4570 2003-11-12 Jackson Harper <jackson@ximian.com>
4571
4572         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4573         system directory. Also use the full file name so users can
4574         libraries names mscorlib-o-tron.dll in a non system dir.
4575         
4576 2004-01-04  David Sheldon <dave-mono@earth.li>
4577
4578         * expression.cs: Added matching ")" to error message for CS0077.
4579
4580 2003-12-19  Martin Baulig  <martin@ximian.com>
4581
4582         * typemanager.cs (TypeManager.IsEqualGenericType): New public
4583         static method; see documentation in the method.
4584         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
4585
4586         * convert.cs (Convert.ImplicitReferenceConversion,
4587         Convert.ImplicitReferenceConversionExists): Add support for
4588         generic type declarations; see gen-36.cs.
4589
4590 2003-12-19  Martin Baulig  <martin@ximian.com>
4591
4592         * pending.cs (Pending.InterfaceMethod): Use
4593         `Type.IsAssignableFrom()' instead of `=='.
4594
4595 2003-12-18  Martin Baulig  <martin@ximian.com>
4596
4597         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
4598         byref types first.
4599
4600         * convert.cs (Convert.ImplicitStandardConversionExists): Use
4601         `expr_type.Equals (target_type)' instead of `=='.
4602
4603 2003-12-08  Martin Baulig  <martin@ximian.com>
4604
4605         * generics.cs (Constraints.Types): Removed.
4606         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
4607         to Type's.
4608         (Constraints.ResolveTypes): New public method; resolves the
4609         TypeExpr's to Type's.
4610         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
4611         longer takes the constraints.
4612         (TypeParameter.DefineMethod): Likewise.
4613         (TypeParameter.DefineType): New public method.  Calls
4614         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
4615         the constraints.
4616
4617 2003-12-08  Martin Baulig  <martin@ximian.com>
4618
4619         * convert.cs (Convert.ImplicitConversionStandard): Use
4620         `expr_type.Equals (target_type)' instead of `=='.
4621
4622 2003-12-08  Martin Baulig  <martin@ximian.com>
4623
4624         * typemanager.cs (TypeManager.GetReferenceType): Call
4625         `Type.MakeByRefType ()'.
4626
4627 2003-12-08  Martin Baulig  <martin@ximian.com>
4628
4629         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
4630         just has some special meaning in some situations.  For instance,
4631         it is allowed to use `where' as the name of a variable etc.
4632
4633 2003-12-04  Martin Baulig  <martin@ximian.com>
4634
4635         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
4636         `Type.MakeArrayType()' for array types.
4637
4638 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
4639
4640         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
4641         debugging message.
4642
4643         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
4644         corlib to compile.
4645
4646 2003-11-16  Martin Baulig  <martin@ximian.com>
4647
4648         * codegen.cs (EmitContext.IsGeneric): Removed.
4649
4650         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
4651         ResolveGeneric() on the DeclSpace.
4652
4653 2003-11-16  Martin Baulig  <martin@ximian.com>
4654
4655         * generic.cs (TypeArguments.Resolve):
4656         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
4657         `ResolveType()' on it to get the Type.
4658
4659 2003-11-15  Martin Baulig  <martin@ximian.com>
4660
4661         * generic.cs (ConstructedType.GetInterfaces): Override this.
4662
4663 2003-11-14  Martin Baulig  <martin@ximian.com>
4664
4665         * interface.cs (Interface.DefineType): Define all type parameters
4666         before adding the interfaces we inherit.
4667
4668 2003-11-11  Martin Baulig  <martin@ximian.com>
4669
4670         * generic.cs (ConstructedType.ResolveType): Always call
4671         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
4672
4673 2003-11-10  Martin Baulig  <martin@ximian.com>
4674
4675         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4676         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4677         calling `ResolveType()' on them, directly assign their `Type'.
4678
4679 2003-11-08  Martin Baulig  <martin@ximian.com>
4680
4681         * generic.cs (ConstructedType): Override `IsClass' etc.
4682
4683 2003-11-08  Martin Baulig  <martin@ximian.com>
4684
4685         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4686         return value and the `out parent' parameter.
4687         (TypeContainer.DefineType): Moved the CS0644 check into
4688         GetClassBases().  Don't pass the interface types to the
4689         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4690         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4691
4692         * ecore.cs (TypeExpr.IsAttribute): New property.
4693         (TypeExpr.GetInterfaces): New method.
4694
4695         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4696         TypeExpr instead of a Type.
4697         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4698         (Interface.DefineType): Don't pass the interface types to the
4699         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4700         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4701
4702         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4703         instead of a `Type[]'.
4704         (TypeManager.RegisterBuilder): Likewise.
4705         (TypeManager.AddUserInterface): Likewise.
4706         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4707         `Type[]' and also return a `TypeExpr[]'.
4708         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4709
4710 2003-11-08  Martin Baulig  <martin@ximian.com>
4711
4712         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4713         Expression.     
4714
4715 2003-11-08  Martin Baulig  <martin@ximian.com>
4716
4717         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4718         TypeManager.ResolveExpressionTypes().
4719
4720         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4721         instead of an Expression.
4722         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4723         (TypeExpression): New public class; formerly known as `TypeExpr'.
4724
4725         * expression.cs (ComposedCast): Derive from TypeExpr.
4726
4727         * typemanager.cs (TypeManager.system_*_expr): These are now
4728         TypExpr's instead of Expression's.
4729         (TypeManager.ResolveExpressionTypes): New public static function;
4730         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4731         of them.        
4732
4733 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4734
4735         * expression.cs (New.DoResolve): Do not dereference value that
4736         might be a null return.
4737
4738         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4739         sure that the constant value has the right type.  Fixes an
4740         unreported bug, similar to 50425.
4741
4742         * const.cs (Const.LookupConstantValue): Call
4743         ImplicitStandardConversionExists before doing a conversion to
4744         avoid havng the TypeManager.ChangeType do conversions.
4745
4746         Reduced the number of casts used
4747
4748         (Const.ChangeType): New routine to enable reuse of the constant
4749         type changing code from statement.
4750
4751         * typemanager.cs (ChangeType): Move common initialization to
4752         static global variables.
4753
4754         Fixes #50425.
4755
4756         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4757         every value type to go through, even if it was void.  Fix that. 
4758
4759         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4760         character of the define, and the is_identifier_part_character for
4761         the rest of the string.
4762
4763 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4764
4765         * expression.cs (UnaryMutator.EmitCode): When I updated
4766         LocalVariableReference.DoResolve, I overdid it, and dropped an
4767         optimization done on local variable references.
4768
4769 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4770
4771         * ecore.cs: Convert the return from Ldlen into an int.
4772
4773 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4774
4775         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4776         the accessibility, this is a special case for toplevel non-public
4777         classes (internal for instance).
4778
4779 2003-10-20  Nick Drochak <ndrochak@gol.com>
4780
4781         * ecore.cs: Fix typo and build.  Needed another right paren.
4782
4783 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4784
4785         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4786         `internal' case regular and protected, but not allowing protected
4787         to be evaluated later.  Bug 49840
4788
4789 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4790
4791         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4792         to kb.Nlast, and not the kb.nFirst to isolate the switch
4793         statement.
4794
4795         Extract the underlying type, so enumerations of long/ulong are
4796         treated like long/ulong.
4797
4798 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4799
4800         * expression.cs (New): Overload the meaning of RequestedType to
4801         track the possible creation of the NewDelegate type, since
4802         DoResolve is invoked more than once for new constructors on field
4803         initialization.
4804
4805         See bugs: #48800 and #37014
4806
4807         * cs-parser.jay (declare_local_constants): Take an arraylist
4808         instead of a single constant.
4809
4810         (local_constant_declaration): It should take a
4811         constant_declarators, not a constant_declarator.  Fixes 49487
4812
4813         * convert.cs: Fix error report.
4814
4815 2003-10-13 Jackson Harper <jackson@ximian.com>
4816
4817         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4818         bug #49611
4819         
4820 2003-11-03  Martin Baulig  <martin@ximian.com>
4821
4822         * expression.cs (ArrayAccess.GetStoreOpcode): Added
4823         `out bool has_type_arg'; if set, we need to pass the type to
4824         ig.Emit().
4825         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
4826         Stelem_Any/Ldelem_Any for generic parameters.   
4827
4828 2003-11-02  Martin Baulig  <martin@ximian.com>
4829
4830         * expression.cs (Invocation.EmitCall): Use
4831         `TypeManager.IsValueType()' to check whether it's a value type.
4832         Don't set `struct_call' when calling a method on a type parameter.
4833
4834 2003-11-02  Martin Baulig  <martin@ximian.com>
4835
4836         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
4837         and removed the TypeBuilder argument.
4838
4839         * typemanager.cs (TypeManager.IsValueType): Return
4840         `t.IsGenericParameter || t.IsValueType'.
4841
4842 2003-10-25  Martin Baulig  <martin@ximian.com>
4843
4844         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
4845         call ConstructedType.Resolve() on it.
4846
4847         * generic.cs (ConstructedType.Resolve): Set `type' on success.
4848
4849 2003-10-25  Martin Baulig  <martin@ximian.com>
4850
4851         * class.cs (TypeContainer.GetClassBases): Changed
4852         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
4853         CS8214 reporting here.
4854         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
4855         instead of a `Type' for our parent.  In case of a recursive
4856         declaration (see tests/gen-23.cs for an example), our parent is a
4857         ConstructedType and it doesn't have its type set.  So, first
4858         create our own TypeBuilder, then call constructed.Resolve() to get
4859         the parent's type and finally TypeBuilder.SetParent() it.
4860
4861         * ecore.cs (TypeExpr.Name): New public virtual property.
4862
4863         * generic.cs
4864         (ConstructedType): We're now a TypeExpr and not just an Expression.
4865         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
4866         arguments here; this is done later.
4867         (ConstructedType.Resolve): New public method to resolve the type
4868         arguments and bind them.
4869
4870 2003-10-21  Martin Baulig  <martin@ximian.com>
4871
4872         * convert.cs: Use `TypeManager.IsValueType' instead of
4873         'type.IsValueType' everywhere.
4874
4875         * typemanager.cs (TypeManager.IsValueType): Return true for type
4876         parameters.  The reason for this is that we need to box a type
4877         parameter when converting it to a reference type.
4878
4879         * cs-parser.jay: Added support for default value expressions.
4880
4881         * generics.cs (DefaultValueExpression): New public class.       
4882
4883 2003-10-17  Martin Baulig  <martin@ximian.com>
4884
4885         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
4886         TypeContainer so we can also use this for Interfaces.
4887         (TypeParameter.Resolve): Likewise.
4888
4889         * interface.cs (Interface.DefineType): Added support for generic
4890         interfaces.
4891
4892         * cs-parser.jay: Added support for generic structs and interfaces.
4893
4894 2003-10-17  Martin Baulig  <martin@ximian.com>
4895
4896         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
4897         call generic methods :-)
4898
4899 2003-10-16  Martin Baulig  <martin@ximian.com>
4900
4901         * cs-parser.jay (namespace_or_type_name): Only create a
4902         GenericMemberAccess if we actually have type arguments.
4903
4904 2003-10-13  Martin Baulig  <martin@ximian.com>
4905
4906         * class.cs (Method.Define): If we're a generic method, call
4907         TypeBuilder.DefineGenericMethod () before resolving
4908         the parameters.
4909         (MethodData): Added .ctor which takes an additional MethodBuilder
4910         argument; this is used for generic methods.
4911         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
4912         we already have a MethodBuilder.
4913
4914 2003-10-10  Martin Baulig  <martin@ximian.com>
4915
4916         * class.cs (Method): Added .ctor which takes a `GenericMethod'
4917         instead of a `DeclSpace'.  This is used for generic methods.
4918
4919         * cs-parser.jay (method_header): Added support for generic
4920         methods; create a `GenericMethod' instance and pass it to the
4921         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
4922         parameters and locals.
4923
4924         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
4925         since we already have the location.  Check whether we're a generic
4926         type declaration or a generic method and create the correct type
4927         parameter.
4928
4929         * generic.cs (TypeParameter.DefineMethod): New public method.
4930         (GenericMethod): New public class; derives from DeclSpace and is
4931         used for generic methods.       
4932
4933 2003-10-09  Martin Baulig  <martin@ximian.com>
4934
4935         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4936         to the .ctor.
4937         (MethodCore.DoDefineParameters): Removed the TypeContainer
4938         argument; use the DeclSpace which was passed to the .ctor instead.
4939         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4940         TypeContainer; we only need a DeclSpace here.
4941
4942 2003-10-09  Martin Baulig  <martin@ximian.com>
4943
4944         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4945         to the .ctor.
4946         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4947         EmitContext's .ctor.    
4948
4949 2003-10-09  Martin Baulig  <martin@ximian.com>
4950
4951         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4952         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4953         AsAccessible(), moved them as well.
4954
4955         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4956
4957 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4958
4959         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4960         generation for >=, as spotted by Paolo, bug 48679.  
4961         Patch from David Waite.
4962
4963         * cs-tokenizer.cs: Add handling for #pragma.
4964
4965         * cs-parser.jay: Allow for both yield and yield return in the
4966         syntax.  The anti-cobolization of C# fight will go on!
4967
4968         * class.cs (TypeBuilder.DefineType): Catch error condition here
4969         (Parent.DefineType erroring out and returning null).
4970
4971         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
4972         coping with enumerations variables, we were mistakenly processing
4973         them as a regular value type instead of built-in types.  Fixes the
4974         bug #48063
4975
4976         * typemanager.cs (IsBuiltinOrEnum): New method.
4977
4978 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
4979
4980         * cs-parser.jay: Upgrade: yield now needs the return clause.
4981
4982 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
4983
4984         * cs-parser.jay : Renamed yyName to yyNames related to jay.
4985
4986 2003-09-29  Martin Baulig  <martin@ximian.com>
4987
4988         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
4989         inflated generic methods.
4990
4991         * generics.cs (ConstructedType): Distinguish between open and
4992         closed constructed types; correctly resolve the arguments.
4993
4994 2003-09-22  Martin Baulig  <martin@ximian.com>
4995
4996         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
4997         all type arguments meet their constraints.
4998
4999 2003-09-19  Martin Baulig  <martin@ximian.com>
5000
5001         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5002         `MemberCache parent' argument.  Normally, an interface doesn't
5003         have a parent type except System.Object, but we use this in gmcs
5004         for generic type parameters.
5005
5006 2003-09-18  Martin Baulig  <martin@ximian.com>
5007
5008         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5009         on `type.IsInterface'; don't check whether the type has a parent
5010         to determine whether it's an interface.
5011
5012 2003-09-17  Martin Baulig  <martin@ximian.com>
5013
5014         * generic.cs (ConstructedType.ToString): Always use `name' as the
5015         type name.
5016
5017 2003-09-15  Martin Baulig  <martin@ximian.com>
5018
5019         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
5020
5021         * generic.cs (Constraints.Resolve): New public method; this is
5022         called to resolve the constraint types and to check whether all
5023         the constraints are correct.
5024         (Constraints.Types): New public property.
5025         (TypeParameter.Resolve): New public method; resolves all the
5026         type's constraints.
5027
5028         * class.cs (TypeContainer.DefineType): Call
5029         TypeParameter.Resolve() before actually defining the type.
5030
5031 2003-09-15  Martin Baulig  <martin@ximian.com>
5032
5033         * class.cs (TypeContainer.DefineType): Added an error flag to
5034         avoid reporting duplicate CS0146's ("class definition is
5035         circular.").
5036
5037         * driver.cs (Driver.MainDriver): Abort if
5038         RootContext.ResolveTree() reported any errors.
5039
5040 2003-09-07  Martin Baulig  <martin@ximian.com>
5041
5042         * report.cs (Error, Warning): Added overloaded versions which take
5043         a `params object[] args' and call String.Format().
5044
5045 2003-09-07  Martin Baulig  <martin@ximian.com>
5046
5047         * decl.cs (DeclSpace..ctor): Don't call
5048         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5049         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5050         (DeclSpace.RecordDecl): New method.
5051
5052         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5053
5054 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5055
5056         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5057         value attributes to be applied to ParameterBuilders.
5058
5059         * class.cs (MethodCore.LabelParameters): Make static and more
5060         generic so that it can be used from other places - like interface
5061         methods, for instance.
5062
5063         * interface.cs (Interface.Emit): Call LabelParameters before
5064         emitting attributes on the InterfaceMethod.
5065
5066 2003-09-07  Martin Baulig  <martin@ximian.com>
5067
5068         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
5069         if the number of type parameters doesn't match.
5070
5071 2003-09-04  Martin Baulig  <martin@ximian.com>
5072
5073         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
5074         for arrays of generic type params (ie. `!0[]').
5075
5076 2003-09-04  Martin Baulig  <martin@ximian.com>
5077
5078         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
5079         for the moment.
5080
5081 2003-09-04  Martin Baulig  <martin@ximian.com>
5082
5083         * decl.cs (DeclSpace.LookupGeneric): New method.
5084         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
5085         moment.
5086
5087         * generic.cs (TypeParameterExpr): Take a TypeParameter as
5088         argument, not just a string.
5089         (TypeParameter.Define): New public method; this is called to
5090         actually define the generic parameter; after this, you can use the
5091         new `Type' property to get the type.
5092
5093 2003-09-04  Martin Baulig  <martin@ximian.com>
5094
5095         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
5096         is now an ArrayList; initialize the result of the `TypeParameters'
5097         property here.
5098         (DeclSpace.GetGenericData): Removed.
5099         (DeclSpace.LookupGeneric): Temporarily removed; we need to
5100         implement this in a different way.
5101         (DeclSpace.GetTypeParameters): Removed; there's now a
5102         `TypeParameters' property.
5103         (DeclSpace.TypeParameters): New public property.
5104
5105         * generic.cs (Constraints): Make this class public.
5106         (TypeParameter): New public class.
5107
5108 2003-09-04  Martin Baulig  <martin@ximian.com>
5109
5110         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
5111         generic parameters.
5112
5113         * class.cs (TypeContainer.DefineType): Call
5114         TypeBuilder.DefineGenericParameter () on all generic parameters if
5115         this is a generic type.
5116
5117 2003-08-28  Martin Baulig  <martin@ximian.com>
5118
5119         * sample-stack.il: Compile this with ilasm: "ilasm /dll
5120         sample-stack.il".
5121
5122         * sample-hello.cs: Compile this with gmcs: "gmcs
5123         /r:sample-stack.dll sample-hello.cs".
5124
5125 2003-08-28  Martin Baulig  <martin@ximian.com>
5126
5127         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
5128         the parameters to the generic type.
5129
5130 2003-08-28  Martin Baulig  <martin@ximian.com>
5131
5132         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
5133
5134 2003-08-28  Martin Baulig  <martin@ximian.com>
5135
5136         * cs-parser.jay (opt_type_argument_list): Use
5137         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
5138         (primary_expression): Replace `qualified_identifier' with `type_name'.
5139         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
5140
5141         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
5142         parser to check whether it is syntactically a type parameter list;
5143         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
5144         this case.
5145
5146 2003-08-26  Martin Baulig  <martin@ximian.com>
5147
5148         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5149         resolving aliases; fixes #47927.
5150
5151 2003-08-26  Martin Baulig  <martin@ximian.com>
5152
5153         * statement.cs (Using.DoResolve): This is internally emitting a
5154         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5155         do not always return.  Fixes #47681.
5156
5157 2003-08-26  Martin Baulig  <martin@ximian.com>
5158
5159         * decl.cs (MemberCore): Moved WarningNotHiding(),
5160         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5161         into MemberBase.
5162         (AdditionResult): Make this nested in DeclSpace.
5163         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5164         argument; call NamespaceEntry.Define() unless we're nested in a
5165         class or struct.
5166
5167         * namespace.cs (Namespace.DefineName): New public function.  This
5168         is called from DeclSpace's .ctor to add 
5169         (Namespace.Lookup): Include DeclSpaces in the lookup.
5170
5171         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5172
5173         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5174
5175 2003-08-25  Martin Baulig  <martin@ximian.com>
5176
5177         * convert.cs (Convert.ExplicitReferenceConversion): When
5178         converting from an interface type to a class, unbox if the target
5179         type is a struct type.  Fixes #47822.
5180
5181 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5182
5183         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5184         #47854.
5185
5186 2003-08-22  Martin Baulig  <martin@ximian.com>
5187
5188         * class.cs (TypeManager.DefineType): When defining a nested type,
5189         call DefineType() on our parent; fixes #47801.
5190
5191 2003-08-22  Martin Baulig  <martin@ximian.com>
5192
5193         * class.cs (MethodData.Define): While checking if a method is an
5194         interface implementation, improve the test a bit more to fix #47654.
5195
5196 2003-08-22  Martin Baulig  <martin@ximian.com>
5197
5198         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5199         correctly; fixes #47722.
5200
5201 2003-08-22  Martin Baulig  <martin@ximian.com>
5202
5203         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5204         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5205
5206         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5207
5208 2003-08-22  Martin Baulig  <martin@ximian.com>
5209
5210         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5211         can only be assigned in static constructors.  Fixes #47161.
5212
5213 2003-08-22  Martin Baulig  <martin@ximian.com>
5214
5215         Rewrote and improved the flow analysis code.
5216
5217         * flowbranching.cs (FlowBranching): Make this class abstract.
5218         (FlowBranching.CreateBranching): New static function to create a
5219         new flow branching.
5220         (FlowBranchingBlock, FlowBranchingException): New classes.
5221         (FlowBranching.UsageVector.Type): New public readonly field.
5222         (FlowBranching.UsageVector.Breaks): Removed the setter.
5223         (FlowBranching.UsageVector.Returns): Removed the setter.
5224         (FlowBranching.UsageVector): Added Break(), Return(),
5225         NeverReachable() and Throw() methods to modify the reachability.
5226         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5227         done by FlowBranching.Merge().
5228         (FlowBranching.UsageVector.MergeChild): New method; merges the
5229         merge result into the current vector.
5230         (FlowBranching.Merge): New abstract method to merge a branching.
5231
5232 2003-08-12  Martin Baulig  <martin@ximian.com>
5233
5234         * expression.cs (Indirection.CacheTemporaries): Create the
5235         LocalTemporary with the pointer type, not its element type.
5236
5237 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5238
5239         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5240         token was a keyword or not.
5241
5242         Add `error' options where an IDENTIFIER was expected;  Provide
5243         CheckToken and CheckIdentifierToken convenience error reporting
5244         functions. 
5245
5246         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5247
5248         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5249         NameSpaceEntry NameSpaceEntry.
5250
5251         (LookupInterfaceOrClass): Avoid creating a full qualified name
5252         from namespace and name: avoid doing lookups when we know the
5253         namespace is non-existant.   Use new Tree.LookupByNamespace which
5254         looks up DeclSpaces based on their namespace, name pair.
5255
5256         * driver.cs: Provide a new `parser verbose' to display the
5257         exception thrown during parsing.  This is turned off by default
5258         now, so the output of a failure from mcs is more graceful.
5259
5260         * namespace.cs: Track all the namespaces defined in a hashtable
5261         for quick lookup.
5262
5263         (IsNamespace): New method
5264
5265 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5266
5267         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5268         we know that we need to concatenate (full typename can never be
5269         null). 
5270
5271         * class.cs: ditto.
5272
5273         * statement.cs: Use a bitfield;  Do not initialize to null things
5274         which are done by the constructor by default.
5275
5276         * cs-parser.jay: bug fix, parameter was 4, not 3.
5277
5278         * expression.cs: Just use the property;
5279
5280         * statement.cs: No need for GetVariableInfo method.
5281
5282 2003-08-08  Martin Baulig  <martin@ximian.com>
5283
5284         * flowanalysis.cs (FlowReturns): This is now nested in the
5285         `FlowBranching' class.
5286         (MyBitVector): Moved this here from statement.cs.
5287         (FlowBranching.SiblingType): New enum type.
5288         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5289
5290 2003-08-07  Martin Baulig  <martin@ximian.com>
5291
5292         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5293         `FlowBranching' class and called `BranchingType'.
5294
5295 2003-08-07  Martin Baulig  <martin@ximian.com>
5296
5297         * flowanalysis.cs: Moved all the control flow analysis code into
5298         its own file.
5299
5300 2003-08-07  Martin Baulig  <martin@ximian.com>
5301
5302         * assign.cs (Assign.DoResolve): `target' must either be an
5303         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5304         #37319.
5305
5306 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5307
5308         * expression.cs (BinaryMethod): This kind of expression is created by the
5309         Binary class if it determines that the operator has to be handled
5310         by a method.
5311
5312         (BinaryDelegate): This kind of expression is created if we are
5313         dealing with a + or - operator on delegates.
5314
5315         (Binary): remove method, argumetns, and DelegateOperator: when
5316         dealing with methods, 
5317
5318         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5319
5320         * statement.cs (Block): use bitfields for the three extra booleans
5321         we had in use.   Remove unused topblock parameter.
5322
5323         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5324
5325         * assign.cs: Drop extra unneeded tests.
5326
5327 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5328
5329         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5330
5331         * statement.cs (Foreach): Use VariableStorage instead of
5332         LocalBuilders.   
5333
5334         * codegen.cs (VariableStorage): New class used by clients that
5335         require a variable stored: locals or fields for variables that
5336         need to live across yield.
5337
5338         Maybe provide a convenience api for EmitThis+EmitLoad?
5339
5340         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5341         these bad boys.
5342
5343 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5344
5345         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5346         RemapParameterLValue): New methods that are used to turn a
5347         precomputed FieldInfo into an expression like this:
5348
5349                 instance.FieldInfo
5350
5351         The idea is to use this instead of making LocalVariableReference
5352         have more than one meaning.
5353
5354         * cs-parser.jay: Add error production to BASE.
5355
5356         * ecore.cs: Deal with TypeManager.GetField returning null, which
5357         is now a valid return value.
5358
5359         (FieldExprNoAddress): New expression for Fields whose address can
5360         not be taken.
5361
5362         * expression.cs (LocalVariableReference): During the resolve
5363         phases, create new expressions if we are in a remapping context.
5364         Remove code that dealt with remapping here.
5365
5366         (ParameterReference): same.
5367
5368         (ProxyInstance): New expression, like the `This' expression, but
5369         it is born fully resolved.  We know what we are doing, so remove
5370         the errors that are targeted to user-provided uses of `this'.
5371
5372         * statement.cs (Foreach): our variable is now stored as an
5373         Expression;  During resolution, follow the protocol, dont just
5374         assume it will return this.
5375
5376 2003-08-06  Martin Baulig  <martin@ximian.com>
5377
5378         * support.cs (SeekableStreamReader.cs): New public class.
5379
5380         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5381         SeekableStreamReader instead of the normal StreamReader.
5382
5383 2003-08-04  Martin Baulig  <martin@ximian.com>
5384
5385         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5386         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5387         deambiguate casts and delegate invocations.
5388         (parenthesized_expression): Use the new tokens to ensure this is
5389         not a cast of method invocation.
5390
5391         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5392         when reading a `)' and Deambiguate_CloseParens () was previously
5393         called.
5394
5395         * expression.cs (ParenthesizedExpression): New class.  This is
5396         just used for the CS0075 test.
5397         (Binary.DoResolve): Check for CS0075.   
5398
5399 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5400
5401         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5402         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5403         reference comparison.
5404
5405         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5406         examine the ReturnType for equality - this is necessary in the
5407         cases of implicit and explicit operators whose signature also
5408         includes the return type.
5409
5410 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5411
5412         * namespace.cs: Cache the result of the namespace computation,
5413         instead of computing it every time.
5414
5415 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5416
5417         * decl.cs: Use a global arraylist that we reuse over invocations
5418         to avoid excesive memory consumption.  Reduces memory usage on an
5419         mcs compile by one meg (45 average).
5420
5421         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5422         private, work around that.
5423
5424 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5425
5426         * literal.cs (IntLiteral): Define Zero and One static literals. 
5427
5428         * cs-parser.jay (integer_literal): use static literals to reduce
5429         memory usage for the most used literals (0, 1 and -1).  211kb
5430         reduced in memory usage.
5431
5432         Replace all calls to `new ArrayList' with `new
5433         ArrayList(4)' which is a good average number for most allocations,
5434         and also requires only 16 bytes of memory for its buffer by
5435         default. 
5436
5437         This reduced MCS memory usage in seven megabytes for the RSS after
5438         bootstrapping.
5439
5440 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5441
5442         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5443         handle params methods the correct way by forming only one
5444         applicable set with params and normal methods in them. Earlier we
5445         were looking at params methods only if we found no normal methods
5446         which was not the correct thing to do.
5447
5448         (Invocation.BetterFunction): Take separate arguments indicating
5449         when candidate and the best method are params methods in their
5450         expanded form.
5451
5452         This fixes bugs #43367 and #46199.
5453
5454         * attribute.cs: Documentation updates.
5455
5456         (CheckAttribute): Rename to CheckAttributeTarget.
5457         (GetValidPlaces): Rename to GetValidTargets.
5458
5459         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5460         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5461
5462         Fixes bug #44468.
5463
5464 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
5465
5466         * codegen.cs: Compute IsGeneric correctly.
5467
5468         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
5469         resolution. 
5470
5471         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
5472         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
5473         regressions, and I was chasing more bugs than I required.
5474
5475         * interface.cs: Use expressions for base type names (like classes
5476         and structs have been doing for a while now), and resolve that.
5477         This patch should probably go into head as well.
5478
5479         This makes it one less user of FindType.
5480
5481 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5482
5483         This compiler can not self host currently.  Need to fix that.
5484         
5485         * Makefile: compile to `gmcs.exe'
5486
5487         * driver.cs: Turn on v2 by default on gmcs.
5488
5489         * generic.cs (ConstructedType): Does no longer take a container
5490         type argument;  That will be taken care of later.
5491
5492         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
5493         Use SimpleName to resolve for now, so we can continue the work on
5494         the parser, until we get Type.GetType that understands generics.
5495
5496         (ConstructedType.ToString): Implement
5497
5498         (TypeArguments.Resolve): Resolve the child expressions as types. 
5499         
5500         * cs-parser.jay: Rename interface_constraints to
5501         type_parameter_constraints
5502
5503         (namespace_or_type_name): Only use constructed types for the basic
5504         construction, we will deal with identifier<...> later.
5505
5506         (type/type_name): No longer call DecomposeQI, as
5507         namespace_or_type_name is always decoded now.
5508         
5509 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5510
5511         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5512         closely: we eliminate methods in base types when we have an
5513         applicable method in a top-level type.
5514
5515         Please see section 14.5.5.1 for an exact description of what goes
5516         on. 
5517
5518         This fixes bug #45127 and a host of other related to corlib compilation.
5519
5520         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5521         array is the method corresponding to the top-level type (this is
5522         because of the changes made to icall.c) so we change this
5523         accordingly.
5524
5525         (MethodGroupExpr.Name): This too.
5526
5527         * typemanager.cs (GetElementType): New method which does the right
5528         thing when compiling corlib. 
5529
5530         * everywhere: Make use of the above in the relevant places.
5531
5532 2003-07-22  Martin Baulig  <martin@ximian.com>
5533
5534         * cs-parser.jay (invocation_expression): Moved
5535         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5536         `cast_expression', but create a InvocationOrCast which later
5537         resolves to either an Invocation or a Cast.
5538
5539         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5540         method; call this before EmitStatement() to make sure that this
5541         expression can be used as a statement.
5542
5543         * expression.cs (InvocationOrCast): New class; resolves to either
5544         an Invocation or a Cast.
5545
5546         * statement.cs (StatementExpression): Call ResolveStatement() on
5547         the ExpressionStatement before emitting it.
5548
5549 2003-07-21  Martin Baulig  <martin@ximian.com>
5550
5551         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5552         `ref' and `out' attributes match; fixes #46220.
5553         (MemberAccess.ResolveMemberAccess): You can't reference a type
5554         through an expression; fixes #33180.
5555         (Indexers.GetIndexersForType): Don't return the indexers from
5556         interfaces the class implements; fixes #46502.
5557
5558 2003-07-21  Martin Baulig  <martin@ximian.com>
5559
5560         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5561         CS0661 checks; fixes bug #30442.
5562
5563 2003-07-21  Martin Baulig  <martin@ximian.com>
5564
5565         * decl.cs (AdditionResult): Added `Error'.
5566
5567         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5568
5569         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
5570         cs0031.cs actually work.
5571
5572  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5573  
5574         * cs-parser.jay (namespace_name): do not use
5575         namespace_or_type_name, use qualified_identifier, because
5576         namespace_or_type_name will soon return a composed expression
5577         instead of a string.
5578  
5579         (namespace_or_type_name): Instead of returning a string, now this
5580         production returns an expression.
5581  
5582         * codegen.cs (EmitContext): Setup IsGeneric property based on
5583         whether our DeclSpace is generic, our the method is generic.
5584  
5585         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
5586         the method is generic.
5587  
5588         * cs-parser.jay (type_arguments, opt_type_argument_list,
5589         type_parameters, type_parameter_list, opt_type_parameter_list,
5590         type_parameter,, opt_type_parameter_constraints_clauses,
5591         type_parameter_constraints_clauses,
5592         type_parameter_constraint_clause, type_parameter_constraint,
5593         interface_constraints): Add new production
5594  
5595         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
5596         DeclSpace is generic or not.
5597  
5598         (DeclSpace.SetParameterInfo): New routine, used to set the
5599         parameter info for a type.
5600  
5601         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
5602         returns a GenericTypeExpr
5603  
5604         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
5605         generic, lookup the generic argument.
5606  
5607         * attribute.cs: Do not allow TypeParameterExpressions in
5608         Attributes.
5609  
5610         * class.cs: Do not allow the Main method to be defined in a
5611         Generic container.
5612  
5613         * expression.cs (SizeOf): Do not allow generic types to be used as
5614         arguments to sizeof.
5615  
5616         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
5617         it: whether a type is generic or not.  Only works for types we are
5618         currently building for now.
5619         
5620 2003-07-20  Martin Baulig  <martin@ximian.com>
5621
5622         * namespace.cs: Fixed that bug which caused a crash when compiling
5623         the debugger's GUI.
5624
5625 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5626
5627         * typemanager.cs (LookupTypeReflection): Never expose types which
5628         are NotPublic, NestedPrivate, NestedAssembly, or
5629         NestedFamANDAssem.  We used to return these, and later do a check
5630         that would report a meaningful error, but the problem is that we
5631         would not get the real match, if there was a name override.
5632
5633 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5634
5635         * namespace.cs (Namespace, Name): Do not compute the namespace
5636         name dynamically, compute it in the constructor.  This reduced
5637         memory usage by 1697 KB.
5638
5639         * driver.cs: Use --pause to pause at the end.
5640
5641 2003-07-17  Peter Williams  <peter@newton.cx>
5642
5643         * Makefile: Change the name of the test target so that it doesn't
5644         conflict with the recursive test target.
5645
5646 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5647
5648         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5649         AddressOf): Do not use EmitThis, that was wrong, use the actual
5650         this pointer.
5651
5652 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5653
5654         * class.cs (MethodData.Define): While checking if a method is an
5655         interface implementation, improve the test: If we are not public
5656         (use new test here: use the computed MethodAttributes directly,
5657         instead of the parsed modifier flags) check if the `implementing'
5658         method comes from an interface or not.
5659
5660         * pending.cs (VerifyPendingMethods): Slightly better error
5661         message.
5662
5663         * makefile: add test target that does the mcs bootstrap.
5664
5665 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5666
5667         * interface.cs (Define): Do nothing here since there are no
5668         members to populate etc. Move the attribute emission out of here
5669         since this was just totally the wrong place to put it. Attribute
5670         application happens during the 'Emit' phase, not in the 'Define'
5671         phase.
5672
5673         (Emit): Add this method and move the attribute emission here
5674
5675         * rootcontext.cs (EmitCode): Call the Emit method on interface
5676         types too.
5677
5678 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5679
5680         * expression.cs (OverloadResolve): Report error only if Location
5681         is not 'Null' which means that there was a probe going on.
5682
5683 2003-07-14  Martin Baulig  <martin@ximian.com>
5684
5685         * expression.cs (ConditionalLogicalOperator): New public class to
5686         implement user defined conditional logical operators.
5687         This is section 14.11.2 in the spec and bug #40505.
5688
5689 2003-07-14  Martin Baulig  <martin@ximian.com>
5690
5691         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5692
5693 2003-07-14  Martin Baulig  <martin@ximian.com>
5694
5695         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5696
5697         * ecore.cs (IVariable.VerifyFixed): New interface method.
5698
5699         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5700         operator, check whether the variable is actually fixed.  Fixes bug
5701         #36055.  Set a variable definitely assigned when taking its
5702         address as required by the spec.
5703
5704         * statement.cs (LocalInfo.IsFixed): New field.
5705         (LocalInfo.MakePinned): Set `IsFixed' to true.
5706
5707 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5708
5709         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5710         for .ctors, ensure that we only ask for members declared in the
5711         attribute type (BindingFlags.DeclaredOnly).
5712
5713         Fixes bug #43632.
5714
5715         * expression.cs (Error_WrongNumArguments): Report error 1501
5716         correctly the way CSC does.
5717
5718 2003-07-13  Martin Baulig  <martin@ximian.com>
5719
5720         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5721         lookup on the fully qualified name, to make things like "X.X" work
5722         where "X.X" is a fully qualified type name, but we also have a
5723         namespace "X" in the using list.  Fixes #41975.
5724
5725 2003-07-13  Martin Baulig  <martin@ximian.com>
5726
5727         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5728         function. If we're a CompoundAssign, we need to create an embedded
5729         CompoundAssign, not an embedded Assign.
5730         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5731         Fixes #45854.
5732
5733 2003-07-13  Martin Baulig  <martin@ximian.com>
5734
5735         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5736         work to fix bug #46088.
5737
5738 2003-07-13  Ravi Pratap <ravi@ximian.com>
5739
5740         * class.cs (Operator.Emit): Do not emit attributes here - it is
5741         taken care of by the Method class that we delegate too. This takes
5742         care of bug #45876.
5743
5744 2003-07-10  Martin Baulig  <martin@ximian.com>
5745
5746         * expression.cs (TypeOfVoid): New class.
5747         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5748
5749 2003-07-10  Martin Baulig  <martin@ximian.com>
5750
5751         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5752         bug #35957.
5753
5754 2003-07-10  Martin Baulig  <martin@ximian.com>
5755
5756         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5757         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5758
5759         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5760
5761         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5762
5763 2003-07-10  Martin Baulig  <martin@ximian.com>
5764
5765         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5766         of decimal.  Fixes #42850.
5767
5768         NOTE: I also fixed the created byte blob, but this doesn't work on
5769         the MS runtime and csc never produces any byte blobs for decimal
5770         arrays.
5771
5772 2003-07-10  Martin Baulig  <martin@ximian.com>
5773
5774         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5775         structs; fixes #32068.
5776         (Block.AddChildVariableNames): Fixed #44302.
5777
5778 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5779
5780         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5781
5782 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5783
5784         * attribute.cs: And this test is onger needed.
5785
5786 2003-07-08  Martin Baulig  <martin@ximian.com>
5787
5788         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5789         inaccessible types.  Fixes #36313.
5790
5791         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5792
5793         * namespace.cs (NamespaceEntry): Create implicit entries for all
5794         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5795         implicit entries for N1.N2 and N1.
5796
5797 2003-07-08  Martin Baulig  <martin@ximian.com>
5798
5799         Rewrote the handling of namespaces to fix a lot of the issues
5800         wrt. `using' aliases etc.
5801
5802         * namespace.cs (Namespace): Splitted this class into a
5803         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5804
5805         * typemanager.cs (TypeManager.IsNamespace): Removed.
5806         (TypeManager.ComputeNamespaces): Only compute namespaces from
5807         loaded assemblies here, not the namespaces from the assembly we're
5808         currently compiling.
5809
5810 2003-07-08  Martin Baulig  <martin@ximian.com>
5811
5812         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
5813
5814 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5815
5816         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
5817         already fixed it.  
5818
5819         I thought about the memory savings here, but LookupTypeReflection
5820         is used under already very constrained scenarios.  Compiling
5821         corlib or mcs only exposes one hit, so it would not really reduce
5822         any memory consumption.
5823
5824 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5825
5826         * typemanager.cs: fixes bug #45889 by only adding public types from
5827         other assemblies to the list of known types.
5828
5829 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5830
5831         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
5832         on the type we resolved.
5833
5834 2003-07-05  Martin Baulig  <martin@ximian.com>
5835
5836         * pending.cs (PendingImplementation.ParentImplements): Don't
5837         create the proxy if the parent is abstract.
5838
5839         * class.cs (TypeContainer.DefineIndexers): Process explicit
5840         interface implementations first.  Fixes #37714.
5841
5842 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5843
5844         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5845         defined recursively;  but since we modify the input parameters
5846         (left is set to `this' temporarily), we reset this value if the
5847         left_is_explicit is false, which gives the original semantics to
5848         the code.  
5849
5850         * literal.cs (NullPointer): new class used to represent a null
5851         literal in a pointer context.
5852
5853         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5854         type is a pointer, use a NullPointer object instead of a
5855         NullLiteral.   Closes 43687
5856
5857         (ExplicitConversion): Convert pointer values using
5858         the conv opcode to the proper type.
5859
5860         * ecore.cs (New): change ValueTypeVariable property into a method,
5861         that returns whether the valuetype is suitable for being used.
5862
5863         * expression.cs (Binary.DoNumericPromotions): Only return if we
5864         the int constant was a valid uint, and we can return both left and
5865         right as uints.  If not, we continue processing, to trigger the
5866         type conversion.  This fixes 39018.
5867
5868         * statement.cs (Block.EmitMeta): During constant resolution, set
5869         the CurrentBlock property on the emitcontext, so that we resolve
5870         constants propertly.
5871
5872 2003-07-02  Martin Baulig  <martin@ximian.com>
5873
5874         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5875         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5876
5877         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5878         than emitting it here.
5879
5880         * statement.cs: Fixed some more flow analysis bugs.
5881
5882 2003-07-02  Martin Baulig  <martin@ximian.com>
5883
5884         * class.cs (MethodData.Define): When implementing interface
5885         methods, set Final unless we're Virtual.
5886
5887         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5888         check work for interface methods.
5889
5890 2003-07-01  Martin Baulig  <martin@ximian.com>
5891
5892         * ecore.cs (EmitContext.This): Replaced this property with a
5893         GetThis() method which takes a Location argument.  This ensures
5894         that we get the correct error location for a CS0188.
5895
5896 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5897
5898         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5899         ImplicitStandardConversion.
5900
5901         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5902
5903 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5904
5905         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5906         optimization.
5907
5908 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5909
5910         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5911         constructors.
5912
5913         (MethodData.Define): Turn off initlocals for unsafe methods.
5914
5915 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5916
5917         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5918         complete;  Fixes #37521.
5919
5920         * delegate.cs: Use Modifiers.TypeAttr to compute the
5921         TypeAttributes, instead of rolling our own.  This makes the flags
5922         correct for the delegates.
5923
5924 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5925
5926         * class.cs (Constructor.Define): Set the private flag for static
5927         constructors as well.
5928
5929         * cs-parser.jay (statement_expression): Set the return value to
5930         null, to avoid a crash when we catch an error.
5931
5932 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5933
5934         * cs-parser.jay: Applied patch from Jackson that adds support for
5935         extern and unsafe modifiers to destructor declarations.
5936
5937         * expression.cs: Report error 21 if the user is trying to index a
5938         System.Array.
5939
5940         * driver.cs: Add an error message, suggested by the bug report.
5941
5942         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5943         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5944
5945 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5946
5947         * namespace.cs: Add some information to reduce FAQs.
5948
5949 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5950
5951         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5952         underlying enumeration types.  Fixes #43915.
5953
5954         * expression.cs: Treat ushort/short as legal values to be used in
5955         bitwise operations.
5956
5957 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5958
5959         * delegate.cs: transfer custom attributes for paramenters from
5960         the delegate declaration to Invoke and BeginInvoke.
5961
5962 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5963
5964         * attribute.cs: handle custom marshalers and emit marshal info
5965         for fields, too.
5966
5967 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5968
5969         * makefile.gnu: Added anonymous.cs to the compiler sources.
5970
5971 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
5972
5973         * iterators.cs: Change the name of the proxy class to include two
5974         underscores.
5975
5976         * cs-parser.jay: Update grammar to include anonymous methods.
5977
5978         * anonymous.cs: new file.
5979
5980 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
5981
5982         * class.cs (Field.Define): Add missing test for pointers and
5983         safety. 
5984
5985 2003-05-27  Ravi Pratap  <ravi@ximian.com>
5986
5987         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
5988         we use the stobj opcode.
5989
5990         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
5991         since it wasn't the correct fix. 
5992
5993         It still is puzzling that we are required to use stobj for IntPtr
5994         which seems to be a ValueType.
5995
5996 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
5997
5998         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
5999         during regular simple name resolution.   Now, the trick is that
6000         instead of returning for processing the simplename, we do a
6001         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6002         contextual lookup type).   If a match is found, return that, if
6003         not, return for further composition.
6004
6005         This fixes long-standing 30485.
6006
6007         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6008         using the address to initialize an object, do an Stobj instead of
6009         using the regular Stelem.
6010
6011         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6012         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6013         Because if we are a BaseIndexerAccess that value will be true.
6014         Fixes 43643.
6015
6016         * statement.cs (GotoCase.Resolve): Return after reporting an
6017         error, do not attempt to continue. 
6018
6019         * expression.cs (PointerArithmetic.Emit): If our operand is a
6020         long, convert our constants to match the operand before
6021         multiplying.  Convert to I type before adding.   Fixes 43670.
6022
6023 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6024
6025         * enum.cs (ImplicitConversionExists) : Rename to
6026         ImplicitEnumConversionExists to remove ambiguity. 
6027
6028         * ecore.cs (NullCast): New type of cast expression class which
6029         basically is very similar to EmptyCast with the difference being
6030         it still is a constant since it is used only to cast a null to
6031         something else
6032         (eg. (string) null)
6033
6034         * convert.cs (ImplicitReferenceConversion): When casting a null
6035         literal, we return a NullCast.
6036
6037         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6038         should be around anymore.
6039
6040         The renaming (reported was slightly wrong). Corrections:
6041
6042         ConvertImplicitStandard -> ImplicitConversionStandard
6043         ConvertExplicitStandard -> ExplicitConversionStandard
6044
6045         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6046         before passing them in !
6047
6048         * convert.cs (ImplicitConversionStandard): When comparing for
6049         equal expr and target types, ensure that expr is not a
6050         NullLiteral.
6051
6052         In general, we must not be checking (expr_type ==
6053         target_type) in the top level conversion methods
6054         (ImplicitConversion, ExplicitConversion etc). This checking is
6055         done in the methods that they delegate to.
6056
6057 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6058
6059         * convert.cs: Move Error_CannotConvertType,
6060         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6061         ImplicitNumericConversion, ImplicitConversionExists,
6062         ImplicitUserConversionExists, StandardConversionExists,
6063         FindMostEncompassedType, FindMostSpecificSource,
6064         FindMostSpecificTarget, ImplicitUserConversion,
6065         ExplicitUserConversion, GetConversionOperators,
6066         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6067         TryImplicitIntConversion, Error_CannotConvertImplicit,
6068         ConvertImplicitRequired, ConvertNumericExplicit,
6069         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6070         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6071         its own file.
6072
6073         Perform the following renames:
6074
6075         StandardConversionExists -> ImplicitStandardConversionExists
6076         ConvertImplicit -> ImplicitConversion
6077         ConvertImplicitStandard -> ImplicitStandardConversion
6078         TryImplicitIntConversion -> ImplicitIntConversion
6079         ConvertImplicitRequired -> ImplicitConversionRequired
6080         ConvertNumericExplicit -> ExplicitNumericConversion
6081         ConvertReferenceExplicit -> ExplicitReferenceConversion
6082         ConvertExplicit -> ExplicitConversion
6083         ConvertExplicitStandard -> ExplicitStandardConversion
6084
6085 2003-05-19  Martin Baulig  <martin@ximian.com>
6086
6087         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6088         (TypeInfo): Added support for structs having structs as fields.
6089
6090         * ecore.cs (FieldExpr): Implement IVariable.
6091         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6092         VariableInfo for the field.
6093
6094 2003-05-18  Martin Baulig  <martin@ximian.com>
6095
6096         * expression.cs (This.DoResolve): Report a CS0027 if we're
6097         emitting a field initializer.
6098
6099 2003-05-18  Martin Baulig  <martin@ximian.com>
6100
6101         * expression.cs (This.ResolveBase): New public function.
6102         (This.DoResolve): Check for CS0188.
6103
6104         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6105         This.Resolve().
6106
6107         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6108         `instance_expression' to null if we don't have any non-static
6109         methods.
6110
6111 2003-05-18  Martin Baulig  <martin@ximian.com>
6112
6113         Reworked the way how local variables and parameters are handled by
6114         the flow analysis code.
6115
6116         * statement.cs (TypeInfo, VariableMap): New public classes.
6117         (VariableInfo): New public class.  This is now responsible for
6118         checking whether a variable has been assigned.  It is used for
6119         parameters and local variables.
6120         (Block.EmitMeta): Take the InternalParameters as argument; compute
6121         the layout of the flow vectors here.
6122         (Block.LocalMap, Block.ParameterMap): New public properties.
6123         (FlowBranching): The .ctor doesn't get the InternalParameters
6124         anymore since Block.EmitMeta() now computes the layout of the flow
6125         vector.
6126         (MyStructInfo): This class is now known as `StructInfo' and nested
6127         in `TypeInfo'; we don't access this directly anymore.
6128
6129         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6130         property and removed IsAssigned(), IsFieldAssigned(),
6131         SetAssigned() and SetFieldAssigned(); we now call them on the
6132         VariableInfo so we don't need to duplicate this code everywhere.
6133
6134         * expression.cs (ParameterReference): Added `Block block' argument
6135         to the .ctor.
6136         (LocalVariableReference, ParameterReference, This): The new
6137         VariableInfo class is now responsible for all the definite
6138         assignment stuff.
6139
6140         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6141         IsParameterAssigned, SetParameterAssigned): Removed.
6142
6143 2003-05-18  Martin Baulig  <martin@ximian.com>
6144
6145         * typemanager.cs (InitCoreTypes): Try calling
6146         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6147         the 3-args-version.  Corlib now also needs our `void_type'.
6148         (GetMethod): Added overloaded version which takes an optional
6149         `bool report_errors' to allow lookups of optional methods.
6150
6151 2003-05-12  Martin Baulig  <martin@ximian.com>
6152
6153         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6154         only used for locals and not for parameters.
6155
6156 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6157
6158         * support.cs (InternalParameters.ParameterType): Return the
6159         ExternalType of the parameter.
6160
6161         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6162         they were unused.
6163
6164 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6165
6166         * class.cs (MethodData.Define): Do not set the `newslot' on
6167         interface members, if they are also flagged as "override".
6168
6169         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6170         better code for ++i and i++.  This only works for static fields
6171         and local variables.
6172
6173         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6174         want to pull the DeclSpace out of the builder_to_declspace instead
6175         of the TypeBuilder (like in TypeContainer.FindMembers).
6176
6177         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6178         instead of LookupTypeContainer.  Fixes the crash on .NET for
6179         looking up interface members.
6180
6181         * const.cs: Create our own emit context during the Definition
6182         stage, so that constants are evaluated in the proper context, when
6183         a recursive definition happens.
6184
6185 2003-05-11  Martin Baulig  <martin@ximian.com>
6186
6187         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6188         new block for a switch section.
6189         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6190         the adding/lookup in the switch block.  Fixes #39828.
6191
6192 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6193
6194         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6195         functionality: I needed to convert the data after I had performed
6196         the add/sub operation into the operands type size.
6197
6198         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6199         pass the type for the box operation, otherwise the resulting
6200         object would have been of type object.
6201
6202         (BoxedCast): Add constructor to specify the type to box as.
6203
6204 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6205
6206         * iterators.cs: I was reusing the `count' variable inadvertently,
6207         take steps to not allow this to happen.
6208
6209 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6210
6211         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6212         by creating an array at the point where the params starts and
6213         putting all those arguments there, then adjusting the size of the
6214         array.
6215
6216 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6217
6218         * expression.cs (New.AddressOf): Implement interface
6219         IMemoryLocation.  This is used when the `new' operator is used in
6220         the context of an invocation to a method on a value type.
6221
6222         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6223         example. 
6224
6225         * namespace.cs: Also check the using aliases here.
6226
6227         * driver.cs: Move the test for using validity after the types have
6228         been entered, so we do a single pass that also includes the using
6229         aliases. 
6230
6231         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6232         in the regular case.   CreateSiblingForFinally is doing extra
6233         error checking.
6234
6235         * attribute.cs (GetAttributeArgumentExpression): Store the result
6236         on an out value, and use the return value to indicate failure
6237         instead of using null (which is a valid return for Constant.GetValue).
6238
6239         * statement.cs: Perform the analysis flow for the increment
6240         portion after the statement, because this will be the real flow of
6241         execution.  Fixes #42385
6242
6243         * codegen.cs (EmitContext.EmitArgument,
6244         EmitContext.EmitStoreArgument): New helper functions when the
6245         RemapToProxy flag is set.
6246
6247         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6248         function.
6249
6250         Add support for remapping parameters. 
6251
6252         * iterators.cs: Propagate parameter values;  Store parameter
6253         values in the proxy classes.
6254
6255 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6256
6257         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6258         need a proxy reference;  I do not know what I was thinking
6259
6260         * cs-parser.jay (constructor_initializer): catch another error,
6261         and display nice message.
6262
6263         (field_declaration): catch void field declaration
6264         to flag a better error. 
6265
6266         * class.cs (MemberBase.CheckBase): Report an error instead of a
6267         warning if a new protected member is declared in a struct. 
6268         (Field.Define): catch the error of readonly/volatile.
6269
6270         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6271
6272         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6273         volatile variable is taken
6274
6275 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6276
6277         * statement.cs (Fixed.Resolve): Report an error if we are not in
6278         an unsafe context.
6279
6280 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6281
6282         * typemanager.cs: reuse the code that handles type clashes for
6283         delegates and enumerations.
6284
6285         * class.cs (Report28): Always report.
6286
6287         * expression.cs (EncodeAsAttribute): Allow nulls here.
6288
6289 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6290
6291         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6292         the functionality for testing whether an expression is valid for
6293         an attribute here.  Also handle the case of arrays of elements
6294         being stored. 
6295
6296         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6297         encoding a linear array into an array of objects that are suitable
6298         to be passed to an CustomAttributeBuilder.
6299
6300         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6301
6302         * ecore.cs: (FieldExpr): Handle field remapping here.
6303
6304         * iteratators.cs: Pass the instance variable (if the method is an
6305         instance method) to the constructors, so we can access the field
6306         variables on the class.
6307
6308         TODO: Test this with structs.  I think the THIS variable on
6309         structs might have to be a pointer, and not a refenrece
6310
6311 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6312
6313         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6314         local variables to fields in a proxy class.
6315
6316         * iterators.cs (PopulateProxy): Rename our internal fields to
6317         <XXX>.  
6318         Create a <THIS> field if we are an instance method, so we can
6319         reference our parent container variables.
6320         (MapVariable): Called back from the EmitContext code to enter a
6321         new variable to field mapping into the proxy class (we just create
6322         a FieldBuilder).
6323
6324         * expression.cs
6325         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6326         for using the remapped locals to fields.
6327
6328         I placed the code here, because that gives the same semantics to
6329         local variables, and only changes the Emit code.
6330
6331         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6332         statements inside iterators.
6333         (VariableInfo): Add a FieldBuilder for the cases when we are
6334         remapping local variables to fields in a proxy class
6335
6336         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6337         current_block != null.
6338
6339         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6340         not cope with strings, as it has been moved to the
6341         TableSwitchEmit.  Fixed bug in switch generation.
6342
6343         * expression.cs (New.DoResolve): Provide more context for the user
6344         when reporting an error.
6345
6346         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6347         pointers. 
6348
6349         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6350         check the permissions for it.  Note than in a type-resolution
6351         context the check was already present in DeclSpace.ResolveType,
6352         but was missing from the MemberAccess.
6353
6354         (ArrayCreation.CheckIndices): warn if the user has
6355         more nested levels of expressions, but there are no more
6356         dimensions specified.  Avoids crash on bug 41906.
6357
6358 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6359
6360         * statement.cs (Block): replace Implicit bool, for a generic
6361         flags.   
6362         New flag: `Unchecked'.  This is used during the EmitMeta phase
6363         (which is out-of-line with the regular Resolve/Emit process for a
6364         statement, as this is done ahead of time, but still gets a chance
6365         to call constant resolve).
6366
6367         (Block.Flags): new enum for adding a new flag.
6368
6369         (Block.EmitMeta): track the state of unchecked.
6370
6371         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6372         to enable constant resolution to work there as well.
6373
6374 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6375
6376         * typemanager.cs (ienumerable_type): Also look up
6377         System.Collections.IEnumerable. 
6378
6379 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6380
6381         TODO: Test more than one conditional per method.
6382
6383         * class.cs (Indexer.Define): Report the location where the user is
6384         referencing the unsupported feature.
6385
6386         (MethodData): Overload the use of `conditionals' to
6387         minimize the creation of needless ArrayLists.   This saves roughly
6388         212kb on my machine.
6389
6390         (Method): Implement the new IIteratorContainer interface.
6391         (Method.SetYields): Implement the method by setting the ModFlags
6392         to contain METHOD_YIELDS.
6393
6394         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6395         which just got set to null.
6396
6397         * iterators.cs: New file.
6398
6399         (Yield, YieldBreak): New statements.
6400
6401         * statement.cs (Return.Resolve): Flag an error if we are used in
6402         an iterator method.
6403
6404         * codegen.cs (InIterator): New flag set if the code is being
6405         compiled in an iterator method.
6406
6407         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6408         internal modifier, and we just use it to avoid adding extra
6409         fields, as this is seldom used.  
6410
6411         * cs-parser.jay: Add yield_statement (yield and yield break).
6412
6413         * driver.cs: New flag -v2 to turn on version 2 features. 
6414
6415         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6416         hashtable when v2 is enabled.
6417
6418 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6419
6420         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6421         there is already a namespace defined with this name.
6422
6423         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6424         people upgraded their corlibs.
6425
6426         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6427         always use fully qualified types, no need to use the compiler
6428         front end.
6429
6430         (TypeManager.IsNamespace): Use binarysearch.
6431
6432         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6433         AddDelegate): I did not quite use the new IsValid API properly: I
6434         have to pass the short-name and the fullname.  I was passing only
6435         the basename instead of the fullname sometimes. 
6436
6437         (TypeContainer.DefineType): call NamespaceClash.
6438
6439         * interface.cs (Interface.DefineType): use NamespaceClash before
6440         defining the type.
6441
6442         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6443         defining the type.
6444
6445         * enum.cs: (Enum.DefineType): use NamespaceClash before
6446         defining the type.
6447
6448         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6449         speed increase.  First, use the negative_hits cache when we get a
6450         negative.  Second, add the type with its full original name
6451         instead of the new . and + encoded name (reflection uses + to
6452         separate type from a nested type).  Use LookupTypeReflection
6453         directly which bypasses the type->name hashtable (that we already
6454         know does not contain the type.
6455
6456         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6457         location/container type. 
6458
6459         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6460
6461 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6462
6463         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6464
6465         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6466         method is being referenced in the method group from a static
6467         context, and report error 120 if so.
6468
6469         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6470         Error118. 
6471
6472         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6473         is created, we create the A namespace).
6474
6475         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6476         Fixes #41591
6477
6478 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6479
6480         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6481         invocation to ModuleBuilder.GetType with the same values will
6482         return a new type instance, so we need to cache its return
6483         values. 
6484
6485         * expression.cs (Binary.ResolveOperator): Only allow the compare
6486         operators on enums if they are of the same type.
6487
6488         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6489         types of ValueType on their own case.  Before we were giving them
6490         the same treatment as objects.
6491
6492         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6493         fullname.  Short name is used to compare against container name.
6494         Fullname is used to check against defined namespace names.
6495
6496         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6497         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6498
6499         (Method.CheckBase): Call parent.
6500         (MemberBase.CheckBase): Check for protected members on sealed
6501         classes.
6502         (PropertyBase.CheckBase): Call parent.
6503         (Field.Define): Call parent.
6504
6505         * report.cs: Negative error codes are now mapped to 8000 - code,
6506         so that the display is render more nicely.
6507
6508         * typemanager.cs: Do not use try/catch, instead report a regular
6509         error. 
6510
6511         (GetPointerType, GetReferenceType): These methods provide
6512         mechanisms to obtain the T* and T& from a T.  We had the code
6513         previously scattered around the code base, and it also used
6514         TypeManager.LookupType that would go through plenty of caches.
6515         This one goes directly to the type source.
6516
6517         In some places we did the Type.GetType followed by
6518         ModuleBuilder.GetType, but not in others, so this unifies the
6519         processing as well.
6520
6521         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6522         statements now that we have namespace information.
6523
6524         * typemanager.cs (IsNamespace): New method, returns whether the
6525         string presented is a namespace or not.
6526
6527         (ComputeNamespaces): New public entry point, computes the list of
6528         available namespaces, using the GetNamespaces API call in Mono, or
6529         the slower version in MS.NET.   
6530
6531         Now before we start the semantic analysis phase, we have a
6532         complete list of namespaces including everything that the user has
6533         provided.
6534
6535         Deleted old code to cache namespaces in .nsc files.
6536
6537 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6538
6539         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6540         class/struct location definition Location for the implicit
6541         constructor location.
6542
6543         (Operator.Define): Use the location of the operator for the
6544         implicit Method definition.
6545
6546         (Constructor.Emit): use the constructor location for the implicit
6547         base initializer constructor.
6548
6549         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6550         and the Expression class now contains two new methods:
6551
6552         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6553         isolate type lookup from the rest of the resolution process.
6554
6555         Since we use Expressions to hold type definitions due to the way
6556         we parse the input we have historically overloaded Resolve to
6557         perform the Type lookups if a special flag is passed.  Now this is
6558         eliminated and two methods take their place. 
6559
6560         The differences in the two methods between xStep and xTerminal is
6561         that xStep is involved in our current lookup system that uses
6562         SimpleNames to compose a name, while xTerminal is used just to
6563         catch the case where the simplename lookup failed.
6564
6565 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6566
6567         * expression.cs (ResolveMemberAccess): Remove redundant code.
6568         TypeExpr expressions are always born fully resolved.
6569
6570         * interface.cs (PopulateMethod): Do not lookup the types twice.
6571         We were doing it once during SemanticAnalysis and once during
6572         PopulateMethod.
6573
6574         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6575         in local variable type definitions, were being returned as a
6576         SimpleName (we decomposed everything into a string), that is
6577         because primary_expression was being used instead of a type in the
6578         grammar (reduce/reduce conflicts).
6579
6580         The part that was wrong is that we converted the expression into a
6581         string (an oversimplification in one hand, compounded with primary
6582         expressions doing string concatenation).
6583
6584         So things like:
6585
6586         A.B.C [] x;
6587
6588         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6589         using clauses from working on this particular context.  And a type
6590         was being matched directly against "A.B.C[]".
6591
6592         We now use the correct approach, and allow for ComposedCast to be
6593         part of the unary expression.  So the "A.B.C []" become a composed
6594         cast of "A.B.C" (as a nested group of MemberAccess with a
6595         SimpleName at the end) plus the rank composition "[]". 
6596
6597         Also fixes 35567
6598
6599 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6600
6601         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6602         for the access level checking.
6603
6604         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6605         `TypeContainer container', because I kept getting confused when I
6606         was debugging this code.
6607
6608         * expression.cs (Indexers): Instead of tracking getters/setters,
6609         we now track them in parallel.  We create one arraylist less, but
6610         most importantly it is possible now for the LValue code to find a
6611         matching get for a set.
6612
6613         (IndexerAccess.DoResolveLValue): Update the code.
6614         GetIndexersForType has been modified already to extract all the
6615         indexers from a type.  The code assumed it did not.
6616
6617         Also make the code set the correct return type for the indexer.
6618         This was fixed a long time ago for properties, but was missing for
6619         indexers.  It used to be void_type.
6620
6621         (Binary.Emit): Test first for doubles instead of
6622         floats, as they are more common.
6623
6624         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6625         when dealing with floats and the <=, >= operators.  This fixes bug
6626         #39314 
6627
6628         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6629         to load the array value by emitting a load on the foreach variable
6630         type.  This was incorrect.  
6631
6632         We now emit the code to load an element using the the array
6633         variable type, and then we emit the conversion operator.
6634
6635         Fixed #40176
6636
6637 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6638
6639         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6640
6641 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6642
6643         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6644         test for protection before we test for signatures. 
6645
6646         (MethodSignature.ToString): implement.
6647
6648         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6649         to the case where we reduced into a LongConstant.
6650
6651         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6652         depend on whether the information is acurrate, because the
6653         Microsoft runtime will always claim that the array type is public,
6654         regardless of the real state.
6655
6656         If the type is a pointer, another problem happens: the type is
6657         reported as non-public in Microsoft.  
6658
6659         In both cases we have to call CheckAccessLevel recursively with
6660         the underlying type as the argument to be tested.
6661
6662 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6663
6664         * assign.cs (Assign.Emit): If we are dealing with a compound
6665         assignment expression, we should use the code path that stores the
6666         intermediate result in a temporary value.  This fixes #40903.
6667
6668         *expression.cs (Indirection.ToString): Provide ToString method for
6669         debugging. 
6670
6671 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6672
6673         * class.cs: Null out fields holding references to Block objects so
6674         they can be garbage collected.
6675
6676         * expression.cs (OverloadResolve): Remove unused local.
6677
6678 2003-04-07  Martin Baulig  <martin@ximian.com>
6679
6680         * codegen.cs (EmitContext.CurrentFile): New public field.
6681         (EmitContext.Mark): Use the CurrentFile to check whether the
6682         location is in the correct file.
6683         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6684
6685 2003-04-07  Martin Baulig  <martin@ximian.com>
6686
6687         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6688
6689         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6690         location.  [FIXME: The location argument which gets passed to this
6691         method is sometimes wrong!]
6692
6693 2003-04-07  Nick Drochak <ndrochak@gol.com>
6694
6695         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6696
6697 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6698
6699         * expression.cs (Indirection.EmitAssign): We were using the
6700         temporary, but returning immediately instead of continuing the
6701         EmitAssing flow.
6702
6703 2003-04-06  Martin Baulig  <martin@ximian.com>
6704
6705         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6706         if it's a nested child, but also deriving from the outer class.
6707         See test 190.cs.
6708
6709         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6710         nested child, but also deriving from the outer class.  See
6711         test-190.cs.
6712         (FilterWithClosure): We may access private members of the outer
6713         class if we're a nested child and deriving from the outer class.
6714         (RealMemberLookup): Only set `closure_private_ok' if the
6715         `original_bf' contained BindingFlags.NonPublic.
6716
6717 2003-04-05  Martin Baulig  <martin@ximian.com>
6718
6719         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
6720         probe if its a type parameter, and if so, flag an error.
6721
6722         * decl.cs: Move here the SetParameterInfo code from class.cs.
6723         Handle IsGeneric here.
6724
6725         Handle a variety of errors in the parameter info definition.
6726
6727         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
6728         type parameters here.
6729
6730         * cs-parser.jay (class_declaration): report errors for parameters
6731         here as well.
6732
6733 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
6734
6735         * generic.cs: New file, contains support code for generics.
6736
6737         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
6738         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
6739
6740         Update parser for the above removals.
6741
6742         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
6743         now taken care of in the parser.
6744
6745 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6746
6747         * class.cs (Event.Define): Do not allow abstract events to have
6748         initializers. 
6749
6750 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6751
6752         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6753         block in event declarations.
6754
6755         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6756         value type, get its address.
6757
6758         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6759         leaving a class on the stack instead of a boolean value (int
6760         0/1).  Change the code so we compare against null, and then the
6761         result against zero.
6762
6763         * class.cs (TypeContainer.GetClassBases): We were checking for the
6764         parent class being sealed too late.
6765
6766         * expression.cs (Binary.Emit): For <= and >= when dealing with
6767         floating point values, use cgt.un and clt.un instead of cgt and
6768         clt alone.
6769
6770 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6771
6772         * statement.cs: Apply the same optimization as MS: skip the 
6773         GetEnumerator returning an IEnumerator, and use the one returning a 
6774         CharEnumerator instead. This allows us to avoid the try-finally block 
6775         and the boxing.
6776
6777 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6778
6779         * cs-parser.jay: Attributes cannot be applied to
6780                          namespaces. Fixes #40473
6781
6782 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6783
6784         * class.cs:
6785         (Add*): check if the name is valid using the full name for constants,
6786         fields, properties and events.
6787
6788 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6789
6790         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6791         char constants to be part of the enumeration.
6792
6793         * expression.cs (Conditional.DoResolve): Add support for operator
6794         true. Implements the missing functionality from 14.12
6795
6796         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6797         operator true/false as required by the spec.
6798
6799         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6800         implicit conversion to boolean.
6801
6802         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6803         also one where the type implements `operator true'. 
6804
6805         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6806         get an expression that will invoke operator true based on an
6807         expression.  
6808
6809         (GetConversionOperators): Removed the hack that called op_True
6810         here.  
6811
6812         (Expression.ResolveBoolean): Move this from Statement.
6813
6814 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6815
6816         * ecore.cs (FieldExpr): do not allow initialization of initonly
6817         fields on derived classes
6818
6819 2003-03-13  Martin Baulig  <martin@ximian.com>
6820
6821         * statement.cs (Block.Emit): Call ig.BeginScope() and
6822         ig.EndScope() when compiling with debugging info; call
6823         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6824
6825 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6826
6827         * expression.cs (Indexers): Do not construct immediately, allow
6828         for new members to be appended as we go.  Fixes 38143
6829
6830 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6831
6832         * expression.cs: save/restore context when resolving an unchecked
6833         expression.
6834
6835 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6836
6837         * cfold.cs: Catch division by zero in modulus operator during
6838         constant folding.
6839
6840 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
6841
6842         * interface.cs (Interface.DefineMembers): Avoid defining members
6843         twice. 
6844
6845 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
6846
6847         * driver.cs: handle the +/- options for -noconfig
6848
6849         * statement.cs (Unckeched.Resolve): Also track the state of
6850         unchecked in the Resolve phase.
6851
6852 2003-02-27  Martin Baulig  <martin@ximian.com>
6853
6854         * ecore.cs (Expression.MemberLookup): Don't create a
6855         MethodGroupExpr for something which is not a method.  Fixes #38291.
6856
6857 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6858
6859         * class.cs (MemberBase.CheckParameters): Also check that the type
6860         is unmanaged if it is a pointer.
6861
6862         * expression.cs (SizeOf.Resolve): Add location information.
6863
6864         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6865         a managed type is declared.
6866
6867         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6868         parameter modifiers as well.  Fixes bug 38606
6869
6870         * class.cs: Very sad.  Am backing out the speed up changes
6871         introduced by the ArrayList -> Array in the TypeContainer, as they
6872         were not actually that much faster, and introduced a bug (no error
6873         reports on duplicated methods).
6874
6875         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6876         source first, this will guarantee that we have a valid expression
6877         before calling in lower levels functions that will require a
6878         resolved object.  Then use this original_source in the
6879         target.ResolveLValue instead of the original source that was
6880         passed to us.
6881
6882         Another change.  Use target.Resolve instead of LValueResolve.
6883         Although we are resolving for LValues, we will let the Assign code
6884         take care of that (it will be called again from Resolve).  This
6885         basically allows code like this:
6886
6887         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6888         class Y { void A (X x) { x [0] += o; }
6889
6890         The problem was that the indexer was trying to resolve for
6891         set_Item (idx, object o) and never finding one.  The real set_Item
6892         was set_Item (idx, X).  By delaying the process we get the right
6893         semantics. 
6894
6895         Fixes bug 36505
6896
6897 2003-02-23  Martin Baulig  <martin@ximian.com>
6898
6899         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6900         while calling DoEmit ().
6901
6902         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6903         source files; if you use the #line directive inside a method, the
6904         compiler stops emitting line numbers for the debugger until it
6905         reaches the end of the method or another #line directive which
6906         restores the original file.
6907
6908 2003-02-23  Martin Baulig  <martin@ximian.com>
6909
6910         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6911
6912 2003-02-23  Martin Baulig  <martin@ximian.com>
6913
6914         * statement.cs (Block.AddChildVariableNames): We need to call this
6915         recursively, not just for our immediate children.
6916
6917 2003-02-23  Martin Baulig  <martin@ximian.com>
6918
6919         * class.cs (Event.Define): Always make the field private, like csc does.
6920
6921         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6922         actually work, fixes bug #37521.
6923
6924 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6925
6926         * delegate.cs: When creating the various temporary "Parameters"
6927         classes, make sure that we call the ComputeAndDefineParameterTypes
6928         on those new parameters (just like we do with the formal ones), to
6929         allow them to be resolved in the context of the DeclSpace.
6930
6931         This fixes the bug that Dick observed in Bugzilla #38530.
6932
6933 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6934
6935         * expression.cs (ResolveMemberAccess): When resolving a constant,
6936         do not attempt to pull a constant if the value was not able to
6937         generate a valid constant.
6938
6939         * const.cs (LookupConstantValue): Do not report more errors than required.
6940
6941 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6942
6943         * expression.cs: fixes bug #38328.
6944
6945 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6946
6947         * class.cs: Changed all the various members that can be part of a
6948         class from being an ArrayList to be an Array of the right type.
6949         During the DefineType type_list, interface_list, delegate_list and
6950         enum_list are turned into types, interfaces, delegates and enums
6951         arrays.  
6952
6953         And during the member population, indexer_list, event_list,
6954         constant_list, field_list, instance_constructor_list, method_list,
6955         operator_list and property_list are turned into their real arrays.
6956
6957         Although we could probably perform this operation earlier, for
6958         good error reporting we need to keep the lists and remove the
6959         lists for longer than required.
6960
6961         This optimization was triggered by Paolo profiling the compiler
6962         speed on the output of `gen-sample-program.pl' perl script. 
6963
6964         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6965         not crash in methods like MemberLookupFailed that use this field.  
6966
6967         This problem arises when the compiler fails to resolve a type
6968         during interface type definition for example.
6969
6970 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6971
6972         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
6973         inherit from System.Object, so we have to stop at null, not only
6974         when reaching System.Object.
6975
6976 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
6977
6978         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
6979         DeclaredOnly because the parent indexer might have had a different
6980         name, but did not loop until the top of the hierarchy was reached.
6981
6982         The problem this one fixes is 35492: when a class implemented an
6983         indexer from an interface, we were getting the interface method
6984         (which was abstract) and we were flagging an error (can not invoke
6985         abstract method).
6986
6987         This also keeps bug 33089 functioning, and test-148 functioning.
6988
6989         * typemanager.cs (IsSpecialMethod): The correct way of figuring
6990         out if a method is special is to see if it is declared in a
6991         property or event, or whether it is one of the predefined operator
6992         names.   This should fix correctly #36804.
6993
6994 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
6995
6996         The goal here is to remove the dependency on EmptyCast.Peel ().
6997         Killing it completely.
6998
6999         The problem is that currently in a number of places where
7000         constants are expected, we have to "probe" for an EmptyCast, and
7001         Peel, which is not the correct thing to do, as this will be
7002         repetitive and will likely lead to errors. 
7003
7004         The idea is to remove any EmptyCasts that are used in casts that
7005         can be reduced to constants, so we only have to cope with
7006         constants. 
7007
7008         This bug hunt was triggered by Bug 37363 and the desire to remove
7009         the duplicate pattern where we were "peeling" emptycasts to check
7010         whether they were constants.  Now constants will always be
7011         constants.
7012
7013         * ecore.cs: Use an enumconstant here instead of wrapping with
7014         EmptyCast.  
7015
7016         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7017         throwing me off.  By handling this we can get rid of a few hacks.
7018
7019         * statement.cs (Switch): Removed Peel() code.
7020
7021 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7022
7023         * class.cs: Location information for error 508
7024
7025         * expression.cs (New.DoResolve): Add a guard against double
7026         resolution of an expression.  
7027
7028         The New DoResolve might be called twice when initializing field
7029         expressions (see EmitFieldInitializers, the call to
7030         GetInitializerExpression will perform a resolve on the expression,
7031         and later the assign will trigger another resolution
7032
7033         This leads to bugs (#37014)
7034
7035         * delegate.cs: The signature for EndInvoke should contain any ref
7036         or out parameters as well.  We were not doing this in the past. 
7037
7038         * class.cs (Field.Define): Do not overwrite the type definition
7039         inside the `volatile' group.  Turns out that volatile enumerations
7040         were changing the type here to perform a validity test, which
7041         broke conversions. 
7042
7043 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7044
7045         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7046         and structs, we do not want to load the instance variable
7047
7048         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7049         enum_type has to be handled like an object reference (implicit
7050         conversions exists from this to object), but the regular IsClass
7051         and IsValueType tests will never return true for this one.
7052
7053         Also we use TypeManager.IsValueType instead of type.IsValueType,
7054         just for consistency with the rest of the code (this is only
7055         needed if we ever use the construct exposed by test-180.cs inside
7056         corlib, which we dont today).
7057
7058 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7059
7060         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7061         just InternalCall.
7062
7063 2003-02-09  Martin Baulig  <martin@ximian.com>
7064
7065         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7066         (Namespace.DefineNamespaces): New static public method; this is
7067         called when we're compiling with debugging to add all namespaces
7068         to the symbol file.
7069
7070         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7071         pass it to the Namespace's .ctor.
7072
7073         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7074         and MethodBase arguments; pass the namespace ID to the symwriter;
7075         pass the MethodBase instead of the token to the symwriter.
7076         (SymbolWriter.DefineNamespace): New method to add a namespace to
7077         the symbol file.
7078
7079 2003-02-09  Martin Baulig  <martin@ximian.com>
7080
7081         * symbolwriter.cs: New file.  This is a wrapper around
7082         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7083         methods here in near future.
7084
7085 2003-02-09  Martin Baulig  <martin@ximian.com>
7086
7087         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7088         ILGenerator.MarkSequencePoint() which are actually used by the
7089         symbol writer.
7090
7091 2003-02-09  Martin Baulig  <martin@ximian.com>
7092
7093         * location.cs (SourceFile): New public sealed class.  This
7094         contains the name and an index which is used in the location's token.
7095         (Location): Reserve an appropriate number of bits in the token for
7096         the source file instead of walking over that list, this gives us a
7097         really huge performance improvement when compiling with debugging.
7098
7099         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7100         `SourceFile' argument instead of a string.
7101         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7102         but don't parse/tokenize here, we need to generate the list of all
7103         source files before we do that.
7104         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7105         the files.
7106
7107         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7108         instead of a string.
7109
7110         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7111         of a string.
7112
7113 2003-02-09  Martin Baulig  <martin@ximian.com>
7114
7115         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7116         filename on `#line default'.
7117
7118 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7119
7120         * statement.cs: don't clear the pinned var when the fixed statement
7121         returns from the method (fixes bug#37752).
7122
7123 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7124
7125         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7126         to IsValueType.
7127
7128 2003-02-07  Martin Baulig  <martin@ximian.com>
7129
7130         * driver.cs: Removed the `--debug-args' command line argument.
7131
7132         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7133         automatically by the AsssemblyBuilder.
7134         (CodeGen.InitializeSymbolWriter): We don't need to call any
7135         initialization function on the symbol writer anymore.  This method
7136         doesn't take any arguments.
7137
7138 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7139
7140         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7141         from referenced assemblies as well.
7142
7143 2003-02-02  Martin Baulig  <martin@ximian.com>
7144
7145         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7146
7147 2003-02-02  Martin Baulig  <martin@ximian.com>
7148
7149         * class.cs (Constructor.Emit): Open the symbol writer before
7150         emitting the constructor initializer.
7151         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7152         single-stepping through constructor initializers.
7153
7154 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7155
7156         * class.cs: Handle error 549: do not allow virtual methods in
7157         sealed classes. 
7158
7159 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7160
7161         * decl.cs: Check access levels when resolving types
7162
7163 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7164
7165         * statement.cs: Add parameters and locals set in catch blocks that might 
7166         return to set vector
7167
7168 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7169
7170         * class.cs (Operator): Set the SpecialName flags for operators.
7171
7172         * expression.cs (Invocation.DoResolve): Only block calls to
7173         accessors and operators on SpecialName methods.
7174
7175         (Cast.TryReduce): Handle conversions from char constants.
7176
7177
7178 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7179
7180         * statement.cs: small memory and time optimization in FlowBranching.
7181
7182 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7183
7184         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7185         problem that the last fix but in the other sid (Set).
7186
7187         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7188         access when there is no indexer in the hierarchy.
7189
7190 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7191
7192         * class.cs: Combine some if statements.
7193
7194 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7195
7196         * driver.cs: fixed bug #37187.
7197
7198 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7199
7200         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7201         any indexer, it's needed to build a list with all the indexers in the
7202         hierarchy (AllGetters), else we have problems. Fixes #35653.
7203
7204 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7205
7206         * class.cs (MethodData.Define): It is wrong for an interface
7207         implementation to be static in both cases: explicit and implicit.
7208         We were only handling this in one case.
7209
7210         Improve the if situation there to not have negations.
7211
7212         * class.cs (Field.Define): Turns out that we do not need to check
7213         the unsafe bit on field definition, only on usage.  Remove the test.
7214
7215 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7216
7217         * driver.cs: use assembly.Location instead of Codebase (the latest
7218         patch made mcs fail when using MS assemblies).
7219
7220 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7221
7222         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7223         get the path to *corlib.dll.
7224
7225 2003-01-21  Nick Drochak <ndrochak@gol.com>
7226
7227         * cs-tokenizer.cs:
7228         * pending.cs:
7229         * typemanager.cs: Remove compiler warnings
7230
7231 2003-01-20  Duncan Mak  <duncan@ximian.com>
7232
7233         * AssemblyInfo.cs: Bump the version number to 0.19.
7234
7235 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7236
7237         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7238
7239 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7240
7241         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7242
7243 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7244
7245         * cs-parser.jay: Small fix: we were not comparing the constructor
7246         name correctly.   Thanks to Zoltan for the initial pointer.
7247
7248 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7249
7250         * cs-tokenizer.cs: Set file name when specified with #line
7251
7252 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7253
7254         * cs-parser.jay: Only perform the constructor checks here if we
7255         are named like the class;  This will help provider a better
7256         error.  The constructor path is taken when a type definition is
7257         not found, but most likely the user forgot to add the type, so
7258         report that rather than the constructor error.
7259
7260 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7261
7262         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7263         allocations.
7264
7265 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7266
7267         * cs-parser.jay: Add cleanup call.
7268
7269 2003-01-13  Duncan Mak  <duncan@ximian.com>
7270
7271         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7272         consistent with other methods.
7273
7274 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7275
7276         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7277
7278 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7279
7280         * attribute.cs: only set GuidAttr to true when we have a
7281         GuidAttribute.
7282
7283 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7284
7285         * ecore.cs:
7286         * expression.cs:
7287         * typemanager.cs: fixes to allow mcs compile corlib with the new
7288         Type.IsSubclassOf fix.
7289
7290 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7291
7292         * expression.cs (LocalVariableReference.DoResolve): Classify a
7293         constant as a value, not as a variable.   Also, set the type for
7294         the variable.
7295
7296         * cs-parser.jay (fixed_statement): take a type instead of a
7297         pointer_type, so we can produce a better error message later.
7298
7299         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7300         as an error.  
7301
7302         (For.DoEmit): Make inifinite loops have a
7303         non-conditional branch back.
7304
7305         (Fixed.DoEmit): First populate the pinned variables, then emit the
7306         statement, then clear the variables.  Before I was emitting the
7307         code once for each fixed piece.
7308
7309
7310 2003-01-08  Martin Baulig  <martin@ximian.com>
7311
7312         * statement.cs (FlowBranching.MergeChild): A break in a
7313         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7314
7315 2003-01-08  Martin Baulig  <martin@ximian.com>
7316
7317         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7318         lives in the same number space than `param_map'.  Fixes #36154.
7319
7320 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7321
7322         * cs-parser.jay (constructor_declaration): Set the
7323         Constructor.ModFlags before probing for it.  This makes the
7324         compiler report 514, 515 and 132 (the code was there, but got
7325         broken). 
7326
7327         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7328         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7329         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7330
7331 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7332
7333         * enum.cs: create the enum static fields using the enum type.
7334
7335 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7336
7337         * class.cs: don't try to create the ParamBuilder for the return
7338         type if it's not needed (and handle it breaking for the ms runtime
7339         anyway).
7340
7341 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7342
7343         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7344
7345 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7346
7347         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7348         the command.   This showed up while compiling the JANET source
7349         code, which used \r as its only newline separator.
7350
7351 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7352
7353         * class.cs (Method.Define): If we are an operator (because it
7354         reuses our code), then set the SpecialName and HideBySig.  #36128
7355
7356 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7357
7358         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7359         exception, report error 120 `object reference required'.
7360
7361         * driver.cs: Add --pause option, used during to measure the size
7362         of the process as it goes with --timestamp.
7363
7364         * expression.cs (Invocation.DoResolve): Do not allow methods with
7365         SpecialName to be invoked.
7366
7367 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7368
7369         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7370         number before adding it.
7371
7372 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7373
7374         * ecore.cs (StandardImplicitConversion): When in an unsafe
7375         context, we allow conversion between void * to any other pointer
7376         type. This fixes bug #35973.
7377
7378 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7379
7380         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7381         is not thrown when extensionless outputs are used 
7382
7383 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7384
7385         * rootcontext.cs: fixed compilation of corlib.
7386
7387 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7388
7389         * attribute.cs (Attributes.Contains): Add new method.
7390
7391         * class.cs (MethodCore.LabelParameters): if the parameter is an
7392         `out' parameter, check that no attribute `[In]' has been passed.
7393
7394         * enum.cs: Handle the `value__' name in an enumeration.
7395
7396 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7397
7398         * decl.cs: Added special case to allow overrides on "protected
7399         internal" methods
7400
7401 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7402
7403         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7404         since it makes much more sense.
7405
7406         (Attributes.ctor): Don't require a Location parameter.
7407
7408         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7409
7410         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7411         since we already have that information per attribute.
7412
7413         * everywhere : make appropriate changes.
7414
7415         * class.cs (LabelParameters): Write the code which actually
7416         applies attributes to the return type. We can't do this on the MS
7417         .NET runtime so we flag a warning in the case an exception is
7418         thrown.
7419
7420 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7421
7422         * const.cs: Handle implicit null conversions here too.
7423
7424 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7425
7426         * class.cs (MethodCore.LabelParameters): Remove the extra
7427         Type [] parameter since it is completely unnecessary. Instead
7428         pass in the method's attributes so that we can extract
7429         the "return" attribute.
7430
7431 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7432
7433         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7434         of ignoring it and letting the compile continue.
7435
7436         * typemanager.cs (ChangeType): use an extra argument to return an
7437         error condition instead of throwing an exception.
7438
7439 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7440
7441         * expression.cs (Unary.TryReduce): mimic the code for the regular
7442         code path.  Perform an implicit cast in the cases where we can
7443         implicitly convert to one of the integral types, and then reduce
7444         based on that constant.   This fixes bug #35483.
7445
7446 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7447
7448         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7449
7450 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7451
7452         * namespace.cs: fixed bug #35489.
7453
7454 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7455
7456         * class.cs: Remove some dead code.
7457
7458         * cs-parser.jay: Estimate the number of methods needed
7459         (RootContext.MethodCount);
7460
7461         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7462         numbers instead of StringBuilders.
7463
7464         * support.cs (PtrHashtable): Add constructor with initial size;
7465         We can now reduce reallocations of the method table.
7466
7467 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7468
7469         * attribute.cs (ApplyAttributes): Keep track of the emitted
7470         attributes on a per-target basis. This fixes bug #35413.
7471
7472 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7473
7474         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7475         default to the Windows 1252 encoding.
7476
7477         (UnixParseOption): Support version, thanks to Alp for the missing
7478         pointer. 
7479
7480         * AssemblyInfo.cs: Add nice assembly information.
7481
7482         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7483         (bug 35169).
7484
7485         * cs-parser.jay: Allow a trailing comma before the close bracked
7486         in the attribute_section production.
7487
7488         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7489         address of the instance was being taken, I will take this out,
7490         because we take the address of the object immediately here.
7491
7492 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7493
7494         * typemanager.cs (AreMultipleAllowed): Take care of the most
7495         obvious case where attribute type is not in the current assembly -
7496         stupid me ;-)
7497
7498 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7499
7500         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7501         definitions, instead of doing that afterwards.  
7502
7503         Also we use a nice little hack, depending on the constructor, we
7504         know if we are a "composed" name or a simple name.  Hence, we
7505         avoid the IndexOf test, and we avoid 
7506
7507         * codegen.cs: Add code to assist in a bug reporter to track down
7508         the source of a compiler crash. 
7509
7510 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7511
7512         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7513         types have been emitted for a given element and flag an error
7514         if something which does not have AllowMultiple set is used more
7515         than once.
7516
7517         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7518         attribute types and their corresponding AllowMultiple properties
7519
7520         (AreMultipleAllowed): Check the property for a given type.
7521
7522         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7523         property in the case we have a TypeContainer.
7524
7525         (Attributes.AddAttribute): Detect duplicates and just skip on
7526         adding them. This trivial fix catches a pretty gross error in our
7527         attribute emission - global attributes were being emitted twice!
7528
7529         Bugzilla bug #33187 is now fixed.
7530
7531 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7532
7533         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7534         instead of pp_and).
7535
7536         * expression.cs (Binary.ResolveOperator): I can only use the
7537         Concat (string, string, string) and Concat (string, string,
7538         string, string) if the child is actually a concatenation of
7539         strings. 
7540
7541 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7542
7543         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7544         context where we need a 2-character lookahead.
7545
7546         * pending.cs (PendingImplementation): Rework so we can keep track
7547         of interface types all the time, and flag those which were
7548         implemented by parents as optional.
7549
7550 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7551
7552         * expression.cs (Binary.ResolveOperator): Use
7553         String.Concat(string,string,string) or
7554         String.Concat(string,string,string,string) when possible. 
7555
7556         * typemanager: More helper methods.
7557
7558
7559 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7560
7561         * pending.cs: remove the bogus return from GetMissingInterfaces()
7562         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7563
7564 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7565
7566         * namespace.cs: avoid duplicated 'using xxx' being added to
7567         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7568         when we get more than one 'using' statement for the same namespace.
7569         Report a CS0105 warning for it.
7570
7571 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7572
7573         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7574         of calling getChar/putback, uses internal knowledge of it.    
7575
7576         (xtoken): Reorder tokenizer so most common patterns are checked
7577         first.  This reduces the compilation time in another 5% (from 8.11s
7578         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7579
7580         The parsing time is 22% of the compilation in mcs, and from that
7581         64% is spent on the tokenization process.  
7582
7583         I tried using a binary search for keywords, but this is slower
7584         than the hashtable.  Another option would be to do a couple of
7585         things:
7586
7587                 * Not use a StringBuilder, instead use an array of chars,
7588                   with a set value.  Notice that this way we could catch
7589                   the 645 error without having to do it *afterwards*.
7590
7591                 * We could write a hand-parser to avoid the hashtable
7592                   compares altogether.
7593
7594         The identifier consumption process takes 37% of the tokenization
7595         time.  Another 15% is spent on is_number.  56% of the time spent
7596         on is_number is spent on Int64.Parse:
7597
7598                 * We could probably choose based on the string length to
7599                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7600                   computations. 
7601
7602         Another 3% is spend on wrapping `xtoken' in the `token' function.
7603
7604         Handle 0xa0 as whitespace (#34752)
7605
7606 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7607
7608         * typemanager.cs (IsCLRType): New routine to tell whether a type
7609         is one of the builtin types.  
7610
7611         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7612         typecode in more places instead of doing pointer comparissions.
7613         We could leverage some knowledge about the way the typecodes are
7614         laid out.
7615
7616         New code to cache namespaces in assemblies, it is currently not
7617         invoked, to be used soon.
7618
7619         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7620
7621         * expression.cs (Binary.ResolveOperator): specially handle
7622         strings, and do not perform user-defined operator overloading for
7623         built-in types.
7624
7625 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7626
7627         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7628         internalcall as it is a pretty simple operation;  Avoid whenever
7629         possible to call Char.IsLetter.
7630
7631         (consume_identifier): Cut by half the number of
7632         hashtable calls by merging the is_keyword and GetKeyword behavior.
7633
7634         Do not short-circuit, because if we do, we
7635         report errors (ie, #if false && true would produce an invalid
7636         directive error);
7637
7638
7639 2002-11-24  Martin Baulig  <martin@ximian.com>
7640
7641         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7642         check constant ranges and report a CS0221.  Fixes #33186.
7643
7644 2002-11-24  Martin Baulig  <martin@ximian.com>
7645
7646         * cs-parser.jay: Make this work for uninitialized variable
7647         declarations in the `for' initializer.  Fixes #32416.
7648
7649 2002-11-24  Martin Baulig  <martin@ximian.com>
7650
7651         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7652         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7653
7654 2002-11-24  Martin Baulig  <martin@ximian.com>
7655
7656         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7657         argument; if true, we also check for user-defined conversions.
7658         This is only needed if both arguments are of a user-defined type.
7659         Fixes #30443, added test-175.cs.
7660         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7661
7662         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7663
7664 2002-11-24  Martin Baulig  <martin@ximian.com>
7665
7666         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7667         function to get the store opcode.
7668         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7669         only emit the Ldelema if the store opcode is Stobj.  You must run
7670         both test-34 and test-167 to test this.  Fixes #34529.
7671
7672 2002-11-23  Martin Baulig  <martin@ximian.com>
7673
7674         * ecore.cs (Expression.MemberLookup): Added additional
7675         `qualifier_type' argument which is used when we're being called
7676         from MemberAccess.DoResolve() and null if we're called from a
7677         SimpleName lookup.
7678         (Expression.MemberLookupFailed): New method to report errors; this
7679         does the CS1540 check and reports the correct error message.
7680
7681         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7682         argument for the CS1540 check and redone the way how we're dealing
7683         with private members.  See the comment in the source code for details.
7684         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7685         `closure_start_type' to `closure_qualifier_type' and check whether
7686         it's not null.  It was not this filter being broken, it was just
7687         being called with the wrong arguments.
7688
7689         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7690         and pass it the correct `qualifier_type'; this also does the error
7691         handling for us.
7692
7693 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7694
7695         * expression.cs (Invocation.EmitParams): If the we are dealing
7696         with a non-built-in value type, load its address as well.
7697
7698         (ArrayCreation): Use a a pretty constant instead
7699         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7700         static initializers.  
7701
7702         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7703         because they are not really value types, just glorified integers. 
7704
7705         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7706
7707         * ecore.cs: Remove redundant code for enumerations, make them use
7708         the same code path as everything else, fixes the casting issue
7709         with enumerations in Windows.Forms.
7710
7711         * attribute.cs: Do only cast to string if it is a string, the
7712         validation happens later.
7713
7714         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7715         people upgrade their corlibs.
7716
7717         * ecore.cs: Oops, enumerations were not following the entire code path
7718
7719 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7720
7721         * typemanager.cs (FilterWithClosure): Commented out the test for
7722         1540 in typemanager.cs, as it has problems when accessing
7723         protected methods from a parent class (see test-174.cs). 
7724
7725         * attribute.cs (Attribute.ValidateGuid): new method.
7726         (Attribute.Resolve): Use above.
7727
7728 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7729
7730         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7731
7732         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7733         handling for enumerations, as we only needed the TypeContainer
7734         functionality to begin with (this is required for the fix below to
7735         work for enums that reference constants in a container class for
7736         example). 
7737
7738         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7739
7740         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7741         a valid TypeBuilder to perform lookups on.o
7742
7743         * class.cs (InheritableMemberSignatureCompare): Use true in the
7744         call to GetGetMethod and GetSetMethod, because we are comparing
7745         the signature, and we need to get the methods *even* if they are
7746         private. 
7747
7748         (PropertyBase.CheckBase): ditto.
7749
7750         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7751         GotoCase.Resolve): Use Peel on EmpytCasts.
7752
7753         * ecore.cs (EmptyCast): drop child, add Peel method.
7754
7755 2002-11-17  Martin Baulig  <martin@ximian.com>
7756
7757         * ecore.cs (EmptyCast.Child): New public property.
7758
7759         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7760         label resolved to an EmptyCast.  Fixes #34162.
7761         (GotoCase.Resolve): Likewise.
7762         (Block.EmitMeta): Likewise.
7763
7764 2002-11-17  Martin Baulig  <martin@ximian.com>
7765
7766         * expression.cs (Invocation.BetterConversion): Prefer int over
7767         uint; short over ushort; long over ulong for integer literals.
7768         Use ImplicitConversionExists instead of StandardConversionExists
7769         since we also need to check for user-defined implicit conversions.
7770         Fixes #34165.  Added test-173.cs.
7771
7772 2002-11-16  Martin Baulig  <martin@ximian.com>
7773
7774         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7775         with the `true' and `false' literals.  Fixes #33151.
7776
7777 2002-11-16  Martin Baulig  <martin@ximian.com>
7778
7779         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7780         October 22nd; don't do the cs1540 check for static members.
7781
7782         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7783         now using our own filter here and doing the cs1540 check again.
7784
7785 2002-11-16  Martin Baulig  <martin@ximian.com>
7786
7787         * support.cs (InternalParameters): Don't crash if we don't have
7788         any fixed parameters.  Fixes #33532.
7789
7790 2002-11-16  Martin Baulig  <martin@ximian.com>
7791
7792         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7793         when looking up static methods to make this work on Windows.
7794         Fixes #33773.
7795
7796 2002-11-16  Martin Baulig  <martin@ximian.com>
7797
7798         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7799         a setter rather than using PropertyInfo.CanWrite.
7800
7801 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7802
7803         * class.cs: Allow acces to block member by subclasses. Fixes build
7804         breaker.
7805
7806 2002-11-14  Martin Baulig  <martin@ximian.com>
7807
7808         * class.cs (Constructor.Emit): Added the extern/block check.
7809         Fixes bug #33678.
7810
7811 2002-11-14  Martin Baulig  <martin@ximian.com>
7812
7813         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7814         iteration while looking for indexers, this is needed because the
7815         indexer may have a different name in our base classes.  Fixed the
7816         error reporting (no indexers at all, not get accessor, no
7817         overloaded match).  Fixes bug #33089.
7818         (IndexerAccess.DoResolveLValue): Likewise.
7819
7820 2002-11-14  Martin Baulig  <martin@ximian.com>
7821
7822         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7823         indexers.  Fixes the first part of bug #33089.
7824         (MethodSignature.InheritableMemberSignatureCompare): Added support
7825         for properties.
7826
7827 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7828
7829         * attribute.cs (Attribute.Resolve): Catch the
7830         NullReferenceException and report it since it isn't supposed to
7831         happen. 
7832
7833 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7834
7835         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7836         LogicalOr and LogicalAnd that can benefit from recursively
7837         handling EmitBranchable.  The code now should be nice for Paolo.
7838
7839 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
7840
7841         * typemanager.cs (LookupType): Added a negative-hit hashtable for
7842         the Type lookups, as we perform quite a number of lookups on
7843         non-Types.  This can be removed once we can deterministically tell
7844         whether we have a type or a namespace in advance.
7845
7846         But this might require special hacks from our corlib.
7847
7848         * TODO: updated.
7849
7850         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
7851         and double which avoids a conversion from an integer to a double.
7852
7853         * expression.cs: tiny optimization, avoid calling IsConstant,
7854         because it effectively performs the lookup twice.
7855
7856 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
7857
7858         But a bogus return here to keep the semantics of the old code
7859         until the Mono runtime is fixed.
7860
7861         * pending.cs (GetMissingInterfaces): New method used to remove all
7862         the interfaces that are already implemented by our parent
7863         classes from the list of pending methods. 
7864
7865         * interface.cs: Add checks for calls after ResolveTypeExpr.
7866
7867 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7868
7869         * class.cs (Class.Emit): Report warning 67: event not used if the
7870         warning level is beyond 3.
7871
7872         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7873         being a NullLiteral.
7874
7875         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7876         specifiers. 
7877
7878         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7879         path that might fail if a type can not be resolved.
7880
7881         * expression.cs (Binary.Emit): Emit unsigned versions of the
7882         operators. 
7883
7884         * driver.cs: use error 5.
7885
7886 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7887
7888         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7889
7890 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7891
7892         * cs-parser.jay (switch_section): A beautiful patch from Martin
7893         Baulig that fixed 33094.
7894
7895 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7896
7897         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7898         Check whether the base is abstract and report an error if so.
7899
7900         * expression.cs (IndexerAccess.DoResolveLValue,
7901         IndexerAccess.DoResolve): ditto. 
7902
7903         (Invocation.DoResolve): ditto.
7904
7905         (Invocation.FullMethodDesc): Improve the report string.
7906
7907         * statement.cs (Block): Eliminate IsVariableDefined as it is
7908         basically just a wrapper for GetVariableInfo.
7909
7910         * ecore.cs (SimpleName): Use new 
7911
7912         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7913         type, as we return the actual parameter ref/unref state on a
7914         different call.
7915
7916 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7917
7918         * support.cs: Return proper flags REF/OUT fixing the previous
7919         commit.  
7920
7921         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7922         not used to mean `ref' but `ref or out' in ParameterReference
7923
7924         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7925         full type signature instead of calling TypeManger.CSharpName
7926         ourselves. 
7927
7928         * support.cs (InternalParameters.ParameterDesc): Do not compare
7929         directly to the modflags, because REF/OUT will actually be bitsets
7930         if set. 
7931
7932         * delegate.cs (VerifyMethod): Check also the modifiers.
7933
7934         * cs-tokenizer.cs: Fix bug where floating point values with an
7935         exponent where a sign was missing was ignored.
7936
7937         * driver.cs: Allow multiple assemblies to be specified in a single
7938         /r: argument
7939
7940 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7941
7942         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7943         because identifiers after a parenthesis would end up in this kind
7944         of production, and we needed to desamiguate it for having casts
7945         like:
7946
7947                 (UserDefinedType *) xxx
7948
7949 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7950
7951         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7952         we should set on the Bindingflags.NonPublic, but not turn on
7953         private_ok.  private_ok controls whether a Private member is
7954         returned (this is chekced on the filter routine), while the
7955         BindingFlags.NonPublic just controls whether private/protected
7956         will be allowed.   This fixes the problem part of the problem of
7957         private properties being allowed to be used in derived classes.
7958
7959         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7960         so we can call the children DoResolveLValue method (this will
7961         properly signal errors on lvalue assignments to base properties)
7962
7963         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7964         getter are null, and we have a property info, we know that this
7965         happened because the lookup failed, so we report an error 122 for
7966         protection level violation.
7967
7968         We also silently return if setter and getter are null in the
7969         resolve functions, this condition only happens if we have flagged
7970         the error before.  This is the other half of the problem. 
7971
7972         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
7973         not have accessibility information, that is why we were returning
7974         true in the filter function in typemanager.cs.
7975
7976         To properly report 122 (property is inaccessible because of its
7977         protection level) correctly, we report this error in ResolveAccess
7978         by failing if both the setter and the getter are lacking (ie, the
7979         lookup failed). 
7980
7981         DoResolve and DoLResolve have been modified to check for both
7982         setter/getter being null and returning silently, the reason being
7983         that I did not want to put the knowledge about this error in upper
7984         layers, like:
7985
7986         int old = Report.Errors;
7987         x = new PropertyExpr (...);
7988         if (old != Report.Errors)
7989                 return null;
7990         else
7991                 return x;
7992
7993         So the property expr is returned, but it is invalid, so the error
7994         will be flagged during the resolve process. 
7995
7996         * class.cs: Remove InheritablePropertySignatureCompare from the
7997         class, as we no longer depend on the property signature to compute
7998         whether it is possible to implement a method or not.
7999
8000         The reason is that calling PropertyInfo.GetGetMethod will return
8001         null (in .NET, in Mono it works, and we should change this), in
8002         cases where the Get Method does not exist in that particular
8003         class.
8004
8005         So this code:
8006
8007         class X { public virtual int A { get { return 1; } } }
8008         class Y : X { }
8009         class Z : Y { public override int A { get { return 2; } } }
8010
8011         Would fail in Z because the parent (Y) would not have the property
8012         defined.  So we avoid this completely now (because the alternative
8013         fix was ugly and slow), and we now depend exclusively on the
8014         method names.
8015
8016         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8017         reference method, instead of using the property.
8018
8019         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8020         routines are gone now.
8021
8022         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8023         names, they were incorrectly named.
8024
8025         * cs-tokenizer.cs: Return are more gentle token on failure. 
8026
8027         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8028         had an out-of-sync index variable, which caused it to remove from
8029         the list of pending methods the wrong method sometimes.
8030
8031 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8032
8033         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8034         CanWrite, because those refer to this particular instance of the
8035         property, and do not take into account the fact that we can
8036         override single members of a property.
8037
8038         Constructor requires an EmitContext.  The resolution process does
8039         not happen here, but we need to compute the accessors before,
8040         because the resolution does not always happen for properties.
8041
8042         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8043         subclass, before we did not update this flag, but we did update
8044         bindingflags. 
8045
8046         (GetAccessors): Drop this routine, as it did not work in the
8047         presence of partially overwritten set/get methods. 
8048
8049         Notice that this broke the cs1540 detection, but that will require
8050         more thinking. 
8051
8052 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8053
8054         * class.cs:
8055         * codegen.cs:
8056         * driver.cs: issue a warning instead of an error if we don't support
8057         debugging for the platform. Also ignore a couple of errors that may
8058         arise when trying to write the symbols. Undo my previous patch.
8059
8060 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8061
8062         * driver.cs: ignore /debug switch except for Unix platforms.
8063
8064 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8065
8066         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8067
8068 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8069
8070         * driver.cs: Do not make mcs-debug conditional, so we do not break
8071         builds that use it.
8072
8073         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8074         review this patch.  But basically after all the children variables
8075         have been merged, the value of "Breaks" was not being set to
8076         new_breaks for Switch blocks.  I think that it should be set after
8077         it has executed.  Currently I set this to the value of new_breaks,
8078         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8079         conservative, but I do not understand this code very well.
8080
8081         I did not break anything in the build, so that is good ;-)
8082
8083         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8084
8085 2002-10-20  Mark Crichton  <crichton@gimp.org>
8086
8087         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8088
8089 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8090
8091         * cfold.cs: Fixed compile blocker.
8092
8093 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8094
8095         * driver.cs: I was chekcing the key, not the file.
8096
8097 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8098
8099         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8100         message that we were generating - we just need to silently return
8101         a null.
8102
8103 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8104
8105         * class.cs (Event.Define): Change my previous commit, as this
8106         breaks the debugger.  This is a temporary hack, as it seems like
8107         the compiler is generating events incorrectly to begin with.
8108
8109         * expression.cs (Binary.ResolveOperator): Added support for 
8110         "U operator - (E x, E y)"
8111
8112         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8113         y)".
8114
8115         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8116         init-only variables, but this path did not take into account that
8117         there might be also instance readonly variables.  Correct this
8118         problem. 
8119
8120         This fixes bug 32253
8121
8122         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8123         delegates as well.
8124
8125         * driver.cs: Change the extension for modules to `netmodule'
8126
8127         * cs-parser.jay: Improved slightly the location tracking for
8128         the debugger symbols.
8129
8130         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8131         modifiers that were specified instead of the hardcoded value
8132         (FamAndAssem).  This was basically ignoring the static modifier,
8133         and others.  Fixes 32429.
8134
8135         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8136         fixed a bug in the process (32476)
8137
8138         * expression.cs (ArrayAccess.EmitAssign): Patch from
8139         hwang_rob@yahoo.ca that fixes bug 31834.3
8140
8141 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8142
8143         * driver.cs: Make the module extension .netmodule.
8144
8145 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8146
8147         * driver.cs: Report an error if the resource file is not found
8148         instead of crashing.
8149
8150         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8151         false, like Emit does.
8152
8153 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8154
8155         * typemanager.cs: Remove unused private member.  Also reported mcs
8156         bug to report this as a warning like csc.
8157
8158 2002-10-15  Martin Baulig  <martin@gnome.org>
8159
8160         * statement.cs (Statement.Emit): Made this a virtual method; emits
8161         the line number info and calls DoEmit().
8162         (Statement.DoEmit): New protected abstract method, formerly knows
8163         as Statement.Emit().
8164
8165         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8166
8167 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8168
8169         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8170         have fixed a remaining problem: not every AddXXXX was adding a
8171         fully qualified name.  
8172
8173         Now everyone registers a fully qualified name in the DeclSpace as
8174         being defined instead of the partial name.  
8175
8176         Downsides: we are slower than we need to be due to the excess
8177         copies and the names being registered this way.  
8178
8179         The reason for this is that we currently depend (on the corlib
8180         bootstrap for instance) that types are fully qualified, because
8181         we dump all the types in the namespace, and we should really have
8182         types inserted into the proper namespace, so we can only store the
8183         basenames in the defined_names array.
8184
8185 2002-10-10  Martin Baulig  <martin@gnome.org>
8186
8187         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8188         from bug #31834, see the bug report for a testcase which is
8189         miscompiled.
8190
8191 2002-10-10  Martin Baulig  <martin@gnome.org>
8192
8193         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8194         flow analysis code for this.
8195
8196         * statement.cs (Do, While, For): Tell the flow analysis code about
8197         infinite loops.
8198         (FlowBranching.UsageVector): Added support for infinite loops.
8199         (Block.Resolve): Moved the dead code elimination here and use flow
8200         analysis to do it.
8201
8202 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8203
8204         * class.cs (Field.Define): Catch cycles on struct type
8205         definitions. 
8206
8207         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8208         fields if the fields are static.  We only need to check instance
8209         fields. 
8210
8211         * expression.cs (As.DoResolve): Test for reference type.
8212
8213         * statement.cs (Using.ResolveExpression): Use
8214         ConvertImplicitRequired, not ConvertImplicit which reports an
8215         error on failture
8216         (Using.ResolveLocalVariableDecls): ditto.
8217
8218         * expression.cs (Binary.ResolveOperator): Report errors in a few
8219         places where we had to.
8220
8221         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8222
8223 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8224
8225         * expression.cs: Use StoreFromPtr instead of extracting the type
8226         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8227
8228         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8229         an enumeration value to a System.Enum, but System.Enum is not a
8230         value type, but an class type, so we need to box.
8231
8232         (Expression.ConvertExplicit): One codepath could return
8233         errors but not flag them.  Fix this.  Fixes #31853
8234
8235         * parameter.cs (Resolve): Do not allow void as a parameter type.
8236
8237 2002-10-06  Martin Baulig  <martin@gnome.org>
8238
8239         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8240         if it's a class type and not a struct.  Fixes #31815.
8241
8242 2002-10-06  Martin Baulig  <martin@gnome.org>
8243
8244         * statement.cs: Reworked the flow analysis code a bit to make it
8245         usable for dead code elimination.
8246
8247 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8248
8249         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8250
8251 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8252
8253         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8254         to fix the test 165, will investigate deeper.
8255
8256 2002-10-04  Martin Baulig  <martin@gnome.org>
8257
8258         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8259         finally blocks actually work.
8260         (Try.Resolve): We don't need to create a sibling for `finally' if
8261         there is no finally block.
8262
8263 2002-10-04  Martin Baulig  <martin@gnome.org>
8264
8265         * class.cs (Constructor.Define): The default accessibility for a
8266         non-default constructor is private, not public.
8267
8268 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8269
8270         * class.cs (Constructor): Make AllowedModifiers public, add
8271         EXTERN.
8272
8273         * cs-parser.jay: Perform the modifiers test here, as the
8274         constructor for the Constructor class usually receives a zero
8275         because of the way we create it (first we create, later we
8276         customize, and we were never checking the modifiers).
8277
8278         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8279         is a version of LookupTypeReflection that includes the type-name
8280         cache.  This can be used as a fast path for functions that know
8281         the fully qualified name and are only calling into *.GetType() to
8282         obtain a composed type.
8283
8284         This is also used by TypeManager.LookupType during its type
8285         composition.
8286
8287         (LookupType): We now also track the real type name, as sometimes
8288         we can get a quey for the real type name from things like
8289         ComposedCast.  This fixes bug 31422.
8290
8291         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8292         complete type fullname, it does not have to go through the type
8293         resolution system to obtain the composed version of the type (for
8294         obtaining arrays or pointers).
8295
8296         (Conditional.Emit): Use the EmitBoolExpression to
8297         generate nicer code, as requested by Paolo.
8298
8299         (ArrayCreation.CheckIndices): Use the patch from
8300         hwang_rob@yahoo.ca to validate the array initializers. 
8301
8302 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8303
8304         * class.cs (ConstructorInitializer.Emit): simplify code by using
8305         Invocation.EmitCall, and at the same time, fix the bugs in calling
8306         parent constructors that took variable arguments. 
8307
8308         * ecore.cs (Expression.ConvertNumericExplicit,
8309         Expression.ImplicitNumericConversion): Remove the code that
8310         manually wrapped decimal (InternalTypeConstructor call is now gone
8311         as well).
8312
8313         * expression.cs (Cast.TryReduce): Also handle decimal types when
8314         trying to perform a constant fold on the type.
8315
8316         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8317
8318         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8319         that only turned off an error report, and did nothing else. 
8320
8321 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8322
8323         * driver.cs: Handle and ignore /fullpaths
8324
8325 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8326
8327         * expression.cs (Binary.ResolveOperator): Catch the case where
8328         DoNumericPromotions returns true, 
8329
8330         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8331
8332 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8333
8334         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8335         report error 70.
8336
8337 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8338
8339         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8340         conversion exists, but it is also required that the conversion be
8341         performed.  This manifested in "(Type64Enum) 2".  
8342
8343         * class.cs (TypeManager.AddMethod): The fix is not to change
8344         AddEnum, because that one was using a fully qualified name (every
8345         DeclSpace derivative does), but to change the AddMethod routine
8346         that was using an un-namespaced name.  This now correctly reports
8347         the duplicated name.
8348
8349         Revert patch until I can properly fix it.  The issue
8350         is that we have a shared Type space across all namespaces
8351         currently, which is wrong.
8352
8353         Options include making the Namespace a DeclSpace, and merge
8354         current_namespace/current_container in the parser.
8355
8356 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8357
8358         * cs-parser.jay: Improve error reporting when we get a different
8359         kind of expression in local_variable_type and
8360         local_variable_pointer_type. 
8361
8362         Propagate this to avoid missleading errors being reported.
8363
8364         * ecore.cs (ImplicitReferenceConversion): treat
8365         TypeManager.value_type as a target just like object_type.   As
8366         code like this:
8367
8368         ValueType v = 1;
8369
8370         Is valid, and needs to result in the int 1 being boxed before it
8371         is assigned to the value type v.
8372
8373         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8374         to validate the enumeration name.
8375
8376         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8377         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8378         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8379
8380         * ecore.cs (TryImplicitIntConversion): When doing an
8381         implicit-enumeration-conversion, check if the type is 64-bits and
8382         perform a conversion before passing to EnumConstant.
8383
8384 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8385
8386         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8387         report ambiguous type references.  Unlike the MS version, we
8388         report what the ambiguity is.   Innovation at work ;-)
8389
8390         (DeclSpace.FindType): Require a location argument to
8391         display when we display an ambiguous error.
8392
8393         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8394
8395         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8396
8397         * expression.cs (EmitDynamicInitializers): Apply patch from
8398         hwang_rob@yahoo.ca that fixes the order in which we emit our
8399         initializers. 
8400
8401 2002-09-21  Martin Baulig  <martin@gnome.org>
8402
8403         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8404         delegate takes no arguments.
8405
8406 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8407
8408         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8409         from integers.
8410
8411         * expression.cs: Extract the underlying type.
8412
8413         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8414
8415         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8416
8417 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8418
8419         * class.cs (TypeContainer.DefineType): We can not use the nice
8420         PackingSize with the size set to 1 DefineType method, because it
8421         will not allow us to define the interfaces that the struct
8422         implements.
8423
8424         This completes the fixing of bug 27287
8425
8426         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8427         means also structs.  This fixes part of the problem. 
8428         (Expresion.ImplicitReferenceConversionExists): ditto.
8429
8430         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8431         error if there were no errors reported during the type lookup
8432         process, to avoid duplicates or redundant errors.  Without this
8433         you would get an ambiguous errors plus a type not found.  We have
8434         beaten the user enough with the first error.  
8435
8436         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8437         reference. 
8438
8439         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8440         during the resolution process, stop the lookup, this avoids
8441         repeated error reports (same error twice).
8442
8443         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8444
8445         * typemanager.cs (LookupType): Redo the type lookup code to match
8446         the needs of System.Reflection.  
8447
8448         The issue is that System.Reflection requires references to nested
8449         types to begin with a "+" sign instead of a dot.  So toplevel
8450         types look like: "NameSpace.TopLevelClass", and nested ones look
8451         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8452         levels. 
8453
8454 2002-09-19  Martin Baulig  <martin@gnome.org>
8455
8456         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8457         says that a method always returns or always throws an exception,
8458         don't report the CS0161.
8459
8460         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8461         set `Returns = new_returns'.
8462
8463 2002-09-19  Martin Baulig  <martin@gnome.org>
8464
8465         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8466         to an enum constant, check for a CS0176.
8467
8468 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8469
8470         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8471         for operators that must be in pairs and report errors.
8472
8473         * ecore.cs (SimpleName.DoResolveType): During the initial type
8474         resolution process, when we define types recursively, we must
8475         check first for types in our current scope before we perform
8476         lookups in the enclosing scopes.
8477
8478         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8479
8480         (Invocation.VerifyArgumentsCompat): Call
8481         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8482         I thought we were supposed to always call this, but there are a
8483         few places in the code where we dont do it.
8484
8485 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8486
8487         * driver.cs: Add support in -linkres and -resource to specify the
8488         name of the identifier.
8489
8490 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8491
8492         * ecore.cs (StandardConversionExists): Sync with the conversion
8493         code: allow anything-* to void* conversions.
8494
8495         (FindMostSpecificSource): Use an Expression argument
8496         instead of a Type, because we might be handed over a Literal which
8497         gets a few more implicit conversions that plain types do not.  So
8498         this information was being lost.
8499
8500         Also, we drop the temporary type-holder expression when not
8501         required.
8502
8503 2002-09-17  Martin Baulig  <martin@gnome.org>
8504
8505         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8506         this is an explicit interface implementation.
8507
8508 2002-09-17  Martin Baulig  <martin@gnome.org>
8509
8510         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8511         different `IndexerName' attributes.
8512
8513         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8514         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8515         virtual CommonResolve().
8516
8517 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8518
8519         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8520         and convert that to the UnderlyingType.
8521
8522         * statement.cs (Foreach.Resolve): Indexers are just like variables
8523         or PropertyAccesses.
8524
8525         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8526         inside quoted strings, we were not doing this before.
8527
8528 2002-09-16  Martin Baulig  <martin@gnome.org>
8529
8530         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8531         resolve it.  This is needed for the definite assignment check of the
8532         instance expression, fixes bug #29846.
8533         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8534
8535 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8536
8537         * parameter.cs: Fix compile error.  Cannot reference static member
8538         from an instance object.  Is this an mcs bug?
8539
8540 2002-09-14  Martin Baulig  <martin@gnome.org>
8541
8542         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8543         multiple times.  Fixes bug #30295, added test-166.cs.
8544
8545 2002-09-14  Martin Baulig  <martin@gnome.org>
8546
8547         * statement.cs (Block.Emit): Don't emit unreachable code.
8548         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8549         `break' statements.
8550         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8551
8552 2002-09-14  Martin Baulig  <martin@gnome.org>
8553
8554         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8555         is set.
8556
8557 2002-09-14  Martin Baulig  <martin@gnome.org>
8558
8559         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8560         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8561         be false on the ms runtime.
8562
8563 2002-09-13  Martin Baulig  <martin@gnome.org>
8564
8565         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8566         the CS0038 error message.
8567
8568 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8569
8570         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8571         constant inside, return it.
8572
8573 2002-09-12  Martin Baulig  <martin@gnome.org>
8574
8575         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8576         implicit conversion can be done between enum types.
8577
8578         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8579         check whether an implicit conversion to the current enum's UnderlyingType
8580         exists and report an error if not.
8581
8582         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8583         without debugging support.
8584
8585         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8586         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8587
8588 2002-09-12  Martin Baulig  <martin@gnome.org>
8589
8590         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8591
8592         * ecore.cs (IMemberExpr.DeclaringType): New property.
8593         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8594         nonstatic member of an outer type (CS0038).
8595
8596 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8597
8598         * driver.cs: Activate the using-error detector at warning level
8599         4 (at least for MS-compatible APIs).
8600
8601         * namespace.cs (VerifyUsing): Small buglett fix.
8602
8603         * pending.cs (PendingImplementation): pass the container pointer. 
8604
8605         * interface.cs (GetMethods): Allow for recursive definition.  Long
8606         term, I would like to move every type to support recursive
8607         definitions, not the current ordering mechanism that we have right
8608         now.
8609
8610         The situation is this: Attributes are handled before interfaces,
8611         so we can apply attributes to interfaces.  But some attributes
8612         implement interfaces, we will now handle the simple cases
8613         (recursive definitions will just get an error).  
8614
8615         * parameter.cs: Only invalidate types at the end if we fail to
8616         lookup all types.  
8617
8618 2002-09-09  Martin Baulig  <martin@gnome.org>
8619
8620         * ecore.cs (PropertyExpr.Emit): Also check for
8621         TypeManager.system_int_array_get_length so this'll also work when
8622         compiling corlib.  Fixes #30003.
8623
8624 2002-09-09  Martin Baulig  <martin@gnome.org>
8625
8626         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8627         and throw an exception if we can't get the type's size.  Fixed #30040,
8628         added test-165.cs.
8629
8630 2002-09-09  Martin Baulig  <martin@gnome.org>
8631
8632         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8633
8634         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8635         context.  Fixes bug #30027.
8636
8637         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8638         virtual functions.  Fixes bug #30043, added test-164.cs.
8639
8640 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8641
8642         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8643
8644 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8645
8646         * driver.cs: Use an object to get the windows codepage since it's not a
8647         static property.
8648
8649 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8650
8651         * statement.cs (For.Emit): for infinite loops (test == null)
8652         return whether there is a break inside, not always "true".
8653
8654         * namespace.cs (UsingEntry): New struct to hold the name of the
8655         using definition, the location where it is defined, and whether it
8656         has been used in a successful type lookup.
8657
8658         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8659         strings.
8660
8661         * decl.cs: ditto.
8662
8663 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8664
8665         * attribute.cs : Fix incorrect code which relied on catching
8666         a NullReferenceException to detect a null being passed in
8667         where an object was expected.
8668
8669 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8670
8671         * statement.cs (Try): flag the catch variable as assigned
8672
8673         * expression.cs (Cast): Simplified by using ResolveType instead of
8674         manually resolving.
8675
8676         * statement.cs (Catch): Fix bug by using ResolveType.
8677
8678 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8679
8680         * expression.cs (BetterConversion): Special case for when we have
8681         a NullLiteral as the argument and we have to choose between string
8682         and object types - we choose string the way csc does.
8683
8684         * attribute.cs (Attribute.Resolve): Catch the
8685         NullReferenceException and report error #182 since the Mono
8686         runtime no more has the bug and having this exception raised means
8687         we tried to select a constructor which takes an object and is
8688         passed a null.
8689
8690 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8691
8692         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8693         message (1502, 1503) when we can't locate a method after overload
8694         resolution. This is much more informative and closes the bug
8695         Miguel reported.
8696
8697         * interface.cs (PopulateMethod): Return if there are no argument
8698         types. Fixes a NullReferenceException bug.
8699
8700         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8701         expressions too. Previously we were checking only in one place for
8702         positional arguments leaving out named arguments.
8703
8704         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8705         type to the enum type is not allowed. Remove code corresponding to
8706         that.
8707
8708         (ConvertNumericExplicit): Allow explicit conversions from
8709         the underlying type to enum type. This precisely follows the spec
8710         and closes a bug filed by Gonzalo.
8711
8712 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8713
8714         * compiler.csproj:
8715         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8716
8717 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8718
8719         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8720         it was important that we stored the right value after the
8721         reduction in `converted'.
8722
8723 2002-09-04  Martin Baulig  <martin@gnome.org>
8724
8725         * location.cs (Location.SymbolDocument): Use full pathnames for the
8726         source files.
8727
8728 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8729
8730         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8731         of the expression resolve mechanism, because that will catch the
8732         SimpleName error failures.
8733
8734         (Conditional): If we can not resolve the
8735         expression, return, do not crash.
8736
8737 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8738
8739         * cs-tokenizer.cs:
8740         (location): display token name instead of its number.
8741
8742 2002-08-28  Martin Baulig  <martin@gnome.org>
8743
8744         * expression.cs (Binary.ResolveOperator): Don't silently return
8745         but return an error if an operator cannot be applied between two
8746         enum types.
8747
8748 2002-08-28  Martin Baulig  <martin@gnome.org>
8749
8750         * class.cs (Constructor.Define): Set the permission attributes
8751         correctly instead of making all constructors public.
8752
8753 2002-08-28  Martin Baulig  <martin@gnome.org>
8754
8755         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8756         for private members before reporting a CS0103; if we find anything,
8757         it's a CS0122.
8758
8759 2002-08-28  Martin Baulig  <martin@gnome.org>
8760
8761         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8762         to check whether `closure_start_type == closure_invocation_type',
8763         we also need to check whether `m.DeclaringType == closure_invocation_type'
8764         before bypassing the permission checks.  We might be accessing
8765         protected/private members from the base class.
8766         (TypeManager.RealMemberLookup): Only set private_ok if private
8767         members were requested via BindingFlags.NonPublic.
8768
8769         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8770
8771         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8772         MethodGroupExpr.IsExplicitImpl if appropriate.
8773         (Invocation.DoResolve): Don't report the CS0120 for explicit
8774         interface implementations.
8775
8776 2002-08-27  Martin Baulig  <martin@gnome.org>
8777
8778         * expression.cs (Invocation.DoResolve): If this is a static
8779         method and we don't have an InstanceExpression, we must report
8780         a CS0120.
8781
8782 2002-08-25  Martin Baulig  <martin@gnome.org>
8783
8784         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8785         `==' between a valuetype and an object.
8786
8787 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8788
8789         * ecore.cs (TypeExpr): Provide a ToString method.
8790
8791 2002-08-24  Martin Baulig  <martin@gnome.org>
8792
8793         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8794         now called proggie.dbg and it's a binary file.
8795
8796 2002-08-23  Martin Baulig  <martin@gnome.org>
8797
8798         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8799
8800 2002-08-23  Martin Baulig  <martin@gnome.org>
8801
8802         * struct.cs (MyStructInfo.ctor): Make this work with empty
8803         structs; it's not allowed to use foreach() on null.
8804
8805 2002-08-23  Martin Baulig  <martin@gnome.org>
8806
8807         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8808         writer the full pathname of the generated assembly.
8809
8810 2002-08-23  Martin Baulig  <martin@gnome.org>
8811
8812         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8813         A `finally' block never returns or breaks; improved handling of
8814         unreachable code.
8815
8816 2002-08-23  Martin Baulig  <martin@gnome.org>
8817
8818         * statement.cs (Throw.Resolve): Allow `throw null'.
8819
8820 2002-08-23  Martin Baulig  <martin@gnome.org>
8821
8822         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8823         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8824         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8825         MemberLookup would return a wrong event if this is an explicit
8826         interface implementation and the class has an event with the same
8827         name.
8828
8829 2002-08-23  Martin Baulig  <martin@gnome.org>
8830
8831         * statement.cs (Block.AddChildVariableNames): New public method.
8832         (Block.AddChildVariableName): Likewise.
8833         (Block.IsVariableNameUsedInChildBlock): Likewise.
8834         (Block.AddVariable): Check whether a variable name has already
8835         been used in a child block.
8836
8837         * cs-parser.jay (declare_local_variables): Mark all variable names
8838         from the current block as being used in a child block in the
8839         implicit block.
8840
8841 2002-08-23  Martin Baulig  <martin@gnome.org>
8842
8843         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
8844         find the symbol writer.
8845
8846         * driver.cs: csc also allows the arguments to /define being
8847         separated by commas, not only by semicolons.
8848
8849 2002-08-23  Martin Baulig  <martin@gnome.org>
8850
8851         * interface.cs (Interface.GetMembers): Added static check for events.
8852
8853 2002-08-15  Martin Baulig  <martin@gnome.org>
8854
8855         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
8856         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
8857
8858         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8859         why the MethodData.EmitDestructor() change was necessary.
8860
8861 2002-08-20  Martin Baulig  <martin@gnome.org>
8862
8863         * class.cs (TypeContainer.FindMembers): Added static check for events.
8864
8865         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8866
8867         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8868         use Type.GetEvents(), not Type.FindMembers().
8869
8870 2002-08-20  Martin Baulig  <martin@gnome.org>
8871
8872         * decl.cs (MemberCache): Added a special method cache which will
8873         be used for method-only searched.  This ensures that a method
8874         search will return a MethodInfo with the correct ReflectedType for
8875         inherited methods.      
8876
8877 2002-08-20  Martin Baulig  <martin@gnome.org>
8878
8879         * decl.cs (DeclSpace.FindMembers): Made this public.
8880
8881 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8882
8883         * delegate.cs: fixed build on windows.
8884         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8885
8886 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8887
8888         * ecore.cs (StandardConversionExists): Return a false
8889         if we are trying to convert the void type to anything else
8890         since that is not allowed.
8891
8892         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8893         we flag error 70 in the event an event is trying to be accessed
8894         directly from outside the declaring type.
8895
8896 2002-08-20  Martin Baulig  <martin@gnome.org>
8897
8898         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8899         MemberCache from typemanager.cs to decl.cs.
8900
8901 2002-08-19  Martin Baulig  <martin@gnome.org>
8902
8903         * class.cs (TypeContainer): Implement IMemberContainer.
8904         (TypeContainer.DefineMembers): Create the MemberCache.
8905         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8906         return public members if BindingFlags.Public was given, check
8907         whether members are static.
8908
8909 2002-08-16  Martin Baulig  <martin@gnome.org>
8910
8911         * decl.cs (DeclSpace.Define): Splitted this in Define and
8912         DefineMembers.  DefineMembers is called first and initializes the
8913         MemberCache.
8914
8915         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8916         DefineMembers() on all our DeclSpaces.
8917
8918         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8919         but call DefineMembers() on all nested interfaces.  We call their
8920         Define() in our new Define() function.
8921
8922         * interface.cs (Interface): Implement IMemberContainer.
8923         (Interface.Define): Moved all code except the attribute stuf to
8924         DefineMembers().
8925         (Interface.DefineMembers): Initialize the member cache.
8926
8927         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8928         need this anymore since we can use MemberCache.FindMembers directly.
8929
8930 2002-08-19  Martin Baulig  <martin@gnome.org>
8931
8932         * typemanager.cs (MemberCache): When creating the cache for an
8933         interface type, add all inherited members.
8934         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8935         to `out bool used_cache' and documented it.
8936         (TypeManager.MemberLookup): If we already used the cache in the first
8937         iteration, we don't need to do the interfaces check.
8938
8939 2002-08-19  Martin Baulig  <martin@gnome.org>
8940
8941         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8942         here from IMemberFinder and don't implement this interface anymore.
8943         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8944
8945         * typemanager.cs (IMemberFinder): This interface is now only used by
8946         classes which actually support the member cache.
8947         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8948         since we only put DeclSpaces into this Hashtable.
8949         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8950         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8951
8952 2002-08-16  Martin Baulig  <martin@gnome.org>
8953
8954         * typemanager.cs (ICachingMemberFinder): Removed.
8955         (IMemberFinder.MemberCache): New property.
8956         (TypeManager.FindMembers): Merged this with RealFindMembers().
8957         This function will never be called from TypeManager.MemberLookup()
8958         so we can't use the cache here, just the IMemberFinder.
8959         (TypeManager.MemberLookup_FindMembers): Check whether the
8960         IMemberFinder has a MemberCache and call the cache's FindMembers
8961         function.
8962         (MemberCache): Rewrote larger parts of this yet another time and
8963         cleaned it up a bit.
8964
8965 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8966
8967         * driver.cs (LoadArgs): Support quoting.
8968
8969         (Usage): Show the CSC-like command line arguments.
8970
8971         Improved a few error messages.
8972
8973 2002-08-15  Martin Baulig  <martin@gnome.org>
8974
8975         * typemanager.cs (IMemberContainer.Type): New property.
8976         (IMemberContainer.IsInterface): New property.
8977
8978         The following changes are conditional to BROKEN_RUNTIME, which is
8979         defined at the top of the file.
8980
8981         * typemanager.cs (MemberCache.MemberCache): Don't add the base
8982         class'es members, but add all members from TypeHandle.ObjectType
8983         if we're an interface.
8984         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
8985         is the current type.
8986         (MemberCache.CacheEntry.Container): Removed this field.
8987         (TypeHandle.GetMembers): Include inherited members.
8988
8989 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8990
8991         * typemanager.cs: fixed compilation and added a comment on a field that
8992         is never used.
8993
8994 2002-08-15  Martin Baulig  <martin@gnome.org>
8995
8996         * class.cs (ConstructorInitializer.Resolve): In the
8997         Expression.MemberLookup call, use the queried_type as
8998         invocation_type.
8999
9000         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9001         declared' attribute, it's always true.
9002         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9003         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9004         temporary wrapper for FindMembers which tells MemberLookup whether
9005         members from the base classes are included in the return value.
9006         This will go away soon.
9007         (TypeManager.MemberLookup): Use this temporary hack here; once the
9008         new MemberCache is completed, we don't need to do the DeclaredOnly
9009         looping here anymore since the MemberCache will take care of this.
9010         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9011         (MemberCache): When creating the MemberCache for a class, get
9012         members from the current class and all its base classes.
9013         (MemberCache.CacheEntry.Container): New field.  This is a
9014         temporary hack until the Mono runtime is fixed to distinguish
9015         between ReflectedType and DeclaringType.  It allows us to use MCS
9016         with both the MS runtime and the unfixed Mono runtime without
9017         problems and without accecting performance.
9018         (MemberCache.SearchMembers): The DeclaredOnly looping from
9019         TypeManager.MemberLookup is now done here.      
9020
9021 2002-08-14  Martin Baulig  <martin@gnome.org>
9022
9023         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9024         Type.GetFields on dynamic types but get the fields from the
9025         corresponding TypeContainer.
9026         (MyStructInfo.GetStructInfo): Added check for enum types.
9027
9028         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9029         (MemberList.SyncRoot): Implemented.
9030         (TypeManager.FilterWithClosure): No need to check permissions if
9031         closure_start_type == closure_invocation_type, don't crash if
9032         closure_invocation_type is null.
9033
9034 2002-08-13  Martin Baulig  <martin@gnome.org>
9035
9036         Rewrote TypeContainer.FindMembers to use a member cache.  This
9037         gives us a speed increase of about 35% for the self-hosting MCS
9038         build and of about 15-20% for the class libs (both on GNU/Linux).
9039
9040         * report.cs (Timer): New class to get enhanced profiling.  This
9041         whole class is "TIMER" conditional since it remarkably slows down
9042         compilation speed.
9043
9044         * class.cs (MemberList): New class.  This is an IList wrapper
9045         which we're now using instead of passing MemberInfo[]'s around to
9046         avoid copying this array unnecessarily.
9047         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9048         (ICachingMemberFinder, IMemberContainer): New interface.
9049         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9050         has already been checked, otherwise use it for the name comparision.
9051         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9052         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9053         if possible.  Returns a MemberList, not a MemberInfo [].
9054         (TypeHandle): New class, implements IMemberContainer.  We create
9055         one instance of this class per type, it contains a MemberCache
9056         which is used to do the member lookups.
9057         (MemberCache): New class.  Each instance of this class contains
9058         all members of a type and a name-based hash table.
9059         (MemberCache.FindMembers): This is our new member lookup
9060         function.  First, it looks up all members of the requested name in
9061         the hash table.  Then, it walks this list and sorts out all
9062         applicable members and returns them.
9063
9064 2002-08-13  Martin Baulig  <martin@gnome.org>
9065
9066         In addition to a nice code cleanup, this gives us a performance
9067         increase of about 1.4% on GNU/Linux - not much, but it's already
9068         half a second for the self-hosting MCS compilation.
9069
9070         * typemanager.cs (IMemberFinder): New interface.  It is used by
9071         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9072         Enum, Delegate or Interface.
9073         (TypeManager.finder_to_member_finder): New PtrHashtable.
9074         (TypeManager.finder_to_container): Removed.
9075         (TypeManager.finder_to_delegate): Removed.
9076         (TypeManager.finder_to_interface): Removed.
9077         (TypeManager.finder_to_enum): Removed.
9078
9079         * interface.cs (Interface): Implement IMemberFinder.
9080
9081         * delegate.cs (Delegate): Implement IMemberFinder.
9082
9083         * enum.cs (Enum): Implement IMemberFinder.
9084
9085         * class.cs (TypeContainer): Implement IMemberFinder.
9086
9087 2002-08-12  Martin Baulig  <martin@gnome.org>
9088
9089         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9090
9091 2002-08-12  Martin Baulig  <martin@gnome.org>
9092
9093         * ecore.cs (ITypeExpression): New interface for expressions which
9094         resolve to a type.
9095         (TypeExpression): Renamed to TypeLookupExpression.
9096         (Expression.DoResolve): If we're doing a types-only lookup, the
9097         expression must implement the ITypeExpression interface and we
9098         call DoResolveType() on it.
9099         (SimpleName): Implement the new ITypeExpression interface.
9100         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9101         hack, the situation that we're only looking up types can't happen
9102         anymore when this method is called.  Moved the type lookup code to
9103         DoResolveType() and call it.
9104         (SimpleName.DoResolveType): This ITypeExpression interface method
9105         is now doing the types-only lookup.
9106         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9107         (ResolveFlags): Added MaskExprClass.
9108
9109         * expression.cs (MemberAccess): Implement the ITypeExpression
9110         interface.
9111         (MemberAccess.DoResolve): Added support for a types-only lookup
9112         when we're called via ITypeExpression.DoResolveType().
9113         (ComposedCast): Implement the ITypeExpression interface.
9114
9115         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9116         Expression.Resolve() with ResolveFlags.Type instead.
9117
9118 2002-08-12  Martin Baulig  <martin@gnome.org>
9119
9120         * interface.cs (Interface.Define): Apply attributes.
9121
9122         * attribute.cs (Attribute.ApplyAttributes): Added support for
9123         interface attributes.
9124
9125 2002-08-11  Martin Baulig  <martin@gnome.org>
9126
9127         * statement.cs (Block.Emit): Only check the "this" variable if we
9128         do not always throw an exception.
9129
9130         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9131         whether the property has a set accessor.
9132
9133 2002-08-11  Martin Baulig  <martin@gnome.org>
9134
9135         Added control flow analysis support for structs.
9136
9137         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9138         with control flow analysis turned off.
9139         (IVariable): New interface.
9140         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9141         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9142         (FieldExpr.DoResolve): Resolve the instance expression with flow
9143         analysis turned off and do the definite assignment check after the
9144         resolving when we know what the expression will resolve to.
9145
9146         * expression.cs (LocalVariableReference, ParameterReference):
9147         Implement the new IVariable interface, only call the flow analysis
9148         code if ec.DoFlowAnalysis is true.
9149         (This): Added constructor which takes a Block argument.  Implement
9150         the new IVariable interface.
9151         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9152         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9153         This does the definite assignment checks for struct members.
9154
9155         * class.cs (Constructor.Emit): If this is a non-static `struct'
9156         constructor which doesn't have any initializer, call
9157         Block.AddThisVariable() to tell the flow analysis code that all
9158         struct elements must be initialized before control returns from
9159         the constructor.
9160
9161         * statement.cs (MyStructInfo): New public class.
9162         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9163         argument to this indexer.  If non-zero, check an individual struct
9164         member, not the whole struct.
9165         (FlowBranching.CheckOutParameters): Check struct members.
9166         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9167         overloaded versions of these methods which take an additional
9168         `int field_idx' argument to check struct members.
9169         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9170         overloaded versions of these methods which take an additional
9171         `string field_name' argument to check struct member.s
9172         (VariableInfo): Implement the IVariable interface.
9173         (VariableInfo.StructInfo): New public property.  Returns the
9174         MyStructInfo instance of the variable if it's a struct or null.
9175         (Block.AddThisVariable): New public method.  This is called from
9176         Constructor.Emit() for non-static `struct' constructor which do
9177         not have any initializer.  It creates a special variable for the
9178         "this" instance variable which will be checked by the flow
9179         analysis code to ensure that all of the struct's fields are
9180         initialized before control returns from the constructor.
9181         (UsageVector): Added support for struct members.  If a
9182         variable/parameter is a struct with N members, we reserve a slot
9183         in the usage vector for each member.  A struct is considered fully
9184         initialized if either the struct itself (slot 0) or all its
9185         members are initialized.
9186
9187 2002-08-08  Martin Baulig  <martin@gnome.org>
9188
9189         * driver.cs (Driver.MainDriver): Only report an error CS5001
9190         if there were no compilation errors.
9191
9192         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9193         `UnsafeContext' property to determine whether the parent is in
9194         unsafe context rather than checking the parent's ModFlags:
9195         classes nested in an unsafe class are unsafe as well.
9196
9197 2002-08-08  Martin Baulig  <martin@gnome.org>
9198
9199         * statement.cs (UsageVector.MergeChildren): Distinguish between
9200         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9201         we return.  Added test17() and test18() to test-154.cs.
9202
9203 2002-08-08  Martin Baulig  <martin@gnome.org>
9204
9205         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9206         Family access, make sure the invoking type isn't a subclass of the
9207         queried type (that'd be a CS1540).
9208
9209         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9210         this method which takes an additional `Type invocation_type'.
9211
9212         * expression.cs (BaseAccess.DoResolve): Use the base type as
9213         invocation and query type.
9214         (MemberAccess.DoResolve): If the lookup failed and we're about to
9215         report a CS0122, try a lookup with the ec.ContainerType - if this
9216         succeeds, we must report a CS1540.
9217
9218 2002-08-08  Martin Baulig  <martin@gnome.org>
9219
9220         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9221         (MethodGroupExpr): Implement the IMemberExpr interface.
9222
9223         * expression (MemberAccess.ResolveMemberAccess): No need to have
9224         any special code for MethodGroupExprs anymore, they're now
9225         IMemberExprs.   
9226
9227 2002-08-08  Martin Baulig  <martin@gnome.org>
9228
9229         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9230         Family, FamANDAssem and FamORAssem permissions.
9231         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9232
9233 2002-08-08  Martin Baulig  <martin@gnome.org>
9234
9235         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9236         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9237         or loop block.
9238
9239 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9240
9241         * driver.cs: implemented /resource option to embed managed resources.
9242
9243 2002-08-07  Martin Baulig  <martin@gnome.org>
9244
9245         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9246         (FieldBase.HasFieldInitializer): New public property.
9247         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9248         returns the field initializer and makes sure it is only resolved once.
9249         (TypeContainer.EmitFieldInitializers): Call
9250         FieldBase.GetInitializerExpression to get the initializer, this ensures
9251         that it isn't resolved multiple times.
9252
9253         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9254         the resolving process (SimpleName/MemberLookup) that we're currently
9255         emitting a field initializer (which must not access any instance members,
9256         this is an error CS0236).
9257
9258         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9259         argument, if the `IsFieldInitializer' flag is set, we must report and
9260         error CS0236 and not an error CS0120.   
9261
9262 2002-08-07  Martin Baulig  <martin@gnome.org>
9263
9264         * ecore.cs (IMemberExpr): New public interface.
9265         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9266         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9267         if the expression is an IMemberExpr.
9268
9269         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9270         to be null, implicitly default to `this' if we're non-static in
9271         this case.  Simplified the code a lot by using the new IMemberExpr
9272         interface.  Also fixed bug #28176 here.
9273
9274 2002-08-06  Martin Baulig  <martin@gnome.org>
9275
9276         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9277         ParameterReferences during semantic analysis so that we can do a
9278         type-only search when resolving Cast, TypeOf and SizeOf.
9279         (block): Pass the `current_local_parameters' to the Block's
9280         constructor.
9281
9282         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9283         argument to the constructor.
9284         (ConstructorInitializer.Resolve): Create a temporary implicit
9285         block with the parameters.
9286
9287         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9288         references here if we aren't doing a type-only search.
9289
9290         * statement.cs (Block): Added constructor which takes a
9291         `Parameters parameters' argument.
9292         (Block.Parameters): New public property.
9293
9294         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9295         to `Parameters' and made it public readonly.
9296
9297 2002-08-06  Martin Baulig  <martin@gnome.org>
9298
9299         * ecore.cs (Expression.Warning): Made this public as well.
9300
9301         * report.cs (Report.Debug): Print the contents of collections.
9302
9303 2002-08-06  Martin Baulig  <martin@gnome.org>
9304
9305         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9306         used to tell Resolve() which kinds of expressions it may return.
9307         (Expression.Resolve): Added overloaded version of this method which
9308         takes a `ResolveFlags flags' argument.  This can be used to tell
9309         Resolve() which kinds of expressions it may return.  Reports a
9310         CS0118 on error.
9311         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9312         ResolveFlags.SimpleName.
9313         (Expression.Error118): Added overloaded version of this method which
9314         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9315         which kinds of expressions are allowed.
9316
9317         * expression.cs (Argument.ResolveMethodGroup): New public method.
9318         Resolves an argument, but allows a MethodGroup to be returned.
9319         This is used when invoking a delegate.
9320
9321         * TODO: Updated a bit.
9322
9323 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9324
9325         Fixed compilation with csc.
9326
9327         * ecore.cs: Expression.Error made public. Is this correct? Should
9328         Warning be made public too?
9329
9330         * expression.cs: use ea.Location instead of ea.loc.
9331         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9332
9333 2002-08-06  Martin Baulig  <martin@gnome.org>
9334
9335         * ecore.cs (Expression.loc): Moved the location here instead of
9336         duplicating it in all derived classes.
9337         (Expression.Location): New public property.
9338         (Expression.Error, Expression.Warning): Made them non-static and
9339         removed the location argument.
9340         (Expression.Warning): Added overloaded version which takes an
9341         `int level' argument.
9342         (Expression.Error118): Make this non-static and removed the
9343         expression and location arguments.
9344         (TypeExpr): Added location argument to the constructor.
9345
9346         * expression.cs (StaticCallExpr): Added location argument to
9347         the constructor.
9348         (Indirection, PointerArithmetic): Likewise.
9349         (CheckedExpr, UnCheckedExpr): Likewise.
9350         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9351         (StringPtr): Likewise.
9352
9353
9354 2002-08-05  Martin Baulig  <martin@gnome.org>
9355
9356         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9357
9358         * assign.cs (Assign.DoResolve): Check whether the source
9359         expression is a value or variable.
9360
9361         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9362         while resolving the corresponding blocks.
9363
9364         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9365         an error, don't silently return null.
9366
9367         * statement.cs (Block.AddVariable): Do the error reporting here
9368         and distinguish between CS0128 and CS0136.
9369         (Block.DoResolve): Report all unused labels (warning CS0164).
9370         (LabeledStatement): Pass the location to the constructor.
9371         (LabeledStatement.HasBeenReferenced): New property.
9372         (LabeledStatement.Resolve): Set it to true here.
9373
9374         * statement.cs (Return.Emit): Return success even after reporting
9375         a type mismatch error (CS0126 or CS0127), this is what csc does and
9376         it avoids confusing the users with any consecutive errors.
9377
9378 2002-08-05  Martin Baulig  <martin@gnome.org>
9379
9380         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9381
9382         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9383
9384         * expression.cs (MemberAccess.DoResolve): Silently return if an
9385         error has already been reported.
9386
9387         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9388         error has already been reported.
9389
9390 2002-08-05  Martin Baulig  <martin@gnome.org>
9391
9392         * statement.cs (UsageVector): Only initialize the `parameters'
9393         vector if we actually have any "out" parameters.
9394
9395 2002-08-05  Martin Baulig  <martin@gnome.org>
9396
9397         * expression.cs (Binary.ResolveOperator): When combining delegates,
9398         they must have the same type.
9399
9400 2002-08-05  Martin Baulig  <martin@gnome.org>
9401
9402         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9403         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9404         work with the ms runtime and we also don't need it: if we're a
9405         PropertyBuilder and not in the `indexer_arguments' hash, then we
9406         are a property and not an indexer.
9407
9408         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9409         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9410         since the latter one doesn't work with the ms runtime.
9411
9412 2002-08-03  Martin Baulig  <martin@gnome.org>
9413
9414         Fixed bugs #27998 and #22735.
9415
9416         * class.cs (Method.IsOperator): New public field.
9417         (Method.CheckBase): Report CS0111 if there's already a method
9418         with the same parameters in the current class.  Report CS0508 when
9419         attempting to change the return type of an inherited method.
9420         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9421         and it's not marked abstract or extern.
9422         (PropertyBase): New abstract base class for Property and Indexer.
9423         (PropertyBase.CheckBase): Moved here from Property and made it work
9424         for indexers.
9425         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9426         the same so we can reuse it there.
9427         (Property, Indexer): Derive from PropertyBase.
9428         (MethodSignature.inheritable_property_signature_filter): New delegate
9429         to find properties and indexers.
9430
9431         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9432         argument and improved error reporting.
9433
9434         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9435         EmptyReadOnlyParameters and made it a property.
9436
9437         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9438         version of this method which takes a `PropertyInfo indexer'.
9439         (TypeManager.RegisterIndexer): New method.
9440
9441         * class.cs: Added myself as author of this file :-)
9442
9443 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9444
9445         * class.cs: fixed compilation on windoze.
9446
9447 2002-08-03  Martin Baulig  <martin@gnome.org>
9448
9449         * interface.cs (Interface.GetInterfaceBases): Check whether all
9450         base interfaces are at least as accessible than the current one.
9451
9452         * class.cs (TypeContainer.GetClassBases): Check whether base types
9453         are at least as accessible than the current type.
9454         (TypeContainer.AsAccessible): Implemented and made non-static.
9455         (MemberBase.CheckParameters): Report errors if the accessibility
9456         checks fail.
9457
9458         * delegate.cs (Delegate.Delegate): The default visibility is
9459         internal for top-level types and private for nested types.
9460         (Delegate.Define): Report errors if the accessibility checks fail.
9461
9462         * enum.cs (Enum.Enum): The default visibility is internal for
9463         top-level types and private for nested types.
9464         (Enum.DefineType): Compute the correct visibility.
9465
9466         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9467         function which takes a `bool is_toplevel' instead of a TypeContainer.
9468
9469         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9470         builtin type.
9471
9472 2002-08-02  Martin Baulig  <martin@gnome.org>
9473
9474         * expression.cs (LocalVariableReferenc): Added constructor which
9475         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9476         (LocalVariableReference.IsReadOnly): New property.
9477         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9478         variable is readonly, use our own readonly flag to do this; you can
9479         use the new constructor to get a writable reference to a read-only
9480         variable.
9481
9482         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9483         reference to the local variable.
9484
9485 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9486
9487         * rootcontext.cs (ResolveCore): Also include System.Exception
9488
9489         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9490         we reach an EmptyStatement.
9491
9492         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9493         is also fine.
9494
9495         * expression.cs (Binary.ResolveOperator): Check error result in
9496         two places.
9497
9498         use brtrue/brfalse directly and avoid compares to null.
9499
9500 2002-08-02  Martin Baulig  <martin@gnome.org>
9501
9502         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9503         Fixes bug #28407, added test-155.cs.
9504
9505 2002-08-01  Martin Baulig  <martin@gnome.org>
9506
9507         * class.cs (Event.EmitDefaultMethod): Make this work with static
9508         events.  Fixes #28311, added verify-3.cs.
9509
9510 2002-08-01  Martin Baulig  <martin@gnome.org>
9511
9512         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9513         `is_disposable' fields.
9514         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9515         `hm.is_disposable' if we're using the collection pattern.
9516         (Foreach.EmitCollectionForeach): Use the correct type for the
9517         enumerator's local variable, only emit the try/finally block if
9518         necessary (fixes #27713).
9519
9520 2002-08-01  Martin Baulig  <martin@gnome.org>
9521
9522         * ecore.cs (Expression.report118): Renamed to Error118 and made
9523         it public static.
9524
9525         * statement.cs (Throw.Resolve): Check whether the expression is of
9526         the correct type (CS0118) and whether the type derives from
9527         System.Exception (CS0155).
9528         (Catch.Resolve): New method.  Do the type lookup here and check
9529         whether it derives from System.Exception (CS0155).
9530         (Catch.CatchType, Catch.IsGeneral): New public properties.
9531
9532         * typemanager.cs (TypeManager.exception_type): Added.
9533
9534 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9535
9536         * driver.cs: Updated About function.
9537
9538 2002-07-31  Martin Baulig  <martin@gnome.org>
9539
9540         Implemented Control Flow Analysis.
9541
9542         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9543         (EmitContext.CurrentBranching): Added.
9544         (EmitContext.StartFlowBranching): Added.
9545         (EmitContext.EndFlowBranching): Added.
9546         (EmitContext.KillFlowBranching): Added.
9547         (EmitContext.IsVariableAssigned): Added.
9548         (EmitContext.SetVariableAssigned): Added.
9549         (EmitContext.IsParameterAssigned): Added.
9550         (EmitContext.SetParameterAssigned): Added.
9551         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9552         Added control flow analysis stuff here.
9553
9554         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9555         resolve the expression as lvalue.
9556         (LocalVariableReference.DoResolve): Check whether the variable has
9557         already been assigned.
9558         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9559         the parameter as assigned here.
9560         (ParameterReference.DoResolve): Check whether the parameter has already
9561         been assigned.
9562         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9563         expression as lvalue.
9564
9565         * statement.cs (FlowBranching): New class for the flow analysis code.
9566         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9567         (LabeledStatement.IsDefined): New public property.
9568         (LabeledStatement.AddUsageVector): New public method to tell flow
9569         analyis that the label may be reached via a forward jump.
9570         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9571         flow analysis.
9572         (VariableInfo.Number): New public field.  This is used by flow analysis
9573         to number all locals of a block.
9574         (Block.CountVariables): New public property.  This is the number of
9575         local variables in this block (including the locals from all parent
9576         blocks).
9577         (Block.EmitMeta): Number all the variables.
9578
9579         * statement.cs: Added flow analysis support to all classes.
9580
9581 2002-07-31  Martin Baulig  <martin@gnome.org>
9582
9583         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9584         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9585         then use this argument.
9586
9587         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9588
9589         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9590         use this to specify /define options.
9591
9592 2002-07-29  Martin Baulig  <martin@gnome.org>
9593
9594         * statement.cs (Fixed): Moved all code that does variable lookups
9595         and resolvings from Emit to Resolve.
9596
9597         * statement.cs (For): Moved all code that does variable lookups
9598         and resolvings from Emit to Resolve.
9599
9600         * statement.cs (Using): Moved all code that does variable lookups
9601         and resolvings from Emit to Resolve.
9602
9603 2002-07-29  Martin Baulig  <martin@gnome.org>
9604
9605         * attribute.cs (Attribute.Resolve): Explicitly catch a
9606         System.NullReferenceException when creating the
9607         CustromAttributeBuilder and report a different warning message.
9608
9609 2002-07-29  Martin Baulig  <martin@gnome.org>
9610
9611         * support.cs (ParameterData.ParameterName): Added method to
9612         get the name of a parameter.
9613
9614         * typemanager.cs (TypeManager.IsValueType): New public method.
9615
9616 2002-07-29  Martin Baulig  <martin@gnome.org>
9617
9618         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9619         is a flag which specifies that it's either ref or out.
9620         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9621         the out parameter to `out Parameter.Modifier mod', also set the
9622         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9623
9624         * support.cs (InternalParameters.ParameterModifier): Distinguish
9625         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9626         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9627
9628         * expression.cs (Argument.GetParameterModifier): Distinguish
9629         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9630         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9631
9632 2002-07-29  Martin Baulig  <martin@gnome.org>
9633
9634         * expression.cs (ParameterReference.ParameterReference): Added
9635         `Location loc' argument to the constructor.
9636
9637         * cs-parser.jay: Pass location to ParameterReference.
9638
9639 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9640
9641         * statement.cs (Try): Initialize the location.
9642
9643         * cs-parser.jay: pass location to Try.
9644
9645         * expression.cs (Unary.Reduce): Change the prototype to return
9646         whether a constant fold could be performed or not.  The result is
9647         returned in an out parameters.  In the case of Indirection and
9648         AddressOf, we want to perform the full tests.
9649
9650 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9651
9652         * statement.cs (Statement.Emit): Flag dead code.
9653
9654 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9655
9656         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9657
9658 2002-07-27  Martin Baulig  <martin@gnome.org>
9659
9660         * class.cs (MethodData.Define): Put back call to
9661         TypeManager.AddMethod(), accidentally commented this out.
9662
9663         * report.cs (Debug): New public method to print debugging information,
9664         this is `[Conditional ("DEBUG")]'.
9665
9666 2002-07-26  Martin Baulig  <martin@gnome.org>
9667
9668         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9669         (switch_statement): Push the current_block to the switch_stack and
9670         pop it again when we're done with the switch.
9671         (switch_section): The new block is a child of the current_block.
9672         Fixes bug #24007, added test-152.cs.
9673
9674 2002-07-27  Martin Baulig  <martin@gnome.org>
9675
9676         * expression.cs (Invocation.EmitArguments): When calling a varargs
9677         function with only its fixed arguments, we need to pass an empty
9678         array.
9679
9680 2002-07-27  Martin Baulig  <martin@gnome.org>
9681
9682         Mono 0.13 has been released.
9683
9684 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9685
9686         * driver.cs: Rename --resource to --linkres, because that is what
9687         we do currently, we dont support --resource yet.
9688
9689         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9690
9691 2002-07-25  Martin Baulig  <martin@gnome.org>
9692
9693         * class.cs (MethodData): New public class.  This is a `method builder'
9694         class for a method or one accessor of a Property/Indexer/Event.
9695         (MethodData.GetMethodFlags): Moved here from MemberBase.
9696         (MethodData.ApplyAttributes): Likewise.
9697         (MethodData.ApplyObsoleteAttribute): Likewise.
9698         (MethodData.ApplyConditionalAttribute): Likewise.
9699         (MethodData.ApplyDllImportAttribute): Likewise.
9700         (MethodData.CheckAbstractAndExternal): Likewise.
9701         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9702         (MethodData.Emit): Formerly known as Method.Emit().
9703         (MemberBase): Moved everything which was specific to a single
9704         accessor/method to MethodData.
9705         (Method): Create a new MethodData and call Define() and Emit() on it.
9706         (Property, Indexer, Event): Create a new MethodData objects for each
9707         accessor and call Define() and Emit() on them.
9708
9709 2002-07-25  Martin Baulig  <martin@gnome.org>
9710
9711         Made MethodCore derive from MemberBase to reuse the code from there.
9712         MemberBase now also checks for attributes.
9713
9714         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9715         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9716         as virtual.
9717         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9718         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9719         (MemberBase.ApplyAttributes): New virtual method; applies the
9720         attributes to a method or accessor.
9721         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9722         (MemberBase.ApplyConditionalAttribute): Likewise.
9723         (MemberBase.ApplyDllImportAttribute): Likewise.
9724         (MemberBase.CheckAbstractAndExternal): Likewise.
9725         (MethodCore.ParameterTypes): This is now a property instead of a
9726         method, it's initialized from DoDefineParameters().
9727         (MethodCore.ParameterInfo): Removed the set accessor.
9728         (MethodCore.DoDefineParameters): New protected virtual method to
9729         initialize ParameterTypes and ParameterInfo.
9730         (Method.GetReturnType): We can now simply return the MemberType.
9731         (Method.GetMethodFlags): Override the MemberBase version and add
9732         the conditional flags.
9733         (Method.CheckBase): Moved some code from Define() here, call
9734         DoDefineParameters() here.
9735         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9736         here to avoid some larger code duplication.
9737         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9738         ensure that abstract and external accessors don't declare a body.
9739
9740         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9741         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9742         lookup in the attribute's parent classes, so we need to abort as soon
9743         as we found the first match.
9744         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9745         the attribute has no arguments.
9746
9747         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9748         of a Method.
9749
9750 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9751
9752         * cs-parser.jay: reverted previous patch.
9753
9754 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9755
9756         * cs-parser.jay: fixed bug #22119.
9757
9758 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9759
9760         * attribute.cs: fixed compilation. The error was:
9761         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9762         be assigned to before control leaves the current method."
9763         [FIXME:  Filed as bug #28186: MCS must report this error.]
9764
9765 2002-07-25  Martin Baulig  <martin@gnome.org>
9766
9767         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9768         method to pull the condition name ouf of a Conditional attribute.
9769         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9770         the obsolete message and error flag out of an Obsolete attribute.
9771
9772         * class.cs (Method.GetMethodFlags): New public method to get the
9773         TypeManager.MethodFlags for this method.
9774         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9775         private methods.
9776         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9777         if we're overriding a virtual function, set the new private variable
9778         `parent_method'; call the new TypeManager.AddMethod().
9779
9780         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9781         the MethodBuilder and the Method in a PtrHashtable.
9782         (TypeManager.builder_to_method): Added for this purpose.
9783         (TypeManager.MethodFlags): Added IsObsoleteError.
9784         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9785         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9786         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9787         the message from the attribute.
9788
9789 2002-07-24  Martin Baulig  <martin@gnome.org>
9790
9791         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9792         preprocessor directives, ensure that the argument to #define/#undef is
9793         exactly one identifier and that it's actually an identifier.
9794
9795         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9796         did not work ....
9797
9798 2002-07-24  Martin Baulig  <martin@gnome.org>
9799
9800         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9801         initialize it to TypeManager.object_type in the constructor.
9802         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9803         of the `hm.get_current' method if we're using the collection pattern.
9804         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9805         for the explicit conversion to make it work when we're using the collection
9806         pattern and the `Current' property has a different return type than `object'.
9807         Fixes #27713.
9808
9809 2002-07-24  Martin Baulig  <martin@gnome.org>
9810
9811         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9812         does not match, but don't report any errors.  This method is called in
9813         order for all methods in a MethodGroupExpr until a matching method is
9814         found, so we don't want to bail out if the first method doesn't match.
9815         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9816         matches, report the 123.  Fixes #28070.
9817
9818 2002-07-24  Martin Baulig  <martin@gnome.org>
9819
9820         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9821         TypeManager.TypeToCoreType() to the top of the method so the
9822         following equality checks will work.  Fixes #28107.
9823
9824 2002-07-24  Martin Baulig  <martin@gnome.org>
9825
9826         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9827         operand is of type uint, and the other operand is of type sbyte,
9828         short or int, the operands are converted to type long." -
9829         Actually do what this comment already told us.  Fixes bug #28106,
9830         added test-150.cs.
9831
9832 2002-07-24  Martin Baulig  <martin@gnome.org>
9833
9834         * class.cs (MethodBase): New abstract class.  This is now a base
9835         class for Property, Indexer and Event to avoid some code duplication
9836         in their Define() and DefineMethods() methods.
9837         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
9838         generic methods for Define() and DefineMethods().
9839         (FieldBase): Derive from MemberBase, not MemberCore.
9840         (Property): Derive from MemberBase, not MemberCore.
9841         (Property.DefineMethod): Moved all the code from this method to the
9842         new MethodBase.DefineAccessor(), just call it with appropriate
9843         argumetnts.
9844         (Property.Define): Call the new Property.DoDefine(), this does some
9845         sanity checks and we don't need to duplicate the code everywhere.
9846         (Event): Derive from MemberBase, not MemberCore.
9847         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
9848         accessors, this will also make them work with interface events.
9849         (Indexer): Derive from MemberBase, not MemberCore.
9850         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
9851         (Indexer.Define): Use the new MethodBase functions.
9852
9853         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
9854         argument to the constructor.
9855         (Interface.FindMembers): Added support for interface events.
9856         (Interface.PopluateEvent): Implemented.
9857
9858         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9859
9860 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9861
9862         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9863         but this is required to check for a method name being the same as
9864         the containing class.  
9865
9866         Handle this now.
9867
9868 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9869
9870         * interface.cs: initialize variable.
9871
9872 2002-07-23  Martin Baulig  <martin@gnome.org>
9873
9874         Implemented the IndexerName attribute in interfaces.
9875
9876         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9877         name if this is an explicit interface implementation.
9878         (Indexer.InterfaceIndexerName): New public variable.  If we're
9879         implementing an interface indexer, this is the IndexerName in that
9880         interface.  Otherwise, it's the IndexerName.
9881         (Indexer.DefineMethod): If we're implementing interface indexer,
9882         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9883         and Pending.ImplementIndexer methods.
9884         (Indexer.Define): Also define the PropertyBuilder if we're
9885         implementing an interface indexer and this is neither an explicit
9886         interface implementation nor do the IndexerName match the one in
9887         the interface.
9888
9889         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9890         If a method is defined here, then we always need to create a proxy
9891         for it.  This is used when implementing interface indexers.
9892         (Pending.IsInterfaceIndexer): New public method.
9893         (Pending.ImplementIndexer): New public method.
9894         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9895         This is used when implementing interface indexers to define a proxy
9896         if necessary.
9897         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9898         define a proxy if necessary.
9899
9900         * interface.cs (Interface.IndexerName): New public variable.
9901         (Interface.PopulateIndexer): Set the IndexerName.
9902         (Interface.DefineIndexers): New private method.  Populate all the
9903         indexers and make sure their IndexerNames match.
9904
9905         * typemanager.cs (IndexerPropertyName): Added support for interface
9906         indexers.
9907
9908 2002-07-22  Martin Baulig  <martin@gnome.org>
9909
9910         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9911         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9912         ret if HasReturnLabel.
9913         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9914         variables.
9915
9916         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9917         and set the ec.LoopBeginTryCatchLevel.
9918         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9919         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9920         the current ec.TryCatchLevel, the branch goes out of an exception
9921         block.  In this case, we need to use Leave and not Br.
9922
9923 2002-07-22  Martin Baulig  <martin@gnome.org>
9924
9925         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9926         block unless the block does not always return or it is contained in
9927         another try { ... } catch { ... } block.  Fixes bug #26506.
9928         Added verify-1.cs to the test suite.
9929
9930 2002-07-22  Martin Baulig  <martin@gnome.org>
9931
9932         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9933         then we do not always return.  Fixes bug #24985.
9934
9935 2002-07-22  Martin Baulig  <martin@gnome.org>
9936
9937         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9938         lookup on a per-class level; ie. walk up the class hierarchy until we
9939         found at least one applicable method, then choose the best among them.
9940         Fixes bug #24463 and test-29.cs.
9941
9942 2002-07-22  Martin Baulig  <martin@gnome.org>
9943
9944         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9945         return types of the methods.  The return type is not part of the
9946         signature and we must not check it to make the `new' modifier work.
9947         Fixes bug #27999, also added test-147.cs.
9948         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9949
9950         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9951         on the method's return type.
9952
9953 2002-07-21  Martin Baulig  <martin@gnome.org>
9954
9955         * assign.cs: Make this work if the rightmost source is a constant and
9956         we need to do an implicit type conversion.  Also adding a few more tests
9957         to test-38.cs which should have caught this.
9958
9959         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9960         target in the makefile for this.  The makefile.gnu is primarily intended
9961         for end-users who don't want to debug the compiler.
9962
9963 2002-07-21  Martin Baulig  <martin@gnome.org>
9964
9965         * assign.cs: Improved the Assign class so it can now handle embedded
9966         assignments (X = Y = Z = something).  As a side-effect this'll now also
9967         consume less local variables.  test-38.cs now passes with MCS, added
9968         a few new test cases to that test.
9969
9970 2002-07-20  Martin Baulig  <martin@gnome.org>
9971
9972         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
9973         instructions.  Fixes bug #27977, also added test-146.cs.
9974
9975 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9976
9977         * cs-tokenizer.cs: fixed getHex ().
9978
9979 2002-07-19  Martin Baulig  <martin@gnome.org>
9980
9981         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
9982         not Type.GetType() to lookup the array type.  This is needed when
9983         we're constructing an array of a user-defined type.
9984         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
9985         single-dimensional arrays, but also for single-dimensial arrays of
9986         type decimal.
9987
9988 2002-07-19  Martin Baulig  <martin@gnome.org>
9989
9990         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
9991         this function is called, it's not allowed to share LocalBuilders
9992         among ILGenerators.
9993
9994 2002-07-19  Martin Baulig  <martin@gnome.org>
9995
9996         * expression.cs (Argument.Resolve): Report an error 118 when trying
9997         to pass a type as argument.
9998
9999 2002-07-18  Martin Baulig  <martin@gnome.org>
10000
10001         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10002         Conv_R_Un for the signed `long' type.
10003
10004 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10005
10006         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10007         `expr' for the temporary result, as that will fail if we do
10008         multiple resolves on the same expression.
10009
10010 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10011
10012         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10013         ec.TypeContainer for looking up aliases. 
10014
10015         * class.cs (TypeContainer): Remove LookupAlias from here.
10016
10017         * decl.cs (DeclSpace); Move here.
10018
10019 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10020
10021         * class.cs (FindMembers): Only call filter if the constructor
10022         bulider is not null.
10023
10024         Also handle delegates in `NestedTypes' now.  Now we will perform
10025         type lookups using the standard resolution process.  This also
10026         fixes a bug.
10027
10028         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10029         This uses Expressions (the limited kind that can be parsed by the
10030         tree) instead of strings.
10031
10032         * expression.cs (ComposedCast.ToString): Implement, used to flag
10033         errors since now we have to render expressions.
10034
10035         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10036         FormArrayType. 
10037
10038         * ecore.cs (SimpleName.ToString): ditto.
10039
10040         * cs-parser.jay: Instead of using strings to assemble types, use
10041         Expressions to assemble the type (using SimpleName, ComposedCast,
10042         MemberAccess).  This should fix the type lookups in declarations,
10043         because we were using a different code path for this.
10044
10045         * statement.cs (Block.Resolve): Continue processing statements
10046         even when there is an error.
10047
10048 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10049
10050         * class.cs (Event.Define): Also remove the `remove' method from
10051         the list of pending items.
10052
10053         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10054         generate more compact code. 
10055
10056 2002-07-17  Martin Baulig  <martin@gnome.org>
10057
10058         * const.cs (Const.LookupConstantValue): Add support for constant
10059         `unchecked' and `checked' expressions.
10060         Also adding test case test-140.cs for this.
10061
10062 2002-07-17  Martin Baulig  <martin@gnome.org>
10063
10064         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10065         check whether mi.ReturnType implements the IEnumerator interface; the
10066         `==' and the IsAssignableFrom() will fail in this situation.
10067
10068 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10069
10070         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10071         here too.
10072
10073 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10074
10075         * expression.cs: fixed bug #27811.
10076
10077 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10078
10079         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10080         Molaro: when we are a ref, the value already contains a pointer
10081         value, do not take the address of it.
10082
10083 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10084         * removed mb-parser.jay and mb-tokenizer.cs
10085
10086 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10087
10088         * expression.cs: check against the building corlib void type.
10089
10090 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10091
10092         * ecore.cs: fix for valuetype static readonly fields: when 
10093         initializing them, we need their address, not the address of a copy.
10094
10095 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10096
10097         * typemanager.cs: register also enum_type in corlib.
10098
10099 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10100
10101         * class.cs: allow calling this (but not base) initializers in structs.
10102
10103 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10104
10105         * ecore.cs: make sure we compare against the building base types
10106         in GetTypeSize ().
10107
10108 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10109
10110         * typemanager.cs: fix TypeToCoreType() to handle void and object
10111         (corlib gets no more typerefs after this change).
10112
10113 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10114
10115         * expression.cs (ArrayCreation.EmitArrayArguments): use
10116         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10117
10118         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10119         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10120         array indexes, the runtime actually forbids them.
10121
10122         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10123         for array arguments here.
10124
10125         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10126         instead of the default for ValueTypes.
10127
10128         (New.DoEmit): Use IsValueType instead of
10129         IsSubclassOf (value_type)
10130         (New.DoResolve): ditto.
10131         (Invocation.EmitCall): ditto.
10132
10133         * assign.cs (Assign): ditto.
10134
10135         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10136         Statements *are* currently doing part of their resolution during
10137         Emit.  
10138
10139         Expressions do always resolve during resolve, but statements are
10140         only required to propagate resolution to their children.
10141
10142 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10143
10144         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10145
10146         (LoadAssembly): Do not add the dll if it is already specified
10147
10148         (MainDriver): Add the System directory to the link path at the end,
10149         after all the other -L arguments. 
10150
10151         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10152         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10153         ldelem.u1) and using the opposite for sbytes.
10154
10155         This fixes Digger, and we can finally run it.
10156
10157         * driver.cs (UnixParseOption): Move the option parsing here.  
10158         (CSCParseOption): Implement CSC-like parsing of options.
10159
10160         We now support both modes of operation, the old Unix way, and the
10161         new CSC-like way.  This should help those who wanted to make cross
10162         platform makefiles.
10163
10164         The only thing broken is that /r:, /reference: and /lib: are not
10165         implemented, because I want to make those have the same semantics
10166         as the CSC compiler has, and kill once and for all the confussion
10167         around this.   Will be doing this tomorrow.
10168
10169         * statement.cs (Unsafe.Resolve): The state is checked during
10170         resolve, not emit, so we have to set the flags for IsUnsfe here.
10171
10172 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10173
10174         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10175         not catch the Error_ObjectRefRequired in SimpleName (as it is
10176         possible to have a class/instance variable name that later gets
10177         deambiguated), we have to check this here.      
10178
10179 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10180
10181         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10182         make static and put into Expression.
10183
10184         (Event.Define): Register the private field of the event with the 
10185         TypeManager so that GetFieldFromEvent can get at it.
10186
10187         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10188         keep track of the private field associated with an event which
10189         has no accessors.
10190
10191         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10192         private field.
10193
10194         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10195
10196 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10197
10198         * expression.cs (Binary.EmitBranchable): this routine emits the
10199         Binary expression in a branchable context.  This basically means:
10200         we need to branch somewhere, not just get the value on the stack.
10201
10202         This works together with Statement.EmitBoolExpression.
10203
10204         * statement.cs (Statement.EmitBoolExpression): Use
10205         EmitBranchable. 
10206
10207 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10208
10209         * statement.cs (For): Reduce the number of jumps in loops.
10210
10211         (For): Implement loop inversion for the For statement.
10212
10213         (Break): We can be breaking out of a Try/Catch controlled section
10214         (foreach might have an implicit try/catch clause), so we need to
10215         use Leave instead of Br.
10216
10217         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10218         now).  If the instace expression supports IMemoryLocation, we use
10219         the AddressOf method from the IMemoryLocation to extract the
10220         address instead of emitting the instance.
10221
10222         This showed up with `This', as we were emitting the instance
10223         always (Emit) instead of the Address of This.  Particularly
10224         interesting when This is a value type, as we dont want the Emit
10225         effect (which was to load the object).
10226
10227 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10228
10229         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10230
10231         * statement.cs (Checked): Set the CheckedState during the resolve
10232         process too, as the ConvCast operations track the checked state on
10233         the resolve process, and not emit.
10234
10235         * cs-parser.jay (namespace_member_declaration): Flag that we have
10236         found a declaration when we do.  This is used to flag error 1529
10237
10238         * driver.cs: Report ok when we display the help only.
10239
10240 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10241
10242         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10243
10244 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10245
10246         * cs-tokenizer.cs (define): We also have to track locally the
10247         defines.  AllDefines is just used for the Conditional Attribute,
10248         but we also need the local defines for the current source code. 
10249
10250 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10251
10252         * statement.cs (While, For, Do): These loops can exit through a
10253         Break statement, use this information to tell whether the
10254         statement is the last piece of code.
10255
10256         (Break): Flag that we break.
10257
10258         * codegen.cs (EmitContexts): New `Breaks' state variable.
10259
10260 2002-07-03  Martin Baulig  <martin@gnome.org>
10261
10262         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10263         modifiers in method declarations in structs.  Otherwise, you won't
10264         be able to override things like Object.Equals().
10265
10266 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10267
10268         * class.cs (Method, Property, Indexer): Do not allow the public
10269         modifier to be used in explicit interface implementations.
10270
10271         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10272         override modifiers in method declarations in structs
10273
10274 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10275
10276         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10277         integer or real overflow, report an error
10278
10279 2002-07-02  Martin Baulig  <martin@gnome.org>
10280
10281         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10282         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10283         to tell the runtime about our newly created System.Object and
10284         System.ValueType types.
10285
10286 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10287
10288         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10289         struct instead of Ldarg/Starg.
10290
10291 2002-07-02  Martin Baulig  <martin@gnome.org>
10292
10293         * expression.cs (Indirection.Indirection): Call
10294         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10295
10296 2002-07-02  Martin Baulig  <martin@gnome.org>
10297
10298         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10299         ValueType, call TypeManager.TypeToCoreType() on it.
10300         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10301         the OpCodes.Newarr argument.
10302
10303 2002-07-02  Martin Baulig  <martin@gnome.org>
10304
10305         * expression.cs (Invocation.EmitCall): When compiling corlib,
10306         replace all calls to the system's System.Array type to calls to
10307         the newly created one.
10308
10309         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10310         System.Array methods.
10311         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10312         from the system's System.Array type which must be replaced.
10313
10314 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10315
10316         * typemanager.cs: load unverifiable_code_ctor so we can build
10317         corlib using the correct type. Avoid using GetTypeCode() with
10318         TypeBuilders.
10319         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10320         TypeManager.object_type to allow building corlib.
10321
10322 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10323
10324         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10325
10326 2002-07-01  Martin Baulig  <martin@gnome.org>
10327
10328         * class.cs: Make the last change actually work, we need to check
10329         whether `ifaces != null' to avoid a crash.
10330
10331 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10332
10333         * class.cs: when we build structs without fields that implement
10334         interfaces, we need to add the interfaces separately, since there is
10335         no API to both set the size and add the interfaces at type creation
10336         time.
10337
10338 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10339
10340         * expression.cs: the dimension arguments to the array constructors
10341         need to be converted if they are a long.
10342
10343 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10344
10345         * class.cs: don't emit ldarg.0 if there is no parent constructor
10346         (fixes showstopper for corlib).
10347
10348 2002-06-29  Martin Baulig  <martin@gnome.org>
10349
10350         MCS now compiles corlib on GNU/Linux :-)
10351
10352         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10353         ie. check for MethodImplOptions.InternalCall.
10354
10355         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10356         and TypeManager.attribute_type are null, so we must explicitly check
10357         whether parent is not null to find out whether it's an attribute type.
10358         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10359         and SetBuilder, not only if the property is neither abstract nor external.
10360         This is necessary to set the MethodImplOptions on the accessor methods.
10361         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10362         SetBuilder, see Property.Emit().
10363
10364         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10365         populate "System.Object", "System.ValueType" and "System.Attribute" since
10366         they've already been populated from BootCorlib_PopulateCoreTypes().
10367
10368 2002-06-29  Martin Baulig  <martin@gnome.org>
10369
10370         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10371         is the NullLiteral, we also need to make sure that target_type is not
10372         an enum type.   
10373
10374 2002-06-29  Martin Baulig  <martin@gnome.org>
10375
10376         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10377         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10378         before calling BootstrapCorlib_ResolveDelegate ().
10379
10380 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10381
10382         * statement.cs: fixed build-breaker. All tests passed ok.
10383
10384 2002-06-27  Martin Baulig  <martin@gnome.org>
10385
10386         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10387         for System.Decimal when compiling corlib.
10388
10389 2002-06-27  Martin Baulig  <martin@gnome.org>
10390
10391         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10392         switch blocks which contain nothing but a default clause.
10393
10394 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10395
10396        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10397
10398 2002-06-27  Martin Baulig  <martin@gnome.org>
10399
10400         * ecore.cs (PropertyExpr.PropertyExpr): Call
10401         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10402
10403         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10404         is already a TypeBuilder.
10405
10406 2002-06-27  Martin Baulig  <martin@gnome.org>
10407
10408         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10409         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10410         the "from an array-type to System.Array" case.  This makes it work
10411         when compiling corlib.
10412
10413 2002-06-27  Martin Baulig  <martin@gnome.org>
10414
10415         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10416         non-static PropertyExpr, set its InstanceExpression.  This makes
10417         the `ICollection.Count' property work in System/Array.cs.
10418
10419 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10420
10421         * driver.cs: Made error handling more consistent.  Errors now
10422         tracked by Report class, so many methods which used to return int
10423         now return void.  Main() now prints success/failure and 
10424         errors/warnings message.
10425
10426         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10427         the magic number return values (123 and 124).  Now, if the
10428         expected error occurs, the compiler exits with success (exit value
10429         0).  If the compilation completes without seeing that particular
10430         error, the compiler exits with failure (exit value 1).  The
10431         makefile in mcs/errors has been changed to handle the new behaviour.
10432
10433         * report.cs: Made 'expected error' number a property and renamed
10434         it from 'Probe' to 'ExpectedError'.
10435
10436         * genericparser.cs: Removed error handling support, since it is
10437         now all done by Report class.
10438
10439         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10440         class, so parse() no longer returns an int.
10441
10442         * namespace.cs: Use Report.Error instead of GenericParser.error
10443
10444 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10445
10446         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10447         TypeContainer.AddOperator): At the front of the list put the
10448         explicit implementations, so they get resolved/defined first. 
10449
10450 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10451
10452         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10453         interface type is implemented by this TypeContainer.  Used during
10454         explicit interface implementation.
10455
10456         (Property.Define, Indexer.Define, Method.Define): Validate that
10457         the given interface in the explicit implementation is one of the
10458         base classes for the containing type.
10459
10460         Also if we are explicitly implementing an interface, but there is
10461         no match in the pending implementation table, report an error.
10462
10463         (Property.Define): Only define the property if we are
10464         not explicitly implementing a property from an interface.  Use the
10465         correct name also for those properties (the same CSC uses,
10466         although that is really not needed).
10467
10468         (Property.Emit): Do not emit attributes for explicitly implemented
10469         properties, as there is no TypeBuilder.
10470
10471         (Indexer.Emit): ditto.
10472
10473         Hiding then means that we do not really *implement* a pending
10474         implementation, which makes code fail.
10475
10476 2002-06-22  Martin Baulig  <martin@gnome.org>
10477
10478         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10479         the return value of Object.GetType().  [FIXME: we need to do this whenever
10480         we get a type back from the reflection library].
10481
10482 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10483
10484         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10485
10486 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10487
10488         * attribute.cs: Return null if we can not look up the type.
10489
10490         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10491         the interface types found.
10492
10493         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10494         interface types found.
10495
10496         * typemanager.cs (GetInterfaces): Make this routine returns alll
10497         the interfaces and work around the lame differences between
10498         System.Type and System.Reflection.Emit.TypeBuilder in the results
10499         result for GetInterfaces.
10500
10501         (ExpandInterfaces): Given an array of interface types, expand and
10502         eliminate repeated ocurrences of an interface.  This expands in
10503         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10504         be IA, IB, IC.
10505
10506 2002-06-21  Martin Baulig  <martin@gnome.org>
10507
10508         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10509         on System.Enum.
10510
10511 2002-06-21  Martin Baulig  <martin@gnome.org>
10512
10513         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10514         and called with one of the core types, return the corresponding typebuilder for
10515         that type.
10516
10517         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10518         element type.
10519
10520 2002-06-21  Martin Baulig  <martin@gnome.org>
10521
10522         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10523         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10524         (Expression.ConvertReferenceExplicit): Likewise.
10525
10526         * expression.cs (ElementAccess.DoResolve): Likewise.
10527         (ElementAccess.DoResolveLValue): Likewise.
10528
10529 2002-06-10  Martin Baulig  <martin@gnome.org>
10530
10531         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10532         add the "value" parameter to the parameter list.
10533
10534         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10535         to our caller.
10536
10537 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10538
10539         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10540         the argument to an int, uint, long or ulong, per the spec.  Also
10541         catch negative constants in array creation.
10542
10543 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10544
10545         * class.cs: do not allow the same interface to appear twice in
10546         the definition list.
10547
10548 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10549
10550         * ecore.cs: don't use ldlen with System.Array.
10551
10552 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10553
10554         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10555
10556 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10557
10558         * modifiers.cs: produce correct field attributes for protected
10559         internal. Easy fix so miguel can work on ther harder stuff:-)
10560
10561 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10562
10563         * pending.cs: New file.  Move the code from class.cs here.
10564         Support clearning the pending flag for all methods (when not doing
10565         explicit interface implementation).
10566
10567 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10568
10569         * rootcontext.cs: added a couple more types needed to bootstrap.
10570
10571 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10572
10573         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10574         constructor in the type, instead of any constructor in the type
10575         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10576         a bug in the Mono runtime when applying the params attribute). 
10577
10578 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10579         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10580
10581 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10582
10583         * expression.cs (Unary.ResolveOperator): Use TypeManager
10584         to resolve the type.
10585
10586 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10587
10588         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10589         attached.
10590
10591         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10592         with each member too.
10593
10594         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10595         field builders too - this takes care of the enum member case.
10596
10597 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10598
10599         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10600         address-of operator on both value types and pointers.
10601
10602 2002-06-10  Martin Baulig  <martin@gnome.org>
10603
10604         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10605         PropertyBuilder to the `property_builders' list.
10606
10607         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10608         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10609         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10610         find any indexers which are inherited from an interface.
10611
10612 2002-06-09  Martin Baulig  <martin@gnome.org>
10613
10614         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10615         the same type as the constant if necessary.  There's also a test-130.cs
10616         for this.
10617
10618         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10619
10620         * typemanager.cs (TypeManager.ChangeType): Previously known as
10621         Enum.ChangeEnumType().
10622
10623 2002-06-09  Martin Baulig  <martin@gnome.org>
10624
10625         * expression.cs (Cast.TryReduce): Added support for consts.
10626
10627 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10628
10629         * class.cs (Accessor): Hold attributes information so we can pass
10630         it along.
10631
10632         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10633         Modify to pass in attributes attached to the methods.
10634
10635         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10636
10637         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10638         to handle the Accessor kind :-)
10639
10640         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10641
10642 2002-06-08  Martin Baulig  <martin@gnome.org>
10643
10644         * expression.cs (Unary.TryReduceNegative): Added support for
10645         ULongConstants.
10646
10647 2002-06-08  Martin Baulig  <martin@gnome.org>
10648
10649         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10650         name can't be found in the `defined_names' - the caller will do a
10651         MemberLookup in this case and thus find methods in System.Enum
10652         such as Enum.IsDefined().
10653
10654 2002-06-08  Martin Baulig  <martin@gnome.org>
10655
10656         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10657         Convert.ChangeType() which works with TypeBuilder created types.
10658         (Enum.LookupEnumValue, Enum.Define): Use it here.
10659
10660         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10661         `TypeBuilder.BaseType != null' check.
10662         (TypeContainer.FindMembers): Only lookup parent members if we
10663         actually have a parent.
10664         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10665         (ConstructorInitializer.Resolve): Likewise.
10666
10667         * interface.cs (Interface.FindMembers): Added
10668         `TypeBuilder.BaseType != null' check.
10669
10670         * rootcontext.cs (RootContext.ResolveCore): Added
10671         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10672         classes_second_stage.
10673
10674         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10675         debug_type and trace_type when compiling with --nostdlib.       
10676
10677 2002-06-07  Martin Baulig  <martin@gnome.org>
10678
10679         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10680         (AddField): Set it to true when adding a non-static field.
10681         (DefineType): Use `have_nonstatic_fields' to find out whether we
10682         have non-static fields, not `Fields != null'.
10683
10684 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10685
10686         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10687         dereferencing a null on the static-field code path)
10688
10689 2002-05-30  Martin Baulig  <martin@gnome.org>
10690
10691         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10692         to take command line arguments.  Use reflection to call the new
10693         custom `Initialize' function on the symbol writer and pass it the
10694         command line arguments.
10695
10696         * driver.cs (--debug-args): New command line argument to pass command
10697         line arguments to the symbol writer.
10698
10699 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10700
10701         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10702         the target type for indexers and properties.  Thanks to Joe for
10703         catching this.
10704
10705 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10706
10707         * typemanager.cs (MethodFlags): returns the method flags
10708         (Obsolete/ShouldIgnore) that control warning emission and whether
10709         the invocation should be made, or ignored. 
10710
10711         * expression.cs (Invocation.Emit): Remove previous hack, we should
10712         not do this on matching a base type, we should do this based on an attribute
10713
10714         Only emit calls to System.Diagnostics.Debug and
10715         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10716         on the command line.
10717
10718         * rootcontext.cs: Global settings for tracing and debugging.
10719
10720         * cs-tokenizer.cs (define): New utility function to track
10721         defines.   Set the global settings for TRACE and DEBUG if found.
10722
10723 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10724
10725         * interface.cs (Populate*): Pass in the TypeContainer as well as
10726         the DeclSpace as parameters so that we can create EmitContexts and
10727         then use that to apply attributes etc.
10728
10729         (PopulateMethod, PopulateEvent, PopulateProperty)
10730         (PopulateIndexer): Apply attributes everywhere.
10731
10732         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10733         etc.
10734
10735         (ApplyAttributes): Update accordingly.
10736
10737         We now apply interface attributes for all members too.
10738
10739 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10740
10741         * class.cs (Indexer.Define); Correctly check if we are explicit
10742         implementation (instead of checking the Name for a ".", we
10743         directly look up if the InterfaceType was specified).
10744
10745         Delay the creation of the PropertyBuilder.
10746
10747         Only create the PropertyBuilder if we are not an explicit
10748         interface implementation.   This means that explicit interface
10749         implementation members do not participate in regular function
10750         lookups, and hence fixes another major ambiguity problem in
10751         overload resolution (that was the visible effect).
10752
10753         (DefineMethod): Return whether we are doing an interface
10754         implementation. 
10755
10756         * typemanager.cs: Temporary hack until we get attributes in
10757         interfaces (Ravi is working on that) and we get IndexerName
10758         support in interfaces.
10759
10760         * interface.cs: Register the indexers as properties.
10761
10762         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10763         warning, I have verified that this is a bug in the .NET runtime
10764         (JavaScript suffers of the same problem).
10765
10766         * typemanager.cs (MemberLookup): When looking up members for
10767         interfaces, the parent of an interface is the implicit
10768         System.Object (so we succeed in searches of Object methods in an
10769         interface method invocation.  Example:  IEnumerable x;  x.ToString
10770         ()) 
10771
10772 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10773
10774         * class.cs (Event): Events should also register if they do
10775         implement the methods that an interface requires.
10776
10777         * typemanager.cs (MemberLookup); use the new GetInterfaces
10778         method. 
10779
10780         (GetInterfaces): The code used to lookup interfaces for a type is
10781         used in more than one place, factor it here. 
10782
10783         * driver.cs: Track the errors at the bottom of the file, we kept
10784         on going.
10785
10786         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10787         instance if the method we are calling is static!
10788
10789 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10790
10791         * attribute.cs (ApplyAttributes): Make this function filter out
10792         the IndexerName attribute (as that attribute in reality is never
10793         applied) and return the string constant for the IndexerName
10794         attribute. 
10795
10796         * class.cs (TypeContainer.Emit): Validate that all the indexers
10797         have the same IndexerName attribute, and if so, set the
10798         DefaultName attribute on the class. 
10799
10800         * typemanager.cs: The return value might contain other stuff (not
10801         only methods).  For instance, consider a method with an "Item"
10802         property and an Item method.
10803
10804         * class.cs: If there is a problem with the parameter types,
10805         return. 
10806
10807 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10808
10809         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10810         looks at user defined conversion after making a call to 
10811         StandardConversionExists - we need this for overload resolution.
10812
10813         * expression.cs : Update accordingly the various method calls.
10814
10815         This fixes 2 bugs filed against implicit user defined conversions 
10816
10817 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10818
10819         * statement.cs: Track the result of the assignment.
10820
10821 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10822
10823         * expression.cs (MemberAccess): Improved error reporting for
10824         inaccessible members.
10825
10826 2002-05-22  Martin Baulig  <martin@gnome.org>
10827
10828         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10829         itself with debugging support.
10830
10831 2002-05-22  Martin Baulig  <martin@gnome.org>
10832
10833         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10834         Removed, this isn't needed anymore.
10835
10836 2002-05-20  Martin Baulig  <martin@gnome.org>
10837
10838         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
10839         be underlying type for an enum.
10840
10841 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
10842
10843         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
10844         that splits out the loading of just the core types.
10845
10846         * rootcontext.cs (ResolveCore): Split the struct resolution in
10847         two, so we can load the enumeration underlying types before any
10848         enums are used.
10849
10850         * expression.cs (Is): Bandaid until we fix properly Switch (see
10851         bug #24985 for details).
10852
10853         * typemanager.cs (ImplementsInterface): The hashtable will contain
10854         a null if there are no interfaces implemented.
10855
10856 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
10857
10858         * cs-parser.jay (indexer_declarator): It is fine to have array
10859         parameters
10860
10861 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10862
10863         * typemanager.cs: (RegisterBuilder): New function used to register
10864         TypeBuilders that implement interfaces.  Since
10865         TypeBuilder.GetInterfaces (as usual) does not work with lame
10866         Reflection.Emit. 
10867         (AddUserType): register interfaces.
10868
10869         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10870         dealing with TypeBuilder.  Also, arrays are showing up as
10871         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10872         methods can not be invoked on them!
10873
10874         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10875         (ImplicitReferenceConversionExists): Split out from
10876         StandardConversionExists. 
10877
10878         * expression.cs (As): We were only implementing one of the three
10879         cases for the as operator.  We now implement them all.
10880         (Is): Implement the various other cases for Is as well.
10881
10882         * typemanager.cs (CACHE): New define used to control if we want or
10883         not the FindMembers cache.  Seems to have a negative impact on
10884         performance currently
10885
10886         (MemberLookup): Nested types have full acess to
10887         enclosing type members
10888
10889         Remove code that coped with instance/static returns for events, we
10890         now catch this in RealFindMembers.
10891
10892         (RealFindMembers): only perform static lookup if the instance
10893         lookup did not return a type or an event.  
10894
10895 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10896
10897         * assign.cs (CompoundAssign): We pass more semantic information
10898         now to Compound Assignments than we did before: now we have all
10899         the information at hand, and now we resolve the target *before* we
10900         do the expression expansion, which allows the "CacheValue" method
10901         to have the effect we intended (before, a [x] += 1 would generate
10902         two differen ArrayAccess expressions from the ElementAccess,
10903         during the resolution process).
10904
10905         (CompoundAssign.DoResolve): Resolve target and original_source here.
10906
10907 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10908
10909         * expression.cs (ArrayAccess): dropped debugging information. 
10910
10911         * typemanager.cs: Small bug fix: I was always returning i_members,
10912         instead of one of i_members or s_members (depending on which had
10913         the content).
10914
10915         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10916         method is invoked before any code generation takes place, and it
10917         is a mechanism to inform that the expression will be invoked more
10918         than once, and that the method should use temporary values to
10919         avoid having side effects
10920
10921         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10922
10923         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10924         implementation.
10925
10926         * expression.cs (Indirection, ArrayAccess): Add support for
10927         CacheTemporaries in these two bad boys. 
10928
10929         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10930         ldobj or ldind_ref.  
10931         (StoreFromPtr): Handle stobj as well.
10932
10933         * expression.cs (UnaryMutator): Share more code.
10934
10935         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10936         down: I was not tracking the Filter function as well, which
10937         was affecting the results of the cache.
10938
10939 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10940
10941         * attribute.cs: Remove the hack to handle the CharSet property on
10942         StructLayouts. 
10943
10944 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10945
10946         * attribute.cs (DoResolve): More uglyness, we now only try to
10947         resolve the attribute partially, to extract the CharSet
10948         information (only if we are a StructLayout attribute).  Otherwise 
10949
10950         (GetExtraTypeInfo): Add some code to conditionally kill in the
10951         future this.   I am more and more convinced that the .NET
10952         framework has special code to handle the attribute setting on
10953         certain elements.
10954
10955         * expression.cs (IsParamsMethodApplicable): Revert my previous
10956         foreach change here, it was wrong.
10957
10958 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10959
10960         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10961         (pp_expr): do not abort on unknown input, just return.
10962         (eval): abort if there are pending chars.
10963
10964         * attribute.cs (Attribute.Resolve): Positional parameters are
10965         optional.  Deal with that case.
10966
10967         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10968         the Ansi/Unicode/Auto information for the type.
10969
10970         (TypeContainer.DefineType): instantiate the EmitContext here, as
10971         we will be using it during the type definition (to resolve
10972         attributes) and during the emit phase.
10973
10974         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
10975         to pull type information out of the attributes
10976
10977         (Attribute.Resolve): track the constructor builder, and allow for
10978         multiple invocations (structs and classes will use this).
10979
10980         * ecore.cs (MemberLookupFinal): new version with all the
10981         parameters customizable.
10982
10983         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
10984         constructors.  Return if the result value is null (as the error
10985         would have been flagged already by MemberLookupFinal)
10986
10987         Do not allow instances of abstract classes or interfaces to be
10988         created.
10989
10990         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
10991         We have to compare the assembly property here when dealing with
10992         FamANDAssem and Assembly access modifiers, because we might be
10993         creating an assembly from *modules* (that means that we are not
10994         getting TypeBuilders for types defined in other modules that are
10995         part of this assembly).
10996
10997         (Method.Emit): If the method is marked abstract and has a body,
10998         emit an error. 
10999
11000         (TypeContainer.DefineMembers): If both the defined member and the
11001         parent name match are methods, then do not emit any warnings: let
11002         the Method.Define routine take care of flagging warnings.  But if
11003         there is a mismatch (method overrides something else, or method is
11004         overriwritten by something, then emit warning).
11005
11006         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11007         set to null, this means `do not check for the return type on the
11008         signature'. 
11009
11010         (Method.Define): set the return type for the method signature to
11011         null, so that we get methods with the same name and parameters and
11012         different return types.  This is used to flag warning 114 (you are
11013         hiding a method, and you probably want to use the new/override
11014         keywords instead).
11015
11016         * typemanager.cs (MemberLookup): Implemented proper access
11017         control, closing a long standing set of bug reports.  The problem
11018         was that the Framework only has two bits: Public and NonPublic,
11019         and NonPublic includes private and protected methods, but we need
11020         to enforce the FamANDAssem, FamOrAssem and Family. 
11021
11022 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11023
11024         * statement.cs (GotoCase): Return true: Ammounts to giving up
11025         knowledge on whether we return or not, and letting the other case
11026         be responsible for it.
11027
11028 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11029
11030         * driver.cs: Do not load directories for each file processed, only
11031         do it if there is a pattern.
11032
11033         * ecore.cs: Report readonly assigns here as well, as we might have
11034         been resolved only by MemberAccess.
11035
11036         (SimpleName.SimpleNameResolve): Also be useful for LValue
11037         resolution.   We need this to propagate assign to local readonly variables
11038
11039         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11040         do not want to reuse potential criteria memory.
11041
11042         * class.cs (MyEventBuilder): Set reflected_type;
11043
11044         * ecore.cs (Constantify): Added support for constifying bools.
11045
11046         (RootContext.LookupType): Added a cache for values looked up in
11047         the declaration space.
11048
11049         * typemanager.cs (FindMembers): Now is a front-end to
11050         RealFindMembers, and provides a two-level hashtable-based cache to
11051         the request.  
11052
11053         15% performance improvement: from 22.5 to 19.2 seconds.
11054
11055         * expression.cs (IsParamsMethodApplicable): use foreach.
11056         (Invocation.DoResolve): ditto.
11057         (New.DoResolve): ditto.
11058         (ArrayCreation.DoResolve): ditto.
11059
11060         * ecore.cs (FindMostEncompassingType): use foreach.
11061
11062         * delegate.cs (NewDelegate.DoResolve): Use foreach
11063
11064         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11065         (RemoveMethods): use foreach.
11066
11067         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11068         nested foreach statements instead of for, and also break out of
11069         the inner loop once a match is found.
11070
11071         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11072
11073 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11074
11075         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11076         we actually unwrap the expression to allow for extra information
11077         to be extracted. 
11078
11079         * expression.cs: Use Shr_Un on unsigned operations. 
11080
11081 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11082
11083         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11084         applicable operators was not being considered correctly. This closes
11085         the bug Miguel reported.
11086
11087 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11088
11089         * attribute.cs: check that the type derives from System.Attribute
11090         and report the correct error in that case (moved the duplicate code to
11091         its own method, too).
11092
11093 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11094
11095         * attribute.cs: lookup attribute type name as the spec says: first the
11096         bare attribute name and then name + "Attribute" (nant compiles with
11097         mcs after this fix).
11098
11099 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11100
11101         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11102         Because of the way we parse things, we should try to see if a
11103         UIntConstant can fit in an integer.
11104
11105 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11106
11107         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11108         when we are in an explicit context.
11109
11110         (ConvertReferenceExplicit): When converting from Iface type S to Class
11111         T make sure the rules are implemented as an OR.
11112
11113         * parameter.cs (ParameterType): Make it a property for now although the
11114         purpose really isn't anything immediate.
11115
11116         * expression.cs (Is*Applicable): Do better checking on the parameter type
11117         of a ref/out parameter. The ones from the system assemblies are already 
11118         marked with the correct type so we don't need to do any correction.
11119
11120         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11121         the object type is standard too so include that.
11122
11123 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11124
11125         * ecore.cs (StandardConversionExists): Augment with missing code:
11126         deal with IntConstant, LongConstants and Enumerations.
11127
11128         * assign.cs: Report the error, instead of failing silently
11129
11130         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11131         typecontainer that they are declared, because the
11132         typecontainer/namespace will have the list of using clauses that
11133         need to be applied.
11134
11135         Assembly Attributes were escaping the normal registration
11136         mechanism. 
11137
11138         (EmitCode): Apply attributes within an EmitContext that represents
11139         the container they were declared on.
11140
11141         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11142
11143 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11144
11145         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11146         Revamp completely - make much cleaner as we now operate only
11147         on a set of Types.
11148
11149         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11150         to implement the logic detailed in the spec more correctly.
11151
11152         (UserDefinedConversion): Update accordingly.
11153
11154 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11155
11156         * statement.cs: Return flow analysis information up.
11157
11158         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11159         and the default.
11160
11161         (token): Do not consume an extra character before calling
11162         decimal_digits.
11163
11164 2002-05-06  Piers Haken <piersh@friskit.com>
11165
11166         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11167
11168 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11169
11170         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11171         EmitContext during the instance constructor initializer
11172         resolution, to stop access to instance variables.
11173
11174         This is mandated by the spec, last paragraph of the `constructor
11175         initializers' section. 
11176
11177 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11178
11179         * cs-parser.jay, class.cs (Accessor): new class used to represent
11180         an accessor (get or set).  In the past we used `null' to represent
11181         a missing accessor.  But this is ambiguous because there was no
11182         way to tell in abstract indexers/properties if one of them was
11183         specified.
11184
11185         Now there is a way of addressing that.
11186
11187         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11188         instead of FindMembers.
11189
11190         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11191         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11192
11193         * attribute.cs: Treat indexers and properties as the same in terms
11194         of applying attributes
11195
11196         * ecore.cs (FindMostEncompassedType): Use statically initialized
11197         EmptyExpressions()s like we do elsewhere to avoid creating useless
11198         objects (and we take this out of the tight loop).
11199
11200         (GetConversionOperators): Move the code to extract the actual
11201         operators to a separate routine to clean things up.
11202
11203 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11204
11205         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11206         events are always registered FieldBuilders.
11207
11208         * class.cs (FieldBase): New class shared by Fields 
11209
11210         * delegate.cs: If we are a toplevel delegate, use our full name.
11211         If we are a nested delegate, then only use our tail name.
11212
11213 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11214
11215         * expression.cs (IsApplicable): Ensure that we add the "&" to
11216         ref/out types before comparing it with the type of the argument.
11217
11218         (IsParamsMethodApplicable): Ditto.
11219
11220         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11221         silly me ;-)
11222
11223         * delegate.cs : Handle the case when we have more than one applicable
11224         method. Flag an error only when we finish checking all.
11225
11226 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11227
11228         * expression.cs: Add support for boolean static initializers.
11229
11230 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11231
11232         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11233
11234         * parameter.cs (ComputeParameterTypes,
11235         ComputeAndDefineParameterTypes): Better error handling: now we
11236         clear the `types' cache if we fail during any of the type lookups.
11237         We also return the status code correctly to our caller
11238
11239         * delegate.cs: If we fail to define a delegate, abort the extra
11240         steps. 
11241
11242         * expression.cs (Binary.ResolveOperator): for
11243         operator==(object,object) and operator !=(object, object) we also
11244         have to verify that there is an implicit conversion from one to
11245         the other.
11246
11247         (ArrayAccess.DoResolve): Array Access can operate on
11248         non-variables. 
11249
11250 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11251
11252         * assign.cs (CompoundAssign): A new class used as a "flag" that
11253         the assignment actually is happening as part of a compound
11254         assignment operator.
11255
11256         During compound assignment, a few new rules exist to enable things
11257         like:
11258
11259         byte b |= 1 + 2
11260
11261         From the spec:
11262
11263         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11264         to the type of x) if y is implicitly convertible to the type of x,
11265         and the operator is a builtin operator and the return type of the
11266         operator is explicitly convertible to the type of x. 
11267
11268         * rootcontext.cs: Reset warning level to 2.  4 catches various
11269         "interesting" features in mcs, we must clean this up at some
11270         point, but currently am trying to kill other bugs ;-)
11271
11272         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11273         in container classes as well.  
11274
11275         * expression.cs (Binary.ResolveOperator): Handle string case
11276         before anything else (as operator overloading does emit an error
11277         before doing anything else).
11278
11279         This code could go away when we move to a table driven model, but
11280         i could not come up with a good plan last night.
11281
11282 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11283
11284         * typemanager.cs (CSharpName): reimplementation using regex.
11285         * class.cs: added null check for fields in Emit
11286         * rootcontext.cs: set warninglevel to 4
11287
11288 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11289
11290         * typemanager.cs (CSharpName): reimplemented with Lupus
11291         suggestion.
11292
11293 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11294
11295         * statement.cs (If): correclty implement Resolve, because we were
11296         not catching sem errors in there.  The same process is needed
11297         everywhere else. 
11298         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11299
11300
11301         (Statement.Warning_DeadCodeFound): Factorize code.
11302         (While): Report dead code here too.
11303
11304         (Statement): Added Resolve virtual method to allow
11305         for resolution split from the emit code.
11306
11307 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11308
11309         * statement.cs (EmitBoolExpression): No longer try to resolve the
11310         expression here.    
11311         (MakeBoolean): New utility function that resolve, implicitly
11312         converts to boolean and tags the expression. 
11313
11314
11315         (If, Do): Implement dead code elimination.
11316         (While): Implement loop inversion
11317
11318         (Do, While, For, If): Resolve the expression prior to calling our
11319         code generation.
11320
11321 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11322
11323         * class.cs:
11324           - added method Report28 (warning: program has more than one entry point)
11325           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11326           - modified method Method.Define, the part at the end of the method
11327
11328         * rootcontext.cs: added static public Location EntryPointLocation;
11329           
11330         * ../errors/cs0028.cs : Add test case for the above warning.              
11331
11332         * typemanager.cs:
11333           - modified method CSharpName to allow arrays of primitive type to
11334             be printed nicely (e.g. instead of System.Int32[][] it now prints
11335             int[][])
11336           - added method CSharpSignature: returns the signature of a method
11337             in string format to be used in reporting errors, warnings, etc.
11338
11339         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11340         with String.Empty.
11341
11342 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11343
11344         * delegate.cs (Define): Fix extremely silly bug where I was
11345         setting the type of the 'object' parameter of the BeginInvoke
11346         method to System.IAsyncResult instead of System.Object ;-)
11347
11348 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11349
11350         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11351         here. 
11352
11353         (Constructor.Emit): return if we fail to initialize the
11354         constructor.  Another door closed!  
11355
11356         * expression.cs (New.DoResolve): Improve error message (from -6 to
11357         1501).  Use DeclaredOnly lookup to find the exact constructor.
11358
11359         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11360         loop.  This is useful.
11361
11362         * cs-parser.jay: Adjust the default parameters so that destructors
11363         have the proper signature.
11364
11365 2002-04-26  Martin Baulig  <martin@gnome.org>
11366
11367         * driver.cs (LoadAssembly): If `assembly' contains any characters
11368         which are only valid in path names and not in assembly names
11369         (currently slash, backslash and point), use Assembly.LoadFrom ()
11370         instead of Assembly.Load () on the `assembly' (before iteration
11371         over the link_paths).
11372
11373 2002-04-26  Martin Baulig  <martin@gnome.org>
11374
11375         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11376
11377 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11378
11379         * class.cs (Property): use the new typemanager.MemberLookup
11380
11381         (TypeContainer.MemberLookup): Implement using the
11382         TypeManager.MemberLookup now. 
11383
11384         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11385         and return MemberInfos, so that these can be used without an
11386         EmitContext (what we had before).
11387
11388 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11389
11390         * expression.cs: Fix the case where the argument to params if the
11391         type of the params.  I omitted handling this before.   Fixed
11392
11393 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11394
11395         * driver.cs: Call BootCorlib_PopulateCoreType
11396
11397         * class.cs (Property.CheckBase): Check for properties only, not
11398         for all members. 
11399
11400         * interface.cs: Temporary hack: try/catch around the
11401         CustomAttributeBuilder, because I am getting an exception that I
11402         do not understand.
11403
11404         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11405         types whose definitions are required to be there (attributes are
11406         defined before standard types).
11407
11408         Compute definitions as we boot the various types, as they are used
11409         immediately (value_type class will need object_type, but if we do
11410         not initialize object_type, we will pass a null, which will let
11411         the runtime pick the System.Object from the existing corlib, which
11412         is not what we want).
11413
11414 2002-04-22  Patrik Torstensson <totte@labs2.com>
11415
11416         * cs-tokenizer.cs: fixed a number of trim() issues.
11417
11418 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11419
11420         * expression.cs (Argument.Type): Ensure that we return the correct
11421         type when we have out or ref parameters [in which case we 
11422         append a "&"].
11423
11424 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11425
11426         * class.cs (Property, Indexer): Allow extern modifier in there. 
11427
11428         * typemanager.cs (InitBaseTypes): Initializes object_type and
11429         value_type, since those will be used early on during the bootstrap
11430         process to compile corlib.
11431
11432         (InitCoreTypes): Move code from here to InitBaseTypes.
11433
11434 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11435
11436         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11437         single-dimension arrays as using the ldlen opcode.  
11438
11439         Daniel Lewis discovered this optimization.  
11440
11441         * typemanager.cs: Add signature for System.Array::get_Length
11442
11443 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11444
11445         * statement.cs: report the error when the foreach does not apply to an
11446         array nor a collection.
11447
11448 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11449
11450         * expression.cs: Add implicit conversions to the operator ~.
11451
11452         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11453
11454         * typemanager.cs: Locate the decimal constructor.
11455
11456 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11457
11458         * attribute.cs: use the new property of TypeOf.
11459         * expression.cs: added 'get' property around typearg.
11460
11461         These changes fix a build breaker reported by NickD. Is this the
11462         correct way to fix?  If not, please, revert my changes and make it
11463         work :-).
11464
11465 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11466
11467         * attribute.cs: Add support for typeof in attribute invocations.
11468         I am not sure that this is right though.
11469
11470 2002-04-14  Duncan Mak  <duncan@ximian.com>
11471
11472         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11473         Binary.Operator.Division case.
11474
11475 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11476
11477         * class.cs (DefineType): Ensure that we do a proper check on
11478         attribute types and also register it with the TypeManager.
11479
11480         (TypeContainer.Targets): The default for attribute types is
11481         AttributeTargets.All.
11482
11483         * attribute.cs (ApplyAttributes): Registering the attribute type
11484         is done elsewhere, not when we discover we have a Usage attribute.
11485
11486 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11487
11488         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11489         and get rid of is_delegate parameter.
11490
11491         * everywhere : update.
11492
11493 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11494
11495         * cs-parser.jay (compilation_unit): Revamp completely to use
11496         some new ideas that I got from Rhys' grammar to solve the problems
11497         with assembly level attributes.
11498
11499         (outer_declaration): New grammar production.
11500
11501         (attribute_sections): Add.
11502
11503         (opt_attributes): Base on attribute_sections
11504
11505         (namespace_declaration): Allow opt_attributes to tackle the case
11506         when we have assembly level attributes - we are clever in this
11507         regard now ;-)
11508
11509         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11510         attributes in the non-global context.
11511
11512         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11513         instead of SetGlobalAttributes.
11514
11515         * class.cs, rootcontext.cs : Ensure we define and generate 
11516         attribute types before anything else.
11517
11518         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11519         and flag the new error -20 for the case when the attribute type
11520         does not have valid targets specified. csc does not catch this.
11521
11522         * ../errors/errors.txt : update for error # -20
11523
11524 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11525
11526         * support.cs (InternalParameters.ParameterModifier): Do some null
11527         checking and return sane values.
11528
11529         * class.cs (Method.Define): If we are a PInvoke method, ensure
11530         that we are static and extern. Report error # 601
11531
11532         * ../errors/cs0601.cs : Add test case for the above error.
11533
11534 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11535
11536         * rootcontext.cs (attribute_types): We need to keep type of
11537         all attribute types separately and emit code for them first.
11538
11539         (RegisterAttribute) : Implement.
11540
11541         * class.cs (DefineType): Check if the current Type is a custom
11542         attribute type and register it accordingly.
11543
11544         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11545         adding the first attribute twice and rename to
11546
11547         (SetGlobalAttributes): this.
11548
11549         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11550         lookups.
11551
11552         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11553         if we are processing global arguments. Hmm, I am unsure of this.
11554
11555 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11556
11557         * expression.cs: added static array of strings to avoid calling
11558         Enum.ToString () for Operator in Binary. Significant recover of
11559         performance.
11560
11561 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11562
11563         * class.cs (FindMembers): Allow the Builders of the various
11564         members to be null.  If they are skip them.  This only happens
11565         during the PInvoke declaration.
11566
11567 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11568
11569         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11570         failure, so we do not keep going afterwards.
11571
11572         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11573         wanted to pass `false' as the `is_delegate' argument.  If this is
11574         the case, why not use delegate_type == null to mean `is_delegate =
11575         false' and anything else as is_delegate = true.
11576
11577 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11578
11579         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11580         code for the section, not the beginning of the tests.
11581
11582 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11583
11584         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11585
11586         * expression.cs (Binary): same.  Warn about errors where we have
11587         Enum/Enum in operator + as well.
11588
11589 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11590
11591         * statement.cs:
11592                 - added support for switch(bool)
11593                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11594                 - add TableSwitchEmit() to handle table-based switch statements
11595
11596 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11597
11598         * expression.cs (Invocation.OverloadResolve): Factor out code which
11599         does parameter compatibility checking with arguments so that we can 
11600         re-use the code even from Delegate.VerifyApplicability
11601
11602         (VerifyArgumentsCompat): Move above code here.
11603
11604         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11605         and instead make a call to the above method.
11606
11607 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11608
11609         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11610         We use it to keep track of classes which are attribute types.
11611
11612 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11613
11614         * delegate.cs (Delegate.Define): Correctly define the types in the
11615         presence of fixed and array parameters.
11616
11617         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11618         doing FindMembers.
11619
11620         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11621         include NonPublic after the first iteration.
11622
11623         * class.cs (Indexer.CheckBase): Only check if both parents are
11624         non-null. 
11625
11626         * cs-parser.jay (accessor_body): If empty, set to null.
11627
11628         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11629         same code path here to resolve constants names that we did have in
11630         MemberAccess.DoResolve.  There is too much code duplicated here.
11631
11632 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11633
11634         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11635
11636         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11637         to MakeUnionSet.
11638
11639         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11640         tokens, numbers and strings.
11641
11642         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11643         parenthesis.
11644
11645         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11646         asyncronous parameters and the regular parameters.  
11647
11648         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11649         specify the target directory.
11650
11651         * expression.cs: (This.DoResolve): Simplify
11652         (As.Emit): Optimize, do not generate IsInst if the expression is
11653         always of the given type.
11654
11655         (Is.DoResolve): Bug fix, we were reporting both always/never for
11656         the is expression.
11657
11658         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11659         creating too many unnecessary arrays.
11660
11661 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11662
11663         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11664         fields instead of rolling our own initializer.   Takes care of all
11665         implicit conversions, and drops unnecessary static checks/argument.
11666
11667 2002-03-31  Dick Porter  <dick@ximian.com>
11668
11669         * driver.cs: use the GetDirectories() return values properly, and
11670         use "/" as path separator.
11671
11672 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11673
11674         * expression.cs (Unary): Optimize - - expr into expr.
11675         (Binary): Optimize a + (-b) into a -b.
11676
11677         * codegen.cs (CodeGen): Made all methods static.
11678
11679 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11680
11681         * rootcontext.cs: 
11682
11683         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11684         TypeBuilder property.
11685
11686         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11687         instead. 
11688
11689         * tree.cs: Removed the various RecordXXXX, and replaced with a
11690         single RecordDecl.  Removed all the accessor methods, and just
11691         left a single access point Type 
11692
11693         * enum.cs: Rename DefineEnum to DefineType.
11694
11695         * decl.cs: New abstract method `DefineType' used to unify the
11696         Defines for Enumerations, Interfaces, TypeContainers and
11697         Delegates.
11698
11699         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11700         LookupBaseClasses method that used to live in class.cs and
11701         interface.cs here, and renamed to FindType.
11702
11703         * delegate.cs: Implement DefineType.  Take advantage of the
11704         refactored pattern for locating the parent builder without taking
11705         the parent_builder argument (which we know does not work if we are
11706         nested, and triggering a toplevel definition).
11707
11708 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11709
11710         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11711         accessibility of a member has changed during override and report
11712         an error if so.
11713
11714         * class.cs (Method.Define, Property.Define): Only complain on
11715         overrides if the method is private, any other accessibility is
11716         fine (and since we just checked the permission is the same, we are
11717         good to go).
11718
11719         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11720         and elif are processed always.  The other pre-processing
11721         directives are only processed if we are "taking" the path
11722
11723 2002-03-29  Martin Baulig  <martin@gnome.org>
11724
11725         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11726         current location is not Null.
11727
11728         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11729         a separate method so we can profile it.
11730
11731         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11732         `span.Seconds' are just seconds, but no minutes or hours.
11733         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11734
11735 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11736
11737         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11738         Remove the gratuitous set of Final:
11739
11740                                 // If an interface implementation, then we can set Final.
11741                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11742                                     implementing.DeclaringType.IsInterface)
11743                                         flags |= MethodAttributes.Final;
11744
11745         I do not know what I was smoking when I used that.
11746
11747
11748         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11749         step into fixing the name resolution issues for delegates and
11750         unifying the toplevel name resolution.
11751
11752 2002-03-28  Martin Baulig  <martin@gnome.org>
11753
11754         * class.cs (Method.Emit): If we have a symbol writer, call its
11755         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11756         tell it about the current method.
11757
11758         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11759         writer that we're going to emit the first byte of IL code for a new
11760         statement (a new source line).
11761         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11762         EmitContext.Mark() before emitting any code.
11763
11764         * location.cs (SymbolDocument): Return null when we're Null.
11765
11766         * statement.cs (Statement): Moved the `Location loc' variable here.
11767         (Statement.EmitBoolExpression): If we have a symbol writer, call
11768         ec.Mark() before emitting any code to tell it that we're at the
11769         beginning of a new statement.
11770         (StatementExpression): Added `Location' argument to the constructor.
11771         (Block): Added public readonly variable `StartLocation' and public
11772         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11773         (Block): Added constructor which takes a start and end location.
11774         (Block.SetEndLocation): New method. This sets the end location.
11775         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11776         local variables we create.
11777         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11778         each statement and do also mark the begin and end of the block.
11779
11780         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11781         tell it the current lexer.Location, use Location.Null for the end of the
11782         block.
11783         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11784         current block, set its end location using SetEndLocation().
11785         (statement_expression): StatementExpression constructor now takes the
11786         lexer.Location as additional argument.
11787         (for_statement, declare_local_variables): Likewise.
11788         (declare_local_variables): When creating a new implicit block, use the
11789         new Block constructor and pass it the lexer.Location.
11790
11791 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11792
11793         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11794         members also on the parent interfaces recursively.
11795
11796 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11797
11798         * report.cs: Use new formats, since Gonzalo finished the missing
11799         bits. 
11800
11801         * expression.cs (Binary.ResolveOperator): added missing operator|
11802         operator& and operator^ for bool/bool.
11803
11804         * cs-parser.jay: CheckDef now takes a Location argument that is
11805         used to report errors more precisly (instead of reporting the end
11806         of a definition, we try to track something which is a lot closer
11807         to the source of the problem).
11808
11809         * cs-tokenizer.cs: Track global token use, so we can properly flag
11810         the use of #define/#undef after the first token has been seen.
11811
11812         Also, rename the reportXXXX to Error_DescriptiveName
11813
11814         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11815         TypeContainer, so that Enum and Interface can use this too.
11816
11817         * class.cs (TypeContainer.LookupInterfaceOrClass,
11818         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11819         `builder' argument.  Typically this was used to pass the parent
11820         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11821         the definition).  
11822
11823         The problem is that a nested class could trigger the definition of
11824         a toplevel class, and the builder would be obviously wrong in that
11825         case. 
11826
11827         So we drop this argument, and we compute dynamically the
11828         TypeBuilder/ModuleBuilder (the correct information was available
11829         to us anyways from DeclSpace.Parent)
11830
11831         * interface.cs (Interface.DefineInterface): Drop builder
11832         parameter cleanup like class.cs
11833
11834         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11835         like class.cs
11836
11837         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
11838         values. 
11839
11840         (Try.Emit): Propagate the returns value from the statement.
11841
11842         (Return.Emit): Even if we are leavning 
11843
11844         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
11845
11846         * modifiers.cs: Fix the computation of MethodAttributes flags.
11847
11848 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
11849
11850         * driver.cs: allow compilation of files that start with '/'.
11851         Add a default case when checking the argument of --target.
11852
11853 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
11854
11855         * interface.cs: Implement the same search algorithm for types in
11856         the interface code.
11857
11858         * delegate.cs: Do not allow multiple definition.
11859
11860         * Recovered ChangeLog that got accidentally amputated
11861
11862         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11863
11864         * rootcontext.cs: Load manually enum to allow core classes to
11865         contain enumerations.
11866
11867         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11868         Update to new static methods in TypeManager.
11869
11870         * typemanager.cs (GetMethod, GetConstructor): Use our
11871         implementation of FindMembers to find the members, since during
11872         corlib compilation, the types are TypeBuilders and GetMethod and
11873         GetConstructor do not work.
11874
11875         Make all methods in TypeManager static.
11876
11877         (InitCodeHelpers): Split the functionality from
11878         the InitCodeTypes function.
11879
11880         * driver.cs: Call InitCodeHelpers after we have populated the
11881         types. 
11882
11883         * cs-parser.jay (delegate_declaration): we did not used to compute
11884         the delegate name correctly for void delegates.
11885
11886 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11887
11888         * rootcontext.cs (RootContext): Init the interface_resolve_order
11889         and type_container_resolve_order always.
11890
11891         (ResolveCore, BootstrapCorlib_ResolveClass,
11892         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11893         compiler when compiling with --nostdlib
11894
11895         * class.cs (TypeContainer.DefineType): Check that our parent is
11896         not null.  This test is most important when we are bootstraping
11897         the core types.
11898
11899         * codegen.cs: Split out the symbol writing code.
11900
11901 2002-03-25  Martin Baulig  <martin@gnome.org>
11902
11903         * driver.cs (-g): Made -g an alias for --debug.
11904
11905 2002-03-24  Martin Baulig  <martin@gnome.org>
11906
11907         * codegen.cs (SymbolWriter): New public variable. Returns the
11908         current symbol writer.
11909         (CodeGen): Added `bool want_debugging_support' argument to the
11910          constructor. If true, tell the ModuleBuild that we want debugging
11911         support and ask it for the ISymbolWriter.
11912         (Save): If we have a symbol writer, call it's Close() method after
11913         saving the assembly.
11914
11915         * driver.c (--debug): New command line argument to create a
11916         debugger information file.
11917
11918         * location.cs (SymbolDocument): New public property. Returns an
11919         ISymbolDocumentWriter object for the current source file or null
11920         if we don't have a symbol writer.
11921
11922 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11923
11924         * driver.cs (LoadAssembly): Correctly return when all the paths
11925         have been tried and not before.
11926
11927         * statement.cs (Switch.Emit): return the actual coverage for this
11928         statement (returns/not-returns)
11929
11930         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11931         switch of the statement if we are the last switch section.  That
11932         kills two problems: try/catch problems (we used to emit an empty
11933         nop at the end) and switch statements where all branches would
11934         return. 
11935
11936 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11937
11938         * driver.cs: Add default assemblies (the equivalent to the
11939         Microsoft CSC.RSP file)
11940
11941         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11942         also update tokens_seen and set it to false.
11943
11944         * driver.cs: Implement --recurse for Mike.
11945
11946         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11947         correctly splitting out the paths.
11948
11949 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11950
11951         * interface.cs (Interface.PopulateProperty): Instead of using
11952         `parent' as the declaration space for the set parameters, use
11953         `this' 
11954
11955         * support.cs (InternalParameters): InternalParameters constructor
11956         takes a DeclSpace instead of a TypeContainer.
11957
11958         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11959         types are being initialized, load the address of it before calling
11960         the function.  
11961
11962         (New): Provide a mechanism to disable the generation of local
11963         value type temporaries when the caller will be providing us with
11964         an address to store it.
11965
11966         (ArrayCreation.EmitDynamicInitializers): Use it.
11967
11968 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11969
11970         * expression.cs (Invocation.EmitArguments): Only probe for array
11971         property if there is more than one argument.  Sorry about that.
11972
11973         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
11974         empty param arrays.
11975
11976         * class.cs (Method.LabelParameters): Fix incorrect code path that
11977         prevented the `ParamArrayAttribute' from being applied to the
11978         params attribute.
11979
11980 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
11981
11982         * support.cs (ReflectionParameters): Correctly compute whether the
11983         last argument is a params array.  Fixes the problem with
11984         string.Split ('a')
11985
11986         * typemanager.cs: Make the assemblies array always be non-null
11987         (empty, but non-null)
11988
11989         * tree.cs (RecordDecl): New function that abstracts the recording
11990         of names.  This reports error 101, and provides a pointer to the
11991         previous declaration.  Fixes a crash in the compiler.
11992
11993         * cs-parser.jay (constructor_declaration): Update to new grammar,
11994         and provide a constructor_body that can be empty.
11995
11996 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
11997
11998         * driver.cs: Add support for --resources.
11999
12000         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12001         Make all types for the various array helper methods be integer.
12002
12003         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12004         CheckState to ConvCast.
12005
12006         (ConvCast): Now it takes a `checked' state argument, to avoid
12007         depending on the emit context for the conversion, and just using
12008         the resolve time setting.
12009
12010         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12011         instead of Invocation.EmitArguments.  We do not emit the original
12012         arguments, instead we emit those which have been converted to
12013         unsigned int expressions.
12014
12015         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12016
12017         * codegen.cs: ditto.
12018
12019         * expression.cs (LocalVariableReference): Drop the use of the
12020         Store function that depended on the variable index.
12021
12022         * statement.cs (VariableInfo): Drop the `Idx' property from this
12023         class, as this is not taking into account the indexes for
12024         temporaries tat we generate during the execution, getting the
12025         indexes wrong.
12026
12027         * class.cs: First emit class initializers, then call the parent
12028         constructor. 
12029
12030         * expression.cs (Binary): Fix opcode emision.
12031         (UnaryMutator.EmitCode): Support checked code generation
12032
12033         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12034         matches for events for both the Static and Instance scans,
12035         pointing to the same element.   Fix that.
12036
12037 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12038
12039         * rootcontext.cs (ResolveTree): Always set the
12040         interface_resolve_order, because nested interfaces will be calling
12041         into us.
12042
12043         * class.cs (GetInterfaceOrClass): Track the same resolution
12044         process used by TypeManager.LookupType.  This fixes the nested
12045         type lookups in class declarations (separate path from
12046         LookupType). 
12047
12048         (TypeContainer.DefineType): Also define nested interfaces.
12049         (TypeContainer.RegisterOrder): New public function used to
12050         register the order in which child interfaces need to be closed.
12051
12052         Nested interfaces need to be closed after their parents have been
12053         created. 
12054
12055         * interface.cs (InterfaceAttr): Put all the logic for computing
12056         the interface attribute here. 
12057
12058         (DefineInterface): Register our interface order with the
12059         RootContext or with the TypeContainer depending on the case.
12060
12061 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12062
12063         * cs-parser.jay: rework foreach statement to work with the new
12064         changes to the policy on SimpleNames.
12065
12066         * report.cs: support Stacktrace on warnings as well.
12067
12068         * makefile: drop --unsafe and /unsafe from the compile.
12069
12070 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12071
12072         * ecore.cs (StandardConversionExists): Modify to take an Expression
12073         as the first parameter. Ensure we do null -> reference type conversion
12074         checking.
12075
12076         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12077         temporary Expression objects.
12078
12079 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12080
12081         * interface.cs: workaround bug in method overloading resolution
12082         (there is already a bugzilla bug for it).
12083
12084 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12085
12086         We could also solve this problem by having a separate path for
12087         performing type lookups, instead of DoResolve, we could have a
12088         ResolveType entry point, and only participating pieces of the
12089         production (simplename, deref, array) would implement this. 
12090
12091         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12092         signal SimpleName to only resolve type names and not attempt to
12093         resolve anything else.
12094
12095         * expression.cs (Cast): Set the flag.
12096
12097         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12098
12099         * class.cs: Only report 108 if there is no `new' modifier.
12100
12101         * cs-parser.jay: rework foreach statement to work with the new
12102         changes to the policy on SimpleNames.
12103         
12104         * report.cs: support Stacktrace on warnings as well.
12105
12106         * makefile: drop --unsafe and /unsafe from the compile.
12107
12108 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12109
12110         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12111         lookups here, instead of doing that at parse time.  This means
12112         that our grammar will not introduce `LocalVariableReferences' as
12113         expressions at this point.  That solves the problem of code like
12114         this:
12115
12116         class X {
12117            static void Main ()
12118            { int X = 1;
12119             { X x = null }}}
12120
12121         This is only half the fix.  The full fix requires parameters to
12122         also be handled in this way.
12123
12124         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12125         makes the use more obvious of the DeclSpace.  The
12126         ec.TypeContainer.TypeBuilder is now only used to pull the
12127         TypeBuilder for it.
12128
12129         My theory is that I can get rid of the TypeBuilder completely from
12130         the EmitContext, and have typecasts where it is used (from
12131         DeclSpace to where it matters).  
12132
12133         The only pending problem is that the code that implements Aliases
12134         is on TypeContainer, and probably should go in DeclSpace.
12135
12136         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12137         lookups here, instead of doing that at parse time.  This means
12138         that our grammar will not introduce `LocalVariableReferences' as
12139         expressions at this point.  That solves the problem of code like
12140         this:
12141
12142         class X {
12143            static void Main ()
12144            { int X = 1;
12145             { X x = null }}}
12146
12147         This is only half the fix.  The full fix requires parameters to
12148         also be handled in this way.
12149
12150         * class.cs (Property.DefineMethod): When implementing an interface
12151         method, set newslot, when implementing an abstract method, do not
12152         set the flag (before we tried never setting it, or always setting
12153         it, which is the difference).
12154         (Indexer.DefineMethod): same.
12155         (Method.DefineMethod): same.
12156
12157         * ecore.cs: Only set the status used flag if we get back a Field.
12158
12159         * attribute.cs: Temporary hack, so Paolo can keep working.
12160
12161 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12162
12163         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12164         the unmanaged type in the case we have a MarshalAs attribute.
12165
12166         (Resolve): Handle the case when we are parsing the special MarshalAs
12167         attribute [we need to store the unmanaged type to use later]
12168
12169         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12170         MarshalAs Attribute.
12171
12172         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12173         on parameters and accordingly set the marshalling info.
12174
12175 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12176
12177         * class.cs: Optimizing slightly by removing redundant code after
12178         we switched to the `NoTypes' return value.
12179         (Property.DefineMethod): use NoTypes here too.
12180
12181         This fixes the bug I introduced in my last batch of changes.
12182
12183 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12184
12185         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12186
12187         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12188         Enums since those are types too. 
12189
12190         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12191
12192         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12193         thanks to a call during the lookup process.
12194
12195 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12196
12197         * statement.cs (Foreach): Lots of work to accomodate a particular
12198         kind of foreach statement that I had not kept in mind.  It is
12199         possible to have foreachs on classes that provide a GetEnumerator
12200         method that return objects that implement the "pattern" for using
12201         a foreach, there is no need to support GetEnumerator
12202         specifically. 
12203
12204         This is needed to compile nant.
12205
12206         * decl.cs: Only report 114 if the member is not `Finalize' and if
12207         the warning level is at least 2.
12208
12209         * class.cs: Moved the compare function from Method to
12210         MethodSignature. 
12211
12212         (MethodSignature.InheritableMemberSignatureCompare): Add new
12213         filter function that is used to extract inheritable methods from a
12214         class. 
12215
12216         (Method.Define): Use the new `inheritable_method_signature_filter'
12217         delegate
12218
12219         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12220         command. 
12221
12222 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12223
12224         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12225
12226         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12227
12228         * expression.cs: Pass location information to
12229         ConvertImplicitStandard. 
12230
12231         * class.cs: Added debugging code to track return values from
12232         interfaces. 
12233
12234 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12235
12236         * expression.cs (Is.DoResolve): If either side of the `is' is an
12237         interface, do not flag the warning.
12238
12239         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12240         for interfaces
12241
12242         * report.cs: Allow for --fatal to be used with --probe.
12243
12244         * typemanager.cs (NoTypes): Move the definition for the empty Type
12245         array here. 
12246
12247         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12248         properties. 
12249         (TypeContainer.DefineProxy): New function used to proxy to parent
12250         implementations when implementing interfaces.
12251         (TypeContainer.ParentImplements): used to lookup if our parent
12252         implements a public function that is required by an interface.
12253         (TypeContainer.VerifyPendingMethods): Hook this up.
12254
12255         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12256         `modules' and `assemblies' arraylists into arrays.  We only grow
12257         these are the very early start up of the program, so this improves
12258         the speedof LookupType (nicely measured).
12259
12260         * expression.cs (MakeByteBlob): Replaced unsafe code with
12261         BitConverter, as suggested by Paolo.
12262
12263         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12264         folding of string concatenation, but if either side is a string,
12265         and the other is not, then return null, and let the runtime use
12266         the concatenation on the string plus the object (using
12267         `Object.ToString'). 
12268
12269 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12270
12271         Constant Folding has been implemented now.
12272
12273         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12274         the error instead on types that are not supported in one's
12275         complement. 
12276
12277         * constant.cs (Constant and all children): New set of functions to
12278         perform implict and explicit conversions.
12279
12280         * ecore.cs (EnumConstant): Implement the new functions to perform
12281         conversion by proxying to the child expression.
12282
12283         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12284         own separate setting that can not be turned off from the command
12285         line using --unchecked or --checked and is only controlled using
12286         the checked/unchecked statements and expressions.  This setting is
12287         used by the constant folder to flag errors.
12288
12289         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12290         ConstantCheckState as well.   
12291
12292         During Resolve, they also have to flag the state, because the
12293         constant folder runs completely in the Resolve phase.
12294
12295         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12296         well.
12297
12298 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12299
12300         * cfold.cs: New file, this file contains the constant folder.
12301
12302         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12303         argument to track whether we are using the resulting address to
12304         load or store a value and provide better error messages. 
12305
12306         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12307         new AddressOf arguments.
12308
12309         * statement.cs (Foreach.EmitCollectionForeach): Update
12310
12311         * expression.cs (Argument.Emit): Call AddressOf with proper
12312         arguments to track usage.
12313
12314         (New.DoEmit): Call AddressOf with new arguments.
12315
12316         (Unary.Emit): Adjust AddressOf call.
12317
12318 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12319
12320         * cs-parser.jay (member_access): Change the case for pre-defined types
12321         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12322         this suggestion.
12323
12324         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12325         a method body.
12326
12327         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12328         essentially like methods and apply attributes like MethodImplOptions to them too.
12329
12330         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12331         not being null.
12332
12333         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12334         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12335         is the DeclSpace.
12336
12337         * Update code everywhere accordingly.
12338
12339         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12340
12341         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12342
12343 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12344
12345         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12346         try performing lookups against those instead of jumping straight into using
12347         the 'using' clauses.
12348
12349         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12350
12351         (LookupType): Perform lookups in implicit parents too.
12352
12353         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12354         sequence as RootContext.LookupType. 
12355
12356         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12357         the various cases of namespace lookups into this method.
12358
12359 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12360
12361         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12362         in positional arguments)
12363
12364         * class.cs (Operator): Update the AllowedModifiers to contain
12365         extern. 
12366
12367         * cs-parser.jay: Update operator declaration to allow for the
12368         operator body to be empty.
12369
12370         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12371         values. 
12372
12373 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12374
12375         * class.cs (Method.Emit): Label parameters.
12376
12377         * driver.cs: Return 1 or 0 as the program exit code.
12378
12379 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12380
12381         * expression.cs: Special case the `null' object when trying to
12382         auto-compute the type, as anything can be explicitly converted to
12383         that. 
12384
12385         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12386         spotting this Paolo.
12387
12388         (Expression.ImplicitNumericConversion): Perform comparissions of
12389         the type using the underlying type in the case of an enumeration
12390         rather than using the enumeration type for the compare.
12391
12392         Cope with the underlying == type case, which is not possible to
12393         catch before. 
12394
12395         (Expression.ConvertNumericExplicit): Perform comparissions of
12396         the type using the underlying type in the case of an enumeration
12397         rather than using the enumeration type for the compare.
12398
12399         * driver.cs: If the user does not supply an extension, assume .exe
12400
12401         * cs-parser.jay (if_statement): Rewrote so that we can track the
12402         location for the if statement.
12403
12404         * expression.cs (Binary.ConstantFold): Only concat strings when
12405         the operation is "+", not everything ;-)
12406
12407         * statement.cs (Statement.EmitBoolExpression): Take a location
12408         argument. 
12409         (If, While, Do): Track location.
12410
12411         * expression.cs (Binary.ResolveOperator): In the object + string
12412         case, I was missing a call to ConvertImplicit
12413
12414 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12415
12416         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12417         Location arguments. Ensure we use RootContext.LookupType to do our work
12418         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12419
12420         * interface.cs (PopulateMethod): Handle the type of the parameter being
12421         null gracefully.
12422
12423         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12424         have a params method with no fixed arguments and a call is made with no
12425         arguments.
12426
12427 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12428
12429         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12430         the verbatim-string-literal
12431
12432         * support.cs (InternalParameters.ParameterModifier): handle null
12433         fixed parameters.
12434         (InternalParameters.ParameterType): ditto.
12435
12436         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12437         duplicating the name of the variable parameter.
12438         (GetParameterByName): Fix bug where we were not looking up array
12439         paramters if they were the only present (thanks Paolo!).
12440         (GetParameterInfo): We only have an empty set of types if both
12441         fixed and array are set to null.
12442         (GetParameterInfo-idx): Handle FixedParameter == null
12443
12444         * cs-parser.jay: Handle the case where there is no catch
12445         statements (missing null test).
12446
12447 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12448
12449         * driver.cs (MainDriver): Be conservative on our command line
12450         handling.
12451
12452         Catch DirectoryNotFoundException when calling GetFiles.
12453
12454         (SplitPathAndPattern): Used to split the input specification into
12455         a path and a pattern that we can feed to Directory.GetFiles.
12456
12457 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12458
12459         * statement.cs (Fixed): Implement the last case of the Fixed
12460         statement (string handling).
12461
12462         * expression.cs (StringPtr): New class used to return a char * to
12463         a string;  Used by the Fixed statement.
12464
12465         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12466
12467         * expression.cs (Binary.ResolveOperator): Remove redundant
12468         MemberLookup pn parent type.
12469         Optimize union call, we do not need a union if the types are the same.
12470         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12471         type.
12472
12473         Specialize the use of MemberLookup everywhere, instead of using
12474         the default settings. 
12475
12476         (StackAlloc): Implement stackalloc keyword.
12477
12478         * cs-parser.jay: Add rule to parse stackalloc.
12479
12480         * driver.cs: Handle /h, /help, /?
12481
12482         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12483         before we supported unsafe code.
12484
12485         * makefile: add --unsafe to the self compilation of mcs.
12486
12487 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12488
12489         * expression.cs (PointerArithmetic): New class that is used to
12490         perform pointer arithmetic.
12491         (Binary.Resolve): Handle pointer arithmetic
12492         Handle pointer comparission.
12493         (ArrayPtr): Utility expression class that is used to take the
12494         address of an array.
12495
12496         (ElementAccess): Implement array access for pointers
12497
12498         * statement.cs (Fixed): Implement fixed statement for arrays, we
12499         are missing one more case before we are done.
12500
12501         * expression.cs (Indirection): Implement EmitAssign and set the
12502         ExprClass to Variable.  This allows pointer dereferences to be
12503         treated as variables, and to have values assigned to them.
12504
12505         * ecore.cs (Expression.StoreFromPtr): New utility function to
12506         store values dereferencing.
12507
12508 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12509
12510         * expression.cs (Binary.ResolveOperator): Ensure that we are
12511         not trying to operate on a void type - this fixes the reported
12512         bug.
12513
12514         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12515         the parent implementation is sealed.
12516
12517         * ../errors/cs0239.cs : Add.
12518
12519         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12520
12521         * typemanager.cs (unverifiable_code_type): Corresponds to 
12522         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12523         which have unsafe code in them.
12524
12525         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12526         unsafe context.
12527
12528 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12529
12530         * cs-tokenizer.cs: Add support for @"litreal strings"
12531
12532         Make tokenizer accept pre-processor directives
12533         on any column (remove the old C-like limitation). 
12534
12535         * rootcontext.cs (EmitCode): Emit any global attributes.
12536         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12537
12538         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12539
12540         * cs-parser.jay: Add support for global attributes.  
12541
12542 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12543
12544         * expression.cs (Indirection): New helper class.  Unary will
12545         create Indirection classes to be able to implement the
12546         IMemoryLocation interface on it.
12547
12548 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12549
12550         * cs-parser.jay (fixed_statement): reference the right statement.
12551
12552         * statement.cs (Fixed.Emit): Finish implementing the fixed
12553         statement for the &x case.
12554
12555 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12556
12557         * class.cs (Property.Define, Method.Define): Remove newslot when
12558         `implementing'.  
12559
12560         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12561         wrong.  NewSlot should only be used if the `new' keyword is present.
12562
12563         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12564         locating our system dir.  Sorry about this.
12565
12566 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12567
12568         * driver.cs (GetSystemDir): Compute correctly the location of our
12569         system assemblies.  I was using the compiler directory instead of
12570         the library directory.
12571
12572 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12573
12574         * expression.cs (BetterFunction): Put back in what Miguel commented out
12575         since it is the correct fix. The problem is elsewhere ;-)
12576
12577         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12578         parameters of the parms method are themselves compatible or not !
12579
12580         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12581         to check that a class implements an interface before saying that an implicit
12582         conversion was allowed. Use ImplementsInterface to do the checking.
12583
12584 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12585
12586         * class.cs (Method.Define): Track whether we are an explicit
12587         implementation or not.  And only call DefineMethodOverride if we
12588         are an explicit implementation.
12589
12590         (Property.DefineMethod): Ditto.
12591
12592 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12593
12594         * expression.cs (BetterFunction): Catch hideous bug which was
12595          preventing us from detecting ambiguous calls due to implicit casts i.e
12596         cs0121.
12597
12598 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12599
12600         * support.cs (Pair): Remove un-needed method.  I figured why I was
12601         getting the error in cs-parser.jay, the variable in a foreach loop
12602         is readonly, and the compiler does not really treat this as a variable.
12603
12604         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12605         instead of EQUALS in grammar.  
12606
12607         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12608
12609         * expression.cs (Unary.DoResolve): Check whether the argument is
12610         managed or not.
12611
12612 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12613
12614         * support.cs: Api for Pair to set a value.  Despite the fact that
12615         the variables are public the MS C# compiler refuses to compile
12616         code that accesses the field if the variable is part of a foreach
12617         statement. 
12618
12619         * statement.cs (Fixed): Begin implementation of the fixed
12620         statement.
12621
12622         (Block.AddVariable): Return the VariableInfo on success and null
12623         on failure instead of true/false. 
12624
12625         * cs-parser.jay (foreach): Catch errors on variables already
12626         defined (we were ignoring this value before) and properly unwind
12627         the block hierarchy
12628
12629         (fixed_statement): grammar for the fixed statement.
12630
12631 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12632
12633         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12634         pointer types to be incretemented.
12635
12636         (SizeOf): Implement.
12637
12638         * cs-parser.jay (pointer_member_access): Implement
12639         expr->IDENTIFIER production.
12640
12641         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12642         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12643         on safe contexts.
12644
12645         (Unary): Implement indirection.
12646
12647         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12648         use in non-unsafe context).
12649
12650         (SimpleName.DoResolve): Check for pointers in field access on safe
12651         contexts. 
12652
12653         (Expression.LoadFromPtr): Factor the load-indirect code in this
12654         function.  This was duplicated in UnboxCast and ParameterReference
12655
12656 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12657
12658         * expression.cs (ComposedCast): report an error if a pointer cast
12659         is used in a safe region.
12660
12661         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12662         pointer type casts in unsafe context.
12663
12664         * codegen.cs (EmitContext): Set up IsUnsafe.
12665
12666         * cs-parser.jay (non_expression_type): Add productions for pointer
12667         casts. 
12668
12669         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12670         code.  We should not use force into static mode if the method is
12671         not virtual.  Fixes bug in MIS
12672
12673         * statement.cs (Do.Emit, While.Emit, For.Emit,
12674         Statement.EmitBoolExpression): Add support to Do and While to
12675         propagate infinite loop as `I do return' semantics.
12676
12677         Improve the For case to also test for boolean constants.
12678
12679         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12680         to the list of attributes we can add.
12681
12682         Remove `EmitContext' argument.
12683
12684         * class.cs (Method.Define): Apply parameter attributes.
12685         (Constructor.Define): Apply parameter attributes.
12686         (MethodCore.LabelParameters): Move here the core of labeling
12687         parameters. 
12688
12689         * support.cs (ReflectionParameters.ParameterModifier,
12690         InternalParameters.ParameterModifier): Use IsByRef on the type and
12691         only return the OUT bit for these parameters instead of in/out/ref
12692         flags.
12693
12694         This is because I miss-understood things.  The ParameterInfo.IsIn
12695         and IsOut represent whether the parameter has the [In] and [Out]
12696         attributes set.  
12697
12698 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12699
12700         * ecore.cs (FieldExpr.Emit): Release temporaries.
12701
12702         * assign.cs (LocalTemporary.Release): new function.
12703
12704         * codegen.cs (EmitContext.GetTemporaryStorage,
12705         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12706         temporary storage.  Now we can "put back" localbuilders when we
12707         are done with them
12708
12709 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12710
12711         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12712         need to make a copy of the variable to generate verifiable code.
12713
12714 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12715
12716         * driver.cs: Compute dynamically the system directory.
12717
12718         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12719         Slower, but more generally useful.  Used by the abstract
12720         registering implementation. 
12721
12722         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12723         the rules for the special rule on Type/instances.  First check if
12724         we have the same name, and if so, try that special static path
12725         rather than the instance path.
12726
12727 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12728
12729         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12730         for, while and if.
12731
12732         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12733         Enum, ValueType, Delegate or Array for non-corlib compiles.
12734
12735         * cs-tokenizer.cs: Catch long identifiers (645)
12736
12737         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12738         piece of code.
12739
12740         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12741         fix, we were returning too early, so we were not registering
12742         pending methods from abstract classes.
12743
12744         Do not register pending methods if the class is abstract.
12745
12746         * expression.cs (Conditional.DoResolve): Report circular implicit
12747         conversions when we neecd to compute it for conditional
12748         expressions. 
12749
12750         (Is.DoResolve): If the expression is always of the provided type,
12751         flag warning 183.  If the expression can not ever be of the
12752         provided type flag warning 184.
12753
12754         * class.cs: Catch 169 as well.
12755
12756         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12757         read. 
12758
12759 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12760
12761         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12762
12763 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12764
12765         * interface.cs: (PopulateMethod): Check for pointers being defined
12766         only if the unsafe context is active.
12767         (PopulateProperty): ditto.
12768         (PopulateIndexer): ditto.
12769
12770         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12771         specified.  If pointers are present, make sure that they are
12772         present in an unsafe context.
12773         (Constructor, Constructor.Define): ditto.
12774         (Field, Field.Define): ditto.
12775         (Property, Property.Define): ditto.
12776         (Event, Event.Define): ditto.
12777
12778         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12779         hashtable if there are classes or structs defined.
12780
12781         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12782         code, as the constant resolution moved.
12783
12784         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12785         the metadata, so we can flag error 133. 
12786
12787         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12788         pointer is being declared in an unsafe context.
12789
12790 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12791
12792         * modifiers.cs (Modifiers.Check): Require a Location argument.
12793         Report error 227 for Unsafe use.
12794
12795         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12796
12797         * statement.cs (For.Emit): If the test is null, then report that
12798         we do `return', as we wont reach anything afterwards.
12799
12800         (Switch.SwitchGoverningType): Track the expression that matched
12801         the conversion.
12802
12803         * driver.cs: Allow negative numbers as an error code to flag.
12804
12805         * cs-parser.jay: Handle 1551.
12806
12807         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12808
12809 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12810
12811         * cs-parser.jay: Report 1518 (type declaration can only contain
12812         class, struct, interface, enum or delegate)
12813
12814         (switch_label): Report 1523 (keywords `case' or `default' must
12815         preced code)
12816
12817         (opt_switch_sections): Report 1522 (empty switch)
12818
12819         * driver.cs: Report 1515 (response file specified multiple times)
12820         Report 1516 (Source file specified multiple times).
12821
12822         * expression.cs (Argument.Resolve): Signal 1510
12823
12824         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12825         access not allowed in static code)
12826
12827 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12828
12829         * typemanager.cs (IsPointerType): Utility method which we are going
12830         to need a lot.
12831
12832         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12833         the object type, so we take care of that.
12834
12835         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12836
12837         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
12838         added to non-params parameters :-)
12839
12840         * typemanager.cs (CSharpName): Include 'void' type too. 
12841
12842         (void_ptr_type): Include in the set of core types.
12843
12844         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
12845         duplicating code.
12846
12847         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
12848         an unsafe context.
12849
12850         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
12851         completely forgotten about it.
12852
12853 2002-01-10  Ravi Pratap  <ravi@ximian.com>
12854
12855         * cs-parser.jay (pointer_type): Add. This begins our implementation
12856         of parsing rules for unsafe code.
12857
12858         (unsafe_statement): Implement.
12859
12860         (embedded_statement): Modify to include the above.
12861
12862         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12863
12864         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12865         if the current context is an unsafe one.
12866
12867         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12868         are handled differently, we need separate rules for them.
12869
12870         (local_variable_declaration): Update to use local_variable_pointer_type
12871         to allow variable declarations of unmanaged pointer types.
12872
12873         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12874         in unsafe contexts.
12875
12876         * ../errors/cs0214.cs : Add.
12877
12878 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12879
12880         * makefile: remove 'response' file when cleaning.
12881
12882 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12883
12884         * cs-parser.jay: Report 1524.
12885
12886 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12887
12888         * typemanager.cs (RegisterMethod): drop checking if we have
12889         registered this from here
12890
12891 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12892
12893         * class.cs (Method.EmitDestructor): Implement calling our base
12894         destructor. 
12895
12896         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12897         value of InFinally.
12898
12899         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12900         this routine and will wrap the call in a try/catch block.  Deal
12901         with the case.
12902
12903 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12904
12905         * ecore.cs (Expression.MemberLookup): instead of taking a
12906         parameter `same_type' that was used to tell whether we could
12907         access private members we compute our containing type from the
12908         EmitContext.
12909
12910         (FieldExpr): Added partial support for volatile fields.  This does
12911         not work for volatile fields exposed from assemblies, as I can not
12912         figure out how to extract the modreq from it.
12913
12914         Updated all the source files to use this.
12915
12916         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12917         because it is referenced by MemberLookup very often. 
12918
12919 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12920
12921         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12922         TypeBuilder.GetCustomAttributes to retrieve what we need.
12923
12924         Get rid of redundant default_member_attr_type as this is the same as
12925         default_member_type which already exists.
12926
12927         * interface.cs, attribute.cs : Update accordingly.
12928
12929 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12930
12931         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12932         work for TYpeBuilders though.  Ravi, can you please fix this?
12933
12934         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12935
12936         * expression.cs (Argument.Emit): Handle the case of ref objects
12937         being passed to ref functions;  
12938
12939         (ParameterReference.EmitLoad): Loads the content of the pointer
12940         without dereferencing.
12941
12942 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12943
12944         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12945
12946 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12947
12948         * class.cs (Indexer.DefineMethod): Incorporate the interface
12949         type in the name of the method if we are doing explicit interface
12950         implementation.
12951
12952         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12953
12954         (BetterConversion): Fix extremely trivial bug where we were referring to
12955         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12956         again !
12957
12958         * ../errors/bug16.cs : Add although we have fixed it.
12959
12960 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12961
12962         * expression.cs (BaseIndexer): Begin implementation.
12963
12964         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12965
12966         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12967         production directly to remove a shift/reduce, and implement
12968         explicit interface implementation.
12969
12970         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
12971         after a floating point suffix.
12972
12973         * expression.cs (DoNumericPromotions): Improved the conversion for
12974         uint/uint.  If we have a constant, we avoid doing a typecast to a
12975         larger type.
12976
12977         * class.cs (Indexer): Implement explicit interface implementation
12978         for indexers.
12979
12980 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
12981
12982         * class.cs: make the default instance constructor public and hidebysig.
12983
12984 2001-01-03  Ravi Pratap  <ravi@ximian.com>
12985
12986         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
12987         so we can call it from elsewhere.
12988
12989         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
12990         we emit it internally if the class has a defined indexer; otherwise the user
12991         emits it by decorating the class definition with the DefaultMemberAttribute.
12992
12993         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
12994         attribute is not used on a type which defines an indexer.
12995
12996         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
12997         character when we skip whitespace.
12998
12999         * ../errors/cs0646.cs : Add.
13000
13001 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13002
13003         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13004         again. 
13005
13006         * makefile: Add practical target `mcs3.exe' which builds the third
13007         generation compiler. 
13008
13009         * expression.cs (New): Fix structures constructor calling.
13010
13011         * class.cs (Property, Method, Indexer): Emit Final flag on the
13012         method if we are an interface implementation and we are not
13013         abstract. 
13014
13015         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13016         whether this property is referencing a `base' method.
13017
13018         * expression.cs (Invocation.EmitCall): take an extra argument:
13019         is_base, this is used to determine whether the `call' or
13020         `callvirt' opcode should be used.
13021
13022
13023         * delegate.cs: update EmitCall.
13024
13025         * class.cs (Method.Define): Set NewSlot for the cases where we are
13026         not implementing an interface method.
13027
13028         (Property.Define): ditto.
13029
13030 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13031
13032         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13033         'r'.  Allows mcs to parse itself fully.
13034
13035 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13036
13037         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13038         of the number of initializers that require the InitializeArray method.
13039
13040         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13041         update the above field where necessary.
13042
13043         (MakeByteBlob): Update accordingly.
13044
13045         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13046         greater than 2.
13047
13048         (EmitDynamicInitializers): Update in accordance with the new optimization.
13049
13050         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13051         same OpCode applies.
13052
13053         * cs-parser.jay : Fix some glaring errors I introduced.
13054
13055 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13056
13057         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13058         so that we can check for name clashes there too.
13059
13060         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13061         for interface indexers.
13062
13063         * interfaces.cs (Define): Emit the default member attribute.
13064
13065         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13066         variable was being referred to while setting the value ;-)
13067
13068 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13069
13070         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13071         byte-by-byte information when we know the data is zero.
13072
13073         Make the block always a multiple of 4, because
13074         DefineInitializedData has a bug.
13075
13076         * assign.cs: Fix, we should assign from the temporary, not from
13077         the source. 
13078
13079         * expression.cs (MakeByteBlob): Fix my incorrect code.
13080
13081 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13082
13083         * typemanager.cs (EnumToUnderlying): This function is used to get
13084         the underlying type from an enumeration, because it does not
13085         always work. 
13086
13087         * constant.cs: Use the I4_S form for values between -128 and 127.
13088
13089         * statement.cs (Block.LookupLabel): Looks up a label.
13090         (Block): Drop support for labeled blocks.
13091
13092         (LabeledStatement): New kind of statement that represents a label
13093         only.
13094
13095         (Goto): Finally implement this bad boy.
13096
13097         * cs-parser.jay: Update to reflect new mechanism to implement
13098         labels.
13099
13100 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13101
13102         * codegen.cs (EmitContext.This): a codegen property that keeps the
13103         a single instance of this instead of creating many different this
13104         instances. 
13105
13106         * delegate.cs (Delegate.DoResolve): Update to use the property;
13107
13108         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13109
13110         * expression.cs (BaseAccess.DoResolve): Ditto.
13111
13112 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13113
13114         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13115         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13116
13117         (InitCoreTypes): Update accordingly.
13118
13119         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13120         so we can quickly store the state.
13121
13122         (ApplyAttributes): Set the correct implementation flags
13123         for InternalCall methods.
13124
13125 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13126
13127         * expression.cs (EmitCall): if a method is not virtual, then do
13128         not use callvirt on it.
13129
13130         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13131         user defined stuff) requires the use of stobj, which takes an
13132         address on the stack instead of an array and an index.  So emit
13133         the Ldelema operation for it.
13134
13135         (EmitStoreOpcode): Use stobj for valuetypes.
13136
13137         (UnaryMutator.EmitCode): Use the right 1 value depending on
13138         whether we are dealing with int64/uint64, float or doubles.
13139
13140         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13141         constructors that I implemented last night.
13142
13143         (Constructor.IsDefault): Fix to work properly for static
13144         constructors.
13145
13146         * cs-parser.jay (CheckDef): report method signature errors.
13147         Update error number 103 to be 132.
13148
13149         * decl.cs: New AdditionResult enumeration value: MethodExists.
13150         Although we do this check for methods later on in the semantic
13151         analysis, catching repeated default constructors is so easy that
13152         we catch these here. 
13153
13154         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13155         promotions code.
13156
13157         (ParameterReference.EmitAssign, Emit): handle
13158         bools as bytes.
13159
13160         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13161         (ArrayAccess.EmitStoreOpcode): ditto.
13162
13163         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13164
13165         * expression.cs (MakeByteBlob): Complete all the missing types
13166         (uint, short, ushort, byte, sbyte)
13167
13168         * class.cs: Only init instance field initializers on instance
13169         constructors. 
13170
13171         Rename `constructors' to instance_constructors. 
13172
13173         (TypeContainer.AddConstructor): Only add constructors to the list
13174         if it is not static.
13175
13176         Make sure that we handle default_static_constructor independently
13177         everywhere where we handle instance_constructors
13178
13179 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13180
13181         * class.cs: Do not lookup or create a base initializer for a
13182         static constructor.
13183
13184         (ConstructorInitializer.Resolve): use the proper type to lookup
13185         for constructors.
13186
13187         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13188
13189         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13190         in DeclSpace. 
13191
13192         * decl.cs: CloseType is now an virtual method, the default
13193         implementation just closes this type.
13194
13195 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13196
13197         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13198         to PreserveSig by default. Also emit HideBySig on such methods.
13199
13200         Basically, set the defaults to standard values.
13201
13202         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13203         argument, if candidate is better, it can't be worse than the best !
13204
13205         (Invocation): Re-write bits to differentiate between methods being
13206         applicable in their expanded form and their normal form - for params
13207         methods of course.
13208
13209         Get rid of use_standard everywhere as only standard conversions are allowed
13210         in overload resolution. 
13211
13212         More spec conformance.
13213
13214 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13215
13216         * driver.cs: Add --timestamp, to see where the compiler spends
13217         most of its time.
13218
13219         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13220         `this' in static code.
13221
13222         (SimpleName.DoResolve): Implement in terms of a helper function
13223         that allows static-references to be passed upstream to
13224         MemberAccess.
13225
13226         (Expression.ResolveWithSimpleName): Resolve specially simple
13227         names when called by MemberAccess to implement the special
13228         semantics. 
13229
13230         (Expression.ImplicitReferenceConversion): Handle conversions from
13231         Null to reference types before others, as Null's type is
13232         System.Object. 
13233
13234         * expression.cs (Invocation.EmitCall): Handle the special case of
13235         calling methods declared on a reference type from a ValueType
13236         (Base classes System.Object and System.Enum)
13237
13238         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13239         the left hand side is a TypeExpr, not on every enumeration. 
13240
13241         (Binary.Resolve): If types are reference types, then do a cast to
13242         object on operators != and == of both arguments.
13243
13244         * typemanager.cs (FindMembers): Extract instance and static
13245         members if requested.
13246
13247         * interface.cs (PopulateProperty): Use void_type instead of null
13248         as the return type for the setter method.
13249
13250         (PopulateIndexer): ditto.
13251
13252 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13253
13254         * support.cs (ReflectionParameters): Fix minor bug where we
13255         were examining the wrong parameter for the ParamArray attribute.
13256
13257         Cope with requests for the type of the parameter at position
13258         greater than the params parameter's. We now return the element
13259         type of the params array as that makes more sense.
13260
13261         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13262         accordingly as we no longer have to extract the element type
13263         ourselves.
13264
13265         (Invocation.OverloadResolve): Update.
13266
13267 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13268
13269         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13270         against IEnumerator, test whether the return value is a descendant
13271         of the IEnumerator interface.
13272
13273         * class.cs (Indexer.Define): Use an auxiliary method to implement
13274         the other bits of the method definition.  Begin support for
13275         explicit interface implementation.
13276
13277         (Property.DefineMethod): Use TypeManager.void_type instead of null
13278         for an empty return value.
13279
13280 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13281
13282         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13283         dealing with a FieldExpr which is composed of a FieldBuilder, in
13284         the code path we did extract the constant, but we should have
13285         obtained the underlying value to be able to cast it (otherwise we
13286         end up in an infinite loop, this is what Ravi was running into).
13287
13288         (ArrayCreation.UpdateIndices): Arrays might be empty.
13289
13290         (MemberAccess.ResolveMemberAccess): Add support for section
13291         14.5.4.1 that deals with the special case of E.I when E is a type
13292         and something else, that I can be a reference to a static member.
13293
13294         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13295         handle a particular array type to create byte blobs, it is just
13296         something we dont generate byteblobs for.
13297
13298         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13299         arguments. 
13300
13301         * location.cs (Push): remove the key from the hashtable that we
13302         are about to add.   This happens for empty files.
13303
13304         * driver.cs: Dispose files after we have parsed them.
13305
13306         (tokenize): new function that only runs the tokenizer on its
13307         input, for speed testing.
13308
13309 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13310
13311         * class.cs (Event.Define): Define the private field only if there
13312         are no accessors defined.
13313
13314         * expression.cs (ResolveMemberAccess): If there is no associated
13315         field with the event, that means we have an event defined with its
13316         own accessors and we should flag error cs0070 since transforming
13317         ourselves into a field is not valid in that case.
13318
13319         * ecore.cs (SimpleName.DoResolve): Same as above.
13320
13321         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13322         and charset to sane values.
13323
13324 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13325
13326         * assign.cs (DoResolve): Perform check on events only if they 
13327         are being accessed outside the declaring type.
13328
13329         * cs-parser.jay (event_declarations): Update rules to correctly
13330         set the type of the implicit parameter etc.
13331
13332         (add_accessor, remove_accessor): Set current local parameters.
13333
13334         * expression.cs (Binary): For delegate addition and subtraction,
13335         cast the return value from the method into the appropriate delegate
13336         type.
13337
13338 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13339
13340         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13341         of these as the workaround is unnecessary.
13342
13343         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13344         delegate data - none of that is needed at all.
13345
13346         Re-write bits to extract the instance expression and the delegate method
13347         correctly.
13348
13349         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13350         on delegates too.
13351
13352         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13353         of attaching attributes instead of duplicating code everywhere.
13354
13355         * everywhere : Update code to do attribute emission using the above method.
13356
13357 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13358
13359         * expression.cs (IsParamsMethodApplicable): if there are not
13360         parameters, return immediately.
13361
13362         * ecore.cs: The 0 literal can be implicity converted to an enum
13363         type. 
13364
13365         (SimpleName.DoResolve): First lookup the type, then lookup the
13366         members. 
13367
13368         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13369         want to get its address.  If the InstanceExpression is not
13370         addressable, store the result in a temporary variable, then get
13371         the address of it.
13372
13373         * codegen.cs: Only display 219 errors on warning level or above. 
13374
13375         * expression.cs (ArrayAccess): Make it implement the
13376         IMemoryLocation interface.
13377
13378         (Binary.DoResolve): handle the operator == (object a, object b)
13379         and operator != (object a, object b) without incurring into a
13380         BoxedCast (because 5 != o should never be performed).
13381
13382         Handle binary enumerator operators.
13383
13384         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13385         value type, otherwise use Ldelem_ref.
13386
13387         Use precomputed names;
13388
13389         (AddressOf): Implement address of
13390
13391         * cs-parser.jay (labeled_statement): Fix recursive block
13392         addition by reworking the production.
13393
13394         * expression.cs (New.DoEmit): New has a special case:
13395                 
13396                  If we are dealing with a ValueType, we have a few
13397                  situations to deal with:
13398                 
13399                     * The target of New is a ValueType variable, that is
13400                       easy, we just pass this as the variable reference
13401                 
13402                     * The target of New is being passed as an argument,
13403                       to a boxing operation or a function that takes a
13404                       ValueType.
13405                 
13406                       In this case, we need to create a temporary variable
13407                       that is the argument of New.
13408
13409
13410 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13411
13412         * rootcontext.cs (LookupType): Check that current_type is not null before
13413         going about looking at nested types.
13414
13415         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13416         not implement the IAssignMethod interface any more.
13417
13418         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13419         where we tranform them into FieldExprs if they are being resolved from within
13420         the declaring type.
13421
13422         * ecore.cs (SimpleName.DoResolve): Do the same here.
13423
13424         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13425
13426         * ../errors/bug10.cs : Add.
13427
13428         * ../errors/cs0070.cs : Add.
13429
13430         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13431
13432         * assign.cs : Get rid of EventIsLocal everywhere.
13433
13434 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13435
13436         * ecore.cs (ConvertIntLiteral): finished the implementation.
13437
13438         * statement.cs (SwitchLabel): Convert the value we are using as a
13439         key before looking up the table.
13440
13441 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13442
13443         * codegen.cs (EmitTopBlock): Require a Location argument now.
13444
13445         * cs-parser.jay (constructor_declarator): We need to setup
13446         current_local_parameters before we parse the
13447         opt_constructor_initializer, to allow the variables to be bound
13448         to the constructor arguments.
13449
13450         * rootcontext.cs (LookupType): First lookup nested classes in our
13451         class and our parents before we go looking outside our class.
13452
13453         * expression.cs (ConstantFold): Extract/debox the values at the
13454         beginnning. 
13455
13456         * rootcontext.cs (EmitCode): Resolve the constants first before we
13457         resolve the types.  This is not really needed, but it helps debugging.
13458
13459         * statement.cs: report location.
13460
13461         * cs-parser.jay: pass location to throw statement.
13462
13463         * driver.cs: Small bug fix.
13464
13465         * report.cs: Updated format to be 4-zero filled digits.
13466
13467 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13468
13469         * expression.cs (CheckIndices): Fix minor bug where the wrong
13470         variable was being referred to ;-)
13471
13472         (DoEmit): Do not call EmitStaticInitializers when the 
13473         underlying type is System.Object.
13474
13475 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13476
13477         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13478         and do the usual workaround for SRE.
13479
13480         * class.cs (MyEventBuilder.EventType): New member to get at the type
13481         of the event, quickly.
13482
13483         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13484
13485         * assign.cs (Assign.DoResolve): Handle the case when the target
13486         is an EventExpr and perform the necessary checks.
13487
13488         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13489         interface.
13490
13491         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13492
13493         (EventExpr): Set the type in the constructor itself since we 
13494         are meant to be born fully resolved.
13495
13496         (EventExpr.Define): Revert code I wrote earlier.
13497                 
13498         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13499         instance expression is null. The instance expression is a This in that case
13500         or a null, depending on whether it is a static method or not.
13501
13502         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13503         refers to more than one method.
13504
13505         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13506         and accordingly flag errors.
13507
13508 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13509
13510         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13511
13512 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13513
13514         * location.cs (ToString): Provide useful rutine.
13515
13516 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13517
13518         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13519         objects, return the actual integral boxed.
13520
13521         * statement.cs (SwitchLabel): define an ILLabel for each
13522         SwitchLabel. 
13523
13524         (Switch.CheckSwitch): If the value is a Literal, extract
13525         the underlying literal.
13526
13527         Also in the unused hashtable we had, add the SwitchLabel so we can
13528         quickly look this value up.
13529
13530         * constant.cs: Implement a bunch of new constants.  Rewrite
13531         Literal based on this.  Made changes everywhere to adapt to this.
13532
13533         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13534         dereferencing array only once, and also copes with enumrations.
13535
13536         bytes are two bytes wide, not one.
13537
13538         (Cast): Perform constant conversions.
13539
13540         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13541         wrappers to the literals here.
13542
13543         * expression.cs (DoNumericPromotions): long literals can converted
13544         to ulong implicity (this is taken care of elsewhere, but I was
13545         missing this spot).
13546
13547         * ecore.cs (Expression.Literalize): Make the return type Literal,
13548         to improve type checking.
13549
13550         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13551
13552 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13553
13554         * literal.cs: Revert code from ravi that checked the bounds.  The
13555         bounds are sane by the definition of the type itself. 
13556
13557         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13558         need to actually look up in our parent hierarchy for interfaces
13559         implemented. 
13560
13561         * const.cs: Use the underlying type for enumerations
13562
13563         * delegate.cs: Compute the basename for the delegate creation,
13564         that should fix the delegate test case, and restore the correct
13565         Type Lookup semantics in rootcontext
13566
13567         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13568         referencing a nested type with the Reflection API is using the "+"
13569         sign. 
13570
13571         * cs-parser.jay: Do not require EOF token at the end.
13572
13573 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13574
13575         * rootcontext.cs (LookupType): Concatenate type names with
13576         a '.' instead of a '+' The test suite passes again.
13577
13578         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13579         field of the enumeration.
13580
13581         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13582         the case when the member is an EventExpr.
13583
13584         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13585         static has an associated instance expression.
13586
13587         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13588
13589         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13590
13591         * class.cs (Event.Define): Register event and perform appropriate checks
13592         for error #111.
13593
13594         We define the Add and Remove methods even if the use provides none because
13595         in that case, we provide default implementations ourselves.
13596
13597         Define a private field of the type of the event. This is done by the CSC compiler
13598         and we should be doing it too ;-)
13599
13600         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13601         More methods we use in code we generate.
13602
13603         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13604         is important.
13605
13606         (InitCoreTypes): Update accordingly for the above.
13607
13608         * class.cs (Event.Emit): Generate code for default accessors that we provide
13609
13610         (EmitDefaultMethod): Do the job in the above.
13611
13612         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13613         appropriate place.
13614
13615 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13616
13617         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13618         builders even if we were missing one.
13619
13620         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13621         pass the Basename as our class name instead of the Name.  The
13622         basename will be correctly composed for us.
13623
13624         * parameter.cs (Paramters): Now takes a Location argument.
13625
13626         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13627         make all the code call directly LookupType in RootContext and take
13628         this chance to pass the Location information everywhere.
13629
13630         * Everywhere: pass Location information.
13631
13632 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13633
13634         * class.cs (Constructor.Define): Updated way of detecting the
13635         length of the parameters.
13636
13637         (TypeContainer.DefineType): Use basename as the type name for
13638         nested types.
13639
13640         (TypeContainer.Define): Do not recursively define types here, as
13641         definition is taken care in order by the RootContext.
13642
13643         * tree.cs: Keep track of namespaces in a per-file basis.
13644
13645         * parameter.cs (Parameter.ComputeSignature): Update to use
13646         DeclSpace. 
13647
13648         (Parameters.GetSignature): ditto.
13649
13650         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13651         instead of a TypeContainer.
13652
13653         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13654         resolve names.  Because we need to be resolve in our context, not
13655         our parents.
13656
13657         * driver.cs: Implement response files.
13658
13659         * class.cs (TypeContainer.DefineType): If we are defined, do not
13660         redefine ourselves.
13661
13662         (Event.Emit): Emit the code for add/remove handlers.
13663         (Event.Define): Save the MethodBuilders for add/remove.
13664
13665         * typemanager.cs: Use pair here too.
13666
13667         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13668         DictionaryEntry requires the first argument to be non-null.  
13669
13670         (enum_declaration): Compute full name for registering the
13671         enumeration.
13672
13673         (delegate_declaration): Instead of using
13674         formal_parameter_list, use opt_formal_parameter_list as the list
13675         can be empty.
13676
13677         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13678         (EventParsing): New property that controls whether `add' and
13679         `remove' are returned as tokens or identifiers (for events);
13680
13681 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13682
13683         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13684         use MyEventBuilder only and let it wrap the real builder for us.
13685
13686         (MyEventBuilder): Revamp constructor etc.
13687
13688         Implement all operations that we perform on EventBuilder in precisely the same
13689         way here too.
13690
13691         (FindMembers): Update to use the EventBuilder member.
13692
13693         (Event.Emit): Update accordingly.
13694
13695 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13696
13697         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13698         by calling the appropriate methods.
13699
13700         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13701         useful.
13702
13703         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13704
13705 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13706
13707         * delegate.cs (Delegate.Populate): Check that the return type
13708         and various parameters types are indeed accessible.
13709
13710         * class.cs (Constructor.Define): Same here.
13711
13712         (Field.Define): Ditto.
13713
13714         (Event.Define): Ditto.
13715
13716         (Operator.Define): Check that the underlying Method defined itself
13717         correctly - so it's MethodBuilder should not be null.
13718
13719         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13720         expression happens to be null.
13721
13722         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13723         members but as of now we don't seem to be able to do anything really useful with it.
13724
13725         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13726         not the EventBuilder.
13727
13728 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13729
13730         * cs-tokenizer.cs: Add support for defines.
13731         Add support for #if, #elif, #else, #endif
13732
13733         (eval_var): evaluates a variable.
13734         (eval): stubbed for evaluating functions.
13735
13736         * cs-parser.jay: Pass the defines information
13737
13738         * driver.cs: Add --define command line option.
13739
13740         * decl.cs: Move MemberCore here.
13741
13742         Make it the base class for DeclSpace.  This allows us to catch and
13743         report 108 and 109 for everything now.
13744
13745         * class.cs (TypeContainer.Define): Extract all the members
13746         before populating and emit the warning 108 (new keyword required
13747         to override) instead of having each member implement this.
13748
13749         (MemberCore.Define): New abstract method, we will be using this in
13750         the warning reporting engine in Populate.
13751
13752         (Operator.Define): Adjust to new MemberCore protocol. 
13753
13754         * const.cs (Const): This does not derive from Expression, it is a
13755         temporary object we use to create fields, it is a MemberCore. 
13756
13757         * class.cs (Method.Define): Allow the entry point to be in a
13758         specific class.
13759
13760         * driver.cs: Rewrite the argument handler to clean it up a bit.
13761
13762         * rootcontext.cs: Made it just an auxiliary namespace feature by
13763         making everything static.
13764
13765         * driver.cs: Adapt code to use RootContext type name instead of
13766         instance variable.
13767
13768         * delegate.cs: Remove RootContext argument.
13769
13770         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13771         argument. 
13772
13773         * class.cs (Event.Define): The lookup can fail.
13774
13775         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13776
13777         * expression.cs: Resolve the this instance before invoking the code.
13778
13779 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13780
13781         * cs-parser.jay: Add a production in element_access that allows
13782         the thing to become a "type" reference.  This way we can parse
13783         things like "(string [])" as a type.
13784
13785         Note that this still does not handle the more complex rules of
13786         casts. 
13787
13788
13789         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13790
13791         * ecore.cs: (CopyNewMethods): new utility function used to
13792         assemble the list of methods from running FindMembers.
13793
13794         (MemberLookup): Rework FindMembers so that 
13795
13796 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13797
13798         * class.cs (TypeContainer): Remove Delegates who fail to be
13799         defined.
13800
13801         * delegate.cs (Populate): Verify that we dont get null return
13802         values.   TODO: Check for AsAccessible.
13803
13804         * cs-parser.jay: Use basename to emit error 574 (destructor should
13805         have the same name as container class), not the full name.
13806
13807         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13808         possible representation.  
13809
13810         Also implements integer type suffixes U and L.
13811
13812 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13813
13814         * expression.cs (ArrayCreation.DoResolve): We need to do the
13815         argument resolution *always*.
13816
13817         * decl.cs: Make this hold the namespace.  Hold the root context as
13818         well.
13819         (LookupType): Move here.
13820
13821         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13822
13823         * location.cs (Row, Name): Fixed the code, it was always returning
13824         references to the first file.
13825
13826         * interface.cs: Register properties defined through interfaces.
13827
13828         * driver.cs: Add support for globbing on the command line
13829
13830         * class.cs (Field): Make it derive from MemberCore as well.
13831         (Event): ditto.
13832
13833 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13834
13835         * class.cs (Event::Define): Check that the type of the event is a delegate
13836         type else flag error #66.
13837
13838         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
13839         same.
13840
13841         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
13842         values of EntryPoint, CharSet etc etc.
13843
13844         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
13845
13846         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
13847         be null and we should ignore this. I am not sure if this is really clean. Apparently,
13848         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
13849         which needs this to do its work.
13850
13851         * ../errors/cs0066.cs : Add.
13852
13853 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
13854
13855         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
13856         helper functions.
13857
13858         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13859         clears out the parameters field.
13860         (MemberSignatureCompare): Cleanup
13861
13862         (MemberCore): New base class used to share code between MethodCore
13863         and Property.
13864
13865         (RegisterRequiredImplementations) BindingFlags.Public requires
13866         either BindingFlags.Instace or Static.  Use instance here.
13867
13868         (Property): Refactored code to cope better with the full spec.
13869
13870         * parameter.cs (GetParameterInfo): Return an empty array instead
13871         of null on error.
13872
13873         * class.cs (Property): Abstract or extern properties have no bodies.
13874
13875         * parameter.cs (GetParameterInfo): return a zero-sized array.
13876
13877         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13878         method modifier validation to the typecontainer so we can reuse
13879         this on properties.
13880
13881         (MethodCore.ParameterTypes): return an empty sized array of types.
13882
13883         (Property.Define): Test property modifier validity.
13884
13885         Add tests for sealed/override too.
13886
13887         (Method.Emit): abstract or extern methods have no bodies.
13888
13889 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13890
13891         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13892         thing.
13893
13894         (Method::Define, ::Emit): Modify accordingly.
13895
13896         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13897
13898         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13899
13900         * makefile: Pass in /unsafe.
13901
13902 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13903
13904         * class.cs (MakeKey): Kill routine.
13905
13906         * class.cs (TypeContainer.Define): Correctly define explicit
13907         method implementations (they require the full interface name plus
13908         the method name).
13909
13910         * typemanager.cs: Deply the PtrHashtable here and stop using the
13911         lame keys.  Things work so much better.
13912
13913         This of course broke everyone who depended on `RegisterMethod' to
13914         do the `test for existance' test.  This has to be done elsewhere.
13915
13916         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13917         the object stupid Equals method (because, that like fails all over
13918         the place).  We still do not use it.
13919
13920         * class.cs (TypeContainer.SetRequiredInterface,
13921         TypeContainer.RequireMethods): Killed these two routines and moved
13922         all the functionality to RegisterRequiredImplementations.
13923
13924         (TypeContainer.RegisterRequiredImplementations): This routine now
13925         registers all the implementations required in an array for the
13926         interfaces and abstract methods.  We use an array of structures
13927         which can be computed ahead of time to reduce memory usage and we
13928         also assume that lookups are cheap as most classes will not
13929         implement too many interfaces.
13930
13931         We also avoid creating too many MethodSignatures.
13932
13933         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13934         clear the "pending" bit if we find that there are problems with
13935         the declaration.
13936
13937         (TypeContainer.VerifyPendingMethods): Update to report errors of
13938         methods that look like implementations but are not.
13939
13940         (TypeContainer.Define): Add support for explicit interface method
13941         implementation. 
13942
13943 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13944
13945         * typemanager.cs: Keep track of the parameters here instead of
13946         being a feature of the TypeContainer.
13947
13948         * class.cs: Drop the registration of parameters here, as
13949         InterfaceMethods are also interface declarations.
13950
13951         * delegate.cs: Register methods with the TypeManager not only with
13952         the TypeContainer.  This code was buggy.
13953
13954         * interface.cs: Full registation here.
13955
13956 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13957
13958         * expression.cs: Remove reducer for binary expressions, it can not
13959         be done this way.
13960
13961         * const.cs: Put here the code that used to go into constant.cs
13962
13963         * constant.cs: Put here the code for constants, this is a new base
13964         class for Literals.
13965
13966         * literal.cs: Make Literal derive from Constant.
13967
13968 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13969
13970         * statement.cs (Return.Emit): Report error 157 if the user
13971         attempts to return from a finally block.
13972
13973         (Return.Emit): Instead of emitting a return, jump to the end of
13974         the function.
13975
13976         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
13977         LocalBuilder to store the result of the function.  ReturnLabel is
13978         the target where we jump.
13979
13980
13981 2001-12-09  Radek Doulik  <rodo@ximian.com>
13982
13983         * cs-parser.jay: remember alias in current namespace
13984
13985         * ecore.cs (SimpleName::DoResolve): use aliases for types or
13986         namespaces
13987
13988         * class.cs (LookupAlias): lookup alias in my_namespace
13989
13990         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
13991         aliases hashtable
13992         (LookupAlias): lookup alias in this and if needed in parent
13993         namespaces
13994
13995 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
13996
13997         * support.cs: 
13998
13999         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14000         making things static.  I need this to avoid passing the
14001         TypeContainer when calling ParameterType.
14002
14003         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14004         that did string manipulation to compute the type and then call
14005         GetType.  Use Parameter.ParameterType instead.
14006
14007         * cs-tokenizer.cs: Consume the suffix for floating values.
14008
14009         * expression.cs (ParameterReference): figure out whether this is a
14010         reference parameter or not.  Kill an extra variable by computing
14011         the arg_idx during emission.
14012
14013         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14014         function that returns whether a parameter is an out/ref value or not.
14015
14016         (Parameter.ParameterType): The type of the parameter (base,
14017         without ref/out applied).
14018
14019         (Parameter.Resolve): Perform resolution here.
14020         (Parameter.ExternalType): The full type (with ref/out applied).
14021
14022         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14023         support for expressions on the using statement.
14024
14025 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14026
14027         * statement.cs (Using.EmitLocalVariableDecls): Split the
14028         localvariable handling of the using statement.
14029
14030         (Block.EmitMeta): Keep track of variable count across blocks.  We
14031         were reusing slots on separate branches of blocks.
14032
14033         (Try.Emit): Emit the general code block, we were not emitting it. 
14034
14035         Check the type of the declaration to be an IDisposable or
14036         something that can be implicity converted to it. 
14037
14038         Emit conversions if required.
14039
14040         * ecore.cs (EmptyExpression): New utility class.
14041         (Expression.ImplicitConversionExists): New utility function.
14042
14043 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14044
14045         * statement.cs (Using): Implement.
14046
14047         * expression.cs (LocalVariableReference): Support read only variables.
14048
14049         * statement.cs: Remove the explicit emit for the Leave opcode.
14050         (VariableInfo): Add a readonly field.
14051
14052 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14053
14054         * ecore.cs (ConvCast): new class used to encapsulate the various
14055         explicit integer conversions that works in both checked and
14056         unchecked contexts.
14057
14058         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14059         properly generate the overflow opcodes.
14060
14061 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14062
14063         * statement.cs: The correct type for the EmptyExpression is the
14064         element_type, not the variable type.  Ravi pointed this out.
14065
14066 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14067
14068         * class.cs (Method::Define): Handle PInvoke methods specially
14069         by using DefinePInvokeMethod instead of the usual one.
14070
14071         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14072         above to do the task of extracting information and defining the method.
14073
14074 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14075
14076         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14077         of the condition for string type.
14078
14079         (Emit): Move that here. 
14080
14081         (ArrayCreation::CheckIndices): Keep string literals in their expression
14082         form.
14083
14084         (EmitDynamicInitializers): Handle strings appropriately.
14085
14086 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14087
14088         * codegen.cs (EmitContext): Replace multiple variables with a
14089         single pointer to the current Switch statement.
14090
14091         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14092         EmitContext.
14093
14094 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14095
14096         * statement.cs 
14097
14098         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14099         default'.
14100
14101         (Foreach.Emit): Foreach on arrays was not setting
14102         up the loop variables (for break/continue).
14103
14104         (GotoCase): Semi-implented.
14105
14106 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14107
14108         * attribute.cs (CheckAttribute): Handle system attributes by using
14109         Attribute.GetAttributes to examine information we need.
14110
14111         (GetValidPlaces): Same here.
14112
14113         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14114
14115         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14116
14117         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14118
14119         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14120
14121         (Method::Emit): Handle the case when we are a PInvoke method.
14122
14123 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14124
14125         * expression.cs: Use ResolveWithSimpleName on compound names.
14126
14127 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14128
14129         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14130         before trying to reduce it.
14131
14132         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14133
14134         * constant.cs (LookupConstantValue): Implement.
14135
14136         (EmitConstant): Use the above in emitting the constant.
14137
14138         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14139         that are user-defined by doing a LookupConstantValue on them.
14140
14141         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14142         too, like above.
14143
14144 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14145
14146         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14147
14148         (BaseAccess.DoResolve): Implement.
14149
14150         (MemberAccess.DoResolve): Split this routine into a
14151         ResolveMemberAccess routine that can be used independently
14152
14153 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14154
14155         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14156         As that share bits of the implementation.  Is returns a boolean,
14157         while As returns the Type that is being probed.
14158
14159 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14160
14161         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14162         instead of a Literal - much easier.
14163
14164         (EnumInTransit): Remove - utterly useless :-)
14165
14166         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14167
14168         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14169
14170         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14171         chain when we have no associated expression.
14172
14173 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14174
14175         * constant.cs (Define): Use Location while reporting the errror.
14176
14177         Also emit a warning when 'new' is used and there is no inherited
14178         member to hide.
14179
14180         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14181         populated.
14182
14183         (LookupEnumValue): Implement to lookup an enum member's value and define it
14184         if necessary.
14185
14186         (Populate): Re-write accordingly to use the above routine.
14187
14188 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14189
14190         * expression.cs (This): Fix prototype for DoResolveLValue to
14191         override the base class DoResolveLValue.
14192
14193         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14194         declarations) 
14195
14196         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14197         (we need to load the address of the field here).  This fixes
14198         test-22. 
14199
14200         (FieldExpr.DoResolveLValue): Call the DoResolve
14201         function to initialize the Instance expression.
14202
14203         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14204         correctly the GetEnumerator operation on a value type.
14205
14206         * cs-parser.jay: Add more simple parsing error catches.
14207
14208         * statement.cs (Switch): Add support for string switches.
14209         Handle null specially.
14210
14211         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14212
14213 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14214
14215         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14216
14217         (declare_local_constant): New helper function.
14218
14219         * statement.cs (AddConstant): Keep a separate record of constants
14220
14221         (IsConstant): Implement to determine if a variable is a constant.
14222
14223         (GetConstantExpression): Implement.
14224
14225         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14226
14227         * statement.cs (IsVariableDefined): Re-write.
14228
14229 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14230
14231         * class.cs (TypeContainer::FindMembers): Look for constants
14232         in the case when we are looking for MemberTypes.Field
14233
14234         * expression.cs (MemberAccess::DoResolve): Check that in the
14235         case we are a FieldExpr and a Literal, we are not being accessed
14236         by an instance reference.
14237
14238         * cs-parser.jay (local_constant_declaration): Implement.
14239
14240         (declaration_statement): Implement for constant declarations.
14241
14242 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14243
14244         * statement.cs (Switch): Catch double defaults.
14245
14246         (Switch): More work on the switch() statement
14247         implementation.  It works for integral values now, need to finish
14248         string support.
14249
14250
14251 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14252
14253         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14254         integer literals into other integer literals.  To be used by
14255         switch. 
14256
14257 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14258
14259         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14260         some memory.
14261
14262         (EmitDynamicInitializers): Cope with the above since we extract data
14263         directly from ArrayData now.
14264
14265         (ExpectInitializers): Keep track of whether initializers are mandatory
14266         or not.
14267
14268         (Bounds): Make it a hashtable to prevent the same dimension being 
14269         recorded for every element in that dimension.
14270
14271         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14272         from being found.
14273
14274         Also fix bug which was causing the indices to be emitted in the reverse
14275         order.
14276
14277 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14278
14279         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14280         unfinished.  They do not work, because the underlying code is
14281         sloppy.
14282
14283 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14284
14285         * cs-parser.jay: Remove bogus fixme.
14286
14287         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14288         on Switch statement.
14289
14290 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14291
14292         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14293         the same. 
14294
14295         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14296         parameter. Apparently, any expression is allowed. 
14297
14298         (ValidateInitializers): Update accordingly.
14299
14300         (CheckIndices): Fix some tricky bugs thanks to recursion.
14301
14302         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14303         I was being completely brain-dead.
14304
14305         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14306         and re-write acordingly.
14307
14308         (DelegateInvocation): Re-write accordingly.
14309
14310         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14311
14312         (MakeByteBlob): Handle types more correctly.
14313
14314         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14315         initialization from expressions but it is incomplete because I am a complete
14316         Dodo :-|
14317
14318 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14319
14320         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14321         on If.  Basically, we have to return `true' (ie, we do return to
14322         our caller) only if both branches of the if return.
14323
14324         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14325         short-circuit operators, handle them as short circuit operators. 
14326
14327         (Cast.DoResolve): Resolve type.
14328         (Cast.Cast): Take an expression as the target type.
14329
14330         * cs-parser.jay (cast_expression): Remove old hack that only
14331         allowed a limited set of types to be handled.  Now we take a
14332         unary_expression and we resolve to a type during semantic
14333         analysis.
14334
14335         Use the grammar productions from Rhys to handle casts (this is
14336         not complete like Rhys syntax yet, we fail to handle that corner
14337         case that C# has regarding (-x), but we will get there.
14338
14339 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14340
14341         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14342         field which is an array type.
14343
14344         * cs-parser.jay (declare_local_variables): Support array initialization too.
14345
14346         * typemanager.cs (MakeKey): Implement.
14347
14348         (everywhere): Use the above appropriately.
14349
14350         * cs-parser.jay (for_statement): Update for array initialization while
14351         declaring variables.
14352
14353         * ecore.cs : The error message was correct, it's the variable's names that
14354         were misleading ;-) Make the code more readable.
14355
14356         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14357         the correct type etc.
14358
14359         (ConvertExplicit): Handle Enum types by examining the underlying type.
14360
14361 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14362
14363         * parameter.cs (GetCallingConvention): Always return
14364         CallingConventions.Standard for now.
14365
14366 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14367
14368         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14369         and `r' after calling DoNumericPromotions.
14370
14371         * ecore.cs: Fix error message (the types were in the wrong order).
14372
14373         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14374         BindingFlags.Instance as well 
14375
14376         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14377         implicit int literal conversion in an empty cast so that we
14378         propagate the right type upstream.
14379
14380         (UnboxCast): new class used to unbox value types.
14381         (Expression.ConvertExplicit): Add explicit type conversions done
14382         by unboxing.
14383
14384         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14385         the target type before applying the implicit LongLiterals to ULong
14386         literal cast.
14387
14388 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14389
14390         * cs-parser.jay (for_statement): Reworked the way For works: now
14391         we declare manually any variables that are introduced in
14392         for_initializer to solve the problem of having out-of-band code
14393         emition (that is what got for broken).
14394
14395         (declaration_statement): Perform the actual variable declaration
14396         that used to be done in local_variable_declaration here.
14397
14398         (local_variable_declaration): Do not declare anything, just pass
14399         the information on a DictionaryEntry
14400
14401 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14402
14403         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14404         re-write of the logic to now make it recursive.
14405
14406         (UpdateIndices): Re-write accordingly.
14407
14408         Store element data in a separate ArrayData list in the above methods.
14409
14410         (MakeByteBlob): Implement to dump the array data into a byte array.
14411
14412 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14413
14414         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14415         into CheckIndices.
14416
14417         * constant.cs (Define): Implement.
14418
14419         (EmitConstant): Re-write fully.
14420
14421         Pass in location info.
14422
14423         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14424         respectively.
14425
14426         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14427         DictionaryEntry since we need location info too.
14428
14429         (constant_declaration): Update accordingly.
14430
14431         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14432         code into another method : UpdateIndices.
14433
14434 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14435
14436         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14437         some type checking etc.
14438
14439 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14440
14441         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14442         bits to provide dimension info if the user skips doing that.
14443
14444         Update second constructor to store the rank correctly.
14445
14446 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14447
14448         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14449         and try to implement.
14450
14451         * ../errors/cs0150.cs : Add.
14452
14453         * ../errors/cs0178.cs : Add.
14454
14455 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14456
14457         * statement.cs: Implement foreach on multi-dimensional arrays. 
14458
14459         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14460         name of the params argument.
14461
14462         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14463         initializing the array.
14464
14465         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14466         we can use this elsewhere.
14467
14468         * statement.cs: Finish implementation of foreach for single
14469         dimension arrays.
14470
14471         * cs-parser.jay: Use an out-of-band stack to pass information
14472         around, I wonder why I need this.
14473
14474         foreach_block: Make the new foreach_block the current_block.
14475
14476         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14477         function used to return a static Parameters structure.  Used for
14478         empty parameters, as those are created very frequently.
14479
14480         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14481
14482 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14483
14484         * interface.cs : Default modifier is private, not public. The
14485         make verify test passes again.
14486
14487 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14488
14489         * support.cs (ReflectionParameters): Fix logic to determine
14490         whether the last parameter is a params one. Test 9 passes again.
14491
14492         * delegate.cs (Populate): Register the builders we define with
14493         RegisterParameterForBuilder. Test 19 passes again.
14494
14495         * cs-parser.jay (property_declaration): Reference $6 instead
14496         of $$ to get at the location.
14497
14498         (indexer_declaration): Similar stuff.
14499
14500         (attribute): Ditto.
14501
14502         * class.cs (Property): Register parameters for the Get and Set methods
14503         if they exist. Test 23 passes again.
14504
14505         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14506         call to EmitArguments as we are sure there aren't any params arguments. 
14507         Test 32 passes again.
14508
14509         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14510         IndexOutOfRangeException. 
14511
14512         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14513         Test 33 now passes again.
14514
14515 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14516
14517         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14518         broke a bunch of things.  Will have to come up with a better way
14519         of tracking locations.
14520
14521         * statement.cs: Implemented foreach for single dimension arrays.
14522
14523 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14524
14525         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14526         an error.  This removes the lookup from the critical path.
14527
14528         * cs-parser.jay: Removed use of temporary_loc, which is completely
14529         broken. 
14530
14531 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14532
14533         * support.cs (ReflectionParameters.ParameterModifier): Report
14534         whether the argument is a PARAMS argument or not.
14535
14536         * class.cs: Set the attribute `ParamArrayAttribute' on the
14537         parameter argument.
14538
14539         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14540         and cons_param_array_attribute (ConstructorInfo for
14541         ParamArrayAttribute)., 
14542
14543         * codegen.cs: Emit the return using the `Return' statement, that
14544         way we can report the error correctly for missing return values. 
14545
14546         * class.cs (Method.Emit): Clean up.
14547
14548         * expression.cs (Argument.Resolve): Take another argument: the
14549         location where this argument is used.  Notice that this is not
14550         part of the "Argument" class as to reduce the size of the
14551         structure (we know the approximate location anyways).
14552
14553         Test if the argument is a variable-reference, if not, then
14554         complain with a 206.
14555
14556         (Argument.Emit): Emit addresses of variables.
14557
14558         (Argument.FullDesc): Simplify.
14559
14560         (Invocation.DoResolve): Update for Argument.Resolve.
14561
14562         (ElementAccess.DoResolve): ditto.
14563
14564         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14565         method should be virtual, as this method is always virtual.
14566
14567         (NewDelegate.DoResolve): Update for Argument.Resolve.
14568
14569         * class.cs (ConstructorInitializer.DoResolve): ditto.
14570
14571         * attribute.cs (Attribute.Resolve): ditto.
14572
14573 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14574
14575         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14576
14577         * expression.cs (ParameterReference): Drop IStackStorage and implement
14578         IAssignMethod instead. 
14579
14580         (LocalVariableReference): ditto.
14581
14582         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14583         IAssignMethod instead. 
14584
14585 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14586
14587         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14588         enumerations that are used in heavily used structures derive from
14589         byte in a laughable and pathetic attempt to reduce memory usage.
14590         This is the kind of pre-optimzations that you should not do at
14591         home without adult supervision.
14592
14593         * expression.cs (UnaryMutator): New class, used to handle ++ and
14594         -- separatedly from the other unary operators.  Cleans up the
14595         code, and kills the ExpressionStatement dependency in Unary.
14596
14597         (Unary): Removed `method' and `Arguments' from this class, making
14598         it smaller, and moving it all to SimpleCall, so I can reuse this
14599         code in other locations and avoid creating a lot of transient data
14600         strucutres when not required.
14601
14602         * cs-parser.jay: Adjust for new changes.
14603
14604 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14605
14606         * enum.cs (Enum.Populate): If there is a failure during
14607         definition, return
14608
14609         * cs-parser.jay (opt_enum_base): we used to catch type errors
14610         here, but this is really incorrect.  The type error should be
14611         catched during semantic analysis.
14612
14613 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14614
14615         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14616         current_local_parameters as expected since I, in my stupidity, had forgotten
14617         to do this :-)
14618
14619         * attribute.cs (GetValidPlaces): Fix stupid bug.
14620
14621         * class.cs (Method::Emit): Perform check on applicability of attributes.
14622
14623         (Constructor::Emit): Ditto.
14624
14625         (Field::Emit): Ditto.
14626
14627         (Field.Location): Store location information.
14628
14629         (Property, Event, Indexer, Operator): Ditto.
14630
14631         * cs-parser.jay (field_declaration): Pass in location for each field.
14632
14633         * ../errors/cs0592.cs : Add.
14634
14635 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14636
14637         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14638
14639         (InitCoreTypes): Update accordingly.
14640
14641         (RegisterAttrType, LookupAttr): Implement.
14642
14643         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14644         info about the same.
14645
14646         (Resolve): Update to populate the above as necessary.
14647
14648         (Error592): Helper.
14649
14650         (GetValidPlaces): Helper to the above.
14651
14652         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14653
14654         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14655
14656 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14657
14658         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14659
14660         * ../errors/cs0617.cs : Add.
14661
14662 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14663
14664         * enum.cs (Emit): Rename to Populate to be more consistent with what
14665         we expect it to do and when exactly it is called.
14666
14667         * class.cs, rootcontext.cs : Update accordingly.
14668
14669         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14670         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14671
14672         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14673
14674         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14675         of a fieldinfo using the above, when dealing with a FieldBuilder.
14676
14677 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14678
14679         * ../errors/cs0031.cs : Add.
14680
14681         * ../errors/cs1008.cs : Add.
14682
14683         * ../errrors/cs0543.cs : Add.
14684
14685         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14686         enum type.
14687
14688         (FindMembers): Implement.
14689
14690         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14691         enums and delegates too.
14692
14693         (enum_types): Rename to builder_to_enum.
14694
14695         (delegate_types): Rename to builder_to_delegate.
14696
14697         * delegate.cs (FindMembers): Implement.
14698
14699 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14700
14701         * typemanager.cs (IsEnumType): Implement.
14702
14703         * enum.cs (Emit): Re-write parts to account for the underlying type
14704         better and perform checking etc.
14705
14706         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14707         of the underlying type.
14708
14709         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14710         value
14711
14712         * enum.cs (error31): Helper to report error #31.
14713
14714         * cs-parser.jay (enum_declaration): Store location of each member too.
14715
14716         * enum.cs (member_to_location): New hashtable. 
14717
14718         (AddEnumMember): Update location hashtable.
14719
14720         (Emit): Use the location of each member while reporting errors.
14721
14722 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14723
14724         * cs-parser.jay: A for_initializer if is a
14725         local_variable_declaration really ammount to have an implicit
14726         block with the variable declaration and no initializer for for.
14727
14728         * statement.cs (For.Emit): Cope with null initializers.
14729
14730         This fixes the infinite loop on for initializers.
14731
14732 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14733
14734         * enum.cs: More cleanup.
14735
14736         * ecore.cs: Remove dead code.
14737
14738         * class.cs (Property.Emit): More simplification.
14739         (Event.Emit): ditto.
14740
14741         Reworked to have less levels of indentation.
14742
14743 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14744
14745         * class.cs (Property): Emit attributes.
14746
14747         (Field): Ditto.
14748
14749         (Event): Ditto.
14750
14751         (Indexer): Ditto.
14752
14753         (Operator): Ditto.
14754
14755         * enum.cs (Emit): Ditto.
14756
14757         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14758         Enums too.
14759
14760         * class.cs (Field, Event, etc.): Move attribute generation into the
14761         Emit method everywhere.
14762
14763         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14764         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14765         as we had no way of defining nested enums !
14766
14767         * rootcontext.cs : Adjust code accordingly.
14768
14769         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14770
14771 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14772
14773         * expression.cs (EvalConstantExpression): Move into ecore.cs
14774
14775         * enum.cs (Enum): Rename some members and make them public and readonly
14776         according to our convention.
14777
14778         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14779         nothing else.
14780
14781         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14782
14783         (Enum::Emit): Write a simple version for now which doesn't try to compute
14784         expressions. I shall modify this to be more robust in just a while.
14785
14786         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14787
14788         (TypeContainer::CloseType): Create the Enum types too.
14789
14790         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14791
14792         * expression.cs (EvalConstantExpression): Get rid of completely.
14793
14794         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14795         user-defined values and other cases.
14796
14797         (IsValidEnumLiteral): Helper function.
14798
14799         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14800         out there in the case we had a literal FieldExpr.
14801
14802         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14803
14804         (Literalize): Revamp a bit to take two arguments.
14805
14806         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14807
14808 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14809
14810         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14811
14812         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14813
14814         (Resolve): Use the above to ensure we have proper initializers.
14815
14816 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14817
14818         * expression.cs (Expression::EvalConstantExpression): New method to 
14819         evaluate constant expressions.
14820
14821         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14822
14823 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14824
14825         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14826         in an array.
14827
14828         (Binary.ResolveOperator): Handle operator != (object a, object b)
14829         and operator == (object a, object b);
14830
14831         (Binary.DoNumericPromotions): Indicate whether the numeric
14832         promotion was possible.
14833
14834         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14835         Implement.  
14836
14837         Made the ArrayAccess implement interface IAssignMethod instead of
14838         IStackStore as the order in which arguments are passed reflects
14839         this.
14840
14841         * assign.cs: Instead of using expr.ExprClass to select the way of
14842         assinging, probe for the IStackStore/IAssignMethod interfaces.
14843
14844         * typemanager.cs: Load InitializeArray definition.
14845
14846         * rootcontext.cs (RootContext.MakeStaticData): Used to define
14847         static data that can be used to initialize arrays. 
14848
14849 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
14850
14851         * expression.cs: Handle operator== and operator!= for booleans.
14852
14853         (Conditioal.Reduce): Implement reducer for the ?: operator.
14854
14855         (Conditional.Resolve): Implement dead code elimination.
14856
14857         (Binary.Resolve): Catch string literals and return a new
14858         concatenated string.
14859
14860         (Unary.Reduce): Implement reduction of unary expressions.
14861
14862         * ecore.cs: Split out the expression core handling here.
14863
14864         (Expression.Reduce): New method used to perform constant folding
14865         and CSE.  This is needed to support constant-expressions. 
14866
14867         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14868         targets, and optimize for !x.
14869
14870 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14871
14872         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14873         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14874         set custom atttributes.
14875
14876         * literal.cs (Literal::GetValue): New abstract method to return the actual
14877         value of the literal, cast as an object.
14878
14879         (*Literal): Implement GetValue method.
14880
14881         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14882         expressions to the arraylist but objects of type Argument.
14883
14884         * class.cs (TypeContainer::Emit): Emit our attributes too.
14885
14886         (Method::Emit, Constructor::Emit): Ditto.
14887
14888         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14889         to be ignoring earlier.
14890
14891 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14892
14893         * attribute.cs (AttributeSection::Define): Implement to do the business
14894         of constructing a CustomAttributeBuilder.
14895
14896         (Attribute): New trivial class. Increases readability of code.  
14897
14898         * cs-parser.jay : Update accordingly.
14899
14900         (positional_argument_list, named_argument_list, named_argument): New rules
14901
14902         (attribute_arguments): Use the above so that we are more correct.
14903
14904 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14905
14906         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14907         to perform all checks for a method with a params parameter.
14908
14909         (Invocation::OverloadResolve): Update to use the above method and therefore
14910         cope correctly with params method invocations.
14911
14912         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14913         params too.
14914
14915         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14916         constructors in our parent too because we can't afford to miss out on 
14917         protected ones ;-)
14918
14919         * attribute.cs (AttributeSection): New name for the class Attribute
14920
14921         Other trivial changes to improve readability.
14922
14923         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14924         use the new class names.
14925
14926 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14927
14928         * class.cs (Method::Define): Complete definition for params types too
14929
14930         (Indexer::Define): Ditto.
14931
14932         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14933         Cope everywhere with a request for info about the array parameter.
14934
14935 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14936
14937         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14938
14939         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14940         local_variable_type to extract the string corresponding to the type.
14941
14942         (local_variable_type): Fixup the action to use the new helper method.
14943
14944         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14945         go.
14946
14947         * expression.cs : Clean out code which uses the above.
14948
14949 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14950
14951         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14952         and bale out if necessary by returning a false.
14953
14954         (RegisterProperty): Ditto.
14955
14956         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14957         and print out appropriate error messages.
14958
14959         * interface.cs (everywhere): Ditto.
14960
14961         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14962         location to constructor.
14963
14964         * class.cs (Property, Event, Indexer): Update accordingly.
14965
14966         * ../errors/cs111.cs : Added.
14967
14968         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14969         of a method, as laid down by the spec.
14970
14971         (Invocation::OverloadResolve): Use the above method.
14972
14973 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14974
14975         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
14976         now take a TypeContainer and a Parameters object.
14977
14978         (ParameterData): Modify return type of ParameterModifier method to be 
14979         Parameter.Modifier and not a string.
14980
14981         (ReflectionParameters, InternalParameters): Update accordingly.
14982
14983         * expression.cs (Argument::GetParameterModifier): Same here.
14984
14985         * support.cs (InternalParameters::ParameterType): Find a better way of determining
14986         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
14987         symbol in it at all so maybe this is only for now.
14988
14989 2001-10-30  Ravi Pratap  <ravi@ximian.com>
14990
14991         * support.cs (InternalParameters): Constructor now takes an extra argument 
14992         which is the actual Parameters class.
14993
14994         (ParameterDesc): Update to provide info on ref/out modifiers.
14995
14996         * class.cs (everywhere): Update call to InternalParameters to pass in
14997         the second argument too.
14998
14999         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15000         to return the modifier info [ref/out etc]
15001
15002         (InternalParameters, ReflectionParameters): Implement the above.
15003
15004         * expression.cs (Argument::ParameterModifier): Similar function to return
15005         info about the argument's modifiers.
15006
15007         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15008         too.
15009
15010         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15011         a new SetFormalParameters object which we pass to InternalParameters.
15012
15013 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15014
15015         * expression.cs (NewArray): Merge into the ArrayCreation class.
15016
15017 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15018
15019         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15020         NewUserdefinedArray into one as there wasn't much of a use in having
15021         two separate ones.
15022
15023         * expression.cs (Argument): Change field's name to ArgType from Type.
15024
15025         (Type): New readonly property which returns the proper type, taking into 
15026         account ref/out modifiers.
15027
15028         (everywhere): Adjust code accordingly for the above.
15029
15030         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15031         whether we are emitting for a ref or out parameter.
15032
15033         * expression.cs (Argument::Emit): Use the above field to set the state.
15034
15035         (LocalVariableReference::Emit): Update to honour the flag and emit the
15036         right stuff.
15037
15038         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15039
15040         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15041
15042         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15043
15044         (ReflectionParameters, InternalParameters): Implement the above method.
15045
15046         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15047         reporting errors.
15048
15049         (Invocation::FullMethodDesc): Ditto. 
15050
15051 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15052
15053         * cs-parser.jay: Add extra production for the second form of array
15054         creation. 
15055
15056         * expression.cs (ArrayCreation): Update to reflect the above
15057         change. 
15058
15059         * Small changes to prepare for Array initialization.
15060
15061 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15062
15063         * typemanager.cs (ImplementsInterface): interface might be null;
15064         Deal with this problem;
15065
15066         Also, we do store negative hits on the cache (null values), so use
15067         this instead of calling t.GetInterfaces on the type everytime.
15068
15069 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15070
15071         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15072
15073         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15074         split functionality out into different classes.
15075
15076         (New::FormArrayType): Move into NewBuiltinArray.
15077
15078         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15079         quite useless.
15080
15081         (NewBuiltinArray): New class to handle creation of built-in arrays.
15082
15083         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15084         account creation of one-dimensional arrays.
15085
15086         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15087
15088         (NewUserdefinedArray::DoResolve): Implement.
15089
15090         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15091
15092         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15093         we maintain inside the TypeManager. This is necessary to perform lookups on the
15094         module builder.
15095
15096         (LookupType): Update to perform GetType on the module builders too.     
15097
15098         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15099
15100         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15101
15102 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15103
15104         * expression.cs (New::DoResolve): Implement guts of array creation.
15105
15106         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15107
15108 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15109
15110         * expression.cs: Fix bug I introduced lsat night that broke
15111         Delegates. 
15112
15113         (Expression.Resolve): Report a 246 error (can not resolve name)
15114         if we find a SimpleName in the stream.
15115
15116         (Expression.ResolveLValue): Ditto.
15117
15118         (Expression.ResolveWithSimpleName): This function is a variant of
15119         ResolveName, this one allows SimpleNames to be returned without a
15120         warning.  The only consumer of SimpleNames is MemberAccess
15121
15122 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15123
15124         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15125         might arrive here.  I have my doubts that this is correct.
15126
15127         * statement.cs (Lock): Implement lock statement.
15128
15129         * cs-parser.jay: Small fixes to support `lock' and `using'
15130
15131         * cs-tokenizer.cs: Remove extra space
15132
15133         * driver.cs: New flag --checked, allows to turn on integer math
15134         checking. 
15135
15136         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15137         Threading.Monitor.Exit 
15138
15139 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15140
15141         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15142         Expression Class to be IndexerAccess.
15143
15144         Notice that Indexer::DoResolve sets the eclass to Value.
15145
15146 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15147
15148         * class.cs (TypeContainer::Emit): Emit code for indexers.
15149
15150         * assign.cs (IAssignMethod): New interface implemented by Indexers
15151         and Properties for handling assignment.
15152
15153         (Assign::Emit): Simplify and reuse code. 
15154
15155         * expression.cs (IndexerAccess, PropertyExpr): Implement
15156         IAssignMethod, clean up old code. 
15157
15158 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15159
15160         * typemanager.cs (ImplementsInterface): New method to determine if a type
15161         implements a given interface. Provides a nice cache too.
15162
15163         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15164         method.
15165
15166         (ConvertReferenceExplicit): Ditto.
15167
15168         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15169         various methods, with correct names etc.
15170
15171         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15172         Operator.UnaryNegation.
15173
15174         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15175         we have a unary plus or minus operator.
15176
15177         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15178         UnaryMinus.
15179
15180         * everywhere : update accordingly.
15181
15182         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15183         respectively.
15184
15185         * class.cs (Method::Define): For the case where we are implementing a method
15186         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15187         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15188
15189 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15190
15191         * interface.cs (FindMembers): Implement to work around S.R.E
15192         lameness.
15193
15194         * typemanager.cs (IsInterfaceType): Implement.
15195
15196         (FindMembers): Update to handle interface types too.
15197
15198         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15199         use IsAssignableFrom as that is not correct - it doesn't work.
15200
15201         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15202         and accordingly override EmitStatement.
15203
15204         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15205         using the correct logic :-)
15206
15207 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15208
15209         * ../errors/cs-11.cs : Add to demonstrate error -11 
15210
15211 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15212
15213         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15214         then pass this as a hint to ResolveLValue.
15215
15216         * expression.cs (FieldExpr): Add Location information
15217
15218         (FieldExpr::LValueResolve): Report assignment to readonly
15219         variable. 
15220
15221         (Expression::ExprClassFromMemberInfo): Pass location information.
15222
15223         (Expression::ResolveLValue): Add new method that resolves an
15224         LValue. 
15225
15226         (Expression::DoResolveLValue): Default invocation calls
15227         DoResolve. 
15228
15229         (Indexers): New class used to keep track of indexers in a given
15230         Type. 
15231
15232         (IStackStore): Renamed from LValue, as it did not really describe
15233         what this did.  Also ResolveLValue is gone from this interface and
15234         now is part of Expression.
15235
15236         (ElementAccess): Depending on the element access type
15237
15238         * typemanager.cs: Add `indexer_name_type' as a Core type
15239         (System.Runtime.CompilerServices.IndexerNameAttribute)
15240
15241         * statement.cs (Goto): Take a location.
15242
15243 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15244
15245         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15246         if two delegates are compatible.
15247
15248         (NewDelegate::DoResolve): Update to take care of the case when
15249         we instantiate a delegate from another delegate.
15250
15251         * typemanager.cs (FindMembers): Don't even try to look up members
15252         of Delegate types for now.
15253
15254 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15255
15256         * delegate.cs (NewDelegate): New class to take care of delegate
15257         instantiation.
15258
15259         * expression.cs (New): Split the delegate related code out into 
15260         the NewDelegate class.
15261
15262         * delegate.cs (DelegateInvocation): New class to handle delegate 
15263         invocation.
15264
15265         * expression.cs (Invocation): Split out delegate related code into
15266         the DelegateInvocation class.
15267
15268 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15269
15270         * expression.cs (New::DoResolve): Implement delegate creation fully
15271         and according to the spec.
15272
15273         (New::DoEmit): Update to handle delegates differently.
15274
15275         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15276         because of which we were printing out arguments in reverse order !
15277
15278         * delegate.cs (VerifyMethod): Implement to check if the given method
15279         matches the delegate.
15280
15281         (FullDelegateDesc): Implement.
15282
15283         (VerifyApplicability): Implement.
15284
15285         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15286         delegate invocations too.
15287
15288         (Invocation::Emit): Ditto.
15289
15290         * ../errors/cs1593.cs : Added.
15291
15292         * ../errors/cs1594.cs : Added.
15293
15294         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15295
15296 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15297
15298         * typemanager.cs (intptr_type): Core type for System.IntPtr
15299
15300         (InitCoreTypes): Update for the same.
15301
15302         (iasyncresult_type, asynccallback_type): Ditto.
15303
15304         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15305         correct.
15306
15307         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15308         too.
15309
15310         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15311         the builders for the 4 members of a delegate type :-)
15312
15313         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15314         type.
15315
15316         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15317
15318         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15319
15320 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15321
15322         * statement.cs (Break::Emit): Implement.   
15323         (Continue::Emit): Implement.
15324
15325         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15326         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15327         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15328         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15329         end loop
15330
15331         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15332         properties that track the label for the current loop (begin of the
15333         loop and end of the loop).
15334
15335 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15336
15337         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15338         use of emitting anything at all.
15339
15340         * class.cs, rootcontext.cs : Get rid of calls to the same.
15341
15342         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15343
15344         (Populate): Define the constructor correctly and set the implementation
15345         attributes.
15346
15347         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15348         have been defined.
15349
15350         (AddDelegateType): Implement.
15351
15352         (IsDelegateType): Implement helper method.
15353
15354         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15355
15356         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15357         and accordingly handle it.
15358
15359         * delegate.cs (Populate): Take TypeContainer argument.
15360         Implement bits to define the Invoke method. However, I still haven't figured out
15361         how to take care of the native int bit :-(
15362
15363         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15364         Qualify the name of the delegate, not its return type !
15365
15366         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15367         conversion.
15368
15369         (StandardConversionExists): Checking for array types turns out to be recursive.
15370
15371         (ConvertReferenceExplicit): Implement array conversion.
15372
15373         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15374
15375 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15376
15377         * cs-parser.jay (delegate_declaration): Store the fully qualified
15378         name as it is a type declaration.
15379
15380         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15381         readonly.
15382
15383         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15384         as TypeContainer::DefineType.
15385
15386         (Populate): Method in which all the definition of the various methods (Invoke)
15387         etc is done.
15388
15389         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15390         see.
15391
15392         (CloseDelegate): Finally creates the delegate.
15393
15394         * class.cs (TypeContainer::DefineType): Update to define delegates.
15395         (Populate, Emit and CloseType): Do the same thing here too.
15396
15397         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15398         delegates in all these operations.
15399
15400 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15401
15402         * expression.cs: LocalTemporary: a new expression used to
15403         reference a temporary that has been created.
15404
15405         * assign.cs: Handle PropertyAccess back here, so that we can
15406         provide the proper semantic access to properties.
15407
15408         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15409         a few more explicit conversions. 
15410
15411         * modifiers.cs: `NEW' modifier maps to HideBySig.
15412
15413         * expression.cs (PropertyExpr): Make this into an
15414         ExpressionStatement, and support the EmitStatement code path. 
15415
15416         Perform get/set error checking, clean up the interface.
15417
15418         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15419         them into toplevel access objects.
15420
15421 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15422
15423         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15424         SRE.
15425
15426         * typemanager.cs: Keep track here of our PropertyBuilders again to
15427         work around lameness in SRE.
15428
15429 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15430
15431         * expression.cs (LValue::LValueResolve): New method in the
15432         interface, used to perform a second resolution pass for LValues. 
15433
15434         (This::DoResolve): Catch the use of this in static methods.
15435
15436         (This::LValueResolve): Implement.
15437
15438         (This::Store): Remove warning, assigning to `this' in structures
15439         is 
15440
15441         (Invocation::Emit): Deal with invocation of
15442         methods on value types.  We need to pass the address to structure
15443         methods rather than the object itself.  (The equivalent code to
15444         emit "this" for structures leaves the entire structure on the
15445         stack instead of a pointer to it). 
15446
15447         (ParameterReference::DoResolve): Compute the real index for the
15448         argument based on whether the method takes or not a `this' pointer
15449         (ie, the method is static).
15450
15451         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15452         value types returned from functions when we need to invoke a
15453         method on the sturcture.
15454
15455
15456 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15457
15458         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15459         defining the type in the Modulebuilder or Typebuilder. This is to take
15460         care of nested types which need to be defined on the TypeBuilder using
15461         DefineNestedMethod.
15462
15463         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15464         methods in RootContext, only ported to be part of TypeContainer.
15465
15466         (TypeContainer::GetInterfaceOrClass): Ditto.
15467
15468         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15469
15470         * interface.cs (Interface::DefineInterface): New method. Does exactly
15471         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15472         too.
15473
15474         (Interface::GetInterfaces): Move from RootContext here and port.
15475
15476         (Interface::GetInterfaceByName): Same here.
15477
15478         * rootcontext.cs (ResolveTree): Re-write.
15479
15480         (PopulateTypes): Re-write.
15481
15482         * class.cs (TypeContainer::Populate): Populate nested types too.
15483         (TypeContainer::Emit): Emit nested members too.
15484
15485         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15486         instead just use the name argument passed in as it is already fully
15487         qualified.
15488
15489         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15490         to TypeContainer mapping to see if a type is user-defined.
15491
15492         * class.cs (TypeContainer::CloseType): Implement. 
15493
15494         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15495         the default constructor.
15496
15497         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15498         twice.
15499
15500         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15501
15502         * interface.cs (CloseType): Create the type here.
15503
15504         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15505         the hierarchy.
15506
15507         Remove all the methods which are now in TypeContainer.
15508
15509 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15510
15511         * delegate.cs (Define): Re-write bits to define the delegate
15512         correctly.
15513
15514 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15515
15516         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15517
15518         * expression.cs (ImplicitReferenceConversion): handle null as well
15519         as a source to convert to any reference type.
15520
15521         * statement.cs (Return): Perform any implicit conversions to
15522         expected return type.  
15523
15524         Validate use of return statement.  
15525
15526         * codegen.cs (EmitContext): Pass the expected return type here.
15527
15528         * class.cs (Method, Constructor, Property): Pass expected return
15529         type to EmitContext.
15530
15531 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15532
15533         * expression.cs: Make DoResolve take an EmitContext instead of a
15534         TypeContainer.
15535
15536         Replaced `l' and `location' for `loc', for consistency.
15537
15538         (Error, Warning): Remove unneeded Tc argument.
15539
15540         * assign.cs, literal.cs, constant.cs: Update to new calling
15541         convention. 
15542
15543         * codegen.cs: EmitContext now contains a flag indicating whether
15544         code is being generated in a static method or not.
15545
15546         * cs-parser.jay: DecomposeQI, new function that replaces the old
15547         QualifiedIdentifier.  Now we always decompose the assembled
15548         strings from qualified_identifier productions into a group of
15549         memberaccesses.
15550
15551 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15552
15553         * rootcontext.cs: Deal with field-less struct types correctly now
15554         by passing the size option to Define Type.
15555
15556         * class.cs: Removed hack that created one static field. 
15557
15558 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15559
15560         * statement.cs: Moved most of the code generation here. 
15561
15562 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15563
15564         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15565         seem very right.
15566
15567         (ElementAccess): Remove useless bits for now - keep checks as the spec
15568         says.
15569
15570 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15571
15572         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15573         and start performing checks according to the spec.
15574
15575 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15576
15577         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15578         rank_specifiers instead.
15579
15580         (rank_specifiers): Change the order in which the rank specifiers are stored
15581
15582         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15583
15584         * expression.cs (ElementAccess): Implement the LValue interface too.
15585
15586 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15587
15588         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15589         except that user defined conversions are not included.
15590
15591         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15592         perform the conversion of the return type, if necessary.
15593
15594         (New::DoResolve): Check whether we are creating an array or an object
15595         and accordingly do the needful.
15596
15597         (New::Emit): Same here.
15598
15599         (New::DoResolve): Implement guts of array creation.
15600
15601         (New::FormLookupType): Helper function.
15602
15603 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15604
15605         * codegen.cs: Removed most of the code generation here, and move the
15606         corresponding code generation bits to the statement classes. 
15607
15608         Added support for try/catch/finalize and throw.
15609
15610         * cs-parser.jay: Added support for try/catch/finalize.
15611
15612         * class.cs: Catch static methods having the flags override,
15613         virtual or abstract.
15614
15615         * expression.cs (UserCast): This user cast was not really doing
15616         what it was supposed to do.  Which is to be born in fully resolved
15617         state.  Parts of the resolution were being performed at Emit time! 
15618
15619         Fixed this code.
15620
15621 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15622
15623         * expression.cs: Implicity convert the result from UserCast.
15624
15625 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15626
15627         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15628         prevented it from working correctly. 
15629
15630         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15631         merely ConvertImplicit.
15632
15633 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15634
15635         * typemanager.cs: Make the LookupTypeContainer function static,
15636         and not per-instance.  
15637
15638         * class.cs: Make static FindMembers (the one that takes a Type
15639         argument). 
15640
15641         * codegen.cs: Add EmitForeach here.
15642
15643         * cs-parser.jay: Make foreach a toplevel object instead of the
15644         inline expansion, as we need to perform semantic analysis on it. 
15645
15646 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15647
15648         * expression.cs (Expression::ImplicitUserConversion): Rename to
15649         UserDefinedConversion.
15650
15651         (Expression::UserDefinedConversion): Take an extra argument specifying 
15652         whether we look for explicit user conversions too.
15653
15654         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15655
15656         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15657
15658         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15659         with the appropriate arguments.
15660
15661         * cs-parser.jay (cast_expression): Record location too.
15662
15663         * expression.cs (Cast): Record location info.
15664
15665         (Expression::ConvertExplicit): Take location argument.
15666
15667         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15668         to determine if we are doing explicit conversions.
15669
15670         (UserCast::Emit): Update accordingly.
15671
15672         (Expression::ConvertExplicit): Report an error if everything fails.
15673
15674         * ../errors/cs0030.cs : Add.
15675
15676 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15677
15678         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15679         virtual and newslot bits. 
15680
15681         * class.cs (TypeContainer::RegisterRequiredImplementations):
15682         Record methods we need.
15683
15684         (TypeContainer::MakeKey): Helper function to make keys for
15685         MethodBases, since the Methodbase key is useless.
15686
15687         (TypeContainer::Populate): Call RegisterRequiredImplementations
15688         before defining the methods.   
15689
15690         Create a mapping for method_builders_to_methods ahead of time
15691         instead of inside a tight loop.
15692
15693         (::RequireMethods):  Accept an object as the data to set into the
15694         hashtable so we can report interface vs abstract method mismatch.
15695
15696 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15697
15698         * report.cs: Make all of it static.
15699
15700         * rootcontext.cs: Drop object_type and value_type computations, as
15701         we have those in the TypeManager anyways.
15702
15703         Drop report instance variable too, now it is a global.
15704
15705         * driver.cs: Use try/catch on command line handling.
15706
15707         Add --probe option to debug the error reporting system with a test
15708         suite. 
15709
15710         * report.cs: Add support for exiting program when a probe
15711         condition is reached.
15712
15713 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15714
15715         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15716         we do a forcible conversion regardless of type, to check if 
15717         ForceConversion returns a null.
15718
15719         (Binary::error19): Use location to report error.
15720
15721         (Unary::error23): Use location here too.
15722
15723         * ../errors/cs0019.cs : Check in.
15724
15725         * ../errors/cs0023.cs : Check in.
15726
15727         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15728         case of a non-null MethodInfo object with a length of 0 !
15729
15730         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15731         an applicable member - according to the spec :-)
15732         Also fix logic to find members in base types.
15733
15734         (Unary::ResolveOperator): Same here.
15735
15736         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15737         as I was getting thoroughly confused between this and error19 :-)
15738
15739         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15740         (::FindMostEncompassedType): Implement.
15741         (::FindMostEncompassingType): Implement.
15742         (::StandardConversionExists): Implement.
15743
15744         (UserImplicitCast): Re-vamp. We now need info about most specific
15745         source and target types so that we can do the necessary conversions.
15746
15747         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15748         mathematical union with no duplicates.
15749
15750 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15751
15752         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15753         in order from base classes to child classes, so that we can in
15754         child classes look up in our parent for method names and
15755         attributes (required for handling abstract, virtual, new, override
15756         constructs: we need to instrospect our base class, and if we dont
15757         populate the classes in order, the introspection might be
15758         incorrect.  For example, a method could query its parent before
15759         the parent has any methods and would determine that the parent has
15760         no abstract methods (while it could have had them)).
15761
15762         (RootContext::CreateType): Record the order in which we define the
15763         classes.
15764
15765 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15766
15767         * class.cs (TypeContainer::Populate): Also method definitions can
15768         fail now, keep track of this.
15769
15770         (TypeContainer::FindMembers): Implement support for
15771         DeclaredOnly/noDeclaredOnly flag.
15772
15773         (Constructor::Emit) Return the ConstructorBuilder.
15774
15775         (Method::Emit) Return the MethodBuilder. 
15776         Check for abstract or virtual methods to be public.
15777
15778         * rootcontext.cs (RootContext::CreateType): Register all the
15779         abstract methods required for the class to be complete and the
15780         interface methods that must be implemented. 
15781
15782         * cs-parser.jay: Report error 501 (method requires body if it is
15783         not marked abstract or extern).
15784
15785         * expression.cs (TypeOf::Emit): Implement.
15786
15787         * typemanager.cs: runtime_handle_type, new global type.
15788
15789         * class.cs (Property::Emit): Generate code for properties.
15790
15791 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15792
15793         * expression.cs (Unary::ResolveOperator): Find operators on base type
15794         too - we now conform exactly to the spec.
15795
15796         (Binary::ResolveOperator): Same here.
15797
15798         * class.cs (Operator::Define): Fix minor quirk in the tests.
15799
15800         * ../errors/cs0215.cs : Added.
15801
15802         * ../errors/cs0556.cs : Added.
15803
15804         * ../errors/cs0555.cs : Added.
15805
15806 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15807
15808         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15809         single integer which is really efficient
15810
15811 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15812
15813         *  expression.cs (Expression::ImplicitUserConversion): Use location
15814         even in the case when we are examining True operators.
15815  
15816         * class.cs (Operator::Define): Perform extensive checks to conform
15817         with the rules for operator overloading in the spec.
15818
15819         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15820         some of the other conversions mentioned in the spec.
15821
15822         * typemanager.cs (array_type): New static member for the System.Array built-in
15823         type.
15824
15825         (cloneable_interface): For System.ICloneable interface.
15826
15827         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15828         we start resolving the tree and populating types.
15829
15830         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15831  
15832 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15833
15834         * expression.cs (Expression::ExprClassFromMemberInfo,
15835         Expression::Literalize): Create literal expressions from
15836         FieldInfos which are literals.
15837
15838         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
15839         type casts, because they were wrong.  The test suite in tests
15840         caught these ones.
15841
15842         (ImplicitNumericConversion): ushort to ulong requires a widening
15843         cast. 
15844
15845         Int32 constant to long requires widening cast as well.
15846
15847         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
15848         for integers because the type on the stack is not i4.
15849
15850 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
15851
15852         * expression.cs (report118): require location argument. 
15853
15854         * parameter.cs: Do not dereference potential null value.
15855
15856         * class.cs: Catch methods that lack the `new' keyword when
15857         overriding a name.  Report warnings when `new' is used without
15858         anything being there to override.
15859
15860         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15861
15862         * class.cs: Only add constructor to hashtable if it is non-null
15863         (as now constructors can fail on define).
15864
15865         (TypeManager, Class, Struct): Take location arguments.
15866
15867         Catch field instance initialization in structs as errors.
15868
15869         accepting_filter: a new filter for FindMembers that is static so
15870         that we dont create an instance per invocation.
15871
15872         (Constructor::Define): Catch errors where a struct constructor is
15873         parameterless 
15874
15875         * cs-parser.jay: Pass location information for various new
15876         constructs. 
15877
15878         * delegate.cs (Delegate): take a location argument.
15879
15880         * driver.cs: Do not call EmitCode if there were problesm in the
15881         Definition of the types, as many Builders wont be there. 
15882
15883         * decl.cs (Decl::Decl): Require a location argument.
15884
15885         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15886         into integers, and find the most appropiate integer for it.
15887
15888         * literal.cs: Implement ULongLiteral.
15889
15890         * rootcontext.cs: Provide better information about the location of
15891         failure when CreateType fails.
15892
15893 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15894
15895         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15896         as well.
15897
15898         * expression.cs (Binary::CheckShiftArguments): Add missing type
15899         computation.
15900         (Binary::ResolveOperator): Add type to the logical and and logical
15901         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15902         before.
15903
15904         (Binary::DoNumericPromotions): In the case where either argument
15905         is ulong (and most signed types combined with ulong cause an
15906         error) perform implicit integer constant conversions as well.
15907
15908 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15909
15910         * expression.cs (UserImplicitCast): Method should always be
15911         non-null. 
15912         (Invocation::BetterConversion): Simplified test for IntLiteral.
15913
15914         (Expression::ImplicitNumericConversion): Split this routine out.
15915         Put the code that performs implicit constant integer conversions
15916         here. 
15917
15918         (Expression::Resolve): Become a wrapper around DoResolve so we can
15919         check eclass and type being set after resolve.
15920
15921         (Invocation::Badness): Remove this dead function
15922
15923         (Binary::ResolveOperator): Do not compute the expensive argumnets
15924         unless we have a union for it.
15925
15926         (Probe::Emit): Is needs to do an isinst and then
15927         compare against null.
15928
15929         (::CanConvert): Added Location argument.  If the Location argument
15930         is null (Location.Null), then we do not report errors.  This is
15931         used by the `probe' mechanism of the Explicit conversion.  We do
15932         not want to generate an error for something that the user
15933         explicitly requested to be casted.  But the pipeline for an
15934         explicit cast first tests for potential implicit casts.
15935
15936         So for now, if the Location is null, it means `Probe only' to
15937         avoid adding another argument.   Might have to revise this
15938         strategy later.
15939
15940         (ClassCast): New class used to type cast objects into arbitrary
15941         classes (used in Explicit Reference Conversions).
15942
15943         Implement `as' as well.
15944
15945         Reverted all the patches from Ravi below: they were broken:
15946
15947                 * The use of `level' as a mechanism to stop recursive
15948                   invocations is wrong.  That was there just to catch the
15949                   bug with a strack trace but not as a way of addressing
15950                   the problem.
15951
15952                   To fix the problem we have to *understand* what is going
15953                   on and the interactions and come up with a plan, not
15954                   just get things going.
15955
15956                 * The use of the type conversion cache that I proposed
15957                   last night had an open topic: How does this work across
15958                   protection domains.  A user defined conversion might not
15959                   be public in the location where we are applying the
15960                   conversion, a different conversion might be selected
15961                   (ie, private A->B (better) but public B->A (worse),
15962                   inside A, A->B applies, but outside it, B->A will
15963                   apply).
15964
15965                 * On top of that (ie, even if the above is solved),
15966                   conversions in a cache need to be abstract.  Ie, `To
15967                   convert from an Int to a Short use an OpcodeCast', not
15968                   `To convert from an Int to a Short use the OpcodeCast on
15969                   the variable 5' (which is what this patch was doing).
15970
15971 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15972
15973         * expression.cs (Invocation::ConversionExists): Re-write to use
15974         the conversion cache
15975
15976         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
15977         cache all conversions done, not just user-defined ones.
15978
15979         (Invocation::BetterConversion): The real culprit. Use ConversionExists
15980         to determine if a conversion exists instead of acutually trying to 
15981         perform the conversion. It's faster too.
15982
15983         (Expression::ConvertExplicit): Modify to use ConversionExists to check
15984         and only then attempt the implicit conversion.
15985
15986 2001-09-28  Ravi Pratap  <ravi@ximian.com>
15987
15988         * expression.cs (ConvertImplicit): Use a cache for conversions
15989         already found. Check level of recursion and bail out if necessary.
15990
15991 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15992
15993         * typemanager.cs (string_concat_string_string, string_concat_object_object):
15994         Export standard methods that we expect for string operations.
15995
15996         * statement.cs (Block::UsageWarning): Track usage of variables and
15997         report the errors for not used variables.
15998
15999         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16000         operator. 
16001
16002 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16003
16004         * codegen.cs: remove unnneded code 
16005
16006         * expression.cs: Removed BuiltinTypeAccess class
16007
16008         Fix the order in which implicit conversions are
16009         done.  
16010
16011         The previous fixed dropped support for boxed conversions (adding a
16012         test to the test suite now)
16013
16014         (UserImplicitCast::CanConvert): Remove test for source being null,
16015         that code is broken.  We should not feed a null to begin with, if
16016         we do, then we should track the bug where the problem originates
16017         and not try to cover it up here.
16018
16019         Return a resolved expression of type UserImplicitCast on success
16020         rather than true/false.  Ravi: this is what I was talking about,
16021         the pattern is to use a static method as a "constructor" for
16022         objects. 
16023
16024         Also, do not create arguments until the very last minute,
16025         otherwise we always create the arguments even for lookups that
16026         will never be performed. 
16027
16028         (UserImplicitCast::Resolve): Eliminate, objects of type
16029         UserImplicitCast are born in a fully resolved state. 
16030
16031         * typemanager.cs (InitCoreTypes): Init also value_type
16032         (System.ValueType). 
16033
16034         * expression.cs (Cast::Resolve): First resolve the child expression.
16035
16036         (LValue): Add new method AddressOf to be used by
16037         the `&' operator.  
16038
16039         Change the argument of Store to take an EmitContext instead of an
16040         ILGenerator, because things like FieldExpr need to be able to call
16041         their children expression to generate the instance code. 
16042
16043         (Expression::Error, Expression::Warning): Sugar functions for
16044         reporting errors.
16045
16046         (Expression::MemberLookup): Accept a TypeContainer instead of a
16047         Report as the first argument.
16048
16049         (Expression::ResolvePrimary): Killed.  I still want to improve
16050         this as currently the code is just not right.
16051
16052         (Expression::ResolveMemberAccess): Simplify, but it is still
16053         wrong. 
16054
16055         (Unary::Resolve): Catch errors in AddressOf operators.
16056
16057         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16058         index to a byte for the short-version, or the compiler will choose
16059         the wrong Emit call, which generates the wrong data.
16060
16061         (ParameterReference::Emit, ::Store): same.
16062
16063         (FieldExpr::AddressOf): Implement.
16064
16065         * typemanager.cs: TypeManager: made public variable instead of
16066         property.
16067
16068         * driver.cs: document --fatal.
16069
16070         * report.cs (ErrorMessage, WarningMessage): new names for the old
16071         Error and Warning classes.
16072
16073         * cs-parser.jay (member_access): Turn built-in access to types
16074         into a normal simplename
16075
16076 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16077
16078         * expression.cs (Invocation::BetterConversion): Fix to cope
16079         with q being null, since this was introducing a bug.
16080
16081         * expression.cs (ConvertImplicit): Do built-in conversions first.
16082
16083 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16084
16085         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16086
16087 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16088
16089         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16090         I had introduced long ago (what's new ?).
16091
16092         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16093         the work of all the checking. 
16094         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16095         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16096
16097         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16098         that is the right way. 
16099
16100         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16101         overloading resolution. Use everywhere instead of cutting and pasting code.
16102
16103         (Binary::ResolveOperator): Use MakeUnionSet.
16104
16105         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16106         we have to convert to bool types. Not complete yet.
16107
16108 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16109
16110         * typemanager.cs (TypeManager::CSharpName): support ushort.
16111
16112         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16113         to provide an expression that performsn an implicit constant int
16114         conversion (section 6.1.6).
16115         (Expression::ConvertImplicitRequired): Reworked to include
16116         implicit constant expression conversions.
16117
16118         (Expression::ConvertNumericExplicit): Finished.
16119
16120         (Invocation::Emit): If InstanceExpression is null, then it means
16121         that we perform a call on this.
16122
16123 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16124
16125         * expression.cs (Unary::Emit): Remove some dead code.
16126         (Probe): Implement Resolve and Emit for `is'.
16127         (Expression::ConvertImplicitRequired): Attempt to do constant
16128         expression conversions here.  Maybe should be moved to
16129         ConvertImplicit, but I am not sure.
16130         (Expression::ImplicitLongConstantConversionPossible,
16131         Expression::ImplicitIntConstantConversionPossible): New functions
16132         that tell whether is it possible to apply an implicit constant
16133         expression conversion.
16134
16135         (ConvertNumericExplicit): Started work on explicit numeric
16136         conversions.
16137
16138         * cs-parser.jay: Update operator constants.
16139
16140         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16141         (Parameters::GetSignature): Hook up VerifyArgs here.
16142         (Parameters::VerifyArgs): Verifies that no two arguments have the
16143         same name. 
16144
16145         * class.cs (Operator): Update the operator names to reflect the
16146         ones that the spec expects (as we are just stringizing the
16147         operator names).
16148
16149         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16150         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16151         previous usage did only work for our methods.
16152         (Expression::ConvertImplicit): Handle decimal implicit numeric
16153         conversions as well.
16154         (Expression::InternalTypeConstructor): Used to invoke constructors
16155         on internal types for default promotions.
16156
16157         (Unary::Emit): Implement special handling for the pre/post
16158         increment/decrement for overloaded operators, as they need to have
16159         the same semantics as the other operators.
16160
16161         (Binary::ResolveOperator): ditto.
16162         (Invocation::ConversionExists): ditto.
16163         (UserImplicitCast::Resolve): ditto.
16164
16165 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16166
16167         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16168         operator, return after emitting body. Regression tests pass again !
16169
16170         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16171         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16172         (Invocation::OverloadResolve): Ditto.
16173         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16174
16175         * everywhere : update calls to the above methods accordingly.
16176
16177 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16178
16179         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16180
16181         * expression.cs (ExpressionStatement): New base class used for
16182         expressions that can appear in statements, so that we can provide
16183         an alternate path to generate expression that do not leave a value
16184         on the stack.
16185
16186         (Expression::Emit, and all the derivatives): We no longer return
16187         whether a value is left on the stack or not.  Every expression
16188         after being emitted leaves a single value on the stack.
16189
16190         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16191         facilties of ExpressionStatement if possible.
16192
16193         * cs-parser.jay: Update statement_expression.
16194
16195 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16196
16197         * driver.cs: Change the wording of message
16198
16199 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16200
16201         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16202         the type of the expression to the return type of the method if
16203         we have an overloaded operator match ! The regression tests pass again !
16204         (Unary::ResolveOperator): Ditto.
16205
16206         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16207         to find "op_Implicit", not "implicit" ;-)
16208         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16209         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16210
16211         * everywhere : Correct calls to the above accordingly.
16212
16213         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16214         (ConvertImplicit): Do user-defined conversion if it exists.
16215
16216 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16217
16218         * assign.cs: track location.
16219         (Resolve): Use implicit conversions on assignment.
16220
16221         * literal.cs: Oops.  Not good, Emit of short access values should
16222         pass (Bytes) or the wrong argument will be selected.
16223
16224         * expression.cs (Unary::Emit): Emit code for -expr.
16225
16226         (Unary::ResolveOperator): Handle `Substract' for non-constants
16227         (substract from zero from the non-constants).
16228         Deal with Doubles as well. 
16229
16230         (Expression::ConvertImplicitRequired): New routine that reports an
16231         error if no implicit conversion exists. 
16232
16233         (Invocation::OverloadResolve): Store the converted implicit
16234         expressions if we make them
16235
16236 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16237
16238         * class.cs (ConstructorInitializer): Take a Location argument.
16239         (ConstructorBaseInitializer): Same here.
16240         (ConstructorThisInitializer): Same here.
16241
16242         * cs-parser.jay : Update all calls accordingly.
16243
16244         * expression.cs (Unary, Binary, New): Take location argument.
16245         Update accordingly everywhere.
16246
16247         * cs-parser.jay : Update all calls to the above to take a location
16248         argument.
16249
16250         * class.cs : Ditto.
16251
16252 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16253
16254         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16255         (Invocation::BetterConversion): Same here
16256         (Invocation::ConversionExists): Ditto.
16257
16258         (Invocation::ConversionExists): Implement.
16259
16260 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16261
16262         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16263         Also take an additional TypeContainer argument.
16264
16265         * All over : Pass in TypeContainer as argument to OverloadResolve.
16266
16267         * typemanager.cs (CSharpName): Update to check for the string type and return
16268         that too.
16269
16270         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16271         a given method.
16272
16273 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16274
16275         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16276         (Invocation::BetterFunction): Implement.
16277         (Invocation::BetterConversion): Implement.
16278         (Invocation::ConversionExists): Skeleton, no implementation yet.
16279
16280         Okay, things work fine !
16281
16282 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16283
16284         * typemanager.cs: declare and load enum_type, delegate_type and
16285         void_type. 
16286
16287         * expression.cs (Expression::Emit): Now emit returns a value that
16288         tells whether a value is left on the stack or not.  This strategy
16289         might be reveted tomorrow with a mechanism that would address
16290         multiple assignments.
16291         (Expression::report118): Utility routine to report mismatches on
16292         the ExprClass.
16293
16294         (Unary::Report23): Report impossible type/operator combination
16295         utility function.
16296
16297         (Unary::IsIncrementableNumber): Whether the type can be
16298         incremented or decremented with add.
16299         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16300         complemented. 
16301         (Unary::ResolveOperator): Implement ++, !, ~,
16302
16303         (Invocation::Emit): Deal with new Emit convetion.
16304
16305         * All Expression derivatives: Updated their Emit method to return
16306         whether they leave values on the stack or not.
16307
16308         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16309         stack for expressions that are statements. 
16310
16311 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16312
16313         * expression.cs (LValue): New interface.  Must be implemented by
16314         LValue objects.
16315         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16316         LValue interface.
16317
16318         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16319         interface for generating code, simplifies the code.
16320
16321 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16322
16323         * expression.cs (everywhere): Comment out return statements in ::Resolve
16324         methods to avoid the warnings.
16325
16326 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16327
16328         * driver.cs (parse): Report error 2001 if we can not open the
16329         source file.
16330
16331         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16332         not resolve it.
16333
16334         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16335         object. 
16336
16337         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16338         otherwise nested blocks end up with the same index.
16339
16340         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16341
16342         * expression.cs:  Instead of having FIXMEs in the Resolve
16343         functions, throw exceptions so it is obvious that we are facing a
16344         bug. 
16345
16346         * cs-parser.jay (invocation_expression): Pass Location information.
16347
16348         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16349         Use a basename for those routines because .NET does not like paths
16350         on them. 
16351
16352         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16353         already defined.
16354
16355 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16356
16357         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16358         are loading the correct data types (throws an exception if not).
16359         (TypeManager::InitCoreTypes): Use CoreLookupType
16360
16361         * expression.cs (Unary::ResolveOperator): return the child
16362         expression for expressions which are just +expr.
16363         (Unary::ResolveOperator): Return negative literals for -LITERAL
16364         expressions (otherwise they are Unary {Literal}).
16365         (Invocation::Badness): Take into account `Implicit constant
16366         expression conversions'.
16367
16368         * literal.cs (LongLiteral): Implement long literal class.
16369         (IntLiteral): export the `Value' of the intliteral. 
16370
16371 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16372
16373         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16374
16375         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16376         instead of 'Operator'
16377
16378         * expression.cs (Binary::ResolveOperator): Update accordingly.
16379         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16380         and 'Minus'
16381
16382         * cs-parser.jay (unary_expression): Update to use the new names.
16383
16384         * gen-treedump.cs (GetUnary): Same here.
16385
16386         * expression.cs (Unary::Resolve): Implement.
16387         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16388         operators are found instead of making noise ;-)
16389         (Unary::ResolveOperator): New method to do precisely the same thing which
16390         Binary::ResolveOperator does for Binary expressions.
16391         (Unary.method, .Arguments): Add.
16392         (Unary::OperName): Implement.   
16393         (Unary::ForceConversion): Copy and Paste !
16394
16395         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16396         a unary operator.
16397
16398         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16399         for the inbuilt operators. Only overloading works for now ;-)
16400
16401 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16402
16403         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16404         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16405
16406         * expression.cs (This::Emit): Implement. 
16407         (This::Resolve): Implement.
16408         (TypeOf:Resolve): Implement.
16409         (Expression::ResolveSimpleName): Add an implicit this to instance
16410         field references. 
16411         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16412         Bind instance variable to Field expressions.
16413         (FieldExpr::Instance): New field used to track the expression that
16414         represents the object instance.
16415         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16416         binding 
16417         (FieldExpr::Emit): Implement.
16418
16419         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16420         the last instruction contains a return opcode to avoid generating
16421         the last `ret' instruction (this generates correct code, and it is
16422         nice to pass the peverify output).
16423
16424         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16425         initializer for static and instance variables.
16426         (Constructor::Emit): Allow initializer to be null in the case of
16427         static constructors.  Only emit initializer for instance
16428         constructors. 
16429
16430         (TypeContainer::FindMembers): Return a null array if there are no
16431         matches.
16432
16433         Also fix the code for the MemberTypes.Method branch, as it was not
16434         scanning that for operators (or tried to access null variables before).
16435
16436         * assign.cs (Assign::Emit): Handle instance and static fields. 
16437
16438         * TODO: Updated.
16439
16440         * driver.cs: Stop compilation if there are parse errors.
16441
16442         * cs-parser.jay (constructor_declaration): Provide default base
16443         initializer for non-static constructors.
16444         (constructor_declarator): Do not provide a default base
16445         initializers if none was specified.
16446         Catch the fact that constructors should not have parameters.
16447
16448         * class.cs: Do not emit parent class initializers for static
16449         constructors, that should be flagged as an error.
16450
16451 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16452
16453         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16454         Move back code into TypeContainer::Populate.
16455
16456 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16457
16458         * class.cs (TypeContainer::AddConstructor): Fix the check to
16459         compare against Name, not Basename. 
16460         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16461
16462         * cs-parser.jay : Update accordingly.
16463
16464         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16465         for methods, don't forget to look into the operators too.
16466         (RegisterMethodBuilder): Helper method to take care of this for
16467         methods, constructors and operators.
16468         (Operator::Define): Completely revamp.
16469         (Operator.OperatorMethod, MethodName): New fields.
16470         (TypeContainer::Populate): Move the registering of builders into
16471         RegisterMethodBuilder.
16472         (Operator::Emit): Re-write.
16473
16474         * expression.cs (Binary::Emit): Comment out code path to emit method
16475         invocation stuff for the case when we have a user defined operator. I am
16476         just not able to get it right !
16477
16478 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16479
16480         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16481         argument. 
16482
16483         (Expression::MemberLookup): Provide a version that allows to
16484         specify the MemberTypes and BindingFlags. 
16485
16486         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16487         so it was not fetching variable information from outer blocks.
16488
16489         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16490         Beforefieldinit as it was buggy.
16491
16492         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16493         that Ravi put here.  
16494
16495         * class.cs (Constructor::Emit): Only emit if block is not null.
16496         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16497         deal with this by semantically definining it as if the user had
16498         done it.
16499
16500         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16501         constructors as we now "emit" them at a higher level.
16502
16503         (TypeContainer::DefineDefaultConstructor): Used to define the
16504         default constructors if none was provided.
16505
16506         (ConstructorInitializer): Add methods Resolve and Emit. 
16507
16508         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16509
16510 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16511
16512         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16513         the default constructor builder with our hashtable for methodbuilders
16514         to methodcores.
16515
16516         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16517         and argument_count is 0 in which case we have a match.
16518         (Binary::ResolveOperator): More null checking and miscellaneous coding
16519         style cleanup.
16520
16521 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16522
16523         * rootcontext.cs (IsNameSpace): Compare against null.
16524
16525         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16526
16527         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16528         and Unary::Operator.
16529
16530         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16531         accordingly.
16532
16533         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16534         we have overloaded operators.
16535         (Binary::ResolveOperator): Implement the part which does the operator overload
16536         resolution.
16537
16538         * class.cs (Operator::Emit): Implement.
16539         (TypeContainer::Emit): Emit the operators we have too.
16540
16541         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16542         the case when we have a user-defined operator.
16543
16544 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16545
16546         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16547
16548 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16549
16550         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16551         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16552         (Constructor::Emit): Implement.
16553         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16554         if we have no work to do. 
16555         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16556         Emit method.
16557
16558         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16559         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16560
16561         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16562         of parent.parent.
16563
16564 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16565
16566         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16567         in the source.
16568         (Tree::RecordNamespace): Method to do what the name says ;-)
16569         (Tree::Namespaces): Property to get at the namespaces hashtable.
16570
16571         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16572         keep track.
16573
16574         * rootcontext.cs (IsNamespace): Fixed it :-)
16575
16576 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16577
16578         * class.cs (TypeContainer::FindMembers): Add support for
16579         constructors. 
16580         (MethodCore): New class that encapsulates both the shared aspects
16581         of a Constructor and a Method.  
16582         (Method, Constructor): Factored pieces into MethodCore.
16583
16584         * driver.cs: Added --fatal which makes errors throw exceptions.
16585         Load System assembly as well as part of the standard library.
16586
16587         * report.cs: Allow throwing exceptions on errors for debugging.
16588
16589         * modifiers.cs: Do not use `parent', instead use the real type
16590         container to evaluate permission settings.
16591
16592         * class.cs: Put Ravi's patch back in.  He is right, and we will
16593         have to cope with the
16594
16595 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16596
16597         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16598         FamORAssem, not FamANDAssem.
16599
16600 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16601
16602         * driver.cs: Added --parse option that only parses its input files
16603         and terminates.
16604
16605         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16606         incorrect.  IsTopLevel is not used to tell whether an object is
16607         root_types or not (that can be achieved by testing this ==
16608         root_types).  But to see if this is a top-level *class* (not
16609         necessarly our "toplevel" container). 
16610
16611 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16612
16613         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16614         parent instead of a direct call to GetType.
16615
16616 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16617
16618         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16619         Modifiers.TypeAttr. This should just be a call to that method.
16620
16621         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16622         object so that we can determine if we are top-level or not.
16623
16624         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16625         TypeContainer too.
16626
16627         * enum.cs (Enum::Define): Ditto.
16628
16629         * modifiers.cs (FieldAttr): Re-write.
16630
16631         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16632         (TypeContainer::HaveStaticConstructor): New property to provide access
16633         to precisely that info.
16634
16635         * modifiers.cs (MethodAttr): Re-write.
16636         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16637
16638         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16639         of top-level types as claimed.
16640
16641 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16642
16643         * expression.cs (MemberLookup): Fruitless attempt to lookup
16644         constructors.  Maybe I need to emit default constructors?  That
16645         might be it (currently .NET emits this for me automatically).
16646         (Invocation::OverloadResolve): Cope with Arguments == null.
16647         (Invocation::EmitArguments): new function, shared by the new
16648         constructor and us.
16649         (Invocation::Emit): Handle static and instance methods.  Emit
16650         proper call instruction for virtual or non-virtual invocations.
16651         (New::Emit): Implement.
16652         (New::Resolve): Implement.
16653         (MemberAccess:Resolve): Implement.
16654         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16655         to track instances.
16656         (FieldExpr::Resolve): Set type.
16657
16658         * support.cs: Handle empty arguments.
16659                 
16660         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16661         SimpleLookup): Auxiliary routines to help parse a qualifier
16662         identifier.  
16663
16664         Update qualifier_identifier rule.
16665
16666         * codegen.cs: Removed debugging messages.
16667
16668         * class.cs: Make this a global thing, this acts just as a "key" to
16669         objects that we might have around.
16670
16671         (Populate): Only initialize method_builders_to_methods once.
16672
16673         * expression.cs (PropertyExpr): Initialize type from the
16674         PropertyType. 
16675
16676         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16677         Resolve pattern.  Attempt to implicitly convert value to boolean.
16678         Emit code.
16679
16680         * expression.cs: Set the type for the int32/int32 argument case.
16681         (Binary::ResolveOperator): Set the return type to boolean for
16682         comparission operators
16683
16684         * typemanager.cs: Remove debugging print code.
16685
16686         (Invocation::Resolve): resolve type.
16687
16688         * class.cs: Allocate a MemberInfo of the correct size, as the code
16689         elsewhere depends on the test to reflect the correct contents.
16690
16691         (Method::) Keep track of parameters, due to System.Reflection holes
16692
16693         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16694         mapping here.
16695
16696         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16697         of the exact size and return that.
16698
16699         (Class::LookupMethodByBuilder): New function that maps
16700         MethodBuilders to its methods.  Required to locate the information
16701         on methods because System.Reflection bit us again.
16702
16703         * support.cs: New file, contains an interface ParameterData and
16704         two implementations: ReflectionParameters and InternalParameters
16705         used to access Parameter information.  We will need to grow this
16706         as required.
16707
16708         * expression.cs (Invocation::GetParameterData): implement a cache
16709         and a wrapper around the ParameterData creation for methods. 
16710         (Invocation::OverloadResolve): Use new code.
16711
16712 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16713
16714         * class.cs (TypeContainer::EmitField): Remove and move into 
16715         (Field::Define): here and modify accordingly.
16716         (Field.FieldBuilder): New member.
16717         (TypeContainer::Populate): Update accordingly.
16718         (TypeContainer::FindMembers): Implement.
16719
16720 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16721
16722         * statement.cs: (VariableInfo::VariableType): New field to be
16723         initialized with the full type once it is resolved. 
16724
16725 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16726
16727         * parameter.cs (GetParameterInfo): Use a type cache to compute
16728         things only once, and to reuse this information
16729
16730         * expression.cs (LocalVariableReference::Emit): Implement.
16731         (OpcodeCast::Emit): fix.
16732
16733         (ParameterReference::Resolve): Implement.
16734         (ParameterReference::Emit): Implement.
16735
16736         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16737         that are expressions need to stay as Expressions.
16738
16739         * typemanager.cs (CSharpName): Returns the C# name of a type if
16740         possible. 
16741
16742         * expression.cs (Expression::ConvertImplicit): New function that
16743         implements implicit type conversions.
16744
16745         (Expression::ImplicitReferenceConversion): Implements implicit
16746         reference conversions.
16747
16748         (EmptyCast): New type for transparent casts.
16749
16750         (OpcodeCast): New type for casts of types that are performed with
16751         a sequence of bytecodes.
16752
16753         (BoxedCast): New type used for casting value types into reference
16754         types.  Emits a box opcode.
16755
16756         (Binary::DoNumericPromotions): Implements numeric promotions of
16757         and computation of the Binary::Type.
16758
16759         (Binary::EmitBranchable): Optimization.
16760
16761         (Binary::Emit): Implement code emission for expressions.
16762
16763         * typemanager.cs (TypeManager): Added two new core types: sbyte
16764         and byte.
16765
16766 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16767
16768         * class.cs (TypeContainer::FindMembers): Method which does exactly
16769         what Type.FindMembers does, only we don't have to use reflection. No
16770         implementation yet.
16771
16772         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16773         typecontainer objects as we need to get at them.
16774         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16775
16776         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16777         typecontainer object.
16778
16779         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16780         of just a Report object.
16781
16782 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16783
16784         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16785         "remove_"
16786         (TypeContainer::Populate): Now define the delegates of the type too.
16787         (TypeContainer.Delegates): Property to access the list of delegates defined
16788         in the type.
16789
16790         * delegates.cs (Delegate::Define): Implement partially.
16791
16792         * modifiers.cs (TypeAttr): Handle more flags.
16793
16794 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16795
16796         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16797         and not <=
16798         (Operator::Define): Re-write logic to get types by using the LookupType method
16799         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16800         (Indexer::Define): Ditto.
16801         (Event::Define): Ditto.
16802         (Property::Define): Ditto.
16803
16804 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16805
16806         * class.cs (TypeContainer::Populate): Now define operators too. 
16807         (TypeContainer.Operators): New property to access the list of operators
16808         in a type.
16809         (Operator.OperatorMethodBuilder): New member to hold the method builder
16810         for the operator we are defining.
16811         (Operator::Define): Implement.
16812
16813 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16814
16815         * class.cs (Event::Define): Make the prefixes of the accessor methods
16816         addOn_ and removeOn_ 
16817
16818         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16819         of the location being passed in too. Ideally, this should go later since all
16820         error reporting should be done through the Report object.
16821
16822         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16823         (Populate): Iterate thru the indexers we have and define them too.
16824         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16825         for the get and set accessors.
16826         (Indexer::Define): Implement.
16827
16828 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16829
16830         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16831         my previous implementation, did not work.
16832
16833         * typemanager.cs: Add a couple of missing types (the longs).
16834
16835         * literal.cs: Use TypeManager.bool_type instead of getting it.
16836
16837         * expression.cs (EventExpr): New kind of expressions.
16838         (Expressio::ExprClassFromMemberInfo): finish
16839
16840 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
16841
16842         * assign.cs: Emit stores to static fields differently.
16843
16844 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16845
16846         * Merge in changes and adjust code to tackle conflicts. Backed out my
16847         code in Assign::Resolve ;-) 
16848
16849 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16850
16851         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
16852         instead Report.Error and also pass in the location.
16853         (CSharpParser::Lexer): New readonly property to return the reference
16854         to the Tokenizer object.
16855         (declare_local_variables): Use Report.Error with location instead of plain 
16856         old error.
16857         (CheckDef): Ditto.
16858
16859         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16860         (Operator.CheckBinaryOperator): Ditto.
16861
16862         * cs-parser.jay (operator_declarator): Update accordingly.
16863
16864         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16865         (CheckBinaryOperator): Same here.
16866
16867         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16868         on the name without any prefixes of namespace names etc. This is because we
16869         already might have something already fully qualified like 
16870         'System.Console.WriteLine'
16871
16872         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16873
16874 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16875
16876         * cs-tokenizer.cs (location): Return a string which also contains
16877         the file name.
16878
16879         * expression.cs (ElementAccess): New class for expressions of the
16880         type 'element access.'
16881         (BaseAccess): New class for expressions of the type 'base access.'
16882         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16883         respectively.
16884
16885         * cs-parser.jay (element_access): Implement action.
16886         (base_access): Implement actions.
16887         (checked_expression, unchecked_expression): Implement.
16888
16889         * cs-parser.jay (local_variable_type): Correct and implement.
16890         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16891
16892         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16893
16894         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16895         name and the specifiers.
16896
16897         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16898
16899         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16900         making them all public ;-)
16901
16902         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16903         class anyways.
16904
16905 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16906
16907         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16908         PropertyExprs.
16909         (FieldExpr, PropertyExprs): New resolved expressions.
16910         (SimpleName::MemberStaticCheck): Perform static checks for access
16911         to non-static fields on static methods. Maybe this should be
16912         generalized for MemberAccesses. 
16913         (SimpleName::ResolveSimpleName): More work on simple name
16914         resolution. 
16915
16916         * cs-parser.jay (primary_expression/qualified_identifier): track
16917         the parameter index.
16918
16919         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16920         (EmitContext::EmitBoolExpression): Chain to expression generation
16921         instead of temporary hack.
16922         (::EmitStatementExpression): Put generic expression code generation.
16923
16924         * assign.cs (Assign::Emit): Implement variable assignments to
16925         local variables, parameters and fields.
16926
16927 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16928
16929         * statement.cs (Block::GetVariableInfo): New method, returns the
16930         VariableInfo for a variable name in a block.
16931         (Block::GetVariableType): Implement in terms of GetVariableInfo
16932
16933         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16934         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16935
16936 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16937
16938         * cs-parser.jay (operator_declaration): Continue on my quest : update
16939         to take attributes argument.
16940         (event_declaration): Ditto.
16941         (enum_declaration): Ditto.
16942         (indexer_declaration): Ditto.
16943
16944         * class.cs (Operator::Operator): Update constructor accordingly.
16945         (Event::Event): Ditto.
16946
16947         * delegate.cs (Delegate::Delegate): Same here.
16948
16949         * enum.cs (Enum::Enum): Same here.
16950
16951 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16952
16953         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16954
16955         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16956
16957         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16958         being passed around as an arraylist.
16959         (Attributes::AddAttribute): Method to add attribute sections.
16960
16961         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16962         (struct_declaration): Update accordingly.
16963         (constant_declaration): Update.
16964         (field_declaration): Update.
16965         (method_header): Update.
16966         (fixed_parameter): Update.
16967         (parameter_array): Ditto.
16968         (property_declaration): Ditto.
16969         (destructor_declaration): Ditto.
16970
16971         * class.cs (Struct::Struct): Update constructors accordingly.
16972         (Class::Class): Ditto.
16973         (Field::Field): Ditto.
16974         (Method::Method): Ditto.
16975         (Property::Property): Ditto.
16976         (TypeContainer::OptAttribute): update property's return type.
16977
16978         * interface.cs (Interface.opt_attributes): New member.
16979         (Interface::Interface): Update to take the extra Attributes argument.
16980
16981         * parameter.cs (Parameter::Parameter): Ditto.
16982
16983         * constant.cs (Constant::Constant): Ditto.
16984
16985         * interface.cs (InterfaceMemberBase): New OptAttributes field.
16986         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
16987         the attributes as a parameter.
16988         (InterfaceProperty): Update constructor call.
16989         (InterfaceEvent): Ditto.
16990         (InterfaceMethod): Ditto.
16991         (InterfaceIndexer): Ditto.
16992
16993         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
16994         pass the attributes too.
16995         (interface_event_declaration): Ditto.
16996         (interface_property_declaration): Ditto.
16997         (interface_method_declaration): Ditto.
16998         (interface_declaration): Ditto.
16999
17000 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17001
17002         * class.cs (Method::Define): Track the "static Main" definition to
17003         create an entry point. 
17004
17005         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17006         EntryPoint if we find it. 
17007
17008         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17009         (EmitContext::ig): Make this variable public.
17010
17011         * driver.cs: Make the default output file be the first file name
17012         with the .exe extension.  
17013
17014         Detect empty compilations
17015
17016         Handle various kinds of output targets.  Handle --target and
17017         rename -t to --dumper.
17018
17019         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17020         methods inherited from Expression return now an Expression.  This
17021         will is used during the tree rewriting as we resolve them during
17022         semantic analysis.
17023
17024         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17025         the spec.  Missing entirely is the information about
17026         accessability of elements of it.
17027
17028         (Expression::ExprClassFromMemberInfo): New constructor for
17029         Expressions that creates a fully initialized Expression based on
17030         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17031         a Type.
17032
17033         (Invocation::Resolve): Begin implementing resolution of invocations.
17034
17035         * literal.cs (StringLiteral):  Implement Emit.
17036
17037 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17038
17039         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17040         member.
17041
17042 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17043
17044         * cs-parser.jay (attribute_arguments): Implement actions.
17045         (attribute): Fix bug in production. Implement action.
17046         (attribute_list): Implement.
17047         (attribute_target): Implement.
17048         (attribute_target_specifier, opt_target_specifier): Implement
17049         (CheckAttributeTarget): New method to check if the attribute target
17050         is valid.
17051         (attribute_section): Implement.
17052         (opt_attributes): Implement.
17053
17054         * attribute.cs : New file to handle attributes.
17055         (Attribute): Class to hold attribute info.
17056
17057         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17058         (attribute_section): Modify production to use 2 different rules to 
17059         achieve the same thing. 1 s/r conflict down !
17060         Clean out commented, useless, non-reducing dimension_separator rules.
17061
17062         * class.cs (TypeContainer.attributes): New member to hold list
17063         of attributes for a type.
17064         (Struct::Struct): Modify to take one more argument, the attribute list.
17065         (Class::Class): Ditto.
17066         (Field::Field): Ditto.
17067         (Method::Method): Ditto.
17068         (Property::Property): Ditto.
17069
17070         * cs-parser.jay (struct_declaration): Update constructor call to
17071         pass in the attributes too.
17072         (class_declaration): Ditto.
17073         (constant_declaration): Ditto.
17074         (field_declaration): Ditto.
17075         (method_header): Ditto.
17076         (fixed_parameter): Ditto.
17077         (parameter_array): Ditto.
17078         (property_declaration): Ditto.
17079
17080         * constant.cs (Constant::Constant): Update constructor similarly.
17081         Use System.Collections.
17082
17083         * parameter.cs (Parameter::Parameter): Update as above.
17084
17085 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17086
17087         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17088         (TypeContainer.delegates): New member to hold list of delegates.
17089
17090         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17091         this time as I seem to be on crack ;-)
17092
17093 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17094
17095         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17096         tell whether an identifier represents a namespace.
17097
17098         * expression.cs (NamespaceExpr): A namespace expression, used only
17099         temporarly during expression resolution.
17100         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17101         utility functions to resolve names on expressions.
17102
17103 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17104
17105         * codegen.cs: Add hook for StatementExpressions. 
17106
17107         * class.cs: Fix inverted test for static flag in methods.
17108
17109 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17110
17111         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17112         to make it coincide with MS' number.
17113         (Operator::CheckBinaryOperator): Ditto.
17114
17115         * ../errors/errors.txt : Remove error numbers added earlier.
17116
17117         * ../errors/cs1019.cs : Test case for error # 1019
17118
17119         * ../errros/cs1020.cs : Test case for error # 1020
17120
17121         * cs-parser.jay : Clean out commented cruft.
17122         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17123         used anywhere - non-reducing rule.
17124         (namespace_declarations): Non-reducing rule - comment out.
17125
17126         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17127         with TypeContainer::AddEnum.
17128
17129         * delegate.cs : New file for delegate handling classes.
17130         (Delegate): Class for declaring delegates.
17131
17132         * makefile : Update.
17133
17134         * cs-parser.jay (delegate_declaration): Implement.
17135
17136 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17137
17138         * class.cs (Event::Define): Implement.
17139         (Event.EventBuilder): New member.
17140
17141         * class.cs (TypeContainer::Populate): Update to define all enums and events
17142         we have.
17143         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17144         readonly fields for all these cases ?
17145
17146 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17147
17148         * class.cs (Property): Revamp to use the convention of making fields readonly.
17149         Accordingly modify code elsewhere.
17150
17151         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17152         the Define method of the Property class.
17153
17154         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17155         trivial bug.
17156         (TypeContainer::Populate): Update to define all the properties we have. Also
17157         define all enumerations.
17158
17159         * enum.cs (Define): Implement.
17160
17161 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17162
17163         * cs-parser.jay (overloadable_operator): The semantic value is an
17164         enum of the Operator class.
17165         (operator_declarator): Implement actions.
17166         (operator_declaration): Implement.
17167
17168         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17169         validity of definitions.
17170         (Operator::CheckBinaryOperator): Static method to check for binary operators
17171         (TypeContainer::AddOperator): New method to add an operator to a type.
17172
17173         * cs-parser.jay (indexer_declaration): Added line to actually call the
17174         AddIndexer method so it gets added ;-)
17175
17176         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17177         already taken care of by the MS compiler ?  
17178
17179 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17180
17181         * class.cs (Operator): New class for operator declarations.
17182         (Operator::OpType): Enum for the various operators.
17183
17184 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17185
17186         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17187         ostensibly handle this in semantic analysis.
17188
17189         * cs-parser.jay (general_catch_clause): Comment out
17190         (specific_catch_clauses, specific_catch_clause): Ditto.
17191         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17192         (catch_args, opt_catch_args): New productions.
17193         (catch_clause): Rewrite to use the new productions above
17194         (catch_clauses): Modify accordingly.
17195         (opt_catch_clauses): New production to use in try_statement
17196         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17197         and re-write the code in the actions to extract the specific and
17198         general catch clauses by being a little smart ;-)
17199
17200         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17201         Hooray, try and catch statements parse fine !
17202
17203 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17204
17205         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17206         string from the hashtable of variables.
17207
17208         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17209         I end up making that mistake ;-)
17210         (catch_clauses): Fixed gross error which made Key and Value of the 
17211         DictionaryEntry the same : $1 !!
17212
17213 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17214
17215         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17216
17217         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17218         when the add and remove accessors are specified. 
17219
17220 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17221
17222         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17223         information about indexer_declarator.
17224         (indexer_declarator): Implement actions.
17225         (parsing_indexer): New local boolean used to keep track of whether
17226         we are parsing indexers or properties. This is necessary because 
17227         implicit_parameters come into picture even for the get accessor in the 
17228         case of an indexer.
17229         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17230
17231         * class.cs (Indexer): New class for indexer declarations.
17232         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17233         (TypeContainer::indexers): New member to hold list of indexers for the
17234         type.
17235
17236 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17237
17238         * cs-parser.jay (add_accessor_declaration): Implement action.
17239         (remove_accessor_declaration): Implement action.
17240         (event_accessors_declaration): Implement
17241         (variable_declarators): swap statements for first rule - trivial.
17242
17243         * class.cs (Event): New class to hold information about event
17244         declarations.
17245         (TypeContainer::AddEvent): New method to add an event to a type
17246         (TypeContainer::events): New member to hold list of events.
17247
17248         * cs-parser.jay (event_declaration): Implement actions.
17249
17250 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17251
17252         * cs-parser.jay (dim_separators): Implement. Make it a string
17253         concatenating all the commas together, just as they appear.
17254         (opt_dim_separators): Modify accordingly
17255         (rank_specifiers): Update accordingly. Basically do the same
17256         thing - instead, collect the brackets here.
17257         (opt_rank_sepcifiers): Modify accordingly.
17258         (array_type): Modify to actually return the complete type string
17259         instead of ignoring the rank_specifiers.
17260         (expression_list): Implement to collect the expressions
17261         (variable_initializer): Implement. We make it a list of expressions
17262         essentially so that we can handle the array_initializer case neatly too.
17263         (variable_initializer_list): Implement.
17264         (array_initializer): Make it a list of variable_initializers
17265         (opt_array_initializer): Modify accordingly.
17266
17267         * expression.cs (New::NType): Add enumeration to help us
17268         keep track of whether we have an object/delegate creation
17269         or an array creation.
17270         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17271         members to hold data about array creation.
17272         (New:New): Modify to update NewType
17273         (New:New): New Overloaded contructor for the array creation
17274         case.
17275
17276         * cs-parser.jay (array_creation_expression): Implement to call
17277         the overloaded New constructor.
17278
17279 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17280
17281         * class.cs (TypeContainer::Constructors): Return member
17282         constructors instead of returning null.
17283
17284 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17285
17286         * typemanager.cs (InitCoreTypes): Initialize the various core
17287         types after we have populated the type manager with the user
17288         defined types (this distinction will be important later while
17289         compiling corlib.dll)
17290
17291         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17292         on Expression Classification.  Now all expressions have a method
17293         `Resolve' and a method `Emit'.
17294
17295         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17296         generation from working.     Also add some temporary debugging
17297         code. 
17298
17299 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17300
17301         * codegen.cs: Lots of code generation pieces.  This is only the
17302         beginning, will continue tomorrow with more touches of polish.  We
17303         handle the fundamentals of if, while, do, for, return.  Others are
17304         trickier and I need to start working on invocations soon.
17305
17306         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17307         s.InitStatement. 
17308
17309         * codegen.cs (EmitContext): New struct, used during code
17310         emission to keep a context.   Most of the code generation will be
17311         here. 
17312
17313         * cs-parser.jay: Add embedded blocks to the list of statements of
17314         this block.  So code generation proceeds in a top down fashion.
17315
17316 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17317
17318         * statement.cs: Add support for multiple child blocks.
17319
17320 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17321
17322         * codegen.cs (EmitCode): New function, will emit the code for a
17323         Block of code given a TypeContainer and its ILGenerator. 
17324
17325         * statement.cs (Block): Standard public readonly optimization.
17326         (Block::Block constructors): Link children. 
17327         (Block::Child): Child Linker.
17328         (Block::EmitVariables): Emits IL variable declarations.
17329
17330         * class.cs: Drop support for MethodGroups here, delay until
17331         Semantic Analysis.
17332         (Method::): Applied the same simplification that I did before, and
17333         move from Properties to public readonly fields.
17334         (Method::ParameterTypes): Returns the parameter types for the
17335         function, and implements a cache that will be useful later when I
17336         do error checking and the semantic analysis on the methods is
17337         performed.
17338         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17339         and made a method, optional argument tells whether this is a class
17340         or a structure to apply the `has-this' bit.
17341         (Method::GetCallingConvention): Implement, returns the calling
17342         convention. 
17343         (Method::Define): Defines the type, a second pass is performed
17344         later to populate the methods.
17345
17346         (Constructor::ParameterTypes): implement a cache similar to the
17347         one on Method::ParameterTypes, useful later when we do semantic
17348         analysis. 
17349
17350         (TypeContainer::EmitMethod):  New method.  Emits methods.
17351
17352         * expression.cs: Removed MethodGroup class from here.
17353
17354         * parameter.cs (Parameters::GetCallingConvention): new method.
17355
17356 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17357
17358         * class.cs (TypeContainer::Populate): Drop RootContext from the
17359         argument. 
17360
17361         (Constructor::CallingConvention): Returns the calling convention.
17362         (Constructor::ParameterTypes): Returns the constructor parameter
17363         types. 
17364
17365         (TypeContainer::AddConstructor): Keep track of default constructor
17366         and the default static constructor.
17367
17368         (Constructor::) Another class that starts using `public readonly'
17369         instead of properties. 
17370
17371         (Constructor::IsDefault): Whether this is a default constructor. 
17372
17373         (Field::) use readonly public fields instead of properties also.
17374
17375         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17376         track of static constructors;  If none is used, turn on
17377         BeforeFieldInit in the TypeAttributes. 
17378
17379         * cs-parser.jay (opt_argument_list): now the return can be null
17380         for the cases where there are no arguments. 
17381
17382         (constructor_declarator): If there is no implicit `base' or
17383         `this', then invoke the default parent constructor. 
17384
17385         * modifiers.cs (MethodAttr): New static function maps a set of
17386         modifiers flags into a MethodAttributes enum
17387         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17388         MethodAttr, TypeAttr to represent the various mappings where the
17389         modifiers are used.
17390         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17391
17392 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17393
17394         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17395         method arguments.
17396
17397         * interface.cs (PopulateIndexer): Implemented the code generator
17398         for interface indexers.
17399
17400 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17401
17402         * interface.cs (InterfaceMemberBase): Now we track the new status
17403         here.  
17404
17405         (PopulateProperty): Implement property population.  Woohoo!  Got
17406         Methods and Properties going today. 
17407
17408         Removed all the properties for interfaces, and replaced them with
17409         `public readonly' fields. 
17410
17411 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17412
17413         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17414         initialize their hashtables/arraylists only when they are needed
17415         instead of doing this always.
17416
17417         * parameter.cs: Handle refs and out parameters.
17418
17419         * cs-parser.jay: Use an ArrayList to construct the arguments
17420         instead of the ParameterCollection, and then cast that to a
17421         Parameter[] array.
17422
17423         * parameter.cs: Drop the use of ParameterCollection and use
17424         instead arrays of Parameters.
17425
17426         (GetParameterInfo): Use the Type, not the Name when resolving
17427         types. 
17428
17429 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17430
17431         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17432         and instead use public readonly fields.
17433
17434         * class.cs: Put back walking code for type containers.
17435
17436 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17437
17438         * class.cs (MakeConstant): Code to define constants.
17439
17440         * rootcontext.cs (LookupType): New function.  Used to locate types 
17441
17442
17443 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17444
17445         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17446         this System.Reflection code is.  Kudos to Microsoft
17447
17448         * typemanager.cs: Implement a type cache and avoid loading all
17449         types at boot time.  Wrap in LookupType the internals.  This made
17450         the compiler so much faster.  Wow.  I rule!
17451
17452         * driver.cs: Make sure we always load mscorlib first (for
17453         debugging purposes, nothing really important).
17454
17455         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17456         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17457
17458         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17459         on namespaces that have been imported using the `using' keyword.
17460
17461         * class.cs (TypeContainer::TypeAttr): Virtualize.
17462         (Class::TypeAttr): Return attributes suitable for this bad boy.
17463         (Struct::TypeAttr): ditto.
17464         Handle nested classes.
17465         (TypeContainer::) Remove all the type visiting code, it is now
17466         replaced with the rootcontext.cs code
17467
17468         * rootcontext.cs (GetClassBases): Added support for structs. 
17469
17470 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17471
17472         * interface.cs, statement.cs, class.cs, parameter.cs,
17473         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17474         Drop use of TypeRefs, and use strings instead.
17475
17476 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17477
17478         * rootcontext.cs: 
17479
17480         * class.cs (Struct::Struct): set the SEALED flags after
17481         checking the modifiers.
17482         (TypeContainer::TypeAttr): new property, returns the
17483         TypeAttributes for a class.  
17484
17485         * cs-parser.jay (type_list): Oops, list production was creating a
17486         new list of base types.
17487
17488         * rootcontext.cs (StdLib): New property.
17489         (GetInterfaceTypeByName): returns an interface by type name, and
17490         encapsulates error handling here.
17491         (GetInterfaces): simplified.
17492         (ResolveTree): Encapsulated all the tree resolution here.
17493         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17494         types. 
17495
17496         * driver.cs: Add support for --nostdlib, to avoid loading the
17497         default assemblies.
17498         (Main): Do not put tree resolution here. 
17499
17500         * rootcontext.cs: Beginning of the class resolution.
17501
17502 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17503
17504         * rootcontext.cs: Provide better error reporting. 
17505
17506         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17507
17508         * rootcontext.cs (CreateInterface): Handle the case where there
17509         are no parent interfaces.
17510
17511         (CloseTypes): Routine to flush types at the end.
17512         (CreateInterface): Track types.
17513         (GetInterfaces): Returns an array of Types from the list of
17514         defined interfaces.
17515
17516         * typemanager.c (AddUserType): Mechanism to track user types (puts
17517         the type on the global type hash, and allows us to close it at the
17518         end). 
17519
17520 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17521
17522         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17523         RecordInterface instead.
17524
17525         * cs-parser.jay: Updated to reflect changes above.
17526
17527         * decl.cs (Definition): Keep track of the TypeBuilder type that
17528         represents this type here.  Not sure we will use it in the long
17529         run, but wont hurt for now.
17530
17531         * driver.cs: Smaller changes to accomodate the new code.
17532
17533         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17534         when done. 
17535
17536         * rootcontext.cs (CreateInterface):  New method, used to create
17537         the System.TypeBuilder type for interfaces.
17538         (ResolveInterfaces): new entry point to resolve the interface
17539         hierarchy. 
17540         (CodeGen): Property, used to keep track of the code generator.
17541
17542 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17543
17544         * cs-parser.jay: Add a second production for delegate_declaration
17545         with `VOID'.
17546
17547         (enum_body): Put an opt_comma here instead of putting it on
17548         enum_body or enum_member_declarations so we can handle trailing
17549         commas on enumeration members.  Gets rid of a shift/reduce.
17550
17551         (type_list): Need a COMMA in the middle.
17552
17553         (indexer_declaration): Tell tokenizer to recognize get/set
17554
17555         * Remove old targets.
17556
17557         * Re-add the parser target.
17558
17559 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17560
17561         * cs-parser.jay: Add precendence rules for a number of operators
17562         ot reduce the number of shift/reduce conflicts in the grammar.
17563
17564 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17565
17566         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17567         and put it here.
17568
17569         Get rid of old crufty code.
17570
17571         * rootcontext.cs: Use this to keep track of the parsed
17572         representation and the defined types available to the program. 
17573
17574         * gen-treedump.cs: adjust for new convention.
17575
17576         * type.cs: Split out the type manager, and the assembly builder
17577         from here. 
17578
17579         * typemanager.cs: the type manager will live here now.
17580
17581         * cil-codegen.cs: And the code generator here. 
17582
17583 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17584
17585         * makefile: Fixed up for easy making.
17586
17587 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17588
17589         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17590         the 
17591
17592         (unary_expression): Expand pre_increment_expression and
17593         post_decrement_expression to reduce a shift/reduce.
17594
17595 2001-07-11  Simon Cozens
17596
17597         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17598
17599         Improve allow_keyword_as_indent name.
17600
17601 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17602
17603         * Adjustments for Beta2. 
17604
17605 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17606
17607         * decl.cs: Added `Define' abstract method.
17608         (InTransit): new property, used to catch recursive definitions. 
17609
17610         * interface.cs: Implement `Define'. 
17611
17612         * modifiers.cs: Map Modifiers.constants to
17613         System.Reflection.TypeAttribute flags.
17614
17615         * class.cs: Keep track of types and user-defined types.
17616         (BuilderInit): New method for creating an assembly
17617         (ResolveType): New function to launch the resolution process, only
17618         used by interfaces for now.
17619
17620         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17621         that are inserted into the name space. 
17622
17623 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17624
17625         * ARGH.  I have screwed up my tree so many times due to the use of
17626         rsync rather than using CVS.  Going to fix this at once. 
17627
17628         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17629         load types.
17630
17631 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17632
17633         * Experiment successful: Use System.Type rather that our own
17634         version of Type.  
17635
17636 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17637
17638         * cs-parser.jay: Removed nsAliases from here.
17639
17640         Use new namespaces, handle `using XXX;' 
17641
17642         * namespace.cs: Reimplemented namespace handling, use a recursive
17643         definition of the class.  Now we can keep track of using clauses
17644         and catch invalid using clauses.
17645
17646 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17647
17648         * gen-treedump.cs: Adapted for all the renaming.
17649
17650         * expression.cs (Expression): this class now has a Type property
17651         which returns an expression Type.
17652
17653         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17654         `Type', as this has a different meaning now in the base
17655
17656 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17657
17658         * interface.cs, class.cs: Removed from all the sources the
17659         references to signature computation, as we can not do method
17660         signature computation during the parsing time, as we are not
17661         trying to solve at that point distinguishing:
17662
17663         class X {
17664                 void a (Blah x) {}
17665                 void a (NS.Blah x) {}
17666         }
17667
17668         Which depending on the context might be valid or not, as we do not
17669         know if Blah is the same thing as NS.Blah at that point.
17670
17671         * Redid everything so the code uses TypeRefs now instead of
17672         Types.  TypeRefs are just temporary type placeholders, that need
17673         to be resolved.  They initially have a pointer to a string and the
17674         current scope in which they are used.  This is used later by the
17675         compiler to resolve the reference to an actual Type. 
17676
17677         * DeclSpace is no longer a CIR.Type, and neither are
17678         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17679         are all DeclSpaces, but no Types. 
17680
17681         * type.cs (TypeRefManager): This implements the TypeRef manager,
17682         which keeps track of all the types that need to be resolved after
17683         the parsing has finished. 
17684
17685 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17686
17687         * ARGH.  We are going to have to store `foreach' as a class rather
17688         than resolving it, as we need to verify error 1579 after name
17689         resolution.   *OR* we could keep a flag that says `This request to
17690         IEnumerator comes from a foreach statement' which we can then use
17691         to generate the error.
17692
17693 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17694
17695         * class.cs (TypeContainer.AddMethod): we now add methods to the
17696         MethodGroup instead of the method hashtable.  
17697
17698         * expression.cs: Add MethodGroup abstraction, which gets us one
17699         step closer to the specification in the way we handle method
17700         declarations.  
17701
17702         * cs-parser.jay (primary_expression): qualified_identifier now
17703         tried to match up an identifier to a local variable reference or
17704         to a parameter reference.
17705
17706         current_local_parameters is now a parser global variable that
17707         points to the current parameters for the block, used during name
17708         lookup.
17709
17710         (property_declaration): Now creates an implicit `value' argument to
17711         the set accessor.
17712
17713 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17714
17715         * parameter.cs: Do not use `param' arguments as part of the
17716         signature, per the spec.
17717
17718 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17719
17720         * decl.cs: Base class for classes, structs and interfaces.  This
17721         is the "Declaration Space" 
17722
17723         * cs-parser.jay: Use CheckDef for checking declaration errors
17724         instead of having one on each function.
17725
17726         * class.cs: Factor out some code for handling error handling in
17727         accordance to the "Declarations" section in the "Basic Concepts"
17728         chapter in the ECMA C# spec.
17729
17730         * interface.cs: Make all interface member classes derive from
17731         InterfaceMemberBase.
17732
17733 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17734
17735         * Many things: all interfaces are parsed and generated in
17736         gen-treedump.  Support for member variables, constructors,
17737         destructors, properties, constants is there.
17738
17739         Beginning of the IL backend, but very little done, just there for
17740         testing purposes. 
17741
17742 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17743
17744         * cs-parser.jay: Fix labeled statement.
17745
17746         * cs-tokenizer.cs (escape): Escape " and ' always.
17747         ref_line, ref_name: keep track of the line/filename as instructed
17748         by #line by the compiler.
17749         Parse #line.
17750
17751 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17752
17753         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17754         to match the values in System.CodeDOM.
17755
17756         Divid renamed to Divide.
17757
17758         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17759         statements. 
17760         (Statements.set): remove.
17761
17762         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17763         statements. 
17764
17765         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17766         falseStatements always have valid values. 
17767
17768         * cs-parser.jay: Use System.CodeDOM now.
17769