(bootstrap_libs,bootstrap_libfiles): New.
[mono.git] / mcs / gmcs / ChangeLog
1 2004-10-29  Raja R Harinath  <rharinath@novell.com>
2
3         * Makefile (bootstrap_libs,bootstrap_libfiles): New.
4         (bootstrap-libs): New target.  Invokes the net_2_0_bootstrap profile.
5         (gmcs.exe): Invoke bootstrap-libs.
6         (clean-local): Clean the net_2_0_bootstrap profile too.
7         (PROGRAM_INSTALL_DIR): New.
8         (install-local): Use it.
9
10 2004-10-13  Martin Baulig  <martin@ximian.com>
11
12         * generic.cs (TypeManager.InflatedConstraints): New nested class.
13         (TypeParameter.DefineType): If we're a method type parameter and
14         that method is overriding something, "inflate" its constraints.
15
16 2004-10-12  Martin Baulig  <martin@ximian.com>
17
18         * expression.cs (MemberAccess.DoResolve): If we're a SimpleName
19         and have type arguments, create and resolve a ConstructedType.
20
21 2004-10-12  Martin Baulig  <martin@ximian.com>
22
23         * decl.cs (MemberCache.FindMemberToOverride): Use
24         TypeManager.IsEqual() to compare the parameters and Type.Equals()
25         to compare the invocationType.
26
27         * typemanager.cs (TypeManager.IsEqual): Added support for arrays.
28         When comparing two type parameters, only do the signature-only
29         comparision for method type parameters.
30
31 2004-10-11  Martin Baulig  <martin@ximian.com>
32
33         * report.cs: Don't make --fatal abort on warnings, we have
34         -warnaserror for that.
35
36 2004-10-11  Martin Baulig  <martin@ximian.com>
37
38         * typemanager.cs
39         (TypeManager.IsEqualGenericType): Removed, use IsEqual() instead.
40         (TypeManager.IsEqual): Call ourself recursively instead of using
41         Type.IsEqual(). 
42
43 2004-10-11  Martin Baulig  <martin@ximian.com>
44
45         * class.cs (TypeContainer.DefineType): Only call TypeParameter.Define()
46         on our own type parameters, not on the ones we inherit from a containing
47         class.
48
49         * expression.cs (Invocation.InferType): Use `==', not `Equals()' for
50         the comparision.
51
52         * generic.cs (TypeParameter.Define): We may only be called once.
53
54         * pending.cs (Pending.InterfaceMethod): Call TypeManager.Real_IsEqual()
55         instead of TypeManager.IsEqual().
56
57 2004-09-28  Martin Baulig  <martin@ximian.com>
58
59         * generic.cs
60         (GenericConstraints.EffectiveBaseClass): New public property.
61         (TypeParameter.GenericConstraints): New public property.
62         (ConstructedType.CheckConstraints): Improved.
63
64         * convert.cs (Convert.TypeParam_EffectiveBaseType): New private method.
65         (Convert.TypeParameterConversion): New private method; use this in
66         ImplicitReferenceConversion() and ImplicitReferenceConversionExists()
67         for all conversions related to type parameters.
68
69 2004-09-24  Martin Baulig  <martin@ximian.com>
70
71         * convert.cs (Convert.ImplicitReferenceConversion): Added implicit
72         type parameter conversions for type parameters which are known to
73         be reference types.
74
75 2004-09-24  Martin Baulig  <martin@ximian.com>
76
77         * generic.cs (GenericConstraints): Added `IsReferenceType' and
78         `IsValueType' properties.
79
80         * support.cs (ReflectionConstraints): Use
81         Type.GetGenericParameterConstraints() instead of the old hack.
82
83 2004-09-24  Martin Baulig  <martin@ximian.com>
84
85         * generic.cs (GenericConstraints): Moved here and made it an
86         abstract class.
87
88         * support.cs (GenericConstraints): Moved to generic.cs.
89
90 2004-09-24  Martin Baulig  <martin@ximian.com>
91
92         * support.cs
93         (ReflectionConstraints): Un-nested this class and made it public.
94
95         * typemanager.cs
96         (TypeManager.GetTypeParameterConstraints): New public method.
97         (TypeManager.HasConstructorConstraint): Use the attributes.
98
99 2004-09-24  Martin Baulig  <martin@ximian.com>
100
101         * support.cs (GenericConstraints): Replaced `HasConstructor',
102         `IsReferenceType' and `IsValueType' with `Attributes'.
103         (ReflectionParameters.ReflectionConstraints): Removed the Create()
104         method and made the .ctor public.
105
106         * generic.cs (Constraints.Attributes): New public property.
107         (Constraints): Renamed `HasConstructor' -> `HasConstructorConstraint',
108         `IsReferenceType' -> `HasReferenceTypeConstraint' and
109         `IsValueType' -> `HasValueTypeConstraint'.
110
111 2004-09-23  Martin Baulig  <martin@ximian.com>
112
113         * generic.cs (Constraints): Reflect latest runtime changes.
114
115 2004-09-23  Martin Baulig  <martin@ximian.com>
116
117         * convert.cs (Convert.ImplicitReferenceConversion): Some code cleanup.
118         (Convert.ImplicitReferenceConversionExists): Likewise.
119
120 2004-09-23  Marek Safar  <marek.safar@seznam.cz>
121
122         * class.cs (Operator.Define): Add error 448 and 559 report.
123         
124 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
125
126         * class.cs (MemberBase.IsTypePermitted): New protected
127         method for checking error CS0610.
128
129 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
130
131         * class.cs (TypeContainer.HasExplicitLayout): New property
132         Returns whether container has StructLayout attribute set Explicit.
133         (FieldMember): New abstract class for consts and fields.
134         (FieldMember.ApplyAttributeBuilder): Add error 636 and 637 report.
135         (Field): Reuse FieldMember.
136
137         * const.cs (Const): Reuse FieldMember.
138
139         * rootcontext.cs: EmitConstants call moved to class.
140
141 2004-09-22  Martin Baulig  <martin@ximian.com>
142
143         Marek and me just fixed one of our oldest bugs: #28562 :-)
144
145         * ecore.cs (EnumConstant.GetValueAsEnumType): New public method.
146
147         * attribute.cs (Attribute.GetAttributeArgumentExpression): If
148         we're an EnumConstant, just return that.
149         (Attribute.Resolve): GetAttributeArgumentExpression() may give us
150         an EnumConstant.  In this case, we need to use GetValueAsEnumType()
151         to get the value which'll actually be written into the attribute.
152         However, we have to use GetValue() to access the attribute's value
153         in the compiler.        
154
155 2004-09-22  Marek Safar  <marek.safar@seznam.cz>
156
157         * constant.cs (Constant.IsNegative): New abstract property
158         IsNegative.
159
160         * expression.cs (ArrayAccess.DoResolve): Add warning 251.
161         (StackAlloc.DoResolve): Reused IsNegative.
162
163 2004-09-22  Martin Baulig  <martin@ximian.com>
164
165         * typemanager.cs (TypeManager.LookupGenericTypeContainer): New
166         public method; like LookupTypeContainer, but also works for
167         generic instances.
168
169         * report.cs (Report.SymbolRelatedToPreviousError): Use
170         TypeManager.LookupGenericTypeContainer().       
171
172 2004-09-22  Martin Baulig  <martin@ximian.com>
173
174         Thanks to Peter Sestoft for this bug report.
175
176         * expression.cs (Conditional): If both the `trueExpr' and the
177         `falseExpr' is a NullLiteral, return a NullLiteral.
178
179 2004-09-22  Martin Baulig  <martin@ximian.com>
180
181         * statement.cs (Foreach.EmitCollectionForeach): If we're in an
182         iterator, use `enumerator.EmitThis()' instead of `ec.EmitThis()'
183         for the "get_Current" call.
184
185 2004-09-21  Martin Baulig  <martin@ximian.com>
186
187         * convert.cs (Convert.ImplicitReferenceConversion): When
188         converting to an interface type, first check whether we're
189         converting from a reference type.
190
191 2004-09-14  Martin Baulig  <martin@ximian.com>
192
193         * decl.cs (MemberCore.Emit): Always call VerifyObsoleteAttribute().
194
195 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
196
197         Fixed bug #61902
198         * codegen.cs (TestObsoleteMethodUsage): Trace when method is
199         called and is obsolete then this member suppress message
200         when call is inside next [Obsolete] method or type.
201
202         * expression.cs: Use TestObsoleteMethodUsage member.
203
204 2004-09-14  Martin Baulig  <martin@ximian.com>
205
206         * genericparser.cs: Removed.
207
208 2004-09-13  Marek Safar  <marek.safar@seznam.cz>
209
210         * class.cs (MethodCore.CheckBase): Fix bug #65757.
211
212 2004-09-12  Marek Safar  <marek.safar@seznam.cz>
213
214         * attribute.cs (Attribute.Resolve): Add error 653 report.
215
216         * class.cs (Class.ApplyAttributeBuilder): Add error 641
217         report.
218         (Method.ApplyAttributeBuilder): Add error 685 report.
219         (Operator.Define): Add error 564 report.
220
221         * cs-tokenizer.cs (handle_hex): Add error 1013 report.
222
223         * expression.cs (Invocation.DoResolve): Add error
224         245 and 250 report.
225
226         * parameter.cs (Parameter.ApplyAttributeBuilder): Add
227         error 674 report.
228
229 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
230
231         * class.cs (ConstructorInitializer.Resolve):
232         Wrong error number (515->516).
233
234 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
235
236         * class.cs (Indexer.Define): Add error 631 report.
237
238 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
239
240         * ecore.cs (Error_NegativeArrayIndex): Fix 248 error.
241
242 2004-09-11  Marek Safar  <marek.safar@seznam.cz>
243
244         * expression.cs (Probe.DoResolve): Add error CS0241 report.
245
246 2004-09-10  Marek Safar  <marek.safar@seznam.cz>
247
248         * cs-parser.jay: Added error CS0241 report.
249
250 2004-09-10  Raja R Harinath  <rharinath@novell.com>
251
252         * cs-parser.jay (fixed_statement): Introduce a scope for the
253         declaration in the 'fixed' statement.
254
255 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
256
257         * cs-parser.jay: Added CS0230 error report.
258
259 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
260
261         * cs-parser.jay: Added errors CS0231 and CS0257 report.
262
263 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
264
265         * expression.cs (Argument.Resolve): Added error CS0192 and
266         CS0199 report.
267
268 2004-09-09  Marek Safar  <marek.safar@seznam.cz>
269
270         C# 2.0 #pragma warning feature
271
272         * cs-tokenizer.cs (PreProcessPragma): New method; 
273         Handles #pragma directive.
274
275         * report.cs (WarningRegions): New class; Support
276         class for #pragma warning directive. It tests whether
277         warning is enabled for a given line.
278
279 2004-09-08  Miguel de Icaza  <miguel@ximian.com>
280
281         * const.cs: Add more descriptive error report, tahnks to
282         Sebastien. 
283
284 2004-09-08  Marek Safar  <marek.safar@seznam.cz>
285
286         * ecore.cs (FieldExpr.DoResolveLValue): Fixed CS0198 report.
287
288 2004-09-07  Miguel de Icaza  <miguel@ximian.com>
289
290         * expression.cs: Apply patch from Ben: Remove dead code from
291         ArrayCreation, and remove the TurnintoConstant call in const.cs,
292         as that code just threw an exception anwyays.
293
294         * const.cs: Remove the call to the turnintoconstant, for details
295         see bug: #63144
296         
297         * literal.cs: The type of the null-literal is the null type;  So
298         we use a placeholder type (literal.cs:System.Null, defined here)
299         for it.
300
301         * expression.cs (Conditional.DoResolve): Remove some old code that
302         is no longer needed, conversions have been fixed.
303
304         (ArrayCreationExpression.DoResolve): Return false if we fail to
305         resolve the inner expression.
306
307 2004-09-07  Raja R Harinath  <rharinath@novell.com>
308
309         Fix test-290.cs.
310         * cs-parser.jay (delegate_declaration): Record a delegate
311         declaration as a type declaration.
312         Reported by Jo Vermeulen <jo@lumumba.luc.ac.be>.
313
314 2004-09-06  Miguel de Icaza  <miguel@ximian.com>
315
316         * parameter.cs: Do not crash if the type can not be resolved. 
317
318         * expression.cs: Report errors with unsafe pointers, fixes #64896
319
320 2004-09-06 Ben Maurer  <bmaurer@users.sourceforge.net>
321
322         * expression.cs: Pointer arith always needs to do a conv.i
323         if the operand is a long. fix 65320
324
325 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
326
327         Fixed cs0619-37.cs, cs0619-38.cs
328
329         * enum.cs (GetObsoleteAttribute): Removed.
330
331         * expression.cs (MemberAccess.DoResolve): Test for [Obsolete]
332         on Enum member is double staged. The first is tested member
333         and then enum.
334
335 2004-09-04  Marek Safar  <marek.safar@seznam.cz>
336
337         Fixed #56986, #63631, #65231
338
339         * class.cs: (TypeContainer.AddToMemberContainer): New method,
340         adds member to name container.
341         (TypeContainer.AddToTypeContainer): New method, adds type to
342         name container.
343         (AddConstant, AddEnum, AddClassOrStruct, AddDelegate, AddMethod,
344         AddConstructor, AddInterface, AddField, AddProperty, AddEvent,
345         AddOperator): Simplified by reusing AddToMemberContainer.
346         (TypeContainer.UserDefinedStaticConstructor): Changed to property
347         instead of field.
348         (Method.CheckForDuplications): Fixed implementation to test all
349         possibilities.
350         (MemberBase): Detection whether member is explicit interface
351         implementation is now in constructor.
352         (MemberBase.UpdateMemberName): Handles IndexerName.
353         (Accessor): Changed to keep also location information.
354         (AbstractPropertyEventMethod): Is derived from MemberCore.
355         (AbstractPropertyEventMethod.IsDummy): Says whether accessor
356         will be emited or not.
357         (PropertyBase.AreAccessorsDuplicateImplementation):
358         Tests whether accessors are not in collision with some method.
359         (Operator): Is derived from MethodCore to simplify common
360         operations.
361
362         * decl.cs (Flags.TestMethodDuplication): Test for duplication
363         must be performed.
364         (DeclSpace.AddToContainer): Adds the member to defined_names
365         table. It tests for duplications and enclosing name conflicts.
366
367         * enum.cs (EnumMember): Clean up to reuse the base structures
368
369 2004-09-03  Martin Baulig  <martin@ximian.com>
370
371         Merged latest changes into gmcs.  Please keep this comment in
372         here, it makes it easier for me to see what changed in MCS since
373         the last time I merged.
374
375 2004-09-03  Martin Baulig  <martin@ximian.com>
376
377         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
378         into TypeContainer, to make partial classes work again.
379
380 2004-09-03  Martin Baulig  <martin@ximian.com>
381
382         * rootcontext.cs (RootContext.V2): Removed.
383
384 2004-03-23  Martin Baulig  <martin@ximian.com>
385
386         * expression.cs (Invocation.OverloadResolve): Added `bool
387         may_fail' argument and use it instead of the Location.IsNull() hack.
388
389 2004-09-09  Martin Baulig  <martin@ximian.com>
390
391         * cs-parser.jay (namespace_declaration): Fixed CS0134 reporting.
392
393 2004-09-09  Martin Baulig  <martin@ximian.com>
394
395         * generic.cs (TypeParameter.DefineType): Added support for
396         explicit interface methods.
397
398 2004-09-09  Martin Baulig  <martin@ximian.com>
399
400         * README.Changes: New document.  Started to list important changes
401         between MCS and GMCS here.
402
403 2004-09-08  Martin Baulig  <martin@ximian.com>
404
405         * class.cs
406         (TypeContainer.CheckRecursiveDefinition): New protected method.
407         (TypeContainer.DefineType): Move the CS0146 check into
408         CheckRecursiveDefinition().     
409
410 2004-09-06  Martin Baulig  <martin@ximian.com>
411
412         * generic.cs (ConstructedType.CheckConstraints): Allow builtin
413         types for the constructor constraint.
414
415 2004-09-03  Martin Baulig  <martin@ximian.com>
416
417         * class.cs (TypeContainer.DefineDefaultConstructor): Put this back
418         into TypeContainer, to make partial classes work again.
419
420 2004-09-03  Martin Baulig  <martin@ximian.com>
421
422         * rootcontext.cs (RootContext.V2): Removed.
423
424 2004-03-23  Martin Baulig  <martin@ximian.com>
425
426         * expression.cs (Invocation.OverloadResolve): Added `bool
427         may_fail' argument and use it instead of the Location.IsNull() hack.
428
429 2004-09-03  Martin Baulig  <martin@ximian.com>
430
431         Merged latest changes into gmcs.  Please keep this comment in
432         here, it makes it easier for me to see what changed in MCS since
433         the last time I merged.
434
435 2004-09-03  Raja R Harinath  <rharinath@novell.com>
436
437         Fix #61128.
438         * expression.cs (BetterConversion): Don't allow either conversion 
439         to be null.  Remove redundant implicit conversion test when 'q ==
440         null' -- when this function is invoked, we already know that the
441         implicit conversion exists.
442         (BetterFunction): Assume that 'best' is non-null.  Remove
443         redundant reimplementation of IsApplicable when 'best' is null.
444         (IsParamsMethodApplicable, IsApplicable): Add new parameter for
445         number of arguments.
446         (IsAncestralType): Extract from OverloadResolve.
447         (OverloadResolve): Make robust to the MethodGroupExpr being
448         unsorted.  Implement all the logic of Section 14.5.5.1, and
449         support overloading of methods from multiple applicable types.
450         Clean up logic somewhat.  Don't pass null methods to BetterFunction.
451
452         * report.cs (SymbolRelatedToPreviousError): Cleanup output.
453         (RealError, Warning): Append type of report to related symbol.
454
455 2004-09-03  Marek Safar  <marek.safar@seznam.cz>
456
457         * enum.cs: Fixed CLS-Compliance checks for enum members.
458         Error tests cs3008-8.cs, cs3014-8.cs
459
460 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
461
462         Fixed bug #62342, #63102
463         * class.cs: ImplementIndexer uses member.IsExplicitImpl
464         like ImplementMethod.
465
466 2004-09-02  Marek Safar  <marek.safar@seznam.cz>
467
468         * attribute.cs (Attribute.GetAttributeArgumentExpression):
469         Fixed bug #65170.
470
471 2004-09-02  Martin Baulig  <martin@ximian.com>
472
473         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
474         TypeManager.GetArgumentTypes() rather than calling GetParameters()
475         on the MethodBase.
476
477 2004-09-01  Marek Safar  <marek.safar@seznam.cz>
478
479         C# 2.0 Static classes implemented
480
481         * class.cs (TypeContainer): instance_constructors,
482         initialized_fields, initialized_static_fields,
483         default_constructor, base_inteface_types are protected to be
484         accessible from StaticClass.
485         (TypeContainer.DefineDefaultConstructor): New virtual method
486         for custom default constructor generating
487         (StaticClass): New class to handle "Static classes" feature.
488
489         * cs-parser.jay: Handle static keyword on class like instance
490         of StaticClass.
491
492         * driver.cs: Added "/langversion" command line switch with two
493         options (iso-1, default).
494
495 2004-08-31  Marek Safar  <marek.safar@seznam.cz>
496
497         * ecore.cs (FieldExpr.Resolve): Fixed bug #64689.
498
499 2004-08-31  Miguel de Icaza  <miguel@ximian.com>
500
501         * delegate.cs: Style.
502
503 2004-08-31 Ben Maurer  <bmaurer@users.sourceforge.net>
504
505         * delegate.cs: Add seperate instance expr field for miguel.
506
507 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
508
509         * PointerArithmetic (Resolve): make sure we are not doing
510         pointer arith on void*. Also, make sure we are resolved
511         by not setting eclass until resolve.
512
513         All callers: Make sure that PointerArithmetic gets resolved.
514
515 2004-08-29 Ben Maurer  <bmaurer@users.sourceforge.net>
516
517         * ArrayCreation (LookupType): If the type does not resolve 
518         to an array, give an error.
519
520 2004-08-27  Marek Safar  <marek.safar@seznam.cz>
521
522         * statement.cs (Try.Resolve): Fixed bug #64222
523
524 2004-08-27  Martin Baulig  <martin@ximian.com>
525
526         * class.cs
527         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
528         crash here.     
529
530 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
531
532         * ecore.cs (Constantify): Get underlying type via
533         System.Enum.GetUnderlyingType to avoid StackOverflow on the
534         Windows in special cases.
535
536 2004-08-26  Marek Safar  <marek.safar@seznam.cz>
537
538         * typemanager.cs (GetAddMethod): Used GetAddMethod (true)
539         for obtaining also private methods.
540         (GetRemoveMethod): Used GetRemoveMethod (true)
541         for obtaining also private methods.
542
543 2004-09-02  Martin Baulig  <martin@ximian.com>
544
545         * statement.cs (Using.EmitLocalVariableDeclFinally): Use
546         TypeManager.GetArgumentTypes() rather than calling GetParameters()
547         on the MethodBase.
548
549 2004-08-27  Martin Baulig  <martin@ximian.com>
550
551         * class.cs
552         (TC.OperatorArrayList.OperatorEntry.CheckPairedOperators): Don't
553         crash here.     
554
555 2004-08-25  Martin Baulig  <martin@ximian.com>
556
557         * support.cs (ReflectionParameters..ctor): If this is a generic
558         method, retrieve and store its type parameters.
559         (InternalParameters..ctor): Added `TypeParameter[]' argument.
560         (ReflectionParameters.GenericConstraints): The argument specifies
561         the type parameter, not the method parameter.
562         (InternalParameters.GenericConstraints): Likewise.
563
564         * generic.cs (TypeParameter.DefineType): Correctly handle
565         constraints wrt. generic methods in interfaces and their
566         implementations.        
567
568 2004-08-24  Martin Baulig  <martin@ximian.com>
569
570         * generic.cs (TypeParameter.IsSubclassOf): New public method.
571         (Constraints.IsSubclassOf): New internal method.
572
573         * typemanager.cs (TypeManager.FindMembers): Added special support
574         for GenericTypeParameterBuilder's.      
575         (TypeManager.IsSubclassOf, IsFamilyAccessible): Added support for
576         type parameters.
577
578 2004-08-24  Martin Baulig  <martin@ximian.com>
579
580         * typemanager.cs
581         (TypeManager.IsSubclassOf): Renamed to IsFamilyAccessible; use
582         this for accessibility checks.
583         (TypeManager.IsSubclassOrNestedChildOf): Renamed to
584         IsNestedFamilyAccessible.
585         (TypeManager.IsSubclassOf): New method, do what the name actually
586         says.   
587
588 2004-08-24  Martin Baulig  <martin@ximian.com>
589
590         * expression.cs (MemberAccess.DoResolve): When resolving ourselves
591         as a SimpleName, include the generic arity.
592
593 2004-08-24  Martin Baulig  <martin@ximian.com>
594
595         * class.cs (Method.Define): Set MethodAttributes.SpecialName and
596         MethodAttributes.HideBySig for operators.
597
598 2004-08-23  Martin Baulig  <martin@ximian.com>
599
600         Back to the old error reporting system :-)
601
602         * report.cs (Message): Removed.
603         (Report.MessageData, ErrorData, WarningData): Removed.
604         (Report.Error, Warning): Back to the old system.
605
606 2004-08-23  Martin Baulig  <martin@ximian.com>
607
608         * decl.cs (IMemberContainer.Parent): Renamed to ParentContainer.
609
610         * class.cs (TypeContainer.ParentContainer): New public virtual
611         method; replaces the explicit interface implementation.
612         (ClassPart.ParentContainer): Override.
613
614 2004-08-23  Martin Baulig  <martin@ximian.com>
615
616         * statement.cs (Switch): Added support for constant switches; see
617         #59428 or test-285.cs.
618
619 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
620
621         Fixed bug #62740.
622         * statement.cs (GetEnumeratorFilter): Removed useless
623         logic because C# specs is strict. GetEnumerator must be
624         public.
625
626 2004-08-22  Martin Baulig  <martin@ximian.com>
627
628         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
629         a switch and may break, reset the barrier.  Fixes #59867.
630
631 2004-08-22  Marek Safar  <marek.safar@seznam.cz>
632
633         CLS-Compliance speed up (~5% for corlib)
634
635         * attribute.cs (AttributeTester.VerifyTopLevelNameClsCompliance):
636         New method. Tests container for CLS-Compliant names
637
638         * class.cs (TypeContainer.VerifyClsName): New method.
639         Checks whether container name is CLS Compliant.
640         (Constructor): Implements IMethodData.
641
642         * decl.cs (MemberCache.GetPublicMembers ): New method. Builds
643         low-case table for CLS Compliance test.
644         (MemberCache.VerifyClsParameterConflict): New method.
645         Checks method parameters for CS3006 error.
646
647         * enum.cs (EnumMember): Is derived from MemberCore.
648         (Enum.VerifyClsName): Optimized for better performance.
649
650 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
651
652         * report.cs: Renamed Error_T to Error and changed all
653         references.
654
655 2004-08-06  Marek Safar  <marek.safar@seznam.cz>
656
657         * class.cs (TypeContainer.IndexerArrayList): New inner class
658         container for indexers.
659         (TypeContainer.DefaultIndexerName): New constant for default
660         indexer name. Replaced all "Item" with this constant.
661         (TypeContainer.DefineIndexers): Moved to IndexerArrayList class.
662
663         * typemanager.cs (TypeManager.default_member_ctor): Cache here
664         DefaultMemberAttribute constructor.
665
666 2004-08-05  Martin Baulig  <martin@ximian.com>
667
668         * flowanalysis.cs (FlowBranching.UsageVector.MergeJumpOrigins):
669         Fix bug #59429.
670
671 2004-08-05  Marek Safar  <marek.safar@seznam.cz>
672
673         * mcs.exe.sources: $(EXTRA_SOURCES) are now here to avoid
674         multi platforms problem.
675
676         * compiler.csproj: Included shared files.
677
678 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
679
680         Fix bug 60333, 55971 in the more general way
681         * attribute.cs (Attribute.GetAttributeArgumentExpression):
682         Added arg_type argument for constant conversion.
683         (Attribute.Resolve): Reuse GetAttributeArgumentExpression.
684
685 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
686
687         Fix bug #59760
688         * class.cs (TypeContainer ): New inner classes MethodArrayList, 
689         OperatorArrayList, MethodCoreArrayList for typecontainer
690         containers. Changed class member types to these new types.
691         (MethodArrayList.DefineMembers): Added test for CS0659.
692
693 2004-08-04  Miguel de Icaza  <miguel@ximian.com>
694
695         * cfold.cs: Synchronize the folding with the code in expression.cs
696         Binary.DoNumericPromotions for uint operands.
697
698         * attribute.cs: Revert patch from Raja, it introduced a regression
699         while building Blam-1.2.1 (hard to isolate a test case).
700
701 2004-08-04  Marek Safar  <marek.safar@seznam.cz>
702
703         Fix for #55382
704         * class.cs:
705         (TypeContainer.Define): Renamed to DefineContainerMembers because of
706         name collision.
707         (MethodCore.parent_method): New member. The method we're overriding
708         if this is an override method.
709         (MethodCore.CheckBase): Moved from Method class and made common.
710         (MethodCore.CheckMethodAgainstBase): Moved from MemberBase and made
711         private.
712         (MethodCore.CheckForDuplications): New abstract method. For custom
713         member duplication search in a container
714         (MethodCore.FindOutParentMethod): New abstract method. Gets parent
715         method and its return type.
716         (Event.conflict_symbol): New member. Symbol with same name in the
717         parent class.
718
719         * decl.cs:
720         (MemberCache.FindMemberWithSameName): New method. The method
721         is looking for conflict with inherited symbols.
722
723 2004-08-04  Martin Baulig  <martin@ximian.com>
724
725         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
726
727         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
728
729 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
730
731         * report.cs (Message): New enum for better error, warning reference in
732         the code.
733         (MessageData): New inner abstract class. It generally handles printing of
734         error and warning messages.
735         Removed unused Error, Warning, Message methods.
736
737 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
738
739         Fix for cs0592-8.cs test
740         * attribute.cs
741         (Attributable.ValidAttributeTargets): Made public.
742         (Attribute.ExplicitTarget): New member for explicit target value.
743         (Attribute.CheckTargets): Now we translate explicit attribute
744         target to Target here.
745
746 2004-08-03  Ben Maurer  <bmaurer@ximian.com>
747
748         * ecore.cs (MethodGroupExpr): new IsBase property.
749
750         * expression.cs (BaseAccess): Set IsBase on MethodGroupExpr.
751
752         * delegate.cs (DelegateCreation): store a MethodGroupExpr
753         rather than an instance expr.
754
755         (DelegateCreation.Emit): Use the method group rather than
756         the instance expression. Also, if you have base.Foo as the
757         method for a delegate, make sure to emit ldftn, not ldftnvirt.
758
759         (ResolveMethodGroupExpr): Use the MethodGroupExpr. 
760
761         (NewDelegate.DoResolve): Only check for the existance of Invoke
762         if the method is going to be needed. Use MethodGroupExpr.
763
764         (NewDelegate.Emit): Remove, DelegateCreation implements this.   
765
766         * expression.cs: For pointer arith., make sure to use
767         the size of the type, not the size of the pointer to
768         the type.
769
770 2004-08-03  Marek Safar  <marek.safar@seznam.cz>
771
772         Fix for #60722
773         * class.cs (Class): Added error CS0502 test.
774
775 2004-08-03  John Luke  <jluke@cfl.rr.com>
776             Raja R Harinath  <rharinath@novell.com>
777
778         Fix for #60997.
779         * attribute.cs (Attribute.complained_before): New flag.
780         (Attribute.ResolveType, Attribute.Resolve),
781         (Attribute.DefinePInvokeMethod): Set it.
782         (Attributes.Search): Pass 'complain' to Attribute.ResolveType.
783         
784 2004-08-03  Martin Baulig  <martin@ximian.com>
785
786         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
787         use a user-defined operator; we still need to do numeric
788         promotions in case one argument is a builtin type and the other
789         one has an implicit conversion to that type.  Fixes #62322.
790
791 2004-08-18  Martin Baulig  <martin@ximian.com>
792
793         * class.cs (Method.Define): Use the correct method name when
794         creating the MethodBuilder for a generic method.
795
796 2004-08-17  Martin Baulig  <martin@ximian.com>
797
798         * generic.cs (Constraints): Support type parameter constraints.
799
800 2004-08-16  Martin Baulig  <martin@ximian.com>
801
802         * cs-tokenizer.cs (Tokenizer.TypeOfParsing): New public property.
803         (Token.GENERIC_DIMENSION): New token; this is returned if we
804         encounter an unbound generic type in a typeof() expression.
805
806         * cs-parser.jay (opt_type_argument_list): Added GENERIC_DIMENSION;
807         this token is only generated while parsing a typeof() expression.
808         (typeof_expression): Removed the old unbound_type hack.
809
810         * generic.cs (TypeArguments.IsUnbound): New public property.
811
812         * decl.cs (MemberName): Added support for unbound types.
813
814 2004-08-14  Martin Baulig  <martin@ximian.com>
815
816         * typemanager.cs
817         (TypeManager.IsEqualGenericInstance): New static method.
818         (TypeManager.IsSubclassOrNestedChildOf, IsSubclassOf): This is
819         just used to check accessibility, so follow the rules of 26.1.6.        
820
821         * expression.cs (MemberAccess.ResolveAsTypeStep): Return a
822         ConstructedType instead of a TypeExpression if we have type arguments.
823
824         * cs-parser.jay (typeof_expression): Support unbound generic types.
825
826         * ecore.cs (UnboundTypeExpression): New public class.
827
828 2004-08-12  Martin Baulig  <martin@ximian.com>
829
830         * typemanager.cs (TypeManager.IsNestedChildOf): Use
831         TypeManager.IsEqual() rather than `=='.
832
833         * decl.cs (DeclSpace.CheckAccessLevel): Use `tb.FullName' for
834         generic instances as well.
835
836 2004-08-12  Martin Baulig  <martin@ximian.com>
837
838         * expression.cs (Invocation.InferType): We can only infer method
839         type parameters.  Fixes #62647.
840
841 2004-08-11  Martin Baulig  <martin@ximian.com>
842
843         * class.cs (TypeContainer.DefineType): Create the TypeBuilder
844         before resolving the base classes.
845
846 2004-08-06 Gonzalo Paniagua Javier <gonzalo@ximian.com>
847
848         * Makefile: install .mdb file too.
849
850 2004-08-05  Martin Baulig  <martin@ximian.com>
851
852         * ecore.cs (FieldExpr.DoResolveLValue): If we're resolving a field
853         initializer, the current type is just the TypeBuilder, not the
854         instantiated generic type.
855         (FieldExpr.IsFieldInitializer): New public property.
856
857 2004-08-04  Martin Baulig  <martin@ximian.com>
858
859         * codegen.cs (VariableStorage.EmitLoadAddress): New public method.
860
861         * statement.cs (Foreach.EmitFinally): Make this work for valuetypes.
862
863 2004-08-03  Martin Baulig  <martin@ximian.com>
864
865         * class.cs (MethodData.Define): If we're an explicit
866         implementation, remove the generic arity from the type name.
867
868 2004-08-03  Martin Baulig  <martin@ximian.com>
869
870         * expression.cs (Binary.ResolveOperator): Don't abort if we can't
871         use a user-defined operator; we still need to do numeric
872         promotions in case one argument is a builtin type and the other
873         one has an implicit conversion to that type.  Fixes #62322.
874
875 2004-08-02  Martin Baulig  <martin@ximian.com>
876
877         * class.cs (TypeContainer.ifaces): Make this a `Type[]', not a
878         `TypeExpr[]' array.
879         (TypeContainer.GetClassBases): Return the unexpanded list of
880         interfaces; we expand them later.
881         (TypeContainer.DefineType): After creating the TypeBuilder, call
882         TypeManager.ExpandInterfaces() to get an expanded and resolved
883         list of interfaces.
884
885         * ecore.cs (TypeExpr.GetInterfaces): Removed
886
887         * generics.cs (Constraints.InterfaceConstraints): Remove.
888         (TypeParameter.DefineType): Call TypeManager.RegisterBuilder() to
889         register the interface constraints.
890
891         * typemanager.cs
892         (TypeManager.AddUserType): Removed the `ifaces' argument.
893         (TypeManager.AddTypeParameter): Likewise.
894         (TypeManager.AddUserInterface): Removed, was unused.
895         (TypeManager.RegisterBuilder): Take a `Type[]' instead of a
896         `TypeExpr[]' array for the interfaces.
897         (TypeManager.ExpandInterfaces): Call this after the TypeBuilder
898         has been defined, returns a list of the resolved interfaces types.
899         (TypeManager.GetInterfaces): Return a `Type[]', not a `TypeExpr[]'.
900         (TypeManager.GetExplicitInterfaces): Likewise.  
901
902 2004-08-02  Martin Baulig  <martin@ximian.com>
903
904         * expression.cs (Invocation.EmitCall): If we're invoking a method
905         on a type parameter, use the new `Constrained' prefix opcode.
906
907 2004-08-02  Martin Baulig  <martin@ximian.com>
908
909         * statement.cs (LocalInfo.Flags): Added `IsThis'.
910         (LocalInfo.IsThis): New public property.
911         (Block.EmitMeta): Don't create a LocalBuilder for `this'.
912
913 2004-08-01  Martin Baulig  <martin@ximian.com>
914
915         * class.cs (TypeContainer.GetClassBases): Don't set the default
916         here since we may get called from GetPartialBases().
917         (TypeContainer.DefineType): If GetClassBases() didn't return a
918         parent, use the default one.
919
920 2004-07-30  Martin Baulig  <martin@ximian.com>
921
922         * Makefile (EXTRA_SOURCES): List the symbol writer's sources here.
923
924         * class.cs (SourceMethod): New public class, derive from the
925         symbol writer's ISourceMethod.
926         (Method): Use the new symbol writer API.
927
928         * codegen.cs (CodeGen.InitializeSymbolWriter): Take the filename
929         as argument and use the new symbol writer.
930
931         * location.cs
932         (SourceFile): Implement the symbol writer's ISourceFile.
933         (Location.SymbolDocument): Removed.
934         (Location.SourceFile): New public property.
935
936         * symbolwriter.cs: Use the new symbol writer API.
937
938 2004-07-30  Raja R Harinath  <rharinath@novell.com>
939
940         * Makefile (install-local): Remove.  Functionality moved to
941         executable.make.
942
943 2004-07-28  Lluis Sanchez Gual  <lluis@novell.com>
944
945         * Makefile: Install mcs.exe.config file together with mcs.exe.
946         * mcs.exe.config: Added supportedRuntime entry to make sure it runs in the
947         correct runtime version.
948         
949 2004-07-25  Martin Baulig  <martin@ximian.com>
950
951         * class.cs
952         (TypeContainer.RegisterOrder): Removed, this was unused.
953         (TypeContainer, interface_order): Removed.
954         (TypeContainer.AddClass, AddStruct, AddInterface): Take a
955         TypeContainer as argument since we can also be called with a
956         `PartialContainer' for a partial class/struct/interface.
957         (TypeContainer.IsInterface): Use `Kind == Kind.Interface' instead
958         of checking whether we're an `Interface' - we could be a
959         `PartialContainer'.
960         (PartialContainer.Register): Override; call
961         AddClass()/AddStruct()/AddInterface() on our parent.
962
963         * cs-parser.jay (interface_member_declaration): Add things to the
964         `current_container', not the `current_class'.
965
966         * rootcontext.cs (RegisterOrder): The overloaded version which
967         takes an `Interface' was unused, removed.
968
969         * typemanager.cs (TypeManager.LookupInterface): Return a
970         `TypeContainer', not an `Interface'.
971         (TypeManager.IsInterfaceType): The `builder_to_declspace' may
972         contain a `PartialContainer' for an interface, so check it's
973         `Kind' to figure out what it is.
974
975 2004-07-25  Martin Baulig  <martin@ximian.com>
976
977         * class.cs (Class.DefaultTypeAttributes): New public constant.
978         (Struct.DefaultTypeAttributes): Likewise.
979         (Interface.DefaultTypeAttributes): Likewise.
980         (PartialContainer.TypeAttr): Override this and add the
981         DefaultTypeAttributes.
982
983 2004-07-25  Martin Baulig  <martin@ximian.com>
984
985         * decl.cs (DeclSpace.Emit): Removed the `TypeContainer' argument,
986         we can just use the `Parent' field instead.
987
988 2004-07-25  Martin Baulig  <martin@ximian.com>
989
990         * class.cs (TypeContainer.Emit): Renamed to EmitType().
991
992 2004-07-25  Martin Baulig  <martin@ximian.com>
993
994         * class.cs (TypeContainer.DefineMembers): Call DefineMembers() on
995         our parts before defining any methods.
996         (TypeContainer.VerifyImplements): Make this virtual.
997         (ClassPart.VerifyImplements): Override and call VerifyImplements()
998         on our PartialContainer.
999
1000 2004-07-25  Martin Baulig  <martin@ximian.com>
1001
1002         * iterators.cs (Iterator.Define): Renamed to DefineIterator().
1003
1004         * decl.cs (DeclSpace.Define): Removed the `TypeContainer'
1005         argument, we can just use the `Parent' field instead.
1006
1007         * class.cs
1008         (MemberBase.CheckBase): Removed the `TypeContainer' argument.   
1009         (MemberBase.DoDefine): Likewise.
1010
1011 2004-07-24  Martin Baulig  <martin@ximian.com>
1012
1013         * decl.cs (MemberCore.Parent): New public field.
1014         (DeclSpace.Parent): Moved to MemberCore.
1015
1016         * class.cs (MethodCore.ds): Removed; use `Parent' instead.
1017         (MemberBase.ctor): Added TypeContainer argument, pass it to our
1018         parent's .ctor.
1019         (FieldBase, Field, Operator): Likewise.
1020         (EventProperty.ctor): Take a TypeContainer instead of a DeclSpace.
1021         (EventField, Event): Likewise.
1022
1023 2004-07-23  Martin Baulig  <martin@ximian.com>
1024
1025         * class.cs (PartialContainer): New public class.
1026         (ClassPart): New public class.
1027         (TypeContainer): Added support for partial classes.
1028         (TypeContainer.GetClassBases): Splitted some of the functionality
1029         out into GetNormalBases() and GetPartialBases().
1030
1031         * cs-tokenizer.cs (Token.PARTIAL): New token.
1032         (Tokenizer.consume_identifier): Added some hacks to recognize
1033         `partial', but only if it's immediately followed by `class',
1034         `struct' or `interface'.
1035
1036         * cs-parser.jay: Added support for partial clases.
1037
1038 2004-07-23  Martin Baulig  <martin@ximian.com>
1039
1040         * class.cs (MethodCore.ds): Made this a `TypeContainer' instead of
1041         a `DeclSpace' and also made it readonly.
1042         (MethodCore.ctor): Take a TypeContainer instead of a DeclSpace.
1043         (Method.ctor, Constructor.ctor, Destruktor.ctor): Likewise.
1044         (PropertyBase.ctor, Property.ctor, Indexer.ctor): Likewise.
1045
1046         * cs-parser.jay: Pass the `current_class', not the
1047         `current_container' (at the moment, this is still the same thing)
1048         to a new Method, Property, Event, Indexer or Constructor.
1049
1050 2004-07-23  Martin Baulig  <martin@ximian.com>
1051
1052         * cs-parser.jay (CSharpParser): Added a new `current_class' field
1053         and removed the `current_interface' one.
1054         (struct_declaration, class_declaration, interface_declaration):
1055         Set `current_class' to the newly created class/struct/interface;
1056         set their `Bases' and call Register() before parsing their body.
1057
1058 2004-07-23  Martin Baulig  <martin@ximian.com>
1059
1060         * class.cs (Kind): New public enum.
1061         (TypeContainer): Made this class abstract.
1062         (TypeContainer.Kind): New public readonly field.
1063         (TypeContainer.CheckDef): New public method; moved here from
1064         cs-parser.jay.
1065         (TypeContainer.Register): New public abstract method.
1066         (TypeContainer.GetPendingImplementations): New public abstract
1067         method.
1068         (TypeContainer.GetClassBases): Removed the `is_class' and
1069         `is_iface' parameters.
1070         (TypeContainer.DefineNestedTypes): Formerly known as
1071         DoDefineType().
1072         (ClassOrStruct): Made this class abstract.
1073
1074         * tree.cs (RootTypes): New public type. 
1075
1076 2004-07-20  Martin Baulig  <martin@ximian.com>
1077
1078         * tree.cs (Tree.RecordNamespace): Removed.
1079         (Tree.Namespaces): Removed.
1080
1081         * rootcontext.cs (RootContext.IsNamespace): Removed.
1082
1083         * cs-parser.jay (namespace_declaration): Just create a new
1084         NamespaceEntry here.
1085
1086 2004-07-21  Lluis Sanchez Gual  <lluis@novell.com>
1087
1088         * Makefile: Install gmcs.exe.config file together with gmcs.exe.
1089         * gmcs.exe.config: Renamed from mcs.exe.config. Added supportedRuntime
1090         entry to make sure it runs in the correct runtime version.
1091         
1092 2004-07-18  Martin Baulig  <martin@ximian.com>
1093
1094         * generic.cs (ConstructedType.CheckConstraints): Improved
1095         constraints checking.
1096
1097 2004-07-18  Martin Baulig  <martin@ximian.com>
1098
1099         * expression.cs (Invocation.BetterMethod): Call
1100         TypeManager.TypeToCoreType() on all types and removed my previous
1101         hack; we're already doig the right thing here.
1102
1103 2004-07-17  Martin Baulig  <martin@ximian.com>
1104
1105         * decl.cs (MemberName.MakeName): Create the "class`1" names here.
1106
1107 2004-07-16  Martin Baulig  <martin@ximian.com>
1108
1109         * iterators.cs: Added generics support.
1110
1111 2004-07-16  Martin Baulig  <martin@ximian.com>
1112
1113         * iterators.cs: Rewrote this.  We're now using one single Proxy
1114         class for both the IEnumerable and the IEnumerator interface and
1115         `Iterator' derives from Class so we can use the high-level API.
1116
1117         * class.cs (TypeContainer.AddIterator): New method.
1118         (TypeContainer.DoDefineType): New protected virtual method, which
1119         is called from DefineType().
1120         (TypeContainer.DoDefineMembers): Call DefineType() and
1121         DefineMembers() on all our iterators.
1122         (TypeContainer.Emit): Call Emit() on all our iterators.
1123         (TypeContainer.CloseType): Call CloseType() on all our iterators.
1124
1125         * codegen.cs (EmitContext.CurrentIterator): New public field.
1126
1127 2004-07-15  Martin Baulig  <martin@ximian.com>
1128
1129         * typemanager.cs
1130         (TypeManager.not_supported_exception_type): New type.   
1131
1132 2004-07-14  Martin Baulig  <martin@ximian.com>
1133
1134         * typemanager.cs
1135         (TypeManager.generic_ienumerable_type): New type.
1136         (TypeManager.generic_ienumerator_type): New type.
1137
1138         * rootcontext.cs
1139         (RootContext.interfaces_first_stage): Added
1140         "System.Collections.Generic.IEnumerator`1" and
1141         "System.Collections.Generic.IEnumerable`1".     
1142
1143 2004-07-14  Martin Baulig  <martin@ximian.com>
1144
1145         * iterators.cs: Use real error numbers.
1146
1147 2004-07-14  Martin Baulig  <martin@ximian.com>
1148
1149         * iterator.cs (IteratorHandle.IsIEnumerable): The spec explicitly
1150         requires this to be a System.Collection.IEnumerable and not a
1151         class implementing that interface.
1152         (IteratorHandle.IsIEnumerator): Likewise, for IEnumerator.      
1153
1154 2004-07-13  Marek Safar  <marek.safar@seznam.cz>
1155
1156         * class.cs: Fixed previous fix, it broke some error tests.
1157
1158 2004-07-12  Martin Baulig  <martin@ximian.com>
1159
1160         * enum.cs (Enum.Define): Call Emit() to emit the attributes.
1161         Fixes #61293.
1162
1163 2004-07-14  Martin Baulig  <martin@ximian.com>
1164
1165         * decl.cs, expression.cs, generic.cs: Use a backqoute (`) and not
1166         an exclamation mark (!) for the generic arity to reflect the
1167         latest spec changes; ie. use "System.Collections.Generic.IList`1".
1168
1169 2004-07-13  Martin Baulig  <martin@ximian.com>
1170
1171         * cs-tokenizer.cs (Tokenizer.parse_less_than): Allow array rank
1172         specifiers being part of a type argument.
1173
1174 2004-07-13  Martin Baulig  <martin@ximian.com>
1175
1176         * expression.cs (MemberAccess.ResolveAsTypeStep): Use the full `!'
1177         name for generic types.
1178
1179 2004-07-13  Martin Baulig  <martin@ximian.com>
1180
1181         * assign.cs (Assign.DoResolve): Moved the CS0131 check up a little
1182         bit to fix #60119.
1183
1184 2004-07-09  Miguel de Icaza  <miguel@ximian.com>
1185
1186         * assign.cs (LocalTemporary): Add new argument: is_address,If
1187         `is_address' is true, then the value that we store is the address
1188         to the real value, and not the value itself.
1189         
1190         * ecore.cs (PropertyExpr): use the new local temporary
1191         stuff to allow us to handle X.Y += z (where X is a struct)
1192
1193 2004-07-08  Martin Baulig  <martin@ximian.com>
1194
1195         * statement.cs (Lock.Resolve): Set ec.NeedReturnLabel() if we do
1196         not always return, just like we're doing in Using.Resolve().
1197
1198 2004-07-07  Miguel de Icaza  <miguel@ximian.com>
1199
1200         * cs-parser.jay (fixed_statement): flag this as Pinned.
1201
1202 2004-07-06  Miguel de Icaza  <miguel@ximian.com>
1203
1204         * typemanager.cs (TypeManager): Removed MakePinned method, this
1205         mechanism is replaced with the .NET 2.x compatible mechanism of
1206         calling `ILGenerator.DeclareLocal (Type t, bool pinned)'.
1207
1208         * statement.cs (LocalInfo): Remove MakePinned, add Pinned property 
1209         Rename `Fixed' to `Pinned' as a flag, to distinguish from the
1210         `IsFixed' property which has a different meaning.
1211
1212 2004-07-02  Raja R Harinath  <rharinath@novell.com>
1213
1214         * ecore.cs (DoSimpleNameResolve): Expand CS0038 check to all names
1215         visible from inside a nested class, not just the names of the
1216         immediately enclosing class.
1217         Fix for bug #60730.
1218
1219 2004-06-24  Raja R Harinath  <rharinath@novell.com>
1220
1221         * expression.cs (BetterConversion): Remove buggy special-case
1222         handling of "implicit constant expression conversions".  At this
1223         point, we already know that the conversion is possible -- we're
1224         only checking to see which is better.
1225
1226 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1227
1228         * cs-parser.jay: Added error CS0210 test.
1229
1230 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1231
1232         * cs-parser.jay: Added error CS0134 test.
1233
1234 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1235
1236         Fix bug #52507
1237         * cs-parser.jay: Added error CS0145 test.
1238
1239 2004-06-24  Marek Safar  <marek.safar@seznam.cz>
1240
1241         * class.cs (Operator.Define): Added test for errors CS0553, CS0554.
1242
1243 2004-06-23  Ben Maurer  <bmaurer@ximian.com>
1244         
1245         * expression.cs (StackAlloc.Resolve): The argument may not
1246         be a constant; deal with this case.
1247         
1248 2004-06-23  Marek Safar  <marek.safar@seznam.cz>
1249
1250         * attribute.cs (IndexerName_GetIndexerName): Renamed to
1251         GetIndexerAttributeValue.
1252         (ScanForIndexerName): Renamed to GetIndexerNameAttribute.
1253
1254         * class.cs (Indexer.Define): Added error tests for CS0415,
1255         CS0609.
1256
1257 2004-06-23  Miguel de Icaza  <miguel@ximian.com>
1258
1259         * attribute.cs (Attribute.Resolve): Keep field code in sync with
1260         property code.
1261
1262 2004-06-23  Martin Baulig  <martin@ximian.com>
1263
1264         * flowanalysis.cs (UsageVector.MergeChild): If we're a loop and we
1265         neither return nor throw, reset the barrier as well.  Fixes #60457.
1266
1267 2004-06-22  Atsushi Enomoto  <atsushi@ximian.com>
1268
1269         * class.cs : EventAttributes is now set to None by default.
1270           This fixes bug #60459.
1271
1272 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1273
1274         Fix bug #60219
1275         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1276         Don't throw exception but return null (it's sufficient now).
1277
1278 2004-06-18  Marek Safar  <marek.safar@seznam.cz>
1279
1280         * typemanager.cs (GetArgumentTypes): Faster implementation.
1281
1282 2004-06-18  Martin Baulig  <martin@ximian.com>
1283
1284         * attribute.cs (Attribute.Resolve): Check whether we're an
1285         EmptyCast which a Constant child.  Fixes #60333.
1286
1287 2004-06-17  Ben Maurer  <bmaurer@ximian.com>
1288
1289         * statement.cs (EmitCollectionForeach): Account for the fact that
1290         not all valuetypes are in areas which we can take the address of.
1291         For these variables, we store to a temporary variable. Also, make
1292         sure that we dont emit a `callvirt' on a valuetype method.
1293
1294 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1295
1296         * expression.cs (StackAlloc.DoReSolve): Added test for
1297         negative parameter (CS0247).
1298
1299 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1300
1301         Fix bug #59792
1302         * class.cs: (Event.DelegateMethod.Emit): Added synchronization flag.
1303
1304 2004-06-15  Marek Safar  <marek.safar@seznam.cz>
1305
1306         Fix bug #59781
1307         * expression.cs: (Binary.DoNumericPromotions): Added conversion for
1308         ulong.
1309
1310 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1311
1312         Fix bug #58254 & cs1555.cs, cs1556.cs
1313         * driver.cs (MainDriver): Added tests for errors CS1555, CS1556.
1314
1315 2004-06-14  Marek Safar  <marek.safar@seznam.cz>
1316
1317         * cs-parser.jay: Added error CS1669 test for indexers.
1318
1319 2004-06-18  Martin Baulig  <martin@ximian.com>
1320
1321         * generics.cs (GenericMethod.ctor): Don't take an Attributes
1322         argument.  Fixes #60441.
1323
1324 2004-06-16  Ben Maurer  <bmaurer@ximian.com>
1325         * ecore.cs (MethodGroupExpr.Name): Revert Martin's patch.
1326         The name needs to have the actual name of the method in order
1327         for other tests (such as the one in OverloadResolve for Invoke
1328         on a delegate) to work. As well, it does not really help
1329         error reporting because the method group had multiple methods.
1330         * Makefile: Remove MCS_DEBUG, you can enable with the DEBUG_FLAGS.
1331         Make profiling work.
1332         
1333 2004-06-13  Martin Baulig  <martin@ximian.com>
1334
1335         * cs-parser.jay: Don't allow generic attributes.
1336
1337 2004-06-13  Martin Baulig  <martin@ximian.com>
1338
1339         * class.cs (MemberBase.DoDefineBase): New protected method.
1340         (MemberBase.DoDefine): Compute the `flags' in the new
1341         DoDefineBase() which must be called first.
1342         (Method.Define): Call DoDefineBase() first so we have the flags
1343         when defining the generic method.
1344
1345         * cs-parser.jay (interface_method_declaration): Support generic methods.
1346
1347 2004-06-13  Martin Baulig  <martin@ximian.com>
1348
1349         * decl.cs (TypeName): Removed.
1350         (MemberName): Removed TypeName and MemberNow; now we just have
1351         MemberName.
1352
1353         * cs-parser.jay: Don't distinguish between type arguments and type
1354         parameters in the grammar and simplified the rules a bit.  The
1355         reduce/reduce conflicts are now gone (except the one we inherited
1356         from mcs).
1357
1358 2004-06-11  Martin Baulig  <martin@ximian.com>
1359
1360         * expression.cs (Invocation.IsParamsMethodApplicable): We need to
1361         call this twice: for params and varargs methods.
1362
1363 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1364
1365         * class.cs:
1366         (FieldBase.DoDefine, PropertyBase.DoDefine): Added error test CS0610.
1367
1368 2004-06-11  Marek Safar  <marek.safar@seznam.cz>
1369
1370         * attribute.cs (Attribute.GetValidTargets): Made public.
1371
1372         * class.cs: 
1373         (AbstractPropertyEventMethod): New class for better code sharing.
1374         (AbstractPropertyEventMethod.ApplyAttributeBuilder): Add error
1375         CS1667 report.
1376         (PropertyMethod, DelegateMethod): Derived from AbstractPropertyEventMethod
1377
1378 2004-06-09  Martin Baulig  <martin@ximian.com>
1379
1380         * cs-parser.jay: Removed a reduce/reduce conflict.
1381
1382 2004-06-03  Martin Baulig  <martin@ximian.com>
1383
1384         * generic.cs (ConstructedType.GetMemberAccess): Renamed to
1385         GetSimpleName() and return a SimpleName.
1386
1387         * ecore.cs (SimpleName.Arguments): New public field.
1388         (SimpleName): Added overloaded ctor which takes an additional
1389         TypeArguments argument.
1390         (SimpleName.SimpleNameResolve): Added support for generic methods.
1391         (MethodGroupExpr.ResolveGeneric): New public method.  The code was
1392         formerly in MemberAccess.DoResolve(), but we also need it in
1393         SimpleNameResolve().
1394
1395         * expression.cs (MemberAccess.DoResolve): Use the new
1396         MethodGroupExpr.ResolveGeneric().       
1397
1398 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1399
1400         * decl.cs: If possible, use lookuptypedirect here. We can only do
1401         this if there is no `.' after the namespace. Avoids using
1402         LookupType, which does lots of slow processing.
1403         (FindNestedType) New method, does what it says :-).
1404         * namespace.cs: use LookupTypeDirect.
1405         * rootcontext.cs: use membercache, if possible.
1406         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1407
1408 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1409
1410         * expression.cs:
1411         According to the spec, 
1412
1413         In a member access of the form E.I, if E is a single identifier,
1414         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1415         field, property, localvariable, or parameter with the same type as
1416         the meaning of E as a type-name (§3.8), then both possible
1417         meanings of E are permitted.
1418
1419         We did not check that E as a simple-name had the same type as E as
1420         a type name.
1421
1422         This trivial check gives us 5-7% on bootstrap time.
1423
1424 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1425
1426         * expression.cs (Invocation.OverloadResolve): Avoid the
1427         use of hashtables and boxing here by allocating on demand.
1428
1429 2004-05-30  Martin Baulig  <martin@ximian.com>
1430
1431         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1432         we're doing a silent lookup.  Don't try to lookup nested types in
1433         TypeManager.object_type (thanks to Ben Maurer).
1434
1435 2004-05-30  Martin Baulig  <martin@ximian.com>
1436
1437         Committing a patch from Ben Maurer.
1438
1439         * rootcontext.cs (RootContext.LookupType): Cache negative results.
1440
1441 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1442
1443         * convert.cs: add a trivial cache for overload operator resolution.
1444
1445 2004-05-31  Marek Safar  <marek.safar@seznam.cz>
1446
1447         * attribute.cs
1448         (AttributeTester.GetObsoleteAttribute): Returns instance of
1449         ObsoleteAttribute when type is obsolete.
1450
1451         * class.cs
1452         (TypeContainer.VerifyObsoleteAttribute): Override.
1453         (Method.GetSignatureForError): New method for usage when MethodBuilder is null.
1454         (MethodCode.VerifyObsoleteAttribute): Override.
1455         (MemberBase.VerifyObsoleteAttribute): Override.
1456
1457         * decl.cs
1458         (MemberCore.CheckUsageOfObsoleteAttribute): Tests presence of ObsoleteAttribute
1459         and report proper error.
1460
1461         *delegate.cs
1462         (Delegate.VerifyObsoleteAttribute): Override.
1463
1464         * ecore.cs
1465         (Expression.CheckObsoleteAttribute): Tests presence of ObsoleteAttribute
1466         and report proper error.
1467         (FieldExpr.DoResolve): Added tests for ObsoleteAttribute.
1468
1469         * enum.cs
1470         (Enum.GetObsoleteAttribute): Returns ObsoleteAttribute for both enum type
1471         and enum member.
1472
1473         * expression.cs
1474         (Probe.DoResolve, Cast.DoResolve, LocalVariableReference.DoResolve,
1475         New.DoResolve, SizeOf.DoResolve, TypeOf.DoResolce, MemberAccess.DoResolve):
1476         Added test for ObsoleteAttribute.
1477
1478         * statement.cs
1479         (Catch): Derived from Statement.
1480
1481 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1482
1483         * decl.cs: If possible, use lookuptypedirect here. We can only do
1484         this if there is no `.' after the namespace. Avoids using
1485         LookupType, which does lots of slow processing.
1486         (FindNestedType) New method, does what it says :-).
1487         * namespace.cs: use LookupTypeDirect.
1488         * rootcontext.cs: use membercache, if possible.
1489         * typemanager.cs (LookupTypeDirect): Cache negative hits too.
1490
1491 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1492
1493         * expression.cs:
1494         According to the spec, 
1495
1496         In a member access of the form E.I, if E is a single identifier,
1497         and if the meaning of E as a simple-name (§7.5.2) is a constant,
1498         field, property, localvariable, or parameter with the same type as
1499         the meaning of E as a type-name (§3.8), then both possible
1500         meanings of E are permitted.
1501
1502         We did not check that E as a simple-name had the same type as E as
1503         a type name.
1504
1505         This trivial check gives us 5-7% on bootstrap time.
1506
1507 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1508
1509         Fixed bug #59071 & cs0160.cs
1510         * statement.cs (Try.Resolve): Check here whether order of catch
1511         clauses matches their dependencies.
1512
1513 2004-05-30  Marek Safar  <marek.safar@seznam.cz>
1514
1515         Fixed bug #58624
1516         * ecore.cs (SimpleName.SimpleNameResolve): Added test for
1517         unsafe type.
1518
1519 2004-05-30 Ben Maurer  <bmaurer@users.sourceforge.net>
1520
1521         * expression.cs (Invocation.OverloadResolve): Avoid the
1522         use of hashtables and boxing here by allocating on demand.
1523
1524 2004-05-30  Martin Baulig  <martin@ximian.com>
1525
1526         * rootcontext.cs (RootContext.LookupType): Don't cache things if
1527         we're doing a silent lookup.  Don't try to lookup nested types in
1528         TypeManager.object_type (thanks to Ben Maurer).
1529
1530 2004-05-30  Martin Baulig  <martin@ximian.com>
1531
1532         Committing a patch from Ben Maurer.
1533
1534         * rootcontext.cs (RootContext.LookupType): Cache negative results.      
1535
1536 2004-05-29  Martin Baulig  <martin@ximian.com>
1537
1538         * class.cs (IMethodData.ShouldIgnore): New method.
1539
1540         * typemanager.cs (TypeManager.MethodFlags): Don't take a
1541         `Location' argument, we don't need it anywhere.  Use
1542         `IMethodData.ShouldIgnore ()' instead of
1543         `MethodData.GetMethodFlags ()'.
1544         (TypeManager.AddMethod): Removed.
1545         (TypeManager.AddMethod2): Renamed to AddMethod.
1546
1547 2004-05-29  Martin Baulig  <martin@ximian.com>
1548
1549         Committing a patch from Benjamin Jemlich <pcgod@gmx.net>.
1550
1551         * convert.cs (Convert.ImplicitReferenceConversion): If we're
1552         converting from a class type S to an interface type and we already
1553         have an object on the stack, don't box it again.  Fixes #52578.
1554
1555 2004-05-29  Martin Baulig  <martin@ximian.com>
1556
1557         * class.cs (ConstructorInitializer.GetOverloadedConstructor):
1558         Added support for `params' parameters.  Fixes #59267.
1559
1560 2004-05-29  Martin Baulig  <martin@ximian.com>
1561
1562         * literal.cs (NullPointer): Provide a private .ctor which sets
1563         `type' to TypeManager.object_type.  Fixes #59048.
1564
1565 2004-05-29  Martin Baulig  <martin@ximian.com>
1566
1567         * expression.cs (MemberAccess.ResolveMemberAccess): If we're an
1568         EventExpr, set `ee.InstanceExpression = left'.  Fixes #59188.
1569
1570         * ecore.cs (EventExpr.instance_expr): Make the field private.
1571
1572 2004-05-26  Marek Safar  <marek.safar@seznam.cz>
1573
1574         Fixed bug #50080 & cs0214-2.cs
1575         * expression.cs (Cast.DoResolve): Check unsafe context here.
1576         
1577         * statement.cs (Resolve.DoResolve): Likewise.
1578
1579 2004-05-26  Martin Baulig  <martin@ximian.com>
1580
1581         * namespace.cs (NamespaceEntry.Lookup): Added `bool silent'.
1582
1583         * rootcontext.cs (RootContext.NamespaceLookup): Added `bool silent'.
1584         (RootContext.LookupType): Pass down the `silent' flag.
1585
1586 2004-05-25  Martin Baulig  <martin@ximian.com>
1587
1588         * expression.cs
1589         (MethodGroupExpr.IdenticalTypeName): New public property.
1590         (Invocation.DoResolve): Don't report a CS0176 if the "instance"
1591         expression actually refers to a type.
1592
1593 2004-05-25  Martin Baulig  <martin@ximian.com>
1594
1595         * expression.cs (Invocation.DoResolve): Applied Ben Maurer's patch
1596         for #56176 and made it actually work.
1597
1598 2004-05-25  Martin Baulig  <martin@ximian.com>
1599
1600         * ecore.cs (Expression.CacheTemporaries): Make this virtual.
1601         (FieldExpr, PropertyExpr): Override and implement
1602         CacheTemporaries.  Fixes #52279.
1603
1604 2004-05-25  Miguel de Icaza  <miguel@ximian.com>
1605
1606         * location.cs: In the new compiler listing a file twice is a
1607         warning, not an error.
1608
1609 2004-05-24  Martin Baulig  <martin@ximian.com>
1610
1611         * enum.cs (Enum.DefineType): For the `BaseType' to be a
1612         TypeLookupExpression; otherwise, report a CS1008.  Fixes #58571.
1613
1614 2004-05-24  Martin Baulig  <martin@ximian.com>
1615
1616         * decl.cs (DeclSpace.FindType): Try doing an alias lookup before
1617         walking the `using' list.  Fixes #53921.
1618
1619 2004-05-24  Martin Baulig  <martin@ximian.com>
1620
1621         * const.cs (Const.LookupConstantValue): Added support for
1622         EmptyCast's; fixes #55251.
1623
1624 2004-05-24  Martin Baulig  <martin@ximian.com>
1625
1626         * ecore.cs (SimpleName.SimpleNameResolve): Renamed to
1627         DoSimpleNameResolve() and provide a SimpleNameResolve() wrapper
1628         which does the CS0135 check.  The reason is that we first need to
1629         check whether the variable actually exists.
1630
1631 2004-05-24  Martin Baulig  <martin@ximian.com>
1632
1633         * class.cs (MemberBase.DoDefine): Use DeclSpace.FindType() rather
1634         than RootContext.LookupType() to find the explicit interface
1635         type.  Fixes #58584.
1636
1637 2004-05-24  Raja R Harinath  <rharinath@novell.com>
1638
1639         * Makefile: Simplify.  Use executable.make.
1640         * mcs.exe.sources: New file.  List of sources of mcs.exe.
1641
1642 2004-05-24  Anders Carlsson  <andersca@gnome.org>
1643
1644         * decl.cs:
1645         * enum.cs:
1646         Use the invariant culture when doing String.Compare for CLS case
1647         sensitivity.
1648         
1649 2004-05-23  Martin Baulig  <martin@ximian.com>
1650
1651         * decl.cs (DeclSpace.FindType): Only check the `using' list if we
1652         don't have any dots.  Fixes #52622, added cs0246-8.cs.
1653
1654         * namespace.cs (NamespaceEntry.Lookup): Likewise.
1655
1656 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1657
1658         * class.cs (MemberBase.Define): Reuse MemberType member for 
1659         resolved type. Other methods can use it too.
1660
1661 2004-05-23  Martin Baulig  <martin@ximian.com>
1662
1663         * ecore.cs (SimpleName.SimpleNameResolve): Only report a CS0135 if
1664         the variable also exists in the current block (otherwise, we need
1665         to report a CS0103).  Fixes #58670.
1666
1667 2004-05-23  Martin Baulig  <martin@ximian.com>
1668
1669         * flowanalysis.cs (Reachability.Reachable): Compute this
1670         on-the-fly rather than storing it as a field.
1671
1672 2004-05-23  Martin Baulig  <martin@ximian.com>
1673
1674         * flowanalysis.cs (Reachability.And): Manually compute the
1675         resulting `barrier' from the reachability.      
1676        
1677 2004-05-23  Marek Safar  <marek.safar@seznam.cz>
1678
1679         Fix bug #57835
1680         * attribute.cs (AttributeTester.GetMethodObsoleteAttribute): Returns
1681         instance of ObsoleteAttribute when symbol is obsolete.
1682
1683         * class.cs
1684         (IMethodData): Extended interface for ObsoleteAttribute support.
1685
1686 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1687
1688         * attribute.cs: Fix bug #55970
1689
1690 2004-05-22  Marek Safar  <marek.safar@seznam.cz>
1691
1692         Fix bug #52705
1693         * attribute.cs
1694         (GetObsoleteAttribute): New method. Creates the instance of
1695         ObsoleteAttribute.
1696         (AttributeTester.GetMemberObsoleteAttribute): Returns instance of
1697         ObsoleteAttribute when member is obsolete.
1698         (AttributeTester.Report_ObsoleteMessage): Common method for
1699         Obsolete error/warning reporting.
1700
1701         * class.cs
1702         (TypeContainer.base_classs_type): New member for storing parent type.
1703
1704         * decl.cs
1705         (MemberCore.GetObsoleteAttribute): Returns instance of ObsoleteAttribute
1706         for this MemberCore.
1707
1708 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1709
1710         * attribute.cs, const.cs: Fix bug #58590
1711
1712 2004-05-21  Martin Baulig  <martin@ximian.com>
1713
1714         * flowanalysis.cs (FlowBranching.MergeTopBlock): Don't check for
1715         out parameters if the end of the method is unreachable.  Fixes
1716         #58098. 
1717
1718 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1719
1720         * codegen.cs, cs-parser.jay: Removed SetAttributes method.
1721         Hari was right, why extra method.
1722
1723 2004-05-21  Marek Safar  <marek.safar@seznam.cz>
1724
1725         * attribute.cs, cs-parser.jay: Fix errors/cs0579-7.cs.
1726
1727 2004-05-20  Martin Baulig  <martin@ximian.com>
1728
1729         * delegate.cs: Convert this file to Unix mode - like the original
1730         version in mcs is.
1731
1732 2004-05-20  Martin Baulig  <martin@ximian.com>
1733
1734         * attribute.cs: Convert this file to Unix mode - like the original
1735         version in mcs is.
1736
1737 2004-05-19  Marek Safar  <marek.safar@seznam.cz>
1738
1739        Fix bug #58688 (MCS does not report error when the same attribute
1740        is assigned twice)
1741
1742        * attribute.cs (Attribute.Emit): Distinction between null and default.
1743
1744 2004-05-19  Raja R Harinath  <rharinath@novell.com>
1745
1746        * cs-parser.jay (attribute): Create a GlobalAttribute for the case
1747        of a top-level attribute without an attribute target.
1748        * attribute.cs (Attribute.Error_AttributeConstructorMismatch): 
1749        Make non-static.
1750        (Attribute.Conditional_GetConditionName), 
1751        (Attribute.Obsolete_GetObsoleteMessage): Update.
1752        (Attribute.IndexerName_GetIndexerName): New.  Attribute-specific
1753        part of ScanForIndexerName.
1754        (Attribute.CanIgnoreInvalidAttribute): New function.
1755        (Attribute.ScanForIndexerName): Move to ...
1756        (Attributes.ScanForIndexerName): ... here.
1757        (Attributes.Attrs): Rename from now-misnamed AttributeSections.
1758        (Attributes.Search): New internal variant that can choose not to
1759        complain if types aren't resolved.  The original signature now
1760        complains.
1761        (Attributes.GetClsCompliantAttribute): Use internal variant, with
1762        complaints suppressed.
1763        (GlobalAttribute.CheckAttributeType): Overwrite ds.NamespaceEntry
1764        only if it not useful.
1765        (CanIgnoreInvalidAttribute): Ignore assembly attribute errors at
1766        top-level for attributes that are shared between the assembly
1767        and a top-level class.
1768        * parameter.cs (ImplicitParameter): Rename from ParameterAtribute.
1769        * class.cs: Update to reflect changes.
1770        (DefineIndexers): Fuse loops.
1771        * codegen.cs (GetAssemblyName): Update to reflect changes.  Accept
1772        a couple more variants of attribute names.
1773
1774 2004-05-18  Marek Safar  <marek.safar@seznam.cz>
1775
1776         Fix bug #52585 (Implemented explicit attribute declaration)
1777
1778         * attribute.cs:
1779         (Attributable.ValidAttributeTargets): New abstract method. It gets
1780         list of valid attribute targets for explicit target declaration.
1781         (Attribute.Target): It holds target itself.
1782         (AttributeSection): Removed.
1783         (Attribute.CheckTargets): New method. It checks whether attribute
1784         target is valid for the current element.
1785
1786         * class.cs:
1787         (EventProperty): New class. For events that are declared like
1788         property (with add and remove accessors).
1789         (EventField): New class. For events that are declared like field.
1790         class.cs
1791
1792         * cs-parser.jay: Implemented explicit attribute target declaration.
1793
1794         * class.cs, decl.cs, delegate.cs, enum.cs, parameter.cs:        
1795         Override ValidAttributeTargets.
1796
1797         * parameter.cs:
1798         (ReturnParameter): Class for applying custom attributes on 
1799         the return type.
1800         (ParameterAtribute): New class. Class for applying custom
1801         attributes on the parameter type.
1802
1803 2004-05-17  Miguel de Icaza  <miguel@ximian.com>
1804
1805         * class.cs (MemberBase.DoDefine): Pass UNSAFE on interface
1806         definitions. 
1807
1808         (Method): Allow UNSAFE here.
1809
1810         * modifiers.cs: Support unsafe reporting.
1811
1812 2004-05-17  Marek Safar  <marek.safar@seznam.cz>
1813
1814         * decl.cs: Fix bug #58478.
1815
1816 2004-05-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1817
1818         * statement.cs: When checking for unreachable code on an EmptyStatement,
1819         set the location. Fixes bug #58488.
1820
1821 2004-05-13  Miguel de Icaza  <miguel@ximian.com>
1822
1823         * driver.cs: Add -pkg handling.
1824
1825         From Gonzalo: UseShelLExecute=false
1826
1827 2004-05-12  Marek Safar  <marek.safar@seznam.cz>
1828
1829         * attribute.cs:
1830         (Attribute.GetAttributeTargets): New method. Gets AttributeTargets
1831         for attribute.
1832         (Attribute.IsClsCompliaceRequired): Moved to base for better
1833         accesibility.
1834         (Attribute.UsageAttribute): New property for AttributeUsageAttribute
1835         when attribute is AttributeUsageAttribute.
1836         (Attribute.GetValidTargets): Simplified.
1837         (Attribute.GetAttributeUsage): New method returns AttributeUsage
1838         attribute for this type.
1839         (Attribute.ApplyAttributes): Method renamed to Emit and make
1840         non-static.
1841         (GlobalAttributeSection): New class for special handling of global
1842         attributes (assembly, module).
1843         (AttributeSection.Emit): New method.
1844
1845         * class.cs: Implemented Attributable abstract methods.
1846         (MethodCore.LabelParameters): Moved to Parameter class.
1847         (Accessor): Is back simple class.
1848         (PropertyMethod): Implemented Attributable abstract class.
1849         (DelegateMethod): Implemented Attributable abstract class.
1850         (Event): New constructor for disctintion between normal Event
1851         and Event with accessors.
1852
1853         * cs-parser.jay: Used new Event ctor and GlobalAttributeSection.
1854
1855         * codegen.cs, const.cs, decl.cs, delegate.cs:
1856         (CommonAssemblyModulClass): Implemented Attributable abstract class
1857         and simplified.
1858
1859         * enum.cs: Implement IAttributeSupport interface.
1860         (EnumMember): New class for emum members. Implemented Attributable
1861         abstract class
1862
1863         * parameter.cs:
1864         (ParameterBase): Is abstract.
1865         (ReturnParameter): New class for easier [return:] attribute handling.
1866
1867         * typemanager.cs: Removed builder_to_attr.
1868
1869 2004-05-11  Raja R Harinath  <rharinath@novell.com>
1870
1871         Fix bug #57151.
1872         * attribute.cs (Attribute.GetPositionalValue): New function.
1873         * class.cs (TypeContainer.VerifyMembers): New function.
1874         (TypeContainer.Emit): Use it.
1875         (ClassOrStruct): New base class for Class and Struct.
1876         (ClassOrStruct.ApplyAttributeBuilder): New function.  Note if 
1877         StructLayout(LayoutKind.Explicit) was ascribed to the struct or
1878         class.
1879         (ClassOrStruct.VerifyMembers): If the struct is explicitly laid out,
1880         then each non-static field should have a FieldOffset attribute.
1881         Otherwise, none of the fields should have a FieldOffset attribute.
1882         * rootcontext.cs (RootContext.ResolveCore): Resolve StructLayout 
1883         and FieldOffset attributes.
1884         * typemanager.cs (TypeManager.struct_layout_attribute_type)
1885         (TypeManager.field_offset_attribute_type): New core types.
1886         (TypeManager.InitCoreTypes): Initialize them.
1887
1888 2004-05-11  Michal Moskal  <malekith@pld-linux.org>
1889
1890         * class.cs (Event.RemoveDelegateMethod.DelegateMethodInfo):
1891         Return correct type.
1892         From bug #58270.
1893
1894 2004-05-09  Miguel de Icaza  <miguel@ximian.com>
1895
1896         * expression.cs (Binary.DoNumericPromotions): 0 long constant can
1897         be implicitly converted to ulong.
1898         
1899         * expression.cs: The logic for allowing operator &, | and ^ worked
1900         was wrong, it worked before because we did not report an error in
1901         an else branch.  Fixes 57895.
1902
1903         * class.cs: Applied patch from iain@mccoy.id.au Iain McCoy to
1904         allow volatile fields to be reference types.
1905
1906 2004-05-07  Miguel de Icaza  <miguel@ximian.com>
1907
1908         * driver.cs: Add support for /debug-
1909
1910 2004-05-07  Raja R Harinath  <rharinath@novell.com>
1911
1912         * attribute.cs (Attribute.CheckAttributeType, Attribute.ResolveType): 
1913         Add a 'complain' parameter to silence errors.
1914         (Attribute.Resolve): Update to changes.  Put in sanity check to catch
1915         silently overlooked type-resolutions.
1916         (Attribute.ScanForIndexerName, Attribute.DefinePInvokeMethod): Update
1917         to reflect changes.
1918         (Attributes.Search): New function.
1919         (Attributes.Contains, Attributes.GetClsCompliantAttribute): Use Search.
1920         (Attributes.GetAttributeFullName): Remove hack.
1921         * class.cs (MethodCore.LabelParameters, MethodData.ApplyAttributes): 
1922         Update to reflect changes.
1923         * codegen.cs (CommonAssemblyModulClass.GetClsCompliantAttribute):
1924         Use Attributes.Search instead of nested loops.
1925
1926 2004-05-07  Marek Safar  <marek.safar@seznam.cz>
1927
1928         * decl.cs:
1929         (MemberCore.Flags): Extended for caching presence of CLSCompliantAttribute.
1930         (MemberCore.VerifyClsCompliance): Implemented CS3019 error report.
1931         (DeclSpace.GetClsCompliantAttributeValue): Returns simple bool.
1932
1933         * report.cs: (Report.Warning): Renamed to Warning_T because of
1934         parameter collision.
1935
1936 2004-05-05  Raja R Harinath  <rharinath@novell.com>
1937
1938         * expression.cs (MemberAccess.ResolveMemberAccess):
1939         Exit with non-zero status after Report.Error.
1940         * rootcontext.cs (RootContext.BootstrapCorlib_ResolveDelegate):
1941         Likewise.
1942         * typemanager.cs (TypeManager.CoreLookupType): Likewise.
1943
1944 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1945
1946         * support.cs: Don't hang when the file is empty.
1947
1948 2004-05-04  Lluis Sanchez Gual  <lluis@ximian.com>
1949
1950         * support.cs: In SeekableStreamReader, compute the preamble size of the
1951           underlying stream. Position changes should take into account that initial
1952           count of bytes.
1953
1954 2004-05-03  Todd Berman  <tberman@sevenl.net>
1955
1956         * driver.cs: remove unused GetSysVersion function.
1957
1958 2004-05-03  Todd Berman  <tberman@sevenl.net>
1959
1960         * driver.cs: Remove the hack from saturday, as well as the hack
1961         from jackson (LoadAssemblyFromGac), also adds the CWD to the
1962         link_paths to get that bit proper.
1963
1964 2004-05-01  Todd Berman  <tberman@sevenl.net>
1965
1966         * driver.cs: Try a LoadFrom before a Load, this checks the current
1967         path. This is currently a bug in mono that is be fixed, however, this
1968         provides a workaround for now. This will be removed when the bug
1969         is fixed.
1970
1971 2004-05-01  Sebastien Pouliot  <sebastien@ximian.com>
1972
1973         * CryptoConvert.cs: Updated to latest version. Fix issue with 
1974         incomplete key pairs (#57941).
1975
1976 2004-05-01  Todd Berman  <tberman@sevenl.net>
1977
1978         * driver.cs: Remove '.' from path_chars, now System.* loads properly
1979         from the GAC
1980
1981 2004-04-30  Jackson Harper  <jackson@ximian.com>
1982
1983         * codegen.cs: Open keys readonly.
1984         
1985 2004-04-30  Gonzalo Paniagua Javier <gonzalo@ximian.com>
1986
1987         * typemanager.cs: don't report cyclic struct layout when a struct
1988         contains 2 or more fields of the same type. Failed for Pango.AttrShape
1989         which has 2 Pango.Rectangle fields.
1990
1991 2004-04-29 Ben Maurer  <bmaurer@users.sourceforge.net>
1992
1993         * expression.cs: Handle IntPtr comparisons with IL code
1994         rather than a method call.
1995
1996 2004-04-29  Martin Baulig  <martin@ximian.com>
1997
1998         * ecore.cs (PropertyExpr.FindAccessor): New private method.  Walk
1999         the list of PropertyInfo's in class hierarchy and find the
2000         accessor.  Fixes #56013.
2001
2002 2004-04-29  Martin Baulig  <martin@ximian.com>
2003
2004         * typemanager.cs (TypeManager.CheckStructCycles): Fixed.
2005
2006 2004-04-29  Martin Baulig  <martin@ximian.com>
2007
2008         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2009
2010         * ecore.cs (FieldExpr.AddressOf): Make this work for valuetypes.
2011
2012 2004-04-29  Martin Baulig  <martin@ximian.com>
2013
2014         * class.cs (ConstructorInitializer.Resolve): Check whether the
2015         parent .ctor is accessible.  Fixes #52146.
2016
2017 2004-04-29  Martin Baulig  <martin@ximian.com>
2018
2019         Applying a patch from Benjamin Jemlich <pcgod@gmx.net>.
2020
2021         * statement.cs (Using.EmitLocalVariableDecls): Use
2022         TypeManager.idisposable_type, not typeof (IDisposable).
2023         (Foreach.EmitCollectionForeach): Added support for valuetypes.
2024
2025 2004-04-29  Martin Baulig  <martin@ximian.com>
2026
2027         * class.cs (Event.Define): Don't emit the field and don't set
2028         RTSpecialName and SpecialName for events on interfaces.  Fixes
2029         #57703. 
2030
2031 2004-04-29  Raja R Harinath  <rharinath@novell.com>
2032
2033         Refactor Attribute.ApplyAttributes.
2034         * attribute.cs (Attributable): New base class for objects that can
2035         have Attributes applied on them.
2036         (Attribute): Make AttributeUsage fields public.
2037         (Attribute.GetFieldValue, Attribute.GetMarshal): Make non-static.
2038         (Attribute.IsInternalCall): New property.
2039         (Attribute.UsageAttr): Convert to a public read-only property.
2040         (Attribute.CheckAttributeType): Use a DeclSpace, not an EmitContext.
2041         (Attribute.ResolveType, Attribute.Resolve)
2042         (Attribute.ScanForIndexerName): Update to reflect changes.
2043         (Attribute.CheckAttributeTarget): Re-format.
2044         (Attribute.ApplyAttributes): Refactor, to various
2045         Attributable.ApplyAttributeBuilder methods.
2046         * decl.cs (MemberCore): Make Attributable.
2047         * class.cs (Accessor): Make Attributable.
2048         (MethodData.ApplyAttributes): Use proper attribute types, not
2049         attribute names.
2050         (TypeContainer.LabelParameters): Pass Parameter to ApplyAttributes.
2051         (TypeContainer.ApplyAttributeBuilder)
2052         (Method.ApplyAttributeBuilder, Constructor.ApplyAttributeBuilder)
2053         (Field.ApplyAttributeBuilder, Accessor.ApplyAttributeBuilder)   
2054         (PropertyBase.ApplyAttributeBuilder, Event.ApplyAttributeBuilder)
2055         (Operator.ApplyAttributeBuilder): New factored-out methods.
2056         * const.cs (Const.ApplyAttributeBuilder): Likewise.
2057         * delegate.cs (Delegate.ApplyAttributeBuilder): Likewise.
2058         * enum.cs (Enum.ApplyAttributeBuilder): Likewise.
2059         * parameter.cs (ParameterBase): New Attributable base class
2060         that can also represent Return types.
2061         (Parameter): Update to the changes.
2062
2063 2004-04-29  Jackson Harper  <jackson@ximian.com>
2064
2065         * driver.cs: Prefer the corlib system version when looking for
2066         assemblies in the GAC. This is still a hack, but its a better hack
2067         now.
2068         
2069 2004-04-29  Marek Safar  <marek.safar@seznam.cz>
2070
2071         * decl.cs, enum.cs: Improved error 3005 reporting.
2072   
2073         * report.cs (SymbolRelatedToPreviousError): New method for error reporting.
2074         (related_symbols): New private member for list of symbols
2075         related to reported error/warning.
2076         
2077         * tree.cs: Do not use now obsolete Report.LocationOfPreviousError.
2078
2079 2004-04-29  Martin Baulig  <martin@ximian.com>
2080
2081         * ecore.cs (Expression.Constantify): If we're an enum and
2082         TypeManager.TypeToCoreType() doesn't give us another type, use
2083         t.UnderlyingSystemType.  Fixes #56178.  
2084
2085 2004-04-29  Martin Baulig  <martin@ximian.com>
2086
2087         * decl.cs (MemberCache.SetupCacheForInterface): Look over all our
2088         interfaces and for each interface, only add members directly
2089         declared in that interface.  Fixes #53255.
2090
2091 2004-04-28  Martin Baulig  <martin@ximian.com>
2092
2093         * expression.cs (ConditionalLogicalOperator): Use a temporary
2094         variable for `left' to avoid that we evaluate it more than once;
2095         bug #52588.
2096
2097 2004-04-28  Martin Baulig  <martin@ximian.com>
2098
2099         * expression.cs (ComposedCast.DoResolveAsTypeStep): Don't allow
2100         `void[]' (CS1547).
2101
2102 2004-04-28  Martin Baulig  <martin@ximian.com>
2103
2104         * statement.cs (LocalInfo.Resolve): Check whether the type is not
2105         void (CS1547).
2106
2107         * class.cs (MemberBase.CheckParameters, FieldBase.DoDefine): Check
2108         whether the type is not void (CS1547).
2109
2110 2004-04-28  Martin Baulig  <martin@ximian.com>
2111
2112         * expression.cs (Unary.DoResolveLValue): Override this and report
2113         CS0131 for anything but Operator.Indirection.
2114
2115 2004-04-28  Martin Baulig  <martin@ximian.com>
2116
2117         Committing a patch from Ben Maurer; see bug #50820.
2118
2119         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2120         check for classes.
2121
2122         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2123         classes.        
2124
2125 2004-04-28  Martin Baulig  <martin@ximian.com>
2126
2127         Committing a patch from Ben Maurer; see bug #50820.
2128
2129         * typemanager.cs (TypeManager.FilterWithClosure): Added CS1540
2130         check for classes.
2131
2132         * ecore.cs (Expression.MemberLookupFailed): Added CS1540 check for
2133         classes.        
2134
2135 2004-04-28  Martin Baulig  <martin@ximian.com>
2136
2137         * statement.cs (Block.LookupLabel): Also lookup in implicit child blocks.
2138         (Block.AddLabel): Call DoLookupLabel() to only search in the
2139         current block.
2140
2141 2004-04-28  Martin Baulig  <martin@ximian.com>
2142
2143         * cfold.cs (ConstantFold.BinaryFold): Added special support for
2144         comparing StringConstants and NullLiterals in Equality and Inequality.
2145
2146 2004-04-28  Jackson Harper  <jackson@ximian.com>
2147
2148         * driver.cs: Attempt to load referenced assemblies from the
2149         GAC. This is the quick and dirty version of this method that
2150         doesnt take into account versions and just takes the first
2151         canidate found. Will be good enough for now as we will not have more
2152         then one version installed into the GAC until I update this method.
2153
2154 2004-04-28  Martin Baulig  <martin@ximian.com>
2155
2156         * typemanager.cs (TypeManager.CheckStructCycles): New public
2157         static method to check for cycles in the struct layout.
2158
2159         * rootcontext.cs (RootContext.PopulateTypes): Call
2160         TypeManager.CheckStructCycles() for each TypeContainer.
2161         [Note: We only need to visit each type once.]
2162
2163 2004-04-28  Martin Baulig  <martin@ximian.com>
2164
2165         * constant.cs (StringConstant.Emit): Emit Ldnull if we're null.
2166
2167         * const.cs (Const.LookupConstantValue): Return a `bool' signalling
2168         success and added `out object value'.  Use a `bool resolved' field
2169         to check whether we've already been called rather than
2170         `ConstantValue != null' since this breaks for NullLiterals.
2171
2172 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2173
2174         * driver.cs (Driver.MainDriver) [IsModuleOnly]: Open code the
2175         setting of this flag, since the 'set' method may be non-public.
2176
2177 2004-04-28  Raja R Harinath  <rharinath@novell.com>
2178
2179         * flowanalysis.cs (FlowBranchingException.LookupLabel): Add a null
2180         check on current_vector.Block.
2181
2182 2004-04-27  Martin Baulig  <martin@ximian.com>
2183
2184         * expression.cs (BaseAccess.CommonResolve): Don't allow `base' in
2185         a field initializer.  Fixes #56459.
2186
2187 2004-04-27  Martin Baulig  <martin@ximian.com>
2188
2189         * ecore.cs (PropertyExpr.DoResolve/DoResolveLValue): Check whether
2190         we're not attempting to use an indexer.  Fixes #52154.
2191
2192 2004-04-27  Martin Baulig  <martin@ximian.com>
2193
2194         * statement.cs (Return): Don't create a return label if we don't
2195         need it; reverts my change from January 20th.  Thanks to Ben
2196         Maurer for this.
2197
2198 2004-04-27  Martin Baulig  <martin@ximian.com>
2199
2200         According to the spec, `goto' can only leave a nested scope, but
2201         never enter it.
2202
2203         * statement.cs (Block.LookupLabel): Only lookup in the current
2204         block, don't recurse into parent or child blocks.
2205         (Block.AddLabel): Check in parent and child blocks, report
2206         CS0140/CS0158 if we find a duplicate.
2207         (Block): Removed this indexer for label lookups.
2208         (Goto.Resolve): Call LookupLabel() on our current FlowBranching;
2209         this already does the error reporting for us.
2210
2211         * flowanalysis.cs
2212         (FlowBranching.UsageVector.Block): New public variable; may be null.
2213         (FlowBranching.CreateSibling): Added `Block' argument.
2214         (FlowBranching.LookupLabel): New public virtual method.  Lookup a
2215         label for the target of a `goto' and check whether we're not
2216         leaving a `finally'.
2217
2218 2004-04-27  Martin Baulig  <martin@ximian.com>
2219
2220         * flowanalysis.cs (FlowBranching.UsageVector.MergeChild): If we're
2221         a finite loop block, also do the ALWAYS->SOMETIMES for throws (not
2222         just for returns).
2223
2224 2004-04-27  Martin Baulig  <martin@ximian.com>
2225
2226         * statement.cs (Block.AddLabel): Also check for implicit blocks
2227         and added a CS0158 check.
2228
2229 2004-04-27  Martin Baulig  <martin@ximian.com>
2230
2231         * flowanalysis.cs (FlowBranchingLoop): New class.
2232         (FlowBranching.UsageVector.MergeJumpOrigins): Take a list of
2233         UsageVector's instead of an ArrayList.
2234         (FlowBranching.Label): Likewise.
2235         (FlowBranching.UsageVector.MergeBreakOrigins): New method.
2236         (FlowBranching.AddBreakVector): New method.
2237
2238 2004-04-27  Miguel de Icaza  <miguel@ximian.com>
2239
2240         * attribute.cs: Small regression fix: only convert the type if we
2241         the type is different, fixes System.Drawing build.
2242
2243 2004-04-27  Martin Baulig  <martin@ximian.com>
2244
2245         * attribute.cs (Attribute.Resolve): If we have a constant value
2246         for a named field or property, implicity convert it to the correct
2247         type.
2248
2249 2004-04-27  Raja R Harinath  <rharinath@novell.com>
2250
2251         * statement.cs (Block.Block): Implicit blocks share
2252         'child_variable_names' fields with parent blocks.
2253         (Block.AddChildVariableNames): Remove.
2254         (Block.AddVariable): Mark variable as "used by a child block" in
2255         every surrounding block.
2256         * ecore.cs (SimpleName.SimpleNameResolve): If the name has already
2257         been used in a child block, complain about violation of "Invariant
2258         meaning in blocks" rule.
2259         * cs-parser.jay (declare_local_variables): Don't use
2260         AddChildVariableNames.
2261         (foreach_statement): Don't create an implicit block: 'foreach'
2262         introduces a scope.
2263
2264 2004-04-23  Miguel de Icaza  <miguel@ximian.com>
2265
2266         * convert.cs (ImplicitNumericConversion): 0 is also positive when
2267         converting from 0L to ulong.  Fixes 57522.
2268
2269 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2270
2271         * decl.cs (FindMemberToOverride): Fix wrong warning for case when
2272         derived class hides via 'new' keyword field from base class (test-242.cs).
2273         TODO: Handle this in the more general way.
2274         
2275         * class.cs (CheckBase): Ditto.
2276
2277 2004-04-22  Marek Safar  <marek.safar@seznam.cz>
2278
2279         * decl.cs (caching_flags): New member for storing cached values
2280         as bit flags.
2281         (MemberCore.Flags): New enum where bit flags for caching_flags
2282         are defined.
2283         (MemberCore.cls_compliance): Moved to caching_flags.
2284         (DeclSpace.Created): Moved to caching_flags.
2285
2286         * class.cs: Use caching_flags instead of DeclSpace.Created
2287         
2288 2004-04-21  Miguel de Icaza  <miguel@ximian.com>
2289
2290         * ecore.cs (PropertyExpr.GetAccesor): Only perform the 1540 check
2291         if we are only a derived class, not a nested class.
2292
2293         * typemanager.cs: Same as above, but do this at the MemberLookup
2294         level (used by field and methods, properties are handled in
2295         PropertyExpr).   Allow for the qualified access if we are a nested
2296         method. 
2297
2298 2004-04-21  Marek Safar  <marek.safar@seznam.cz>
2299
2300         * class.cs: Refactoring.
2301         (IMethodData): New inteface; Holds links to parent members
2302         to avoid member duplication (reduced memory allocation).
2303         (Method): Implemented IMethodData interface.
2304         (PropertyBase): New inner classes for get/set methods.
2305         (PropertyBase.PropertyMethod): Implemented IMethodData interface
2306         (Event): New inner classes for add/remove methods.
2307         (Event.DelegateMethod): Implemented IMethodData interface.
2308
2309         * cs-parser.jay: Pass DeclSpace to Event class for creation of valid
2310         EmitContext (related to class.cs refactoring).
2311
2312 2004-04-21  Raja R Harinath  <rharinath@novell.com>
2313
2314         * delegate.cs (Delegate.VerifyApplicability): If the number of
2315         arguments are the same as the number of parameters, first try to
2316         verify applicability ignoring  any 'params' modifier on the last
2317         parameter.
2318         Fixes #56442.
2319
2320 2004-04-08  Martin Baulig  <martin@ximian.com>
2321
2322         Merged latest changes into gmcs.  Please keep this comment in
2323         here, it makes it easier for me to see what changed in MCS since
2324         the last time I merged.
2325
2326 2004-04-16  Raja R Harinath  <rharinath@novell.com>
2327
2328         * class.cs (TypeContainer.AddIndexer): Use
2329         'ExplicitInterfaceName' to determine if interface name was
2330         explicitly specified.  'InterfaceType' is not initialized at this time.
2331         (TypeContainer.DefineIndexers): Remove use of temporary list.  The
2332         Indexers array is already in the required order.  Initialize
2333         'IndexerName' only if there are normal indexers.
2334         (TypeContainer.DoDefineMembers): Don't initialize IndexerName.
2335         (TypeContainer.Emit): Emit DefaultMember attribute only if
2336         IndexerName is initialized.
2337         Fixes #56300.
2338
2339 2004-04-15  Benjamin Jemlich  <pcgod@gmx.net>
2340
2341         * enum.cs (Enum.DefineType): Don't allow char as type for enum.
2342         Fixes #57007
2343
2344 2004-04-15  Raja R Harinath  <rharinath@novell.com>
2345
2346         * attribute.cs (Attribute.CheckAttributeType): Check for ambiguous
2347         attributes.
2348         Fix for #56456.
2349
2350         * attribute.cs (Attribute.Resolve): Check for duplicate named
2351         attributes.
2352         Fix for #56463.
2353
2354 2004-04-15  Miguel de Icaza  <miguel@ximian.com>
2355
2356         * iterators.cs (MarkYield): track whether we are in an exception,
2357         and generate code accordingly.  Use a temporary value to store the
2358         result for our state.
2359
2360         I had ignored a bit the interaction of try/catch with iterators
2361         since their behavior was not entirely obvious, but now it is
2362         possible to verify that our behavior is the same as MS .NET 2.0
2363
2364         Fixes 54814
2365
2366 2004-04-14  Miguel de Icaza  <miguel@ximian.com>
2367
2368         * iterators.cs: Avoid creating temporaries if there is no work to
2369         do. 
2370
2371         * expression.cs (ArrayAccess.EmitLoadOpcode): If dealing with
2372         Enumerations, use TypeManager.EnumToUnderlying and call
2373         recursively. 
2374
2375         Based on the patch from Benjamin Jemlich (pcgod@gmx.net), fixes
2376         bug #57013
2377
2378         (This.Emit): Use EmitContext.EmitThis to emit our
2379         instance variable.
2380
2381         (This.EmitAssign): Ditto.
2382
2383         * ecore.cs (FieldExpr.Emit): Remove RemapToProxy special
2384         codepaths, we will move all the functionality into
2385         Mono.CSharp.This 
2386
2387         (FieldExpr.EmitAssign): Ditto.
2388
2389         This fixes several hidden bugs that I uncovered while doing a code
2390         review of this today.
2391
2392         * codegen.cs (EmitThis): reworked so the semantics are more clear
2393         and also support value types "this" instances.
2394
2395         * iterators.cs: Changed so that for iterators in value types, we
2396         do not pass the value type as a parameter.  
2397
2398         Initialization of the enumerator helpers is now done in the caller
2399         instead of passing the parameters to the constructors and having
2400         the constructor set the fields.
2401
2402         The fields have now `assembly' visibility instead of private.
2403
2404 2004-04-11  Miguel de Icaza  <miguel@ximian.com>
2405
2406         * expression.cs (Argument.Resolve): Check if fields passed as ref
2407         or out are contained in a MarshalByRefObject.
2408
2409         * typemanager.cs, rootcontext.cs: Add System.Marshalbyrefobject as
2410         another compiler type.
2411
2412 2004-04-06 Ben Maurer  <bmaurer@users.sourceforge.net>
2413
2414         * class.cs (Indexer.Define): use the new name checking method.
2415         Also, return false on an error.
2416         * cs-tokenizer.cs (IsValidIdentifier): Checks for a valid identifier.
2417         (is_identifier_[start/part]_character): make static.
2418
2419 2004-04-10  Miguel de Icaza  <miguel@ximian.com>
2420
2421         * expression.cs (Binary.ResolveOperator): Do no append strings
2422         twice: since we can be invoked more than once (array evaluation)
2423         on the same concatenation, take care of this here.  Based on a fix
2424         from Ben (bug #56454)
2425
2426 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2427
2428         * codegen.cs: Fix another case where CS1548 must be reported (when 
2429         delay-sign isn't specified and no private is available #56564). Fix
2430         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2431         error when MCS is used on the MS runtime and we need to delay-sign 
2432         (which seems unsupported by AssemblyBuilder - see #56621).
2433
2434 2004-04-08  Marek Safar  <marek.safar@seznam.cz>
2435
2436         * typemanager.cs (TypeManager.TypeToCoreType): Handle IntPtr too.
2437         (TypeManager.ComputeNamespaces): Faster implementation for
2438         Microsoft runtime.
2439
2440         * compiler.csproj: Updated AssemblyName to mcs.
2441
2442 2004-05-11  Jackson Harper  <jackson@ximian.com>
2443
2444         * Makefile: Preserve MONO_PATH
2445         
2446 2004-05-11  Jackson Harper  <jackson@ximian.com>
2447
2448         * Makefile: Use mono and mcs to build gmcs
2449         
2450 2004-05-03  Miguel de Icaza  <miguel@ximian.com>
2451
2452         * codegen.cs: Add patch from Robert Shade
2453         <rshade@dvsconsulting.com>, use FileAccess.Read on the keyfile, to
2454         sync with mcs.
2455
2456 2004-05-02  Sebastien Pouliot  <sebastien@ximian.com>
2457
2458         * CryptoConvert.cs: Updated to latest version. Fix issue with 
2459         incomplete key pairs (#57941).
2460
2461 2004-04-08  Sebastien Pouliot  <sebastien@ximian.com>
2462
2463         * codegen.cs: Fix another case where CS1548 must be reported (when 
2464         delay-sign isn't specified and no private is available #56564). Fix
2465         loading the ECMA "key" to delay-sign an assembly. Report a CS1548 
2466         error when MCS is used on the MS runtime and we need to delay-sign 
2467         (which seems unsupported by AssemblyBuilder - see #56621).
2468
2469 2004-04-29  Jackson Harper  <jackson@ximian.com>
2470
2471         * Makefile: Set MONO_PATH to use the bootstrap corlib
2472         * driver.cs: Check the GAC for referenced assemblies.
2473                 
2474 2004-04-29  Martin Baulig  <martin@ximian.com>
2475
2476         * Makefile (gmcs.exe): Set MONO_PATH to use `../class/lib/net_2_0'.
2477
2478 2004-04-07  Martin Baulig  <martin@ximian.com>
2479
2480         * expression.cs (Binary.ResolveOperator): Added special case for
2481         Equality/Inequality between a type parameter and a null literal.
2482
2483 2004-04-07  Martin Baulig  <martin@ximian.com>
2484
2485         * convert.cs: Check null literal -> type parameter conversions.
2486
2487 2004-04-07  Martin Baulig  <martin@ximian.com>
2488
2489         * generic.cs (ConstructedType.CheckConstraints): Enforce the
2490         `class' and `struct' constraints.
2491
2492 2004-04-07  Martin Baulig  <martin@ximian.com>
2493
2494         * generic.cs (SpecialConstraint): New public enum.
2495         (Constraints.Resolve): Added support for the `class' and `struct'
2496         constraints.
2497
2498         * cs-parser.jay (type_parameter_constraint): Added support for the
2499         `class' and `struct' constraints.
2500
2501 2004-04-07  Martin Baulig  <martin@ximian.com>
2502
2503         * support.cs (GenericConstraints): Replaced `Types' by
2504         `ClassConstraint' and `InterfaceConstraints'; added
2505         `HasClassConstraint'.   
2506
2507 2004-04-07  Martin Baulig  <martin@ximian.com>
2508
2509         * generic.cs
2510         (Constraints.InterfaceConstraints): New public property.
2511         (Constraints.Types): Make this property public
2512         (TypeParameter): Implement IMemberContainer.
2513         (TypeParameter.Define): Take a `GenericTypeParameterBuilder'
2514         instead of a TypeBuilder/MethodBuilder; pass the interface
2515         constraints to TypeManager.AddTypeParameter().
2516         (TypeParameter.DefineType): Just take an EmitContext and no
2517         TypeBuilder/MethodBuilder.  Use the new public API.
2518
2519         * typemanager.cs (TypeManager.AddTypeParameter): Added
2520         `TypeExpr[]' argument; add the interfaces to the
2521         `builder_to_ifaces' hash.
2522         (TypeManager.LookupMemberContainer): For
2523         GenericTypeParameterBuilders, get the TypeParameter from the
2524         `builder_to_type_param'.
2525         (TypeManager.FindMembers): For GenericTypeParameterBuilders, get
2526         the TypeParameter and call FindMembers on it.
2527
2528 2004-04-07  Martin Baulig  <martin@ximian.com>
2529
2530         * class.cs
2531         (MethodCore.GenericMethod): Moved this field here from Method.
2532         (MethodCore.IsDuplicateImplementation): Take the number of type
2533         parameters into account if we're a generic method.
2534
2535         * expression.cs (Invocation.InferTypeArguments): Don't return true
2536         if `arguments' is null; we still need to check whether we actually
2537         don't need to infer anything in this case.
2538         (MemberAccess): Merged the functionality from GenericMemberAccess
2539         into this class.
2540
2541         * generic.cs (GenericMemberAccess): Removed.
2542
2543 2004-04-05  Martin Baulig  <martin@ximian.com>
2544
2545         * decl.cs (MemberCore): For generic classes, interfaces and
2546         structs, `Name' now includes the number of type parameters
2547         ("Stack!1.Node!1").
2548         (DeclSpace.FindType): Removed the `num_type_args' argument; we now
2549         encode the number of type arguments in the type name.
2550
2551         * expression.cs (Expression.MemberLookup): Removed the
2552         `num_type_args' argument; we now encode the number of type
2553         arguments in the type name.
2554
2555         * ecore.cs (SimpleName): Encode the number of type arguments in
2556         the type name itself.
2557
2558         * generic.cs (ConstructedType): Likewise.
2559
2560         * tree.cs (Tree.RecordDecl): Take a `string' instead of a
2561         `MemberName'; we now include the number of type parameters in the
2562         type name.
2563
2564         * typemanager.cs (TypeManager.CheckGeneric): Removed.
2565         (TypeManager.MemberLookup): Removed the
2566         `num_type_args' argument; we now encode the number of type
2567         arguments in the type name.     
2568
2569 2004-04-03  Martin Baulig  <martin@ximian.com>
2570
2571         * decl.cs (MemberCore.ctor): Take a MemberName instead of a sting.
2572         (MemberCore.MemberName): Moved here from MemberBase.
2573         (DeclSpace.SetParameterInfo): Just take the constraints as an
2574         ArrayList; we already have the type parameters in our
2575         `MemberName'; also do the CS0080 reporting here.
2576
2577         * cs-parser.jay (struct_declaration): Use `member_name' instead of
2578         `IDENTIFIER opt_type_parameter_list'; when constructing our
2579         `MemberName', it'll already include our type parameters.
2580         (class_declaration, interface_declaration): Likewise.
2581         (delegate_declaration): Likewise.
2582         (MakeName): Take a MemberName and return a MemberName.
2583         The following two changes are required to avoid shift/reduce conflicts:
2584         (member_name): Don't include a TypeName anymore; ie. this is now
2585         just 'IDENTIFIER opt_type_parameter_list'.
2586         (property_declaration, event_declaration): Use a
2587         `namespace_or_type_name' instead of a `member_name'.            
2588
2589 2004-04-03  Martin Baulig  <martin@ximian.com>
2590
2591         * decl.cs (MemberName): Renamed to `TypeName' and created a new
2592         `MemberName' class.
2593         (TypeName): Formerly known as MemberName.
2594
2595         * namespace.cs (NamespaceEntry.UsingAlias): Take a `TypeName'
2596         instead of a `MemberName'.
2597
2598         * cs-parser.jay (namespace_or_type_name): Create a TypeName.
2599         (member_name): New rule; create a MemberName.
2600
2601 2004-04-02  Martin Baulig  <martin@ximian.com>
2602
2603         * namespace.cs (NamespaceEntry.VerifyUsing): Added error checking
2604         (CS0305 and CS0308).
2605
2606 2004-04-02  Martin Baulig  <martin@ximian.com>
2607
2608         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Added
2609         support for nested types.
2610
2611 2004-04-02  Martin Baulig  <martin@ximian.com>
2612
2613         * ecore.cs (IAlias): New public interface.
2614         (TypeExpr, TypeExpression): Implement IAlias.
2615         (TypeAliasExpression): New public class.
2616
2617         * namespace.cs (Namespace): Implement IAlias.
2618         (Namespace.Lookup): Return an IAlias instead on an object.
2619         (Namespace.DefineName): Take an IAlias instead of an object.
2620         (NamespaceEntry.AliasEntry.Resolve): Return an IAlias instead of
2621         an object.
2622         (NamespaceEntry.UsingAlias): Take a Membername instead of an
2623         Expression.
2624         (NamespaceEntry.LookupAlias): Return an IAlias instead on an
2625         object.
2626         (NamespaceEntry.Lookup): Likewise.
2627
2628         * rootcontext.cs (RootContext.LookupType): Return a TypeExpr
2629         instead of a Type.      
2630
2631         * decl.cs (DeclSpace): Implement IAlias.
2632         (DeclSpace.LookupAlias): Return an IAlias instead of a string.
2633
2634         * generic.cs (ConstructedType): Improved error checking.
2635
2636 2004-04-02  Martin Baulig  <martin@ximian.com>
2637
2638         * convert.cs: Added type parameter conversions.
2639
2640         * ecore.cs
2641         (UnboxCast.Emit): Emit an `unbox.any' for type params.
2642         (ClassCast.Emit): If the source type is a type parameter, box it.
2643         If the target type is a type parameter, emit an `unbox.any'
2644         instead of a `classcast'.1      
2645
2646 2004-04-01  Martin Baulig  <martin@ximian.com>
2647
2648         * cs-tokenizer.cs (parse_less_than): Allow Token.DOT.
2649
2650 2004-04-01  Martin Baulig  <martin@ximian.com>
2651
2652         * generic.cs (ConstructedType.CheckConstraints): Use
2653         Convert.ImplicitStandardConversionExists(); user-defined implicit
2654         conversions are not allowed according to the spec.
2655
2656 2004-03-30  Martin Baulig  <martin@ximian.com>
2657
2658         * expression.cs (New): Added support for type parameters.
2659
2660         * typemanager.cs
2661         (TypeManager.activator_type): New public static field.
2662         (TypeManager.activator_create_instance): Likewise.
2663
2664 2004-03-30  Martin Baulig  <martin@ximian.com>
2665
2666         * typemanager.cs (TypeManager.HasConstructorConstraint): New
2667         public method.
2668
2669 2004-03-30  Martin Baulig  <martin@ximian.com>
2670
2671         * generic.cs (ConstructedType.CheckConstraints): Actually follow
2672         the spec here: the argument type must be convertible to the
2673         constraints.
2674
2675 2004-03-30  Martin Baulig  <martin@ximian.com>
2676
2677         * generic.cs
2678         (TypeParameter.Define, TypeParameter.DefineMethod): Call
2679         TypeManager.AddTypeParameter().
2680         (ConstructedType.CheckConstraints): Re-enable this and actually
2681         check whether we have a constructor constraint.
2682
2683         * typemanager.cs
2684         (TypeManager.builder_to_type_param): New static field.
2685         (TypeManager.AddTypeParameter): New static method.
2686         (TypeManager.LookupTypeParameter): New public method.
2687
2688 2004-03-30  Martin Baulig  <martin@ximian.com>
2689
2690         * generic.cs (TypeParameter.DefineType): Return a boolean and use
2691         the new API to actually define the constructor constraint.
2692
2693         * typemanager.cs
2694         (TypeManager.new_constraint_attr_type): New static field.
2695         (TypeManager.InitCoreTypes): Initialize it.
2696
2697 2004-03-30  Martin Baulig  <martin@ximian.com>
2698
2699         * generic.cs (Constraints): Completed error checking, use correct
2700         error numbers.
2701
2702 2004-03-29  Martin Baulig  <martin@ximian.com>
2703
2704         * delegate.cs (Delegate.VerifyMethod): Infer type arguments.
2705
2706         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2707         public version which takes a `ParameterData pd' instead of an
2708         `ArrayList args'.
2709
2710 2004-03-29  Martin Baulig  <martin@ximian.com>
2711
2712         * typemanager.cs (TypeManager.IsGenericMethod): Take a MethodBase,
2713         not a MethodInfo.       
2714
2715 2004-03-29  Martin Baulig  <martin@ximian.com>
2716
2717         * expression.cs (Argument.ResolveMethodGroup): If we're a
2718         ConstructedType, call GetMemberAccess() on it.  
2719
2720 2004-03-29  Martin Baulig  <martin@ximian.com>
2721
2722         * class.cs (MethodBase.CheckGenericOverride): New abstract method.
2723         (MethodCore.CheckGenericOverride): When overriding a generic
2724         method, check whether the constraints match.
2725
2726         * support.cs (GenericConstraints): New public interface.
2727         (ParameterData.GenericConstraints): New public method.
2728
2729         * parameter.cs (Parameter.Resolve): Check whether we're a generic
2730         method parameter and compute our constraints if appropriate.
2731         (Parameter.GenericConstraints): New public property.
2732
2733         * generic.cs (Constraints): Implement GenericConstraints.
2734
2735 2004-03-29  Martin Baulig  <martin@ximian.com>
2736
2737         * decl.cs (MemberCache.FindMemberToOverride): Use
2738         `paramTypes [j].Equals (cmpAttrs [j])' instead of `=='.
2739
2740 2004-03-29  Martin Baulig  <martin@ximian.com>
2741
2742         * generic.cs (GenericMethod.Define): Resolve our type parameters.
2743
2744 2004-03-29  Martin Baulig  <martin@ximian.com>
2745
2746         * cs-parser.jay: Report CS0080 instead of -200 ("Constraints are
2747         not allowed on non-generic declarations").
2748
2749 2004-03-29  Martin Baulig  <martin@ximian.com>
2750
2751         * expression.cs (Invocation.InferTypeArguments): Added overloaded
2752         public version of this method.
2753
2754         * class.cs (MethodCore.IsDuplicateImplementation): Use
2755         Invocation.InferTypeArguments() to check this.
2756
2757 2004-03-29  Martin Baulig  <martin@ximian.com>
2758
2759         * convert.cs: Use TypeManager.IsDelegateType() instead of
2760         comparing types correctly.
2761
2762 2004-03-29  Martin Baulig  <martin@ximian.com>
2763
2764         * convert.cs: Use TypeManager.IsSubclassOf() instead of comparing
2765         types directly to make it work for generic instances.
2766
2767         * typemanager.cs (TypeManager.IsSubclassOf): New static method.
2768
2769 2004-03-29  Martin Baulig  <martin@ximian.com>
2770
2771         * typemanager.cs (TypeManager.MayBecomeEqualGenericTypes): Added
2772         support for arrays.     
2773
2774 2004-03-24  Martin Baulig  <martin@ximian.com>
2775
2776         * decl.cs (DeclSpace.FindType): Also use
2777         TypeManager.CheckGeneric() for types from the using clauses.
2778
2779 2004-03-23  Martin Baulig  <martin@ximian.com>
2780
2781         * expression.cs (Invocation.OverloadResolve): Added `bool
2782         may_fail' argument and use it instead of the Location.IsNull() hack.
2783
2784 2004-03-23  Martin Baulig  <martin@ximian.com>
2785
2786         * expression.cs (Invocation.InferType): Use correct type inference
2787         rules here.     
2788
2789 2004-03-23  Martin Baulig  <martin@ximian.com>
2790
2791         * ecore.cs (MethodGroupExpr.Name): Use
2792         TypeManager.CSharpSignature() instead of just the name.
2793
2794         * expression.cs (Invocation.OverloadResolve): Provide better error
2795         reporting.
2796         (Invocation.DoResolve): OverloadResolve() never returns null
2797         without reporting an error, so removed the error -6 reporting here.
2798
2799 2004-03-23  Martin Baulig  <martin@ximian.com>
2800
2801         * typemanager.cs (TypeManager.GetMethodFlags): Fixed the FIXME for
2802         generic methods.
2803
2804         * cs-parser.jay (delegate_declaration): Support generic delegates.
2805
2806         * delegate.cs: Support generic delegates.
2807
2808 2004-03-22  Martin Baulig  <martin@ximian.com>
2809
2810         * expression.cs (Invocation.InferParamsTypeArguments): New static
2811         method; does type inference for params arguments.
2812
2813 2004-03-21  Martin Baulig  <martin@ximian.com>
2814
2815         * typemanager.cs (TypeManager.IsGenericMethod): New public static
2816         method; checks whether a method is a generic method.    
2817
2818         * expression.cs (Invocation.InferTypeArguments): New static method;
2819         infer type arguments for generic method invocation.
2820
2821         * ecore.cs (MethodGroupExpr.HasTypeArguments): New public
2822         property; we set this to true if we're resolving a generic method
2823         invocation and the user specified type arguments, ie. we're not
2824         doing type inference.
2825
2826 2004-03-20  Martin Baulig  <martin@ximian.com>
2827
2828         * class.cs (MethodData.DeclaringType): New public property.
2829         (MethodData.Define): Set DeclaringType here.
2830         (Operator.Define): Use OperatorMethod.MethodData.DeclaringType
2831         instead of OperatorMethodBuilder.DeclaringType.
2832
2833 2004-03-20  Martin Baulig  <martin@ximian.com>
2834
2835         * cs-tokenizer.cs (xtoken): Return a special
2836         Token.DEFAULT_OPEN_PARENS for "`default' followed by open parens".
2837
2838         * cs-parser.jay (default_value_expression): Switch to the new
2839         syntax (14.5.13).
2840
2841 2004-03-19  Martin Baulig  <martin@ximian.com>
2842
2843         * decl.cs (MemberName): New class.  We use this to "construct"
2844         namespace_or_type_name's.
2845
2846         * generics.cs (TypeArguments.GetDeclarations): New public method;
2847         returns the type arguments as a string[] and reports a CS0081 if
2848         one of them is not an identifier.
2849
2850         * class.cs (MemberBase): The .ctor now takes the name as a
2851         MemberName instead of a string.
2852         (MemberBase.ExplicitInterfaceName): Changed type from string to
2853         Expression.
2854         (MemberBase.DoDefine): If we're an explicit implementation, the
2855         InterfaceType may be a generic instance.
2856
2857         * cs-parser.jay (namespace_or_type_name): Return a MemberName.
2858         (namespace_name): Call MemberName.GetName () to transform the
2859         MemberName into a string and ensure we don't have any type
2860         arguments.
2861         (type_name): Call MemberName.GetTypeExpression() to transfrom the
2862         MemberName into an expression.
2863         (method_header): Use namespace_or_type_name instead of member_name.     
2864
2865 2004-04-07  Miguel de Icaza  <miguel@ximian.com>
2866
2867         * rootcontext.cs: Add new types to the boot resolution.
2868
2869         * ecore.cs (TypeExpr.CanInheritFrom): Inheriting from
2870         MulticastDelegate is not allowed.
2871
2872         * typemanager.cs: Add new types to lookup: System.TypedReference
2873         and ArgIterator.
2874
2875         * paramter.cs (Parameter.Resolve): if we are an out/ref parameter,
2876         check for TypedReference or ArgIterator, they are not allowed. 
2877
2878         * ecore.cs (BoxedCast): Set the eclass to ExprClass.Value, this
2879         makes us properly catch 1510 in some conditions (see bug 56016 for
2880         details). 
2881
2882 2004-04-06  Bernie Solomon  <bernard@ugsolutions.com>
2883
2884         * CryptoConvert.cs: update from corlib version
2885         with endian fixes.
2886
2887 2004-04-05  Miguel de Icaza  <miguel@ximian.com>
2888
2889         * class.cs (Indexer.Define): Check indexername declaration
2890
2891 2004-04-05  Marek Safar  <marek.safar@seznam.cz>
2892
2893         * attribute.cs (IsClsCompliant): Fixed problem with handling
2894         all three states (compliant, not-compliant, undetected).
2895
2896 2004-03-30  Marek Safar  <marek.safar@seznam.cz>
2897
2898         * attribute.cs (Attribute): Location is now public.
2899         (Resolve): Store resolved arguments (pos_values) in attribute class.
2900         Attribute extractors (now GetClsCompliantAttributeValue) can reuse them.
2901         (GetClsCompliantAttributeValue): New method that gets
2902         CLSCompliantAttribute value.
2903         (GetClsCompliantAttribute): Returns CLSCompliantAttribute for DeclSpace
2904         if exists else null.
2905         (AttributeTester): New class for CLS-Compliant verification routines.
2906
2907         * class.cs (Emit): Add CLS-Compliant verification.
2908         (Method.GetSignatureForError): Implemented.
2909         (Constructor.GetSignatureForError): Implemented
2910         (Constructor.HasCompliantArgs): Returns if constructor has
2911         CLS-Compliant arguments.
2912         (Constructor.Emit): Override.
2913         (Construcor.IsIdentifierClsCompliant): New method; For constructors
2914         is needed to test only parameters.
2915         (FieldBase.GetSignatureForError): Implemented.
2916         (TypeContainer): New member for storing base interfaces.
2917         (TypeContainer.FindMembers): Search in base interfaces too.
2918
2919         * codegen.cs (GetClsComplianceAttribute): New method that gets
2920         assembly or module CLSCompliantAttribute value.
2921         (ResolveClsCompliance): New method that resolve CLSCompliantAttribute
2922         for assembly.
2923         (ModuleClass.Emit): Add error 3012 test.
2924
2925         * const.cs (Emit): Override and call base for CLS-Compliant tests.
2926
2927         * decl.cs (ClsComplianceValue): New enum that holds CLS-Compliant
2928         state for all decl types.
2929         (MemberCore.Emit): Emit is now virtual and call VerifyClsCompliance
2930         if CLS-Compliant tests are required.
2931         (IsClsCompliaceRequired): New method. Analyze whether code
2932         must be CLS-Compliant.
2933         (IsExposedFromAssembly): New method. Returns true when MemberCore
2934         is exposed from assembly.
2935         (GetClsCompliantAttributeValue): New method. Resolve CLSCompliantAttribute
2936         value or gets cached value.
2937         (HasClsCompliantAttribute): New method. Returns true if MemberCore
2938         is explicitly marked with CLSCompliantAttribute.
2939         (IsIdentifierClsCompliant): New abstract method. This method is
2940         used to testing error 3005.
2941         (IsIdentifierAndParamClsCompliant): New method. Common helper method
2942         for identifier and parameters CLS-Compliant testing.
2943         (VerifyClsCompliance): New method. The main virtual method for
2944         CLS-Compliant verifications.
2945         (CheckAccessLevel): In one special case (System.Drawing) was TypeBuilder
2946         null. I don't know why is null (too many public members !).
2947         (GetClsCompliantAttributeValue). New method. Goes through class hierarchy
2948         and get value of first CLSCompliantAttribute that found.
2949
2950         * delegate.cs (Emit): Override and call base for CLS-Compliant tests.
2951         (VerifyClsCompliance): Override and add extra tests.
2952
2953         * driver.cs (CSCParseOption): New command line options (clscheck[+|-]).
2954         clscheck- disable CLS-Compliant verification event if assembly is has
2955         CLSCompliantAttribute(true).
2956
2957         * enum.cs (Emit): Override and call base for CLS-Compliant tests.
2958         ApllyAttribute is now called in emit section as in the other cases.
2959         Possible future Emit integration.
2960         (IsIdentifierClsCompliant): New override.
2961         (VerifyClsCompliance): New override.
2962         (GetEnumeratorName): Returns full enum name.
2963
2964         * parameter.cs (GetSignatureForError): Implemented.
2965
2966         * report.cs (WarningData): New struct for Warning message information.
2967         (LocationOfPreviousError): New method.
2968         (Warning): New method. Reports warning based on the warning table.
2969         (Error_T): New method. Reports error based on the error table.
2970
2971         * rootcontext.cs (EmitCode): Added new Emit(s) because CLS-Compliant
2972         verifications are done here.
2973
2974         * tree.cs (RecordDecl): Used new LocationOfPreviousError method.
2975
2976         * typemanager.cs (cls_compliant_attribute_type): New member thath holds
2977         CLSCompliantAttribute.
2978         (all_imported_types): New member holds all imported types from other
2979         assemblies.
2980         (LoadAllImportedTypes): New method fills static table with exported types
2981         from all referenced assemblies.
2982         (Modules): New property returns all assembly modules.
2983
2984 2004-03-30  Miguel de Icaza  <miguel@ximian.com>
2985
2986         * cs-parser.jay: Add a rule to catch wrong event syntax instead of
2987         throwing a parser error.
2988
2989         * ecore.cs (PropertyExpr.GetAccessor): Apply patch from Patrik Reali
2990         which removes the hardcoded get_/set_ prefixes for properties, as
2991         IL allows for the properties to be named something else.  
2992
2993         Bug #56013
2994
2995         * expression.cs: Do not override operand before we know if it is
2996         non-null.  Fix 56207
2997
2998 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
2999
3000         * typemanager.cs: support for pinned variables.
3001
3002 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3003
3004         * decl.cs, typemanager.cs: Avoid using an arraylist
3005         as a buffer if there is only one result set.
3006
3007 2004-03-29 Ben Maurer  <bmaurer@users.sourceforge.net>
3008
3009         * expression.cs: Make sure you cant call a static method
3010         with an instance expression, bug #56174.
3011
3012 2004-03-29  Miguel de Icaza  <miguel@ximian.com>
3013
3014         * class.cs (IsDuplicateImplementation): Improve error reporting to
3015         flag 663 (method only differs in parameter modifier).
3016
3017         * cs-tokenizer.cs: Do not require whitespace when a ( or " will do
3018         in preprocessor directives.
3019
3020         * location.cs (LookupFile): Allow for the empty path.
3021
3022         * attribute.cs (DefinePInvokeMethod): Fix 56148;  I would like a
3023         better approach for some of that patch, but its failing with the
3024         CharSet enumeration.  For now try/catch will do.
3025
3026         * typemanager.cs: Do not crash if a struct does not have fields.
3027         Fixes 56150.
3028
3029 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3030
3031         * expression.cs: cs0213, cant fix a fixed expression.
3032         fixes 50231.
3033
3034 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3035
3036         * cs-parser.jay: detect invalid embeded statements gracefully.
3037         bug #51113.
3038
3039 2004-03-28 Ben Maurer  <bmaurer@users.sourceforge.net>
3040
3041         * ecore.cs, typemanager.cs: Correct impl of cs1540 check.
3042         As a regex:
3043         s/
3044         the invocation type may not be a subclass of the tye of the item/
3045         The type of the item must be a subclass of the invocation item.
3046         /g
3047
3048         Fixes bug #50820.
3049
3050 2004-03-25  Sebastien Pouliot  <sebastien@ximian.com>
3051
3052         * attribute.cs: Added methods to get a string and a bool from an
3053         attribute. Required to information from AssemblyKeyFileAttribute,
3054         AttributeKeyNameAttribute (string) and AssemblyDelaySign (bool).
3055         * codegen.cs: Modified AssemblyName creation to include support for
3056         strongnames. Catch additional exceptions to report them as CS1548.
3057         * compiler.csproj: Updated include CryptoConvert.cs.
3058         * compiler.csproj.user: Removed file - user specific configuration.
3059         * CryptoConvert.cs: New. A COPY of the class CryptoConvert from 
3060         Mono.Security assembly. The original class is maintained and tested in
3061         /mcs/class/Mono.Security/Mono.Security.Cryptography/CryptoConvert.cs.
3062         * drivers.cs: Added support for /keyfile, /keycontainer and /delaysign
3063         like CSC 8.0 (C# v2) supports.
3064         * Makefile: Added CryptoConvert.cs to mcs sources.
3065         * rootcontext.cs: Added new options for strongnames.
3066
3067 2004-03-24 Ben Maurer  <bmaurer@users.sourceforge.net>
3068
3069         * driver.cs: For --expect-error, report error code `2'
3070         if the program compiled with no errors, error code `1' if
3071         it compiled with an error other than the one expected.
3072
3073 2004-03-24  Sebastien Pouliot  <sebastien@ximian.com>
3074
3075         * compiler.csproj: Updated for Visual Studio .NET 2003.
3076         * compiler.csproj.user: Updated for Visual Studio .NET 2003.
3077         * compiler.sln: Updated for Visual Studio .NET 2003.
3078
3079 2004-03-24  Ravi Pratap M  <ravi@ximian.com>
3080
3081         * expression.cs: Fix bug #47234. We basically need to apply the
3082         rule that we prefer the conversion of null to a reference type
3083         when faced with a conversion to 'object' (csc behaviour).
3084
3085 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3086
3087         * statement.cs: Shorter form for foreach, eliminates
3088         a local variable. r=Martin.
3089
3090 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3091
3092         * constant.cs, ecore.cs, literal.cs: New prop IsZeroInteger that
3093         checks if we can use brtrue/brfalse to test for 0.
3094         * expression.cs: use the above in the test for using brtrue/brfalse.
3095         cleanup code a bit.
3096
3097 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3098
3099         * expression.cs: Rewrite string concat stuff. Benefits:
3100
3101         - "a" + foo + "b" + "c" becomes "a" + foo + "bc"
3102         - "a" + foo + "b" + bar + "c" + baz ... uses concat (string []).
3103         rather than a concat chain.
3104
3105         * typemanager.cs: Add lookups for more concat overloads.
3106
3107 2004-03-23 Ben Maurer  <bmaurer@users.sourceforge.net>
3108
3109         * expression.cs: Emit shorter il code for array init.
3110
3111         newarr
3112         dup
3113         // set 1
3114
3115         // set 2
3116
3117         newarr
3118         stloc.x
3119
3120         ldloc.x
3121         // set 1
3122
3123         ldloc.x
3124         // set 2
3125
3126 2004-03-22 Ben Maurer  <bmaurer@users.sourceforge.net>
3127
3128         * statement.cs: Before, two switch blocks would be merged if the
3129         total size of the blocks (end_item - begin_item + 1) was less than
3130         two times the combined sizes of the blocks.
3131
3132         Now, it will only merge if after the merge at least half of the
3133         slots are filled.
3134
3135         fixes 55885.
3136
3137 2004-03-20  Atsushi Enomoto  <atsushi@ximian.com>
3138
3139         * class.cs : csc build fix for GetMethods(). See bug #52503.
3140
3141 2004-03-20 Ben Maurer  <bmaurer@users.sourceforge.net>
3142
3143         * expression.cs: Make sure fp comparisons work with NaN.
3144         This fixes bug #54303. Mig approved this patch a long
3145         time ago, but we were not able to test b/c the runtime
3146         had a related bug.
3147
3148 2004-03-19  Miguel de Icaza  <miguel@ximian.com>
3149
3150         * ecore.cs (TypExpr.GetHashCode): implement this overload. 
3151
3152 2004-03-19  Martin Baulig  <martin@ximian.com>
3153
3154         * class.cs (MemberCore.IsDuplicateImplementation): Check whether
3155         two overloads may unify for some type parameter substitutions and
3156         report a CS0408 if appropriate.
3157
3158 2004-03-19  Martin Baulig  <martin@ximian.com>
3159
3160         * class.cs (MemberCore.IsDuplicateImplementation): Report the
3161         error here and not in our caller.
3162
3163 2004-03-19  Martin Baulig  <martin@ximian.com>
3164
3165         * interface.cs: Completely killed this file.
3166         (Interface): We're now a TypeContainer and live in class.cs.
3167
3168         * class.cs (TypeContainer.GetClassBases): Added `bool is_iface'
3169         argument; we're now also called for interfaces.
3170         (TypeContainer.DefineMembers): Allow this method being called
3171         multiple times.
3172         (TypeContainer.GetMethods): New public method; formerly known as
3173         Interface.GetMethod().  This is used by PendingImplementation.
3174         (TypeContainer.EmitDefaultMemberAttr): Moved here from Interface;
3175         it's now private and non-static.
3176         (Interface): Moved this here; it's now implemented similar to
3177         Class and Struct.
3178         (Method, Property, Event, Indexer): Added `bool is_interface'
3179         argument to their .ctor's.
3180         (MemberBase.IsInterface): New public field.
3181
3182         * cs-parser.jay: Create normal Method, Property, Event, Indexer
3183         instances instead of InterfaceMethod, InterfaceProperty, etc.
3184         (opt_interface_base): Removed; we now use `opt_class_base' instead.
3185         (InterfaceAccessorInfo): Create `Get' and `Set' Accessor's.
3186
3187 2004-03-19  Martin Baulig  <martin@ximian.com>
3188
3189         * class.cs (MethodCore.IsDuplicateImplementation): New private
3190         method which does the CS0111 checking.
3191         (Method.CheckBase, Constructor.CheckBase, PropertyBase.CheckBase):
3192         Use IsDuplicateImplementation().
3193
3194 2004-03-17 Ben Maurer  <bmaurer@users.sourceforge.net>
3195
3196         * decl.cs (FindMemberToOverride): New method to find the correct
3197         method or property to override in the base class.
3198         * class.cs
3199             - Make Method/Property use the above method to find the
3200               version in the base class.
3201             - Remove the InheritableMemberSignatureCompare as it is now
3202               dead code.
3203
3204         This patch makes large code bases much faster to compile, as it is
3205         O(n) rather than O(n^2) to do this validation.
3206
3207         Also, it fixes bug 52458 which is that nested classes are not
3208         taken into account when finding the base class member.
3209
3210         Reviewed/Approved by Martin.
3211
3212 2004-03-17  Martin Baulig  <martin@ximian.com>
3213
3214         * expression.cs (MemberAccess.DoResolve): Take the parent's number
3215         of type arguments into account; use the `real_num_type_args'
3216         approach like in DoResolveAsTypeStep().
3217
3218         * generic.cs (GenericMemberAccess.DoResolve): Make this work for
3219         nested types.
3220
3221 2004-03-17  Marek Safar  <marek.safar@seznam.cz>
3222
3223         * interface.cs: In all interface classes removed redundant
3224         member initialization.
3225
3226 2004-03-16  Martin Baulig  <martin@ximian.com>
3227
3228         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3229
3230 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3231
3232         * decl.cs (DefineTypeAndParents): New helper method to define a
3233         type's containers before the type itself is defined;  This is a
3234         bug exposed by the recent changes to Windows.Forms when an
3235         implemented interface was defined inside a class that had not been
3236         built yet.   
3237
3238         * modifiers.cs (MethodAttr): All methods in C# are HideBySig.
3239
3240         (Check): Loop correctly to report errors modifiers
3241         (UNSAFE was not in the loop, since it was the same as TOP).
3242
3243         * interface.cs: Every interface member now takes a ModFlags,
3244         instead of a "is_new" bool, which we set on the base MemberCore. 
3245
3246         Every place where we called "UnsafeOk" in the interface, now we
3247         call the proper member (InterfaceMethod.UnsafeOK) instead to get
3248         the unsafe settings from the member declaration instead of the
3249         container interface. 
3250
3251         * cs-parser.jay (opt_new): Allow unsafe here per the spec. 
3252
3253         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3254         `set_indexer_name' to the pending bits (one per type).
3255
3256         We fixed a bug today that was picking the wrong method to
3257         override, since for properties the existing InterfaceMethod code
3258         basically ignored the method name.  Now we make sure that the
3259         method name is one of the valid indexer names.
3260
3261 2004-03-14  Gustavo Giráldez  <gustavo.giraldez@gmx.net>
3262  
3263         * support.cs (SeekableStreamReader): Keep track of stream byte
3264         positions and don't mix them with character offsets to the buffer.
3265
3266         Patch from Gustavo Giráldez
3267
3268 2004-03-15  Marek Safar  <marek.safar@seznam.cz>
3269
3270         * interface.cs (InterfaceSetGetBase): Removed double member
3271         initialization, base class does it as well.
3272
3273 2004-03-13  Martin Baulig  <martin@ximian.com>
3274
3275         * class.cs: Reverted Miguel's latest commit; it makes mcs crash
3276         when compiling corlib.
3277
3278 2004-03-13  Miguel de Icaza  <miguel@ximian.com>
3279
3280         * convert.cs (ExplicitConversion): We were reporting an error on
3281         certain conversions (object_type source to a value type, when the
3282         expression was `null') before we had a chance to pass it through
3283         the user defined conversions.
3284
3285         * driver.cs: Replace / and \ in resource specifications to dots.
3286         Fixes 50752
3287
3288         * class.cs: Add check for duplicate operators.  Fixes 52477
3289
3290 2004-03-11  Miguel de Icaza  <miguel@ximian.com>
3291
3292         * statement.cs (Switch.SimpleSwitchEmit): Deal with default labels
3293         that are in the middle of the statements, not only at the end.
3294         Fixes #54987
3295
3296         * class.cs (TypeContainer.AddField): No longer set the
3297         `HaveStaticConstructor' flag, now we call it
3298         `UserDefineStaticConstructor' to diferentiate the slightly
3299         semantic difference.
3300
3301         The situation is that we were not adding BeforeFieldInit (from
3302         Modifiers.TypeAttr) to classes that could have it.
3303         BeforeFieldInit should be set to classes that have no static
3304         constructor. 
3305
3306         See:
3307
3308         http://www.yoda.arachsys.com/csharp/beforefieldinit.html
3309
3310         And most importantly Zoltan's comment:
3311
3312         http://bugzilla.ximian.com/show_bug.cgi?id=44229
3313
3314         "I think beforefieldinit means 'it's ok to initialize the type sometime 
3315          before its static fields are used', i.e. initialization does not need
3316          to be triggered by the first access to the type. Setting this flag
3317          helps the JIT to compile better code, since it can run the static
3318          constructor at JIT time, and does not need to generate code to call it
3319          (possibly lots of times) at runtime. Unfortunately, mcs does not set
3320          this flag for lots of classes like String. 
3321          
3322          csc sets this flag if the type does not have an explicit static 
3323          constructor. The reasoning seems to be that if there are only static
3324          initalizers for a type, and no static constructor, then the programmer
3325          does not care when this initialization happens, so beforefieldinit
3326          can be used.
3327          
3328          This bug prevents the AOT compiler from being usable, since it 
3329          generates so many calls to mono_runtime_class_init that the AOT code
3330          is much slower than the JITted code. The JITted code is faster, 
3331          because it does not generate these calls if the vtable is type is
3332          already initialized, which is true in the majority of cases. But the
3333          AOT compiler can't do this."
3334
3335 2004-03-10  Miguel de Icaza  <miguel@ximian.com>
3336
3337         * class.cs (MethodData.Emit): Refactor the code so symbolic
3338         information is generated for destructors;  For some reasons we
3339         were taking a code path that did not generate symbolic information
3340         before. 
3341
3342 2004-03-11 Ben Maurer  <bmaurer@users.sourceforge.net>
3343
3344         * class.cs: Create a Constructor.CheckBase method that
3345         takes care of all validation type code. The method
3346         contains some code that was moved from Define.
3347
3348         It also includes new code that checks for duplicate ctors.
3349         This fixes bug #55148.
3350
3351 2004-03-09  Joshua Tauberer <tauberer@for.net>
3352
3353         * expression.cs (ArrayCreation): Fix: More than 6 nulls in
3354         a { ... }-style array creation invokes EmitStaticInitializers
3355         which is not good for reference-type arrays.  String, decimal
3356         and now null constants (NullCast) are not counted toward
3357         static initializers.
3358
3359 2004-03-05  Martin Baulig  <martin@ximian.com>
3360
3361         * location.cs (SourceFile.HasLineDirective): New public field;
3362         specifies whether the file contains or is referenced by a "#line"
3363         directive.
3364         (Location.DefineSymbolDocuments): Ignore source files which
3365         either contain or are referenced by a "#line" directive.        
3366
3367 2004-02-29  Ben Maurer <bmaurer@users.sourceforge.net>
3368
3369         * class.cs (Method.CheckBase): Avoid using FindMembers, we have
3370         direct access to our parent, so check the method inline there.
3371
3372 2004-02-27 Ben Maurer  <bmaurer@users.sourceforge.net>
3373
3374         * expression.cs (Invocation.EmitCall): Miguel's last commit
3375         caused a regression. If you had:
3376
3377             T t = null;
3378             t.Foo ();
3379
3380         In Foo the implict this would be null.
3381
3382 2004-02-27  Miguel de Icaza  <miguel@ximian.com>
3383
3384         * expression.cs (Invocation.EmitCall): If the method is not
3385         virtual, do not emit a CallVirt to it, use Call.
3386
3387         * typemanager.cs (GetFullNameSignature): Improve the method to
3388         cope with ".ctor" and replace it with the type name.
3389
3390         * class.cs (ConstructorInitializer.Resolve): Now the method takes
3391         as an argument the ConstructorBuilder where it is being defined,
3392         to catch the recursive constructor invocations.
3393
3394 2004-03-16  Martin Baulig  <martin@ximian.com>
3395
3396         * expression.cs (MemberAccess.DoResolve): If `expr' resolved to a
3397         ConstructedType, call ResolveType() on it to get the type rather
3398         than just using `expr.Type'.
3399
3400 2004-03-16  Martin Baulig  <martin@ximian.com>
3401
3402         * generics.cs (ConstructedType.GetMemberAccess): Take the
3403         EmitContext instead on the TypeExpr and use
3404         ec.TypeContainer.CurrentType/ec.ContainerType.
3405
3406 2004-03-16  Martin Baulig  <martin@ximian.com>
3407
3408         * ecore.cs (SimpleName.DoResolveAsTypeStep): Lookup type
3409         parameters before aliases.
3410
3411 2004-03-16  Martin Baulig  <martin@ximian.com>
3412
3413         * typemanager.cs (TypeManager.MayBecomeEqualGenericInstances):
3414         New oublic function; checks whether two generic instances may become
3415         equal under some instantiations (26.3.1).
3416
3417         * class.cs (TypeContainer.Define): Call
3418         TypeManager.MayBecomeEqualGenericInstances() and report CS0695 on
3419         error.
3420
3421 2004-03-16  Martin Baulig  <martin@ximian.com>
3422
3423         * class.cs (TypeContainer.GetClassBases): Moved
3424         Error_TypeParameterAsBase() here and also check whether the base
3425         class is not an attribute.
3426
3427 2004-03-16  Martin Baulig  <martin@ximian.com>
3428
3429         * class.cs (TypeContainer.GetClassBases): Fix the CS0528 check.
3430
3431 2004-03-16  Martin Baulig  <martin@ximian.com>
3432
3433         * class.cs (Error_TypeParameterAsBase): Use correct error number
3434         here (CS0689).  
3435
3436 2004-03-16  Martin Baulig  <martin@ximian.com>
3437
3438         * decl.cs (DeclSpace.ResolveTypeExpr): Added more error checking
3439         for generics.
3440
3441         * generics.cs (ConstructedType.DoResolveAsTypeStep): Added better
3442         error reporting.
3443
3444 2004-03-15  Martin Baulig  <martin@ximian.com>
3445
3446         * typemanager.cs (TypeManager.GetFullName): New public method.
3447         (TypeManager.MemberLookup): Added `int_num_type_arguments'
3448         argument; only return members with the correct number of type
3449         arguments.
3450         (TypeManager.CheckGeneric): Allow -1 to bypass the check.
3451         (TypeManager.FilterWithClosure): Call CheckGeneric() to check
3452         whether the number of type arguments matches.
3453
3454         * generic.cs (GenericMemberAccess.ResolveAsTypeStep): Allow `expr'
3455         not being a ConstructedType; we can now do "typeof (Foo.Bar<U>)".
3456
3457         * expression.cs (MemberAccess): Added public `NumTypeArguments'
3458         field; it's set by the protected .ctor when we're actually a
3459         GenericMemberAccess.
3460         (MemberAccess.ResolveAsTypeStep): Compute the total number of type
3461         arguments and pass it to MemberLookupFinal ().
3462
3463         * ecore.cs (Expression.MemberLookup): Added `int
3464         num_type_arguments' argument; only return members with the correct
3465         number of type arguments.
3466         (Expression.MemberLookupFailed): Check whether the MemberLookup
3467         failed because we did not have the correct number of type
3468         arguments; report CS0305 in this case.
3469
3470         * decl.cs (DeclSpace.ResolveTypeExpr): Don't report an error if
3471         `e.ResolveAsTypeTerminal()' already did so.
3472
3473 2004-03-15  Martin Baulig  <martin@ximian.com>
3474
3475         * ecore.cs (Expression.ResolveLValue): Allow e.type being null if
3476         we're a ConstructedType; in this case, the caller must report an
3477         error (for instance CS0131).
3478
3479         * generic.cs (TypeArguments): Added Location argument to the .ctor.
3480         (TypeArguments.Resolve): Actually report errors here.
3481
3482 2004-03-15  Miguel de Icaza  <miguel@ximian.com>
3483
3484         * pending.cs (TypeAndMethods): Add `get_indexer_name' and
3485         `set_indexer_name' to the pending bits (one per type).
3486
3487         We fixed a bug today that was picking the wrong method to
3488         override, since for properties the existing InterfaceMethod code
3489         basically ignored the method name.  Now we make sure that the
3490         method name is one of the valid indexer names.
3491
3492 2004-03-15  Martin Baulig  <martin@ximian.com>
3493
3494         * typemanager.cs (TypeManager.IndexerPropertyName): Added support
3495         for generic instances.
3496
3497 2004-03-13  Martin Baulig  <martin@ximian.com>
3498
3499         * class.cs (TypeContainer.DefineType): Call
3500         TypeManager.AddUserType() immediately after creating the
3501         TypeBuilder; pass all type parameters when creating the
3502         CurrentType.
3503
3504         * decl.cs (DeclSpace.FindNestedType): New public method.
3505         (DeclSpace.FindType): Added `int num_type_args' argument; only
3506         return types with the correct number of type parameters.
3507         (DeclSpace.CountTypeParams): New public property.
3508
3509         * ecore.cs (SimpleName.ctor): Added overloaded version which takes
3510         the number of type parameters; defaults to zero.
3511
3512         * generic.cs (TypeArguments.Count): New public property.
3513         (ConstructedType.DoResolveAsTypeStep): First call
3514         ds.FindNestedType() to find out whether we're nested in the
3515         current generic type; in this case, we inherit all type parameters
3516         from the current class.
3517
3518         * rootcontext.cs (RootContext.NamespaceLookup): Added `int
3519         num_type_args' argument.
3520         (RootContext.LookupType): Added overloaded version which takes the
3521         number of type arguments; only return types with the correct
3522         number of type arguments.
3523
3524         * typemanager.cs (TypeManager.CheckGeneric): New public function;
3525         checks whether `Type t' has `int num_type_args'.
3526
3527 2004-03-13  Martin Baulig  <martin@ximian.com>
3528
3529         * generic.cs (GenericMethod.DefineType): New method; calls
3530         DefineType() on all the type parameters.
3531
3532         * class.cs (MethodData.ctor): Added `GenericMethod generic' argument.
3533         (MethodData.Define): If we're a generic method, call
3534         GenericMethod.DefineType() to define the type parameters.       
3535
3536 2004-03-10  Martin Baulig  <martin@ximian.com>
3537
3538         * pending.cs (Pending.InterfaceMethod): Use TypeManager.IsEqual()
3539         instead of IsAssignableFrom.    
3540
3541 2004-03-10  Martin Baulig  <martin@ximian.com>
3542
3543         * ecore.cs (FieldExpr.ctor): Use TypeManager.TypeToCoreType().
3544
3545         * support.cs (ParameterData.HasArrayParameter): New property.
3546         (ReflectionParameters.ctor): Take a MethodBase instead of a
3547         ParameterInfo[].  If we have any type parameters, get the generic
3548         method definition and ask it whether we have variable arguments.
3549
3550 2004-02-26  Miguel de Icaza  <miguel@ximian.com>
3551
3552         * iterators.cs (IteratorHandler.IsIEnumerator, IsIEnumerable): New
3553         routines to check if a type is an enumerable/enumerator allow
3554         classes that implement the IEnumerable or IEnumerator interfaces.
3555
3556         * class.cs (Property, Operator): Implement IIteratorContainer, and
3557         implement SetYields.
3558
3559         (Property.Define): Do the block swapping for get_methods in the
3560         context of iterators.   We need to check if Properties also
3561         include indexers or not.
3562
3563         (Operator): Assign the Block before invoking the
3564         OperatorMethod.Define, so we can trigger the Iterator code
3565         replacement. 
3566
3567         * cs-parser.jay (SimpleIteratorContainer): new helper class.  Both
3568         Property and Operator classes are not created when we parse the
3569         declarator but until we have the block completed, so we use a
3570         singleton SimpleIteratorContainer.Simple to flag whether the
3571         SetYields has been invoked.
3572
3573         We propagate this setting then to the Property or the Operator to
3574         allow the `yield' to function.
3575
3576 2004-02-25  Marek Safar  <marek.safar@seznam.cz>
3577
3578         * codegen.cs: Implemented attribute support for modules.
3579         New AssemblyClass, ModuleClass and CommonAssemblyModulClass for
3580         Assembly/Module functionality.
3581
3582         * attribute.cs, class.cs, cs-parser.jay, delegate.cs, driver.cs, enum.cs
3583         interface.cs, rootcontext.cs, statement.cs, typemanager.cs:
3584         Updated dependencies on CodeGen.ModuleBuilder and CodeGen.AssemblyBuilder.
3585
3586 2004-02-16  Marek Safar  <marek.safar@seznam.cz>
3587
3588         * interface.cs (FindMembers): The operation is performed on all base
3589         interfaces and not only on the first. It is required for future CLS Compliance patch.
3590
3591 2004-02-12 Ben Maurer  <bmaurer@users.sourceforge.net>
3592
3593         * statement.cs, codegen.cs:
3594         This patch deals with patterns such as:
3595
3596         public class List : IEnumerable {
3597
3598                 public MyEnumerator GetEnumerator () {
3599                         return new MyEnumerator(this);
3600                 }
3601
3602                 IEnumerator IEnumerable.GetEnumerator () {
3603                         ...
3604                 }
3605                 
3606                 public struct MyEnumerator : IEnumerator {
3607                         ...
3608                 }
3609         }
3610
3611         Before, there were a few things we did wrong:
3612         1) we would emit callvirt on a struct, which is illegal
3613         2) we emited ldarg when we needed to emit ldarga
3614         3) we would mistakenly call the interface methods on an enumerator
3615         type that derived from IEnumerator and was in another assembly. For example:
3616
3617         public class MyEnumerator : IEnumerator
3618
3619         Would have the interface methods called, even if there were public impls of the
3620         method. In a struct, this lead to invalid IL code.
3621
3622 2004-02-11  Marek Safar  <marek.safar@seznam.cz>
3623
3624         * const.cs: Const is now derived from FieldBase. Method EmitConstant name
3625           renamed to Emit.
3626
3627         * delegate.cs (Define): Fixed crash when delegate type is undefined.
3628
3629 2004-02-11  Miguel de Icaza  <miguel@ximian.com>
3630
3631         * cs-parser.jay: Fix small regression: we were not testing V2
3632         compiler features correctly.
3633
3634         * interface.cs: If the emit context is null, then create one
3635
3636 2004-02-09  Marek Safar  <marek.safar@seznam.cz>
3637
3638         * decl.cs (GetSignatureForError): New virtual method to get full name
3639           for error messages.
3640
3641         * attribute.cs (IAttributeSupport): New interface for attribute setting.
3642           Now it is possible to rewrite ApplyAttributes method to be less if/else.
3643
3644         * interface.cs : All InterfaceXXX classes are now derived from MemberCore.
3645           Duplicated members and code in these classes has been removed.
3646           Better encapsulation in these classes.
3647
3648 2004-02-07  Miguel de Icaza  <miguel@ximian.com>
3649
3650         * assign.cs (Assign.DoResolve): When dealing with compound
3651         assignments, there is a new rule in ECMA C# 2.4 (might have been
3652         there before, but it is documented here) that states that in:
3653
3654         a op= b;
3655
3656         If b is of type int, and the `op' is a shift-operator, then the
3657         above is evaluated as:
3658
3659         a = (int) a op b 
3660
3661         * expression.cs (Binary.ResolveOperator): Instead of testing for
3662         int/uint/long/ulong, try to implicitly convert to any of those
3663         types and use that in pointer arithmetic.
3664
3665         * delegate.cs (Error_NoMatchingMethodForDelegate): Compute the
3666         method to print information for from the type, not from the
3667         null-method we were given.
3668
3669 2004-02-01  Duncan Mak  <duncan@ximian.com>
3670
3671         * cs-tokenizer.cs (get_cmd_arg): Skip over whitespace before
3672         parsing for cmd, fixes bug #53694.
3673
3674 2004-02-04  Marek Safar  <marek.safar@seznam.cz>
3675
3676         * class.cs, decl.cs: Fixed problem where IndexerName attribute was ignored
3677         in the member name duplication tests. Property and operator name duplication
3678         was missing too (error tests cs0102-{2,3,4,5}.cs, cs0111-{3,4}.cs).
3679
3680 2004-02-03  Marek Safar  <marek.safar@seznam.cz>
3681
3682         * interface.cs (PopulateMethod): Fixed crash when interface method
3683         returns not existing type (error test cs0246-3.cs).
3684
3685 2004-02-02  Ravi Pratap M <ravi@ximian.com>
3686
3687         * cs-parser.jay (interface_accessors): Re-write actions to also
3688         store attributes attached to get and set methods. Fix spelling
3689         while at it.
3690
3691         (inteface_property_declaration): Modify accordingly.
3692
3693         (InterfaceAccessorInfo): New helper class to store information to pass
3694         around between rules that use interface_accessors.
3695
3696         * interface.cs (Emit): Apply attributes on the get and set
3697         accessors of properties and indexers too.
3698
3699         * attribute.cs (ApplyAttributes): Modify accordingly to use the
3700         right MethodBuilder when applying attributes to the get and set accessors.
3701
3702 2004-01-31  Miguel de Icaza  <miguel@ximian.com>
3703
3704         * cs-tokenizer.cs: Applied patch from Marek Safar to fix bug 53386
3705
3706 2004-01-26  Miguel de Icaza  <miguel@ximian.com>
3707
3708         * cs-tokenizer.cs: Handle #line hidden from PDC bits.
3709
3710 2004-01-25  Miguel de Icaza  <miguel@ximian.com>
3711
3712         * cs-parser.jay: Remove YIELD token, instead use the new grammar
3713         changes that treat `yield' specially when present before `break'
3714         or `return' tokens.
3715
3716         * cs-tokenizer.cs: yield is no longer a keyword.
3717
3718 2004-01-23  Marek Safar  <marek.safar@seznam.cz>
3719
3720         * cs-parser.jay, class.cs (DefineDefaultConstructor): Fixed ModFlags
3721         setting for default constructors.
3722         For default constructors are almost every time set wrong Modifier. The
3723         generated IL code has been alright. But inside mcs this values was
3724         wrong and this was reason why several of my CLS Compliance tests
3725         failed.
3726
3727 2004-02-27  Martin Baulig  <martin@ximian.com>
3728
3729         * generics.cs (ConstructedType.ResolveType): Make the nested type
3730         stuff actually work.
3731
3732 2004-02-25  Martin Baulig  <martin@ximian.com>
3733
3734         * decl.cs (DeclSpace.CurrentTypeParameters): New protected
3735         property; returns the type parameters just from the current type,
3736         ie. with the ones from outer classes.
3737         (DeclSpace.LookupGeneric): First search in the current class, then
3738         in outer classes.
3739         (DeclSpace.initialize_type_params): When hiding a type parameter
3740         from an outer class, put it into the `type_param_list' anyways.
3741
3742         * expression.cs (MemberAccess.expr): Made this field protected.
3743
3744         * class.cs (TypeContainer.Define): The `CurrentType' just contains
3745         the type parameters from the current class.
3746
3747         * generic.cs (ConstructedType.ResolveType): Support nested generic
3748         types by taking the type parameters which we inherit from outer
3749         classes into account.
3750         (GenericMemberAccess.ResolveAsTypeStep): Override this and added
3751         support for nested generic types.
3752
3753 2004-02-23  Martin Baulig  <martin@ximian.com>
3754
3755         * decl.cs (DeclSpace.IsGeneric): Make this a property instead of a
3756         field and check whether we're nested inside a generic type.
3757         (DeclSpace.ResolveType): If we're resolving to a generic type
3758         definition, create a ConstructedType and return its resolved type.
3759         (DeclSpace.initialize_type_params): New private method;
3760         initializes the `type_param_list' field from the type parameters
3761         from this and all enclosing classes.
3762         (DeclSpace.TypeParameters): Call initialize_type_params() unless
3763         we're already initialized.
3764
3765 2004-02-23  Martin Baulig  <martin@ximian.com>
3766
3767         * class.cs (Method.Define): Create the generic method before
3768         calling DoDefine().
3769         (Memberbase.DoDefine): Added DeclSpace argument (in addition to
3770         the TypeContainer one); we use this for generic methods.
3771
3772         * decl.cs (CheckAccessLevel): If we're a GenericMethod, use our
3773         parent's TypeBuilder.
3774
3775 2004-02-18  Martin Baulig  <martin@ximian.com>
3776
3777         * ecore.cs (FieldExpr.DoResolveLValue): Use TypeManager.IsEqual()
3778         to check for equality.
3779
3780 2004-02-05  Martin Baulig  <martin@ximian.com>
3781
3782         * ecore.cs (FieldExpr.DoResolveLValue): If we have an
3783         `ec.TypeContainer.CurrentType', use it instead of
3784         `ec.ContainerType' to check whether we're in the type's ctor.
3785
3786 2004-01-29  Martin Baulig  <martin@ximian.com>
3787
3788         * expression.cs (Invocation.DoResolve): If we're a
3789         `ConstructedType', then we're actually a generic method, so
3790         rewrite the expr as a GenericMemberAccess.
3791
3792         * cs-parser.jay (member_name): Don't use `namespace_or_type_name'
3793         here; manually parse it into a string.
3794
3795 2004-01-28  Martin Baulig  <martin@ximian.com>
3796
3797         * typemanager.cs (TypeManager.IsEqual): New static method.
3798         (TypeManager.FilterWithClosure): Call TypeManager.IsEqual() to
3799         check for equality instead of using `=='.
3800
3801 2004-01-26  Martin Baulig  <martin@ximian.com>
3802
3803         * decl.cs (DeclSpace.CurrentType): New public field.
3804
3805         * expression.cs (This.ResolveBase): If we have an
3806         `ec.TypeContainer.CurrentType', use it instead of
3807         `ec.ContainerType'.
3808
3809         * class.cs (TypeContainer.DefineType): If we're a generic type,
3810         create the `CurrentType' (unresolved).
3811         (TypeContainer.GenericType): New private field.
3812         (TypeContainer.DefineMembers): If we have a `CurrentType', resolve
3813         it and store it in `GenericType' before creating the MemberCache.
3814         (TypeContainer.GetMembers): If we have a `GenericType', call
3815         TypeManager.FindMembers() on it.
3816
3817         * interface.cs (Interface.GenericType): New private field.
3818         (Interface.DefineType): If we're a generic type, create the
3819         `CurrentType' (unresolved).
3820         (Interface.DefineMembers): If we have a `CurrentType', resolve it
3821         and store it in `GenericType' before creating the MemberCache.
3822         (Interface.GetMembers): If we have a `GenericType', call
3823         TypeManager.FindMembers() on it.
3824
3825 2004-01-22  Martin Baulig  <martin@ximian.com>
3826
3827         * cs-parser.jay (namespace_or_type_name): Return an Expression,
3828         not a QualifiedIdentifier.  This is what `type_name_expression'
3829         was previously doing.
3830         (type_name_expression): Removed; the code is now in
3831         `namespace_or_type_name'.
3832         (qualified_identifier): Removed, use `namespace_or_type_name'
3833         instead.
3834         (QualifiedIdentifier): Removed this class.      
3835
3836 2004-01-22  Martin Baulig  <martin@ximian.com>
3837
3838         * namespace.cs (NamespaceEntry.UsingAlias): Take an Expression,
3839         not a string as alias name.
3840
3841 2004-01-21  Miguel de Icaza  <miguel@ximian.com>
3842
3843         * ecore.cs (FieldInfo.AddressOf): Revert patch from previous
3844         #52730 bug, and instead compute correctly the need to use a
3845         temporary variable when requesting an address based on the
3846         static/instace modified of the field and the constructor.
3847  
3848 2004-01-21  Martin Baulig  <martin@ximian.com>
3849
3850         * ecore.cs (SimpleName.ResolveAsTypeStep): Lookup in the current
3851         class and namespace before looking up aliases.  Fixes #52517.
3852
3853 2004-01-21  Martin Baulig  <martin@ximian.com>
3854
3855         * flowanalysis.cs (UsageVector.Merge): Allow variables being
3856         assinged in a 'try'; fixes exception4.cs.
3857
3858 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3859         * class.cs : Implemented parameter-less constructor for TypeContainer
3860
3861         * decl.cs: Attributes are now stored here. New property OptAttributes
3862
3863         * delegate.cs, enum.cs, interface.cs: Removed attribute member.
3864
3865         * rootcontext.cs, tree.cs: Now use parameter-less constructor of TypeContainer
3866
3867 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3868
3869         * typemanager.cs (CSharpSignature): Now reports also inner class name.
3870           (CSharpSignature): New method for indexer and property signature.
3871
3872 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3873
3874         * pending.cs (IsVirtualFilter): Faster implementation.
3875
3876 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3877
3878         * typemanager.cs: Avoid inclusion of same assembly more than once.
3879
3880 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3881
3882         * cs-parser.jay: Fixed problem where the last assembly attribute
3883           has been applied also to following declaration (class, struct, etc.)
3884           
3885 2004-01-21  Marek Safar  <marek.safar@seznam.cz>
3886
3887         * class.cs: Added error CS0538, CS0539 reporting.
3888         Fixed crash on Microsoft runtime when field type is void.
3889
3890         * cs-parser.jay: Added error CS0537 reporting.
3891
3892         * pending.cs: Added error CS0535 reporting.
3893         Improved error report for errors CS0536, CS0534.
3894
3895 2004-01-20  Miguel de Icaza  <miguel@ximian.com>
3896
3897         Merge a few bits from the Anonymous Method MCS tree.
3898
3899         * statement.cs (ToplevelBlock): New class for toplevel methods,
3900         will hold anonymous methods, lifted variables.
3901
3902         * cs-parser.jay: Create toplevel blocks for delegates and for
3903         regular blocks of code. 
3904
3905 2004-01-20  Martin Baulig  <martin@ximian.com>
3906
3907         * codegen.cs (EmitContext): Removed `InTry', `InCatch',
3908         `InFinally', `InLoop', `TryCatchLevel', `LoopBeginTryCatchLevel'
3909         and `NeedExplicitReturn'; added `IsLastStatement'.
3910         (EmitContext.EmitTopBlock): Emit the explicit "ret" if we either
3911         have a `ReturnLabel' or we're not unreachable.
3912
3913         * flowanalysis.cs (FlowBranching.MergeChild): Actually merge the
3914         child's reachability; don't just override ours with it.  Fixes
3915         #58058 (lluis's example).
3916         (FlowBranching): Added public InTryOrCatch(), InCatch(),
3917         InFinally(), InLoop(), InSwitch() and
3918         BreakCrossesTryCatchBoundary() methods.
3919
3920         * statement.cs (Return): Do all error checking in Resolve().
3921         Unless we are the last statement in a top-level block, always
3922         create a return label and jump to it.
3923         (Break, Continue): Do all error checking in Resolve(); also make
3924         sure we aren't leaving a `finally'.
3925         (Block.DoEmit): Set `ec.IsLastStatement' when emitting the last
3926         statement in a top-level block.
3927         (Block.Flags): Added `IsDestructor'.
3928         (Block.IsDestructor): New public property.
3929
3930 2004-01-20  Martin Baulig  <martin@ximian.com>
3931
3932         * statement.cs (Break.DoEmit): Set ec.NeedExplicitReturn; fixes #52427.
3933
3934 2004-01-20  Martin Baulig  <martin@ximian.com>
3935
3936         * statement.cs (Statement.ResolveUnreachable): New public method.
3937         (If, While): Do the dead-code elimination in Resolve(), not in Emit().
3938         (Block.Resolve): Resolve unreachable statements.
3939
3940 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3941
3942         * expression.cs: We need to fix the case where we do
3943         not have a temp variable here.
3944
3945         * assign.cs: Only expression compound assignments need
3946         temporary variables.
3947
3948 2004-01-19 Ben Maurer  <bmaurer@users.sourceforge.net>
3949
3950         * flowanalysis.cs: Reduce memory allocation in a few ways:
3951           - A block with no variables should not allocate a bit
3952             vector for itself.
3953           - A method with no out parameters does not need any tracking
3954             for assignment of the parameters, so we need not allocate
3955             any data for it.
3956           - The arrays:
3957                 public readonly Type[] VariableTypes;
3958                 public readonly string[] VariableNames;
3959             Are redundant. The data is already stored in the variable
3960             map, so we need not allocate another array for it.
3961           - We need to add alot of checks for if (params | locals) == null
3962             due to the first two changes.
3963
3964 2004-01-18  Miguel de Icaza  <miguel@ximian.com>
3965
3966         * ecore.cs (FieldExpr.AddressOf): For ValueTypes that do not
3967         implement IMemoryLocation, we store a copy on a local variable and
3968         take the address of it.  Patch from Benjamin Jemlich
3969
3970         * cs-parser.jay: Applied patch from Ben Maurer to the "type" rule
3971         to use a special "type_name_expression" rule which reduces the
3972         number of "QualifiedIdentifier" classes created, and instead
3973         directly creates MemberAccess expressions.
3974
3975 2004-01-17  Miguel de Icaza  <miguel@ximian.com>
3976
3977         * convert.cs: Applied patch from Benjamin Jemlich (pcgod@gmx.net)
3978         that fixes #52853.  Null literal assignment to ValueType
3979
3980         * class.cs (MethodData.Emit): Instead of checking the name of the
3981         method to determine if its a destructor, create a new derived
3982         class from Method called Destructor, and test for that.  
3983
3984         * cs-parser.jay: Create a Destructor object instead of a Method.  
3985
3986         Based on a fix from Benjamin Jemlich (pcgod@gmx.net)
3987
3988         Fixes: 52933
3989
3990 2004-01-16  Miguel de Icaza  <miguel@ximian.com>
3991
3992         * expression.cs (Binary.ResolveOperator): Perform an implicit
3993         conversion from MethodGroups to their delegate types on the
3994         Addition operation.
3995
3996         * delegate.cs: Introduce a new class DelegateCreation that is the
3997         base class for `NewDelegate' and `ImplicitDelegateCreation',
3998         factor some code in here.
3999
4000         * convert.cs (Convert.ImplicitConversionStandard): Add an implicit
4001         conversion from MethodGroups to compatible delegate types. 
4002
4003         * ecore.cs (Expression.Resolve): Do not flag error 654
4004         (Methodgroupd needs parenthesis) if running on the V2 compiler, as
4005         we allow conversions from MethodGroups to delegate types now.
4006
4007         * assign.cs (Assign.DoResolve): Do not flag errors on methodgroup
4008         assignments in v2 either.
4009
4010 2004-01-10  Miguel de Icaza  <miguel@ximian.com>
4011
4012         * ecore.cs (FieldExpr.AddressOf): Fix generated IL for accessing
4013         static read-only fields in ctors.
4014
4015         Applied patch from Benjamin Jemlich 
4016
4017         * expression.cs (UnaryMutator): Avoid leaking local variables. 
4018
4019 2004-01-09  Miguel de Icaza  <miguel@ximian.com>
4020
4021         * cs-tokenizer.cs (IsCastToken): Allow the various native types
4022         here to return true, as they can be used like this:
4023
4024                 (XXX) int.MEMBER ()
4025
4026         Fixed 49836 and all the other dups
4027
4028 2004-01-09  Zoltan Varga  <vargaz@freemail.hu>
4029
4030         * driver.cs: Implement /win32res and /win32icon.
4031
4032 2004-01-08  Miguel de Icaza  <miguel@ximian.com>
4033
4034         * cs-parser.jay: Add a rule to improve error handling for the
4035         common mistake of placing modifiers after the type.
4036
4037 2004-01-07  Miguel de Icaza  <miguel@ximian.com>
4038
4039         * cs-parser.jay (interface_event_declaration): Catch
4040         initialization of events on interfaces, and report cs0068
4041
4042         * cs-parser.jay (interface_event_declaration): Catch
4043         initialization of events. 
4044
4045         * ecore.cs: Better report missing constructors.
4046
4047         * expression.cs (Binary.ResolveOperator): My previous bug fix had
4048         the error reporting done in the wrong place.  Fix.
4049
4050         * expression.cs (Binary.ResolveOperator): Catch the 
4051         operator + (E x, E y) error earlier, and later allow for implicit
4052         conversions in operator +/- (E e, U x) from U to the underlying
4053         type of E.
4054
4055         * class.cs (TypeContainer.DefineDefaultConstructor): Fix bug
4056         52596, if the container class is abstract, the default constructor
4057         is protected otherwise its public (before, we were always public).
4058
4059         * statement.cs (Fixed.Resolve): Catch a couple more errors in the
4060         fixed statement.
4061
4062         (Using.EmitLocalVariableDecls): Applied patch from Benjamin
4063         Jemlich that fixes bug #52597, MCS was generating invalid code for
4064         idisposable structs.   Thanks to Ben for following up with this
4065         bug as well.
4066
4067 2004-01-06  Miguel de Icaza  <miguel@ximian.com>
4068
4069         * driver.cs: Allow assemblies without code to be generated, fixes
4070         52230.
4071
4072 2004-01-07  Nick Drochak <ndrochak@gol.com>
4073
4074         * attribute.cs: Remove unneeded catch variables. Eliminates a warning.
4075
4076 2004-01-05  Miguel de Icaza  <miguel@ximian.com>
4077
4078         * cs-parser.jay: Add rules to improve error reporting if fields or
4079         methods are declared at the namespace level (error 116)
4080
4081         * Add rules to catch event add/remove
4082
4083 2004-01-04  David Sheldon <dave-mono@earth.li>
4084
4085   * expression.cs: Added matching ")" to error message for 
4086   CS0077
4087
4088 2004-01-03 Todd Berman <tberman@gentoo.org>
4089
4090         * ecore.cs, attribute.cs:
4091         Applying fix from #52429.
4092
4093 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4094
4095         * ecore.cs, expression.cs, statement.cs:
4096         Total rewrite of how we handle branching. We
4097         now handle complex boolean expressions with fewer
4098         jumps. As well if (x == 0) no longer emits a ceq.
4099
4100         if (x is Foo) is much faster now, because we generate
4101         better code.
4102
4103         Overall, we get a pretty big improvement on our benchmark
4104         tests. The code we generate is smaller and more readable.
4105
4106         I did a full two-stage bootstrap. The patch was reviewed
4107         by Martin and Miguel.
4108
4109 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4110
4111         * cs-parser.jay: Make primary_expression not take a QI.
4112         we dont need this because the member_access rule covers
4113         us here. So we replace the rule with just IDENTIFIER.
4114
4115         This has two good effects. First, we remove a s/r conflict.
4116         Second, we allocate many fewer QualifiedIdentifier objects.
4117
4118 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4119
4120         * attribute.cs: Handle MarshalAs attributes as pseudo, and
4121         set the correct information via SRE. This prevents
4122         hanging on the MS runtime. Fixes #29374.
4123
4124 2004-01-03 Ben Maurer  <bmaurer@users.sourceforge.net>
4125
4126         * convert.cs: correctly handle conversions to value types
4127         from Enum and ValueType as unboxing conversions.
4128
4129         Fixes bug #52569. Patch by Benjamin Jemlich.
4130
4131 2004-01-02  Ravi Pratap  <ravi@ximian.com>
4132
4133         * expression.cs (BetterConversion): Prefer int -> uint
4134         over int -> ulong (csc's behaviour). This fixed bug #52046.
4135
4136 2004-01-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4137
4138         * decl.cs (MemberCache.FindMembers): now returns a
4139         MemberInfo [].
4140
4141         * typemanager.cs: In general, go with with ^^.
4142         (CopyNewMethods): take an IList.
4143         (RealMemberLookup): Only allocate an arraylist
4144         if we copy from two sets of methods.
4145
4146         This change basically does two things:
4147         1) Fewer array lists allocated due to CopyNewMethods.
4148         2) the explicit cast in MemberList costed ALOT.
4149
4150 2004-01-02  Zoltan Varga  <vargaz@freemail.hu>
4151
4152         * cs-tokenizer.cs (consume_identifier) driver.cs: Cache identifiers in
4153         a hashtable to avoid needless string allocations when an identifier is
4154         used more than once (the common case).
4155
4156 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4157
4158         * pending.cs: MS's TypeBuilder.GetInterfaces ()
4159         is broken, it will not return anything. So, we
4160         have to use the information we have in mcs to
4161         do the task.
4162
4163         * typemanager.cs: Add a cache for GetInterfaces,
4164         since this will now be used more often (due to ^^)
4165
4166         (GetExplicitInterfaces) New method that gets the
4167         declared, not effective, interfaces on a type
4168         builder (eg, if you have interface IFoo, interface
4169         IBar, Foo : IFoo, Bar : Foo, IBar, GetExplInt (Bar) ==
4170         { IBar }.
4171
4172         This patch makes MCS able to bootstrap itself on
4173         Windows again.
4174
4175 2004-01-01 Ben Maurer  <bmaurer@users.sourceforge.net>
4176
4177         * expression.cs: Remove the Nop's that Miguel put
4178         in by mistake.
4179
4180 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4181
4182         * report.cs, codegen.cs: Give the real stack trace to
4183         the error when an exception is thrown.
4184
4185 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4186
4187         * decl.cs: only allocate hashtables for ifaces if 
4188         it is an iface!
4189
4190 2003-12-31 Ben Maurer  <bmaurer@users.sourceforge.net>
4191
4192         * expression.cs: fix the error from cs0121-2.cs
4193         (a parent interface has two child interfaces that
4194         have a function with the same name and 0 params
4195         and the function is called through the parent).
4196
4197 2003-12-30 Ben Maurer  <bmaurer@users.sourceforge.net>
4198
4199         * class.cs, rootcontext.cs, typmanager.cs: do not
4200         leak pointers.
4201
4202 2003-12-28 Ben Maurer  <bmaurer@users.sourceforge.net>
4203
4204         * codegen.cs: remove stack for the ec flow branching.
4205         It is already a linked list, so no need.
4206
4207 2003-12-27 Ben Maurer  <bmaurer@users.sourceforge.net>
4208
4209         * Makefile: Allow custom profiler here.
4210
4211 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4212
4213         * typemanager.cs (LookupType):
4214           - Use a static char [], because split takes
4215             a param array for args, so it was allocating
4216             every time.
4217           - Do not store true in a hashtable, it boxes.
4218
4219 2003-12-26 Ben Maurer  <bmaurer@users.sourceforge.net>
4220
4221         * flowanalysis.cs: bytify common enums.
4222
4223 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4224
4225         * modifiers.cs: Add a new set of flags for the
4226         flags allowed on explicit interface impls.
4227         * cs-parser.jay: catch the use of modifiers in
4228         interfaces correctly.
4229         * class.cs: catch private void IFoo.Blah ().
4230
4231         All related to bug #50572.
4232
4233 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4234
4235         * decl.cs: Rewrite the consistant accessability checking.
4236         Accessability is not linear, it must be implemented in
4237         a tableish way. Fixes #49704.
4238
4239 2003-12-25 Ben Maurer  <bmaurer@users.sourceforge.net>
4240
4241         * expression.cs: Handle negation in a checked context.
4242         We must use subtraction from zero. Fixes #38674.
4243
4244 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4245
4246         * class.cs: Ignore static void main in DLLs.
4247         * rootcontext.cs: Handle the target type here,
4248         since we are have to access it from class.cs
4249         * driver.cs: account for the above.
4250
4251 2003-12-23 Ben Maurer  <bmaurer@users.sourceforge.net>
4252
4253         * report.cs: Give line numbers and files if available.
4254
4255 2003-12-20  Zoltan Varga  <vargaz@freemail.hu>
4256
4257         * driver.cs: Implement /addmodule.
4258
4259         * typemanager.cs:  Change 'modules' field so it now contains Modules not
4260         ModuleBuilders.
4261
4262 2003-12-20  Martin Baulig  <martin@ximian.com>
4263
4264         * class.cs (TypeContainer.DefineMembers): Don't do the CS0649 check here.
4265         (FieldBase.IsAssigned): Removed this field.
4266         (FieldBase.SetAssigned): New public method.
4267         (TypeContainer.Emit): Make the CS0169/CS0649 checks actually work.
4268
4269 2003-12-20  Martin Baulig  <martin@ximian.com>
4270
4271         * expression.cs (LocalVariableReference.DoResolve): Don't set
4272         `vi.Used' if we're called from DoResolveLValue().
4273
4274         * statement.cs (Block.DoResolve): `ec.DoEndFlowBranching()' now
4275         returns the usage vector it just merged into the current one -
4276         pass this one to UsageWarning().
4277         (Block.UsageWarning): Take the `FlowBranching.UsageVector' instead
4278         of the `EmitContext', don't call this recursively on our children.
4279
4280 2003-12-19  Zoltan Varga  <vargaz@freemail.hu>
4281
4282         * driver.cs: Implement /target:module.
4283
4284 2003-12-18  Zoltan Varga  <vargaz@freemail.hu>
4285
4286         * support.cs (CharArrayHashtable): New helper class.
4287
4288         * cs-tokenizer.cs: Store keywords in a hashtable indexed by 
4289         char arrays, not strings, so we can avoid creating a string in
4290         consume_identifier if the identifier is a keyword.
4291
4292 2003-12-16  Martin Baulig  <martin@ximian.com>
4293
4294         * statement.cs (LocalInfo.Assigned): Removed this property.
4295         (LocalInfo.Flags): Removed `Assigned'.
4296         (LocalInfo.IsAssigned): New public method; takes the EmitContext
4297         and uses flow analysis.
4298         (Block.UsageWarning): Made this method private.
4299         (Block.Resolve): Call UsageWarning() if appropriate.
4300
4301         * expression.cs (LocalVariableReference.DoResolve): Always set
4302         LocalInfo.Used here.
4303
4304 2003-12-13  Martin Baulig  <martin@ximian.com>
4305
4306         * statement.cs (Statement.DoEmit, Statement.Emit): Don't return
4307         any value here; we're now using flow analysis to figure out
4308         whether a statement/block returns a value.
4309
4310 2003-12-13  Martin Baulig  <martin@ximian.com>
4311
4312         * flowanalysis.cs (UsageVector.MergeFinallyOrigins): Made this
4313         working again.
4314         (FlowBranching.MergeFinally): Don't call
4315         `branching.CheckOutParameters()' here, this is called in
4316         MergeTopBlock().
4317         (FlowBranchingException.AddSibling): Call MergeFinallyOrigins()
4318         when adding the `finally' vector.       
4319
4320 2003-12-13  Martin Baulig  <martin@ximian.com>
4321
4322         * flowanalysis.cs
4323         (UsageVector.MergeJumpOrigins, FlowBranching.Label): Make this
4324         actually work and also fix #48962.
4325
4326 2003-12-12 Ben Maurer  <bmaurer@users.sourceforge.net>
4327
4328         * decl.cs: Do not check System.Object for nested types,
4329         since we know it does not have any. Big bang for buck:
4330
4331         BEFORE:
4332            Run 1:   8.35 seconds
4333            Run 2:   8.32 seconds
4334            corlib:  17.99 seconds
4335         AFTER:
4336            Run 1:   8.17 seconds
4337            Run 2:   8.17 seconds
4338            corlib:  17.39 seconds
4339
4340 2003-12-11 Ben Maurer  <bmaurer@users.sourceforge.net>
4341
4342         * class.cs (FindMembers): Allocate arraylists on demand. Most of the
4343         time we are returning 0 members, so we save alot here.
4344
4345 2003-12-11  Martin Baulig  <martin@ximian.com>
4346
4347         * flowanalysis.cs (UsageVector.MergeResult): Renamed this back to
4348         `MergeChild()', also just take the `FlowBranching' as argument;
4349         call Merge() on it and return the result.
4350         (FlowBranching.Merge): We don't need to do anything if we just
4351         have one sibling.
4352
4353 2003-12-11  Martin Baulig  <martin@ximian.com>
4354
4355         * flowanalysis.cs: Use a list of `UsageVector's instead of storing
4356         them in an `ArrayList' to reduce memory usage.  Thanks to Ben
4357         Maurer for this idea.
4358
4359 2003-12-11  Martin Baulig  <martin@ximian.com>
4360
4361         * flowanalysis.cs (MergeResult): This class is now gone; we now
4362         use the `UsageVector' for this.  The reason for this is that if a
4363         branching just has one sibling, we don't need to "merge" them at
4364         all - that's the next step to do.
4365         (FlowBranching.Merge): We now return a `UsageVector' instead of a
4366         `MergeResult'.
4367
4368 2003-12-11  Martin Baulig  <martin@ximian.com>
4369
4370         Reworked flow analyis and made it more precise and bug-free.  The
4371         most important change is that we're now using a special `Reachability'
4372         class instead of having "magic" meanings of `FlowReturns'.  I'll
4373         do some more cleanups and optimizations and also add some more
4374         documentation this week.
4375
4376         * flowanalysis.cs (Reachability): Added `Throws' and `Barrier';
4377         largely reworked this class.
4378         (FlowReturns): Removed `Unreachable' and `Exception'; we now use
4379         the new `Reachability' class instead of having "magic" values here.
4380         (FlowBranching): We're now using an instance of `Reachability'
4381         instead of having separate `Returns', `Breaks' etc. fields.
4382
4383         * codegen.cs (EmitContext.EmitTopBlock): Set `has_ret' solely
4384         based on flow analysis; ignore the return value of block.Emit ().
4385
4386 2003-12-10  Zoltan Varga  <vargaz@freemail.hu>
4387
4388         * driver.cs typemanager.cs: Find the mono extensions to corlib even
4389         if they are private.
4390
4391 2003-12-09  Martin Baulig  <martin@ximian.com>
4392
4393         * flowanalyis.cs (FlowBranching.Return, Goto, Throw): Removed;
4394         call them directly on the UsageVector.
4395
4396 2003-12-09  Martin Baulig  <martin@ximian.com>
4397
4398         * flowanalysis.cs (FlowBranching.MergeChild, MergeTopBlock):
4399         Changed return type from `FlowReturns' to `Reachability'.
4400
4401 2003-12-09  Martin Baulig  <martin@ximian.com>
4402
4403         * flowanalysis.cs (FlowBranching.Reachability): New sealed class.
4404         (FlowBranching.MergeResult): Replaced the `Returns', `Breaks' and
4405         `Reachable' fields with a single `Reachability' one.
4406
4407 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4408
4409         * class.cs (FindMembers): Remove foreach's.
4410
4411         Bootstrap times:
4412
4413         BEFORE
4414                 Run 1:   8.74 seconds
4415                 Run 2:   8.71 seconds
4416
4417         AFTER
4418                 Run 1:   8.64 seconds
4419                 Run 2:   8.58 seconds
4420
4421
4422 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4423
4424         * cs-parser.jay:
4425         * gen-treedump.cs:
4426         * statement.cs:
4427         This patch does a few things:
4428                 1. EmptyStatement is now a singleton, so it is never reallocated.
4429                 2. All blah is EmptyStatement constructs have been changed to
4430                    blah == EmptyStatement.Value, which is much faster and valid
4431                    now that EmptyStatement is a singleton.
4432                 3. When resolving a block, rather than allocating a new array for
4433                    the non-empty statements, empty statements are replaced with
4434                    EmptyStatement.Value
4435                 4. Some recursive functions have been made non-recursive.
4436         Mainly the performance impact is from (3), however (1) and (2) are needed for
4437         this to work. (4) does not make a big difference in normal situations, however
4438         it makes the profile look saner.
4439
4440         Bootstrap times:
4441
4442         BEFORE
4443         9.25user 0.23system 0:10.28elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4444         9.34user 0.13system 0:10.23elapsed 92%CPU (0avgtext+0avgdata 0maxresident)k
4445         Total memory allocated: 56397 KB
4446
4447         AFTER
4448         9.13user 0.09system 0:09.64elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
4449         8.96user 0.24system 0:10.13elapsed 90%CPU (0avgtext+0avgdata 0maxresident)k
4450         Total memory allocated: 55666 KB
4451
4452 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4453
4454         * support.cs: Rewrite DoubleHash to use its own impl. Is faster
4455         than the hashtable in a hashtable version
4456
4457         * decl.cs: Right now, whenever we try to lookup a type inside a namespace,
4458         we always end up concating a string. This results in a huge perf
4459         loss, because many strings have to be tracked by the GC. In this
4460         patch, we first use a hashtable that works with two keys, so that
4461         the strings do not need to be concat'ed.
4462
4463         Bootstrap times:
4464         BEFORE
4465                 Run 1:   8.74 seconds
4466                 Run 2:   8.71 seconds
4467
4468         AFTER
4469                 Run 1:   8.65 seconds
4470                 Run 2:   8.56 seconds
4471
4472 2003-12-08 Ben Maurer  <bmaurer@users.sourceforge.net>
4473
4474         * Makefile: Add a new target `do-time' that does a quick and simple
4475         profile, leaving easy to parse output.
4476
4477 2003-12-08  Zoltan Varga  <vargaz@freemail.hu>
4478
4479         * codegen.cs (Init): Create the dynamic assembly with 
4480         AssemblyBuilderAccess.Save, to enable some optimizations in the runtime.
4481
4482 2003-12-02 Ben Maurer  <bmaurer@users.sourceforge.net>
4483
4484         * support.cs: Make the PtrHashtable use only one
4485         instance of its comparer.
4486
4487 2003-11-30  Zoltan Varga  <vargaz@freemail.hu>
4488
4489         * typemanager.cs: Fix lookup of GetNamespaces.
4490
4491 2003-11-29  Miguel de Icaza  <miguel@ximian.com>
4492
4493         * expression.cs: Removed redundant line.
4494
4495         * statement.cs (Block.Resolve, Block.Emit): Avoid foreach on
4496         ArrayLists, use for loops with bounds.  
4497
4498         * flowanalysis.cs (FlowBranching.Merge): Avoid foreach on
4499         arraylist.
4500
4501         * expression.cs (Invocation.OverloadResolve): Avoid foreach on
4502         arraylists, use for loop with bounds.
4503
4504         The above three changes give us a 0.071 second performance
4505         improvement out of 3.294 seconds down to 3.223.  On my machine
4506         the above changes reduced the memory usage by 1,387 KB during
4507         compiler bootstrap.
4508
4509         * cs-parser.jay (QualifiedIdentifier): New class used to represent
4510         QualifiedIdentifiers.  Before we created a new string through
4511         concatenation, and mostly later on, the result would be
4512         manipulated by DecomposeQI through string manipulation.
4513
4514         This reduced the compiler memory usage for bootstrapping from
4515         59380 KB to 59007 KB on my machine, 373 KB, and also reduced the
4516         compile times in 0.05 seconds.
4517
4518 2003-11-28  Dick Porter  <dick@ximian.com>
4519
4520         * support.cs: Do string compares with the Invariant culture.
4521
4522         * rootcontext.cs: 
4523         * gen-treedump.cs: 
4524         * expression.cs: 
4525         * driver.cs: 
4526         * decl.cs: 
4527         * codegen.cs: 
4528         * class.cs: Use the char forms of IndexOf and LastIndexOf, so that
4529         the comparison is done with the Invariant culture.
4530
4531 2003-11-27  Miguel de Icaza  <miguel@ximian.com>
4532
4533         * statement.cs (Foreach.TryType): Use DeclaredOnly to find the
4534         GetEnumerator method.
4535
4536         (ProbeCollectionType): Iterate starting at the most specific type
4537         upwards looking for a GetEnumerator
4538
4539         * expression.cs: Shift count can be up to 31 for int/uint and 63
4540         for long/ulong.
4541
4542 2003-11-26  Miguel de Icaza  <miguel@ximian.com>
4543
4544         * statement.cs (Block.LookupLabel): Also look for the label on the
4545         children blocks.  Use a hash table to keep track of visited
4546         nodes. 
4547
4548         * cfold.cs (IntConstant to UIntConstant mapping): Only return if
4549         we actually did transform the other operand, otherwise fall back
4550         to the common codepath that casts to long.
4551
4552         * cs-tokenizer.cs: Use the same code pattern as the int case.
4553         Maybe I should do the parsing myself, and avoid depending on the
4554         Parse routines to get this done.
4555
4556 2003-11-25  Miguel de Icaza  <miguel@ximian.com>
4557
4558         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4559         which fixes bug 51347.  This time test it.
4560
4561         * expression.cs: Make TypeOfVoid derive from TypeOf, so code in
4562         attributes for example can not tell the difference between these.
4563         The difference was only a syntax feature of the language. 
4564
4565         * attribute.cs: Apply attributes to delegates.
4566
4567         * delegate.cs: Call the apply attributes method.
4568
4569 2003-11-24  Miguel de Icaza  <miguel@ximian.com>
4570
4571         * convert.cs (TryImplicitIntConversion): One line bug fix: we were
4572         comparing 0 vs Byte.MinValue, not the value
4573
4574         (ImplicitConversionRequired): When reporting a conversion error,
4575         use error 31 to print out the constant error instead of the
4576         simpler 29.
4577
4578         * expression.cs: Apply fix from l_m@pacbell.net (Laurent Morichetti),  
4579         which fixes bug 51347.
4580
4581 2003-11-22  Miguel de Icaza  <miguel@ximian.com>
4582
4583         * driver.cs: Applied patch from gert.driesen@pandora.be (Gert Driesen) 
4584         which fixes the -warnaserror command line option.
4585
4586 2003-11-21  Miguel de Icaza  <miguel@ximian.com>
4587
4588         * cfold.cs (DoNumericPromotions): During constant folding of
4589         additions on UIntConstant, special case intconstants with
4590         IntConstants like we do on the expression binary operator. 
4591
4592 2003-11-12  Miguel de Icaza  <miguel@ximian.com>
4593
4594         * convert.cs (ImplicitReferenceConversion): We were missing a case
4595         (System.Enum are not value types or class types, so we need to
4596         classify them separatedly).
4597
4598         * driver.cs: We do not support error 2007.
4599
4600 2003-11-12 Jackson Harper <jackson@ximian.com>
4601
4602         * driver.cs: Use corlib.dll or mscorlib.dll when looking up the
4603         system directory. Also use the full file name so users can
4604         libraries names mscorlib-o-tron.dll in a non system dir.
4605         
4606 2004-01-04  David Sheldon <dave-mono@earth.li>
4607
4608         * expression.cs: Added matching ")" to error message for CS0077.
4609
4610 2003-12-19  Martin Baulig  <martin@ximian.com>
4611
4612         * typemanager.cs (TypeManager.IsEqualGenericType): New public
4613         static method; see documentation in the method.
4614         (TypeManager.IsSubclassOrNestedChild): Allow IsEqualGenericType().
4615
4616         * convert.cs (Convert.ImplicitReferenceConversion,
4617         Convert.ImplicitReferenceConversionExists): Add support for
4618         generic type declarations; see gen-36.cs.
4619
4620 2003-12-19  Martin Baulig  <martin@ximian.com>
4621
4622         * pending.cs (Pending.InterfaceMethod): Use
4623         `Type.IsAssignableFrom()' instead of `=='.
4624
4625 2003-12-18  Martin Baulig  <martin@ximian.com>
4626
4627         * decl.cs (DeclSpace.AsAccessible): Check for array, pointer and
4628         byref types first.
4629
4630         * convert.cs (Convert.ImplicitStandardConversionExists): Use
4631         `expr_type.Equals (target_type)' instead of `=='.
4632
4633 2003-12-08  Martin Baulig  <martin@ximian.com>
4634
4635         * generics.cs (Constraints.Types): Removed.
4636         (Constraints.Resolve): Just resolve everything to TypeExpr's, not
4637         to Type's.
4638         (Constraints.ResolveTypes): New public method; resolves the
4639         TypeExpr's to Type's.
4640         (TypeParameter.Define): TypeBuilder.DefineGenericParameter() no
4641         longer takes the constraints.
4642         (TypeParameter.DefineMethod): Likewise.
4643         (TypeParameter.DefineType): New public method.  Calls
4644         `TypeBuilder/MethodBuilder.SetGenericParameterConstraints()' to set
4645         the constraints.
4646
4647 2003-12-08  Martin Baulig  <martin@ximian.com>
4648
4649         * convert.cs (Convert.ImplicitConversionStandard): Use
4650         `expr_type.Equals (target_type)' instead of `=='.
4651
4652 2003-12-08  Martin Baulig  <martin@ximian.com>
4653
4654         * typemanager.cs (TypeManager.GetReferenceType): Call
4655         `Type.MakeByRefType ()'.
4656
4657 2003-12-08  Martin Baulig  <martin@ximian.com>
4658
4659         * cs-parser.jay, cs-tokenizer.cs: `where' is not a keyword, it
4660         just has some special meaning in some situations.  For instance,
4661         it is allowed to use `where' as the name of a variable etc.
4662
4663 2003-12-04  Martin Baulig  <martin@ximian.com>
4664
4665         * expression.cs (ComposedCast.DoResolveAsTypeStep): Use
4666         `Type.MakeArrayType()' for array types.
4667
4668 2003-11-18  Miguel de Icaza  <miguel@ximian.com>
4669
4670         * expression.cs (Invocation.VerifyArgumentsCompat): Remove
4671         debugging message.
4672
4673         (SizeOf.DoResolve): assign the `type_queried' field.  This gets
4674         corlib to compile.
4675
4676 2003-11-16  Martin Baulig  <martin@ximian.com>
4677
4678         * codegen.cs (EmitContext.IsGeneric): Removed.
4679
4680         * ecore.cs (SimpleName.ResolveAsTypeStep): Always call
4681         ResolveGeneric() on the DeclSpace.
4682
4683 2003-11-16  Martin Baulig  <martin@ximian.com>
4684
4685         * generic.cs (TypeArguments.Resolve):
4686         `Expression.ResolveAsTypeTerminal()' returns a TypeExpr; call
4687         `ResolveType()' on it to get the Type.
4688
4689 2003-11-15  Martin Baulig  <martin@ximian.com>
4690
4691         * generic.cs (ConstructedType.GetInterfaces): Override this.
4692
4693 2003-11-14  Martin Baulig  <martin@ximian.com>
4694
4695         * interface.cs (Interface.DefineType): Define all type parameters
4696         before adding the interfaces we inherit.
4697
4698 2003-11-11  Martin Baulig  <martin@ximian.com>
4699
4700         * generic.cs (ConstructedType.ResolveType): Always call
4701         `gt.BindGenericParameters (atypes)'; also if `args.HasTypeArguments'.
4702
4703 2003-11-10  Martin Baulig  <martin@ximian.com>
4704
4705         * typemanager.cs (TypeManager.ResolveExpressionTypes): Removed.
4706         (TypeManager.InitCoreTypes): Initialize them here, but instead of
4707         calling `ResolveType()' on them, directly assign their `Type'.
4708
4709 2003-11-08  Martin Baulig  <martin@ximian.com>
4710
4711         * generic.cs (ConstructedType): Override `IsClass' etc.
4712
4713 2003-11-08  Martin Baulig  <martin@ximian.com>
4714
4715         * class.cs (TypeContainer.GetClassBases): Use TypeExpr's for the
4716         return value and the `out parent' parameter.
4717         (TypeContainer.DefineType): Moved the CS0644 check into
4718         GetClassBases().  Don't pass the interface types to the
4719         `builder.DefineType()'/`builder.DefineNestedType()', but resolve
4720         them later and then call `TypeBuilder.AddInterfaceImplementation()'.
4721
4722         * ecore.cs (TypeExpr.IsAttribute): New property.
4723         (TypeExpr.GetInterfaces): New method.
4724
4725         * interface.cs (Interface.GetInterfaceTypeByName): Return a
4726         TypeExpr instead of a Type.
4727         (Interface.GetInterfaceBases): Return TypeExpr's instead of Type's.
4728         (Interface.DefineType): Don't pass the interface types to the
4729         `builder.Definetype()'/`builder.DefineNestedType()', but resolve
4730         them later and then call `TypeBulider.AddInterfaceImplementation()'.
4731
4732         * typemanager.cs (TypeManager.AddUserType): Take a `TypeExpr[]'
4733         instead of a `Type[]'.
4734         (TypeManager.RegisterBuilder): Likewise.
4735         (TypeManager.AddUserInterface): Likewise.
4736         (TypeManager.ExpandInterfaces): Take a `Type[]' instead of a
4737         `Type[]' and also return a `TypeExpr[]'.
4738         (TypeManager.GetInterfaces): Return a `TypeExpr[]'.
4739
4740 2003-11-08  Martin Baulig  <martin@ximian.com>
4741
4742         * decl.cs (DeclSpace.ResolveTypeExpr): Return a TypeExpr, not an
4743         Expression.     
4744
4745 2003-11-08  Martin Baulig  <martin@ximian.com>
4746
4747         * decl.cs (DeclSpace.GetTypeResolveEmitContext): Call
4748         TypeManager.ResolveExpressionTypes().
4749
4750         * ecore.cs (Expression.ResolveAsTypeTerminal): Return a TypeExpr
4751         instead of an Expression.
4752         (TypeExpr): This is now an abstract base class for `TypeExpression'.
4753         (TypeExpression): New public class; formerly known as `TypeExpr'.
4754
4755         * expression.cs (ComposedCast): Derive from TypeExpr.
4756
4757         * typemanager.cs (TypeManager.system_*_expr): These are now
4758         TypExpr's instead of Expression's.
4759         (TypeManager.ResolveExpressionTypes): New public static function;
4760         called from DeclSpace.GetTypeResolveEmitContext() to resolve all
4761         of them.        
4762
4763 2003-11-06  Miguel de Icaza  <miguel@ximian.com>
4764
4765         * expression.cs (New.DoResolve): Do not dereference value that
4766         might be a null return.
4767
4768         * statement.cs (Block.EmitMeta): Use the Const.ChangeType to make
4769         sure that the constant value has the right type.  Fixes an
4770         unreported bug, similar to 50425.
4771
4772         * const.cs (Const.LookupConstantValue): Call
4773         ImplicitStandardConversionExists before doing a conversion to
4774         avoid havng the TypeManager.ChangeType do conversions.
4775
4776         Reduced the number of casts used
4777
4778         (Const.ChangeType): New routine to enable reuse of the constant
4779         type changing code from statement.
4780
4781         * typemanager.cs (ChangeType): Move common initialization to
4782         static global variables.
4783
4784         Fixes #50425.
4785
4786         * convert.cs (ImplicitReferenceConversion): Somehow we allowed
4787         every value type to go through, even if it was void.  Fix that. 
4788
4789         * cs-tokenizer.cs: Use is_identifier_start_character on the start
4790         character of the define, and the is_identifier_part_character for
4791         the rest of the string.
4792
4793 2003-11-05  Miguel de Icaza  <miguel@ximian.com>
4794
4795         * expression.cs (UnaryMutator.EmitCode): When I updated
4796         LocalVariableReference.DoResolve, I overdid it, and dropped an
4797         optimization done on local variable references.
4798
4799 2003-11-04  Miguel de Icaza  <miguel@ximian.com>
4800
4801         * ecore.cs: Convert the return from Ldlen into an int.
4802
4803 2003-10-20  Miguel de Icaza  <miguel@ximian.com>
4804
4805         * decl.cs (DeclSpace.GetAccessLevel): Handle NotPublic case for
4806         the accessibility, this is a special case for toplevel non-public
4807         classes (internal for instance).
4808
4809 2003-10-20  Nick Drochak <ndrochak@gol.com>
4810
4811         * ecore.cs: Fix typo and build.  Needed another right paren.
4812
4813 2003-10-19  Miguel de Icaza  <miguel@ximian.com>
4814
4815         * ecore.cs: Applied fix from Ben Maurer.   We were handling in the
4816         `internal' case regular and protected, but not allowing protected
4817         to be evaluated later.  Bug 49840
4818
4819 2003-10-15  Miguel de Icaza  <miguel@ximian.com>
4820
4821         * statement.cs (Switch.TableSwitchEmit): Compare the upper bound
4822         to kb.Nlast, and not the kb.nFirst to isolate the switch
4823         statement.
4824
4825         Extract the underlying type, so enumerations of long/ulong are
4826         treated like long/ulong.
4827
4828 2003-10-14  Miguel de Icaza  <miguel@ximian.com>
4829
4830         * expression.cs (New): Overload the meaning of RequestedType to
4831         track the possible creation of the NewDelegate type, since
4832         DoResolve is invoked more than once for new constructors on field
4833         initialization.
4834
4835         See bugs: #48800 and #37014
4836
4837         * cs-parser.jay (declare_local_constants): Take an arraylist
4838         instead of a single constant.
4839
4840         (local_constant_declaration): It should take a
4841         constant_declarators, not a constant_declarator.  Fixes 49487
4842
4843         * convert.cs: Fix error report.
4844
4845 2003-10-13 Jackson Harper <jackson@ximian.com>
4846
4847         * typemanager.cs (TypeToCoreType): Add float and double this fixes
4848         bug #49611
4849         
4850 2003-11-03  Martin Baulig  <martin@ximian.com>
4851
4852         * expression.cs (ArrayAccess.GetStoreOpcode): Added
4853         `out bool has_type_arg'; if set, we need to pass the type to
4854         ig.Emit().
4855         (ArrayAccess.GetStoreOpcode, ArrayAccess.EmitLoadOpcode): Use
4856         Stelem_Any/Ldelem_Any for generic parameters.   
4857
4858 2003-11-02  Martin Baulig  <martin@ximian.com>
4859
4860         * expression.cs (Invocation.EmitCall): Use
4861         `TypeManager.IsValueType()' to check whether it's a value type.
4862         Don't set `struct_call' when calling a method on a type parameter.
4863
4864 2003-11-02  Martin Baulig  <martin@ximian.com>
4865
4866         * generics.cs (ConstructedType.Resolve): Renamed to ResolveType()
4867         and removed the TypeBuilder argument.
4868
4869         * typemanager.cs (TypeManager.IsValueType): Return
4870         `t.IsGenericParameter || t.IsValueType'.
4871
4872 2003-10-25  Martin Baulig  <martin@ximian.com>
4873
4874         * decl.cs (DeclSpace.ResolveType): If we're a ConstructedType,
4875         call ConstructedType.Resolve() on it.
4876
4877         * generic.cs (ConstructedType.Resolve): Set `type' on success.
4878
4879 2003-10-25  Martin Baulig  <martin@ximian.com>
4880
4881         * class.cs (TypeContainer.GetClassBases): Changed
4882         `out Type parent' into `out TypeExpr parent'.  Moved CS0644 and
4883         CS8214 reporting here.
4884         (TypeContainer.DefineType): GetClassBases() gives us a `TypeExpr'
4885         instead of a `Type' for our parent.  In case of a recursive
4886         declaration (see tests/gen-23.cs for an example), our parent is a
4887         ConstructedType and it doesn't have its type set.  So, first
4888         create our own TypeBuilder, then call constructed.Resolve() to get
4889         the parent's type and finally TypeBuilder.SetParent() it.
4890
4891         * ecore.cs (TypeExpr.Name): New public virtual property.
4892
4893         * generic.cs
4894         (ConstructedType): We're now a TypeExpr and not just an Expression.
4895         (ConstructedType.ResolveAsTypeStep): Don't resolve our type
4896         arguments here; this is done later.
4897         (ConstructedType.Resolve): New public method to resolve the type
4898         arguments and bind them.
4899
4900 2003-10-21  Martin Baulig  <martin@ximian.com>
4901
4902         * convert.cs: Use `TypeManager.IsValueType' instead of
4903         'type.IsValueType' everywhere.
4904
4905         * typemanager.cs (TypeManager.IsValueType): Return true for type
4906         parameters.  The reason for this is that we need to box a type
4907         parameter when converting it to a reference type.
4908
4909         * cs-parser.jay: Added support for default value expressions.
4910
4911         * generics.cs (DefaultValueExpression): New public class.       
4912
4913 2003-10-17  Martin Baulig  <martin@ximian.com>
4914
4915         * generic.cs (Constraints.Resolve): Take a DecpSpace instead of a
4916         TypeContainer so we can also use this for Interfaces.
4917         (TypeParameter.Resolve): Likewise.
4918
4919         * interface.cs (Interface.DefineType): Added support for generic
4920         interfaces.
4921
4922         * cs-parser.jay: Added support for generic structs and interfaces.
4923
4924 2003-10-17  Martin Baulig  <martin@ximian.com>
4925
4926         * generic.cs (GenericMemberAccess.DoResolve): We can now actually
4927         call generic methods :-)
4928
4929 2003-10-16  Martin Baulig  <martin@ximian.com>
4930
4931         * cs-parser.jay (namespace_or_type_name): Only create a
4932         GenericMemberAccess if we actually have type arguments.
4933
4934 2003-10-13  Martin Baulig  <martin@ximian.com>
4935
4936         * class.cs (Method.Define): If we're a generic method, call
4937         TypeBuilder.DefineGenericMethod () before resolving
4938         the parameters.
4939         (MethodData): Added .ctor which takes an additional MethodBuilder
4940         argument; this is used for generic methods.
4941         (MethodData.Define): Call `builder.SetGenericMethodSignature()' if
4942         we already have a MethodBuilder.
4943
4944 2003-10-10  Martin Baulig  <martin@ximian.com>
4945
4946         * class.cs (Method): Added .ctor which takes a `GenericMethod'
4947         instead of a `DeclSpace'.  This is used for generic methods.
4948
4949         * cs-parser.jay (method_header): Added support for generic
4950         methods; create a `GenericMethod' instance and pass it to the
4951         `Method's .ctor; it'll be used as the `DeclSpace' to lookup
4952         parameters and locals.
4953
4954         * decl.cs (DeclSpace.SetParameterInfo): Removed Location argument
4955         since we already have the location.  Check whether we're a generic
4956         type declaration or a generic method and create the correct type
4957         parameter.
4958
4959         * generic.cs (TypeParameter.DefineMethod): New public method.
4960         (GenericMethod): New public class; derives from DeclSpace and is
4961         used for generic methods.       
4962
4963 2003-10-09  Martin Baulig  <martin@ximian.com>
4964
4965         * class.cs (MethodCore): Added additional `DeclSpace ds' argument
4966         to the .ctor.
4967         (MethodCore.DoDefineParameters): Removed the TypeContainer
4968         argument; use the DeclSpace which was passed to the .ctor instead.
4969         (MethodCore.CheckParameter): Take a DeclSpace instead of a
4970         TypeContainer; we only need a DeclSpace here.
4971
4972 2003-10-09  Martin Baulig  <martin@ximian.com>
4973
4974         * class.cs (MethodData): Added additional `DeclSpace ds' argument
4975         to the .ctor.
4976         (MethodData.Define, MethodData.Emit): Pass the `ds' to the
4977         EmitContext's .ctor.    
4978
4979 2003-10-09  Martin Baulig  <martin@ximian.com>
4980
4981         * decl.cs (DeclSpace.AsAccessible): Moved here from TypeContainer.
4982         (AccessLevel, CheckAccessLevel, GetAccessLevel): They're used by
4983         AsAccessible(), moved them as well.
4984
4985         * class.cs (TypeContainer.AsAccessible): Moved to DeclSpace.
4986
4987 2003-10-07  Miguel de Icaza  <miguel@ximian.com>
4988
4989         * expression.cs (Binary.Emit.GreatherThanOrEqual): Fix the code
4990         generation for >=, as spotted by Paolo, bug 48679.  
4991         Patch from David Waite.
4992
4993         * cs-tokenizer.cs: Add handling for #pragma.
4994
4995         * cs-parser.jay: Allow for both yield and yield return in the
4996         syntax.  The anti-cobolization of C# fight will go on!
4997
4998         * class.cs (TypeBuilder.DefineType): Catch error condition here
4999         (Parent.DefineType erroring out and returning null).
5000
5001         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
5002         coping with enumerations variables, we were mistakenly processing
5003         them as a regular value type instead of built-in types.  Fixes the
5004         bug #48063
5005
5006         * typemanager.cs (IsBuiltinOrEnum): New method.
5007
5008 2003-09-30  Miguel de Icaza  <miguel@ximian.com>
5009
5010         * cs-parser.jay: Upgrade: yield now needs the return clause.
5011
5012 2003-10-08  Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
5013
5014         * cs-parser.jay : Renamed yyName to yyNames related to jay.
5015
5016 2003-09-29  Martin Baulig  <martin@ximian.com>
5017
5018         * typemanager.cs (TypeManager.GetMethodFlags): Added support for
5019         inflated generic methods.
5020
5021         * generics.cs (ConstructedType): Distinguish between open and
5022         closed constructed types; correctly resolve the arguments.
5023
5024 2003-09-22  Martin Baulig  <martin@ximian.com>
5025
5026         * generic.cs (ConstructedType.ResolveAsTypeCheck): Check whether
5027         all type arguments meet their constraints.
5028
5029 2003-09-19  Martin Baulig  <martin@ximian.com>
5030
5031         * decl.cs (MemberCache.SetupCacheForInterface): Take a
5032         `MemberCache parent' argument.  Normally, an interface doesn't
5033         have a parent type except System.Object, but we use this in gmcs
5034         for generic type parameters.
5035
5036 2003-09-18  Martin Baulig  <martin@ximian.com>
5037
5038         * typemanager.cs (TypeHandle.ctor): Set `IsInterface' solely based
5039         on `type.IsInterface'; don't check whether the type has a parent
5040         to determine whether it's an interface.
5041
5042 2003-09-17  Martin Baulig  <martin@ximian.com>
5043
5044         * generic.cs (ConstructedType.ToString): Always use `name' as the
5045         type name.
5046
5047 2003-09-15  Martin Baulig  <martin@ximian.com>
5048
5049         * cs-parser.jay: Fix grammar wrt. type_parameter_constraints.
5050
5051         * generic.cs (Constraints.Resolve): New public method; this is
5052         called to resolve the constraint types and to check whether all
5053         the constraints are correct.
5054         (Constraints.Types): New public property.
5055         (TypeParameter.Resolve): New public method; resolves all the
5056         type's constraints.
5057
5058         * class.cs (TypeContainer.DefineType): Call
5059         TypeParameter.Resolve() before actually defining the type.
5060
5061 2003-09-15  Martin Baulig  <martin@ximian.com>
5062
5063         * class.cs (TypeContainer.DefineType): Added an error flag to
5064         avoid reporting duplicate CS0146's ("class definition is
5065         circular.").
5066
5067         * driver.cs (Driver.MainDriver): Abort if
5068         RootContext.ResolveTree() reported any errors.
5069
5070 2003-09-07  Martin Baulig  <martin@ximian.com>
5071
5072         * report.cs (Error, Warning): Added overloaded versions which take
5073         a `params object[] args' and call String.Format().
5074
5075 2003-09-07  Martin Baulig  <martin@ximian.com>
5076
5077         * decl.cs (DeclSpace..ctor): Don't call
5078         NamespaceEntry.DefineName() here; do it in RecordDecl() which is
5079         called from Tree.RecordDecl().  Fixes the CS0101 reporting.
5080         (DeclSpace.RecordDecl): New method.
5081
5082         * tree.cs (Tree.RecordDecl): Call ds.RecordDecl().
5083
5084 2003-09-02  Ravi Pratap  <ravi@ximian.com>
5085
5086         * attribute.cs (CheckAttributeTarget): Ensure that we allow return
5087         value attributes to be applied to ParameterBuilders.
5088
5089         * class.cs (MethodCore.LabelParameters): Make static and more
5090         generic so that it can be used from other places - like interface
5091         methods, for instance.
5092
5093         * interface.cs (Interface.Emit): Call LabelParameters before
5094         emitting attributes on the InterfaceMethod.
5095
5096 2003-09-07  Martin Baulig  <martin@ximian.com>
5097
5098         * generic.cs (ConstructedType.ResolveAsTypeStep): Report a CS8217
5099         if the number of type parameters doesn't match.
5100
5101 2003-09-04  Martin Baulig  <martin@ximian.com>
5102
5103         * expression.cs (ComposedCast.ResolveAsTypeStep): Added support
5104         for arrays of generic type params (ie. `!0[]').
5105
5106 2003-09-04  Martin Baulig  <martin@ximian.com>
5107
5108         * class.cs (TypeContainer.AsAccessible): Ignore generic parameters
5109         for the moment.
5110
5111 2003-09-04  Martin Baulig  <martin@ximian.com>
5112
5113         * decl.cs (DeclSpace.LookupGeneric): New method.
5114         (DeclSpace.CheckAccessLevel): Ignore generic parameters for the
5115         moment.
5116
5117         * generic.cs (TypeParameterExpr): Take a TypeParameter as
5118         argument, not just a string.
5119         (TypeParameter.Define): New public method; this is called to
5120         actually define the generic parameter; after this, you can use the
5121         new `Type' property to get the type.
5122
5123 2003-09-04  Martin Baulig  <martin@ximian.com>
5124
5125         * decl.cs (DeclSpace.SetParameterInfo): The `constraints' argument
5126         is now an ArrayList; initialize the result of the `TypeParameters'
5127         property here.
5128         (DeclSpace.GetGenericData): Removed.
5129         (DeclSpace.LookupGeneric): Temporarily removed; we need to
5130         implement this in a different way.
5131         (DeclSpace.GetTypeParameters): Removed; there's now a
5132         `TypeParameters' property.
5133         (DeclSpace.TypeParameters): New public property.
5134
5135         * generic.cs (Constraints): Make this class public.
5136         (TypeParameter): New public class.
5137
5138 2003-09-04  Martin Baulig  <martin@ximian.com>
5139
5140         * decl.cs (DeclSpace.GetTypeParameters): New method to return the
5141         generic parameters.
5142
5143         * class.cs (TypeContainer.DefineType): Call
5144         TypeBuilder.DefineGenericParameter () on all generic parameters if
5145         this is a generic type.
5146
5147 2003-08-28  Martin Baulig  <martin@ximian.com>
5148
5149         * sample-stack.il: Compile this with ilasm: "ilasm /dll
5150         sample-stack.il".
5151
5152         * sample-hello.cs: Compile this with gmcs: "gmcs
5153         /r:sample-stack.dll sample-hello.cs".
5154
5155 2003-08-28  Martin Baulig  <martin@ximian.com>
5156
5157         * generic.cs (ConstructedType.ResolveAsTypeStep): Actually bind
5158         the parameters to the generic type.
5159
5160 2003-08-28  Martin Baulig  <martin@ximian.com>
5161
5162         * cs-tokenizer.cs (parse_less_than): Also allow all builtin types.
5163
5164 2003-08-28  Martin Baulig  <martin@ximian.com>
5165
5166         * cs-parser.jay (opt_type_argument_list): Use
5167         `OP_GENERICS_LT type_arguments OP_GENERICS_GT'.
5168         (primary_expression): Replace `qualified_identifier' with `type_name'.
5169         (type_parameter_list): Use `OP_GENERICS_LT type_parameters OP_GENERICS_GT'.
5170
5171         * cs-tokenizer.cs (is_punct): When reading a `<', invoke a custom
5172         parser to check whether it is syntactically a type parameter list;
5173         return OP_GENERICS_LT/OP_GENERICS_GT instead of OP_LT/OP_GT in
5174         this case.
5175
5176 2003-08-26  Martin Baulig  <martin@ximian.com>
5177
5178         * ecore.cs (SimpleName.SimpleNameResolve): Look for members before
5179         resolving aliases; fixes #47927.
5180
5181 2003-08-26  Martin Baulig  <martin@ximian.com>
5182
5183         * statement.cs (Using.DoResolve): This is internally emitting a
5184         try/finally clause, so we need to set ec.NeedExplicitReturn if we
5185         do not always return.  Fixes #47681.
5186
5187 2003-08-26  Martin Baulig  <martin@ximian.com>
5188
5189         * decl.cs (MemberCore): Moved WarningNotHiding(),
5190         Error_CannotChangeAccessModifiers() and CheckMethodAgainstBase()
5191         into MemberBase.
5192         (AdditionResult): Make this nested in DeclSpace.
5193         (DeclSpace.ctor): The .ctor now takes an additional NamespaceEntry
5194         argument; call NamespaceEntry.Define() unless we're nested in a
5195         class or struct.
5196
5197         * namespace.cs (Namespace.DefineName): New public function.  This
5198         is called from DeclSpace's .ctor to add 
5199         (Namespace.Lookup): Include DeclSpaces in the lookup.
5200
5201         * class.cs (Operator): Derive from MemberBase, not MemberCore.
5202
5203         * const.cs (Const): Derive from MemberBase, not MemberCore.     
5204
5205 2003-08-25  Martin Baulig  <martin@ximian.com>
5206
5207         * convert.cs (Convert.ExplicitReferenceConversion): When
5208         converting from an interface type to a class, unbox if the target
5209         type is a struct type.  Fixes #47822.
5210
5211 2003-08-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5212
5213         * typemanager.cs: fixed the values of MethodFlags. Closes #47855 and
5214         #47854.
5215
5216 2003-08-22  Martin Baulig  <martin@ximian.com>
5217
5218         * class.cs (TypeManager.DefineType): When defining a nested type,
5219         call DefineType() on our parent; fixes #47801.
5220
5221 2003-08-22  Martin Baulig  <martin@ximian.com>
5222
5223         * class.cs (MethodData.Define): While checking if a method is an
5224         interface implementation, improve the test a bit more to fix #47654.
5225
5226 2003-08-22  Martin Baulig  <martin@ximian.com>
5227
5228         * expression.cs (Probe.DoResolve): Check whether `expr' resolved
5229         correctly; fixes #47722.
5230
5231 2003-08-22  Martin Baulig  <martin@ximian.com>
5232
5233         * expression.cs (UnaryMutator.ResolveVariable): If the target is a
5234         LocalVariableReference, ensure it's not read-only.  Fixes #47536.
5235
5236         * statement.cs (Fixed.DoResolve): Make all variables read-only. 
5237
5238 2003-08-22  Martin Baulig  <martin@ximian.com>
5239
5240         * ecore.cs (FieldExpr.DoResolveLValue): Static read-only fields
5241         can only be assigned in static constructors.  Fixes #47161.
5242
5243 2003-08-22  Martin Baulig  <martin@ximian.com>
5244
5245         Rewrote and improved the flow analysis code.
5246
5247         * flowbranching.cs (FlowBranching): Make this class abstract.
5248         (FlowBranching.CreateBranching): New static function to create a
5249         new flow branching.
5250         (FlowBranchingBlock, FlowBranchingException): New classes.
5251         (FlowBranching.UsageVector.Type): New public readonly field.
5252         (FlowBranching.UsageVector.Breaks): Removed the setter.
5253         (FlowBranching.UsageVector.Returns): Removed the setter.
5254         (FlowBranching.UsageVector): Added Break(), Return(),
5255         NeverReachable() and Throw() methods to modify the reachability.
5256         (FlowBranching.UsageVector.MergeChildren): Removed, this is now
5257         done by FlowBranching.Merge().
5258         (FlowBranching.UsageVector.MergeChild): New method; merges the
5259         merge result into the current vector.
5260         (FlowBranching.Merge): New abstract method to merge a branching.
5261
5262 2003-08-12  Martin Baulig  <martin@ximian.com>
5263
5264         * expression.cs (Indirection.CacheTemporaries): Create the
5265         LocalTemporary with the pointer type, not its element type.
5266
5267 2003-08-10  Miguel de Icaza  <miguel@ximian.com>
5268
5269         * cs-parser.jay: FIRST_KEYWORD, LAST_KEYWORD: used to know if a
5270         token was a keyword or not.
5271
5272         Add `error' options where an IDENTIFIER was expected;  Provide
5273         CheckToken and CheckIdentifierToken convenience error reporting
5274         functions. 
5275
5276         Do not use `DeclSpace.Namespace', use `DeclSpace.NamespaceEntry'.
5277
5278         * decl.cs: Rename `NamespaceEntry Namespace' public field into
5279         NameSpaceEntry NameSpaceEntry.
5280
5281         (LookupInterfaceOrClass): Avoid creating a full qualified name
5282         from namespace and name: avoid doing lookups when we know the
5283         namespace is non-existant.   Use new Tree.LookupByNamespace which
5284         looks up DeclSpaces based on their namespace, name pair.
5285
5286         * driver.cs: Provide a new `parser verbose' to display the
5287         exception thrown during parsing.  This is turned off by default
5288         now, so the output of a failure from mcs is more graceful.
5289
5290         * namespace.cs: Track all the namespaces defined in a hashtable
5291         for quick lookup.
5292
5293         (IsNamespace): New method
5294
5295 2003-08-09  Miguel de Icaza  <miguel@ximian.com>
5296
5297         * namespace.cs: Remove redundant call;  Avoid using MakeFQN when
5298         we know that we need to concatenate (full typename can never be
5299         null). 
5300
5301         * class.cs: ditto.
5302
5303         * statement.cs: Use a bitfield;  Do not initialize to null things
5304         which are done by the constructor by default.
5305
5306         * cs-parser.jay: bug fix, parameter was 4, not 3.
5307
5308         * expression.cs: Just use the property;
5309
5310         * statement.cs: No need for GetVariableInfo method.
5311
5312 2003-08-08  Martin Baulig  <martin@ximian.com>
5313
5314         * flowanalysis.cs (FlowReturns): This is now nested in the
5315         `FlowBranching' class.
5316         (MyBitVector): Moved this here from statement.cs.
5317         (FlowBranching.SiblingType): New enum type.
5318         (FlowBranching.CreateSibling): Added `SiblingType' argument.
5319
5320 2003-08-07  Martin Baulig  <martin@ximian.com>
5321
5322         * flowanalysis.cs (FlowBranchingType): This is now nested in the
5323         `FlowBranching' class and called `BranchingType'.
5324
5325 2003-08-07  Martin Baulig  <martin@ximian.com>
5326
5327         * flowanalysis.cs: Moved all the control flow analysis code into
5328         its own file.
5329
5330 2003-08-07  Martin Baulig  <martin@ximian.com>
5331
5332         * assign.cs (Assign.DoResolve): `target' must either be an
5333         IAssignMethod or an EventAccess; report a CS0131 otherwise.  Fixes
5334         #37319.
5335
5336 2003-08-07  Miguel de Icaza  <miguel@ximian.com>
5337
5338         * expression.cs (BinaryMethod): This kind of expression is created by the
5339         Binary class if it determines that the operator has to be handled
5340         by a method.
5341
5342         (BinaryDelegate): This kind of expression is created if we are
5343         dealing with a + or - operator on delegates.
5344
5345         (Binary): remove method, argumetns, and DelegateOperator: when
5346         dealing with methods, 
5347
5348         * ecore.cs (EventExpr.EmitAddOrRemove): Update to new layout.
5349
5350         * statement.cs (Block): use bitfields for the three extra booleans
5351         we had in use.   Remove unused topblock parameter.
5352
5353         * codegen.cs: Remove unecessary argument to Block.EmitTopBlock
5354
5355         * assign.cs: Drop extra unneeded tests.
5356
5357 2003-08-06  Miguel de Icaza  <miguel@ximian.com>
5358
5359         * iterators.cs (Mapvariable): provide a mechanism to use prefixes.
5360
5361         * statement.cs (Foreach): Use VariableStorage instead of
5362         LocalBuilders.   
5363
5364         * codegen.cs (VariableStorage): New class used by clients that
5365         require a variable stored: locals or fields for variables that
5366         need to live across yield.
5367
5368         Maybe provide a convenience api for EmitThis+EmitLoad?
5369
5370         (GetTemporaryLocal, FreeTemporaryLocal): Recycle
5371         these bad boys.
5372
5373 2003-08-05  Miguel de Icaza  <miguel@ximian.com>
5374
5375         * codegen.cs (RemapLocal, RemapLocalLValue, RemapParameter,
5376         RemapParameterLValue): New methods that are used to turn a
5377         precomputed FieldInfo into an expression like this:
5378
5379                 instance.FieldInfo
5380
5381         The idea is to use this instead of making LocalVariableReference
5382         have more than one meaning.
5383
5384         * cs-parser.jay: Add error production to BASE.
5385
5386         * ecore.cs: Deal with TypeManager.GetField returning null, which
5387         is now a valid return value.
5388
5389         (FieldExprNoAddress): New expression for Fields whose address can
5390         not be taken.
5391
5392         * expression.cs (LocalVariableReference): During the resolve
5393         phases, create new expressions if we are in a remapping context.
5394         Remove code that dealt with remapping here.
5395
5396         (ParameterReference): same.
5397
5398         (ProxyInstance): New expression, like the `This' expression, but
5399         it is born fully resolved.  We know what we are doing, so remove
5400         the errors that are targeted to user-provided uses of `this'.
5401
5402         * statement.cs (Foreach): our variable is now stored as an
5403         Expression;  During resolution, follow the protocol, dont just
5404         assume it will return this.
5405
5406 2003-08-06  Martin Baulig  <martin@ximian.com>
5407
5408         * support.cs (SeekableStreamReader.cs): New public class.
5409
5410         * cs-tokenizer.cs, cs-parser.jay, driver.cs: Use the new
5411         SeekableStreamReader instead of the normal StreamReader.
5412
5413 2003-08-04  Martin Baulig  <martin@ximian.com>
5414
5415         * cs-parser.jay (CLOSE_PARENS_CAST, CLOSE_PARENS_NO_CAST,
5416         CLOSE_PARENS_OPEN_PARENS, CLOSE_PARENS_MINUS): New tokens to
5417         deambiguate casts and delegate invocations.
5418         (parenthesized_expression): Use the new tokens to ensure this is
5419         not a cast of method invocation.
5420
5421         * cs-tokenizer.cs (is_punct): Return one of the new special tokens
5422         when reading a `)' and Deambiguate_CloseParens () was previously
5423         called.
5424
5425         * expression.cs (ParenthesizedExpression): New class.  This is
5426         just used for the CS0075 test.
5427         (Binary.DoResolve): Check for CS0075.   
5428
5429 2003-07-29  Ravi Pratap  <ravi@ximian.com>
5430
5431         * expression.cs (Invocation.MakeUnionSet): Patch from Lluis
5432         Sanchez : use TypeManager.ArrayContainsMethod instead of a direct
5433         reference comparison.
5434
5435         (TypeManager.ArrayContainsMethod): When we have a MethodInfo, also
5436         examine the ReturnType for equality - this is necessary in the
5437         cases of implicit and explicit operators whose signature also
5438         includes the return type.
5439
5440 2003-07-26  Miguel de Icaza  <miguel@ximian.com>
5441
5442         * namespace.cs: Cache the result of the namespace computation,
5443         instead of computing it every time.
5444
5445 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5446
5447         * decl.cs: Use a global arraylist that we reuse over invocations
5448         to avoid excesive memory consumption.  Reduces memory usage on an
5449         mcs compile by one meg (45 average).
5450
5451         * typemanager.cs (LookupTypeReflection): In .NET pointers are
5452         private, work around that.
5453
5454 2003-07-23  Miguel de Icaza  <miguel@ximian.com>
5455
5456         * literal.cs (IntLiteral): Define Zero and One static literals. 
5457
5458         * cs-parser.jay (integer_literal): use static literals to reduce
5459         memory usage for the most used literals (0, 1 and -1).  211kb
5460         reduced in memory usage.
5461
5462         Replace all calls to `new ArrayList' with `new
5463         ArrayList(4)' which is a good average number for most allocations,
5464         and also requires only 16 bytes of memory for its buffer by
5465         default. 
5466
5467         This reduced MCS memory usage in seven megabytes for the RSS after
5468         bootstrapping.
5469
5470 2003-07-28  Ravi Pratap  <ravi@ximian.com>
5471
5472         * expression.cs (Invocation.OverloadResolve): Fix the algorithm to
5473         handle params methods the correct way by forming only one
5474         applicable set with params and normal methods in them. Earlier we
5475         were looking at params methods only if we found no normal methods
5476         which was not the correct thing to do.
5477
5478         (Invocation.BetterFunction): Take separate arguments indicating
5479         when candidate and the best method are params methods in their
5480         expanded form.
5481
5482         This fixes bugs #43367 and #46199.
5483
5484         * attribute.cs: Documentation updates.
5485
5486         (CheckAttribute): Rename to CheckAttributeTarget.
5487         (GetValidPlaces): Rename to GetValidTargets.
5488
5489         * expression.cs (Invocation.IsParamsMethodApplicable): Fix trivial
5490         bug - use Convert.ImplicitConversion, not ImplicitUserConversion!
5491
5492         Fixes bug #44468.
5493
5494 2003-07-28  Miguel de Icaza  <miguel@ximian.com>
5495
5496         * codegen.cs: Compute IsGeneric correctly.
5497
5498         * cs-parser.jay: Introduce OP_GENERIC_LT for the grammar ambiguity
5499         resolution. 
5500
5501         Bring back (temporarily) OP_LEFT_SHIFT, OP_RIGHT_SHIFT,
5502         OP_SHIFT_RIGHT_ASSIGN, OP_SHIFT_LEFT_ASSIGN.  There were too many
5503         regressions, and I was chasing more bugs than I required.
5504
5505         * interface.cs: Use expressions for base type names (like classes
5506         and structs have been doing for a while now), and resolve that.
5507         This patch should probably go into head as well.
5508
5509         This makes it one less user of FindType.
5510
5511 2003-07-24  Miguel de Icaza  <miguel@ximian.com>
5512
5513         This compiler can not self host currently.  Need to fix that.
5514         
5515         * Makefile: compile to `gmcs.exe'
5516
5517         * driver.cs: Turn on v2 by default on gmcs.
5518
5519         * generic.cs (ConstructedType): Does no longer take a container
5520         type argument;  That will be taken care of later.
5521
5522         (ConstructedType.DoResolve, ConstructedType.ResolveAsTypeStep):
5523         Use SimpleName to resolve for now, so we can continue the work on
5524         the parser, until we get Type.GetType that understands generics.
5525
5526         (ConstructedType.ToString): Implement
5527
5528         (TypeArguments.Resolve): Resolve the child expressions as types. 
5529         
5530         * cs-parser.jay: Rename interface_constraints to
5531         type_parameter_constraints
5532
5533         (namespace_or_type_name): Only use constructed types for the basic
5534         construction, we will deal with identifier<...> later.
5535
5536         (type/type_name): No longer call DecomposeQI, as
5537         namespace_or_type_name is always decoded now.
5538         
5539 2003-07-22  Ravi Pratap  <ravi@ximian.com>
5540
5541         * expression.cs (Invocation.OverloadResolve): Follow the spec more
5542         closely: we eliminate methods in base types when we have an
5543         applicable method in a top-level type.
5544
5545         Please see section 14.5.5.1 for an exact description of what goes
5546         on. 
5547
5548         This fixes bug #45127 and a host of other related to corlib compilation.
5549
5550         * ecore.cs (MethodGroupExpr.DeclaringType): The element in the
5551         array is the method corresponding to the top-level type (this is
5552         because of the changes made to icall.c) so we change this
5553         accordingly.
5554
5555         (MethodGroupExpr.Name): This too.
5556
5557         * typemanager.cs (GetElementType): New method which does the right
5558         thing when compiling corlib. 
5559
5560         * everywhere: Make use of the above in the relevant places.
5561
5562 2003-07-22  Martin Baulig  <martin@ximian.com>
5563
5564         * cs-parser.jay (invocation_expression): Moved
5565         `OPEN_PARENS expression CLOSE_PARENS unary_expression' here from
5566         `cast_expression', but create a InvocationOrCast which later
5567         resolves to either an Invocation or a Cast.
5568
5569         * ecore.cs (ExpressionStatement.ResolveStatement): New virtual
5570         method; call this before EmitStatement() to make sure that this
5571         expression can be used as a statement.
5572
5573         * expression.cs (InvocationOrCast): New class; resolves to either
5574         an Invocation or a Cast.
5575
5576         * statement.cs (StatementExpression): Call ResolveStatement() on
5577         the ExpressionStatement before emitting it.
5578
5579 2003-07-21  Martin Baulig  <martin@ximian.com>
5580
5581         * expression.cs (Invocation.VerifyArgumentsCompat): Check whether
5582         `ref' and `out' attributes match; fixes #46220.
5583         (MemberAccess.ResolveMemberAccess): You can't reference a type
5584         through an expression; fixes #33180.
5585         (Indexers.GetIndexersForType): Don't return the indexers from
5586         interfaces the class implements; fixes #46502.
5587
5588 2003-07-21  Martin Baulig  <martin@ximian.com>
5589
5590         * class.cs (TypeContainer.CheckPairedOperators): Added CS0660 and
5591         CS0661 checks; fixes bug #30442.
5592
5593 2003-07-21  Martin Baulig  <martin@ximian.com>
5594
5595         * decl.cs (AdditionResult): Added `Error'.
5596
5597         * enum.cs (AddEnumMember): Report a CS0076 if name is `value__'.
5598
5599         * typemanager.cs (TypeManager.ChangeType): Catch exceptions; makes
5600         cs0031.cs actually work.
5601
5602  2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5603  
5604         * cs-parser.jay (namespace_name): do not use
5605         namespace_or_type_name, use qualified_identifier, because
5606         namespace_or_type_name will soon return a composed expression
5607         instead of a string.
5608  
5609         (namespace_or_type_name): Instead of returning a string, now this
5610         production returns an expression.
5611  
5612         * codegen.cs (EmitContext): Setup IsGeneric property based on
5613         whether our DeclSpace is generic, our the method is generic.
5614  
5615         * modifier.cs (Modifiers.METHOD_GENERIC): New definition, use if
5616         the method is generic.
5617  
5618         * cs-parser.jay (type_arguments, opt_type_argument_list,
5619         type_parameters, type_parameter_list, opt_type_parameter_list,
5620         type_parameter,, opt_type_parameter_constraints_clauses,
5621         type_parameter_constraints_clauses,
5622         type_parameter_constraint_clause, type_parameter_constraint,
5623         interface_constraints): Add new production
5624  
5625         * decl.cs (DeclSpace): IsGeneric, flag to track whether this
5626         DeclSpace is generic or not.
5627  
5628         (DeclSpace.SetParameterInfo): New routine, used to set the
5629         parameter info for a type.
5630  
5631         (DeclSpace.LookupGeneric): Lookups a name, and if it is a generic,
5632         returns a GenericTypeExpr
5633  
5634         * ecore.cs (SimpleName.ResolveAsTypeStep): If our container is
5635         generic, lookup the generic argument.
5636  
5637         * attribute.cs: Do not allow TypeParameterExpressions in
5638         Attributes.
5639  
5640         * class.cs: Do not allow the Main method to be defined in a
5641         Generic container.
5642  
5643         * expression.cs (SizeOf): Do not allow generic types to be used as
5644         arguments to sizeof.
5645  
5646         * typemanager.cs (IsGeneric): Wrapper for Reflection when we have
5647         it: whether a type is generic or not.  Only works for types we are
5648         currently building for now.
5649         
5650 2003-07-20  Martin Baulig  <martin@ximian.com>
5651
5652         * namespace.cs: Fixed that bug which caused a crash when compiling
5653         the debugger's GUI.
5654
5655 2003-07-20  Miguel de Icaza  <miguel@ximian.com>
5656
5657         * typemanager.cs (LookupTypeReflection): Never expose types which
5658         are NotPublic, NestedPrivate, NestedAssembly, or
5659         NestedFamANDAssem.  We used to return these, and later do a check
5660         that would report a meaningful error, but the problem is that we
5661         would not get the real match, if there was a name override.
5662
5663 2003-07-18  Miguel de Icaza  <miguel@ximian.com>
5664
5665         * namespace.cs (Namespace, Name): Do not compute the namespace
5666         name dynamically, compute it in the constructor.  This reduced
5667         memory usage by 1697 KB.
5668
5669         * driver.cs: Use --pause to pause at the end.
5670
5671 2003-07-17  Peter Williams  <peter@newton.cx>
5672
5673         * Makefile: Change the name of the test target so that it doesn't
5674         conflict with the recursive test target.
5675
5676 2003-07-17  Miguel de Icaza  <miguel@ximian.com>
5677
5678         * expression.cs (LocalVariableReference.Emit, EmitAssign,
5679         AddressOf): Do not use EmitThis, that was wrong, use the actual
5680         this pointer.
5681
5682 2003-07-15  Miguel de Icaza  <miguel@ximian.com>
5683
5684         * class.cs (MethodData.Define): While checking if a method is an
5685         interface implementation, improve the test: If we are not public
5686         (use new test here: use the computed MethodAttributes directly,
5687         instead of the parsed modifier flags) check if the `implementing'
5688         method comes from an interface or not.
5689
5690         * pending.cs (VerifyPendingMethods): Slightly better error
5691         message.
5692
5693         * makefile: add test target that does the mcs bootstrap.
5694
5695 2003-07-16  Ravi Pratap  <ravi@ximian.com>
5696
5697         * interface.cs (Define): Do nothing here since there are no
5698         members to populate etc. Move the attribute emission out of here
5699         since this was just totally the wrong place to put it. Attribute
5700         application happens during the 'Emit' phase, not in the 'Define'
5701         phase.
5702
5703         (Emit): Add this method and move the attribute emission here
5704
5705         * rootcontext.cs (EmitCode): Call the Emit method on interface
5706         types too.
5707
5708 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5709
5710         * expression.cs (OverloadResolve): Report error only if Location
5711         is not 'Null' which means that there was a probe going on.
5712
5713 2003-07-14  Martin Baulig  <martin@ximian.com>
5714
5715         * expression.cs (ConditionalLogicalOperator): New public class to
5716         implement user defined conditional logical operators.
5717         This is section 14.11.2 in the spec and bug #40505.
5718
5719 2003-07-14  Martin Baulig  <martin@ximian.com>
5720
5721         * ecore.cs (FieldExpr.DoResolveLValue): Fixed bug #46198.
5722
5723 2003-07-14  Martin Baulig  <martin@ximian.com>
5724
5725         * codegen.cs (EmitContext.InFixedInitializer): New public field.
5726
5727         * ecore.cs (IVariable.VerifyFixed): New interface method.
5728
5729         * expression.cs (Unary.ResolveOperator): When resolving the `&'
5730         operator, check whether the variable is actually fixed.  Fixes bug
5731         #36055.  Set a variable definitely assigned when taking its
5732         address as required by the spec.
5733
5734         * statement.cs (LocalInfo.IsFixed): New field.
5735         (LocalInfo.MakePinned): Set `IsFixed' to true.
5736
5737 2003-07-14  Ravi Pratap M  <ravi@ximian.com>
5738
5739         * attribute.cs (Attribute.Resolve): While doing a Member lookup
5740         for .ctors, ensure that we only ask for members declared in the
5741         attribute type (BindingFlags.DeclaredOnly).
5742
5743         Fixes bug #43632.
5744
5745         * expression.cs (Error_WrongNumArguments): Report error 1501
5746         correctly the way CSC does.
5747
5748 2003-07-13  Martin Baulig  <martin@ximian.com>
5749
5750         * expression.cs (MemberAccess.ResolveAsTypeStep): Try to do a type
5751         lookup on the fully qualified name, to make things like "X.X" work
5752         where "X.X" is a fully qualified type name, but we also have a
5753         namespace "X" in the using list.  Fixes #41975.
5754
5755 2003-07-13  Martin Baulig  <martin@ximian.com>
5756
5757         * assign.cs (Assign.GetEmbeddedAssign): New protected virtual
5758         function. If we're a CompoundAssign, we need to create an embedded
5759         CompoundAssign, not an embedded Assign.
5760         (Assign.DoResolve): Make this work for embedded CompoundAssign's.
5761         Fixes #45854.
5762
5763 2003-07-13  Martin Baulig  <martin@ximian.com>
5764
5765         * typemanager.cs (TypeManager.IsNestedChildOf): Make this actually
5766         work to fix bug #46088.
5767
5768 2003-07-13  Ravi Pratap <ravi@ximian.com>
5769
5770         * class.cs (Operator.Emit): Do not emit attributes here - it is
5771         taken care of by the Method class that we delegate too. This takes
5772         care of bug #45876.
5773
5774 2003-07-10  Martin Baulig  <martin@ximian.com>
5775
5776         * expression.cs (TypeOfVoid): New class.
5777         (TypeOf): Report a CS0673 if it's System.Void.  Fixes #42264.
5778
5779 2003-07-10  Martin Baulig  <martin@ximian.com>
5780
5781         * class.cs (MethodCore.DoDefineParameters): Added CS0225 check;
5782         bug #35957.
5783
5784 2003-07-10  Martin Baulig  <martin@ximian.com>
5785
5786         * rootcontext.cs (RootContext.NamespaceLookup): Take a DeclSpace,
5787         not a NamespaceEntry, so we can use DeclSpace.CheckAccessLevel().
5788
5789         * decl.cs (DeclSpace.FindType): Use DeclSpace.CheckAccessLevel().
5790
5791         * typemanager.cs (TypeManager.IsAccessibleFrom): Removed.
5792
5793 2003-07-10  Martin Baulig  <martin@ximian.com>
5794
5795         * expression.cs (ArrayCreation): Don't use a byte blob for arrays
5796         of decimal.  Fixes #42850.
5797
5798         NOTE: I also fixed the created byte blob, but this doesn't work on
5799         the MS runtime and csc never produces any byte blobs for decimal
5800         arrays.
5801
5802 2003-07-10  Martin Baulig  <martin@ximian.com>
5803
5804         * statement.cs (StructInfo.GetStructInfo): Catch deep cycles in
5805         structs; fixes #32068.
5806         (Block.AddChildVariableNames): Fixed #44302.
5807
5808 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5809
5810         * namespace.cs: fixed compilation with csc. It's bugzilla #44302.
5811
5812 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5813
5814         * attribute.cs: And this test is onger needed.
5815
5816 2003-07-08  Martin Baulig  <martin@ximian.com>
5817
5818         * rootcontext.cs (RootContext.NamespaceLookup): Ignore
5819         inaccessible types.  Fixes #36313.
5820
5821         * decl.cs (DeclSpace.FindType): Ignore inaccessible types.
5822
5823         * namespace.cs (NamespaceEntry): Create implicit entries for all
5824         namespaces; ie. if we have `namespace N1.N2.N3 { ... }', we create
5825         implicit entries for N1.N2 and N1.
5826
5827 2003-07-08  Martin Baulig  <martin@ximian.com>
5828
5829         Rewrote the handling of namespaces to fix a lot of the issues
5830         wrt. `using' aliases etc.
5831
5832         * namespace.cs (Namespace): Splitted this class into a
5833         per-assembly `Namespace' and a per-file `NamespaceEntry'.
5834
5835         * typemanager.cs (TypeManager.IsNamespace): Removed.
5836         (TypeManager.ComputeNamespaces): Only compute namespaces from
5837         loaded assemblies here, not the namespaces from the assembly we're
5838         currently compiling.
5839
5840 2003-07-08  Martin Baulig  <martin@ximian.com>
5841
5842         * rootcontext.cs, class.cs: Fixed the CS1530 reporting.
5843
5844 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5845
5846         * typemanager.cs: Reverted patch from Gonzalo, my previous patch
5847         already fixed it.  
5848
5849         I thought about the memory savings here, but LookupTypeReflection
5850         is used under already very constrained scenarios.  Compiling
5851         corlib or mcs only exposes one hit, so it would not really reduce
5852         any memory consumption.
5853
5854 2003-07-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
5855
5856         * typemanager.cs: fixes bug #45889 by only adding public types from
5857         other assemblies to the list of known types.
5858
5859 2003-07-07  Miguel de Icaza  <miguel@ximian.com>
5860
5861         * attribute.cs (Attribute.Resolve): Add call to CheckAccessLevel
5862         on the type we resolved.
5863
5864 2003-07-05  Martin Baulig  <martin@ximian.com>
5865
5866         * pending.cs (PendingImplementation.ParentImplements): Don't
5867         create the proxy if the parent is abstract.
5868
5869         * class.cs (TypeContainer.DefineIndexers): Process explicit
5870         interface implementations first.  Fixes #37714.
5871
5872 2003-07-04  Miguel de Icaza  <miguel@ximian.com>
5873
5874         * expression.cs (MemberAccess.ResolveMemberAccess): Events are
5875         defined recursively;  but since we modify the input parameters
5876         (left is set to `this' temporarily), we reset this value if the
5877         left_is_explicit is false, which gives the original semantics to
5878         the code.  
5879
5880         * literal.cs (NullPointer): new class used to represent a null
5881         literal in a pointer context.
5882
5883         * convert.cs (Convert.ImplicitReferenceConversion): Is the target
5884         type is a pointer, use a NullPointer object instead of a
5885         NullLiteral.   Closes 43687
5886
5887         (ExplicitConversion): Convert pointer values using
5888         the conv opcode to the proper type.
5889
5890         * ecore.cs (New): change ValueTypeVariable property into a method,
5891         that returns whether the valuetype is suitable for being used.
5892
5893         * expression.cs (Binary.DoNumericPromotions): Only return if we
5894         the int constant was a valid uint, and we can return both left and
5895         right as uints.  If not, we continue processing, to trigger the
5896         type conversion.  This fixes 39018.
5897
5898         * statement.cs (Block.EmitMeta): During constant resolution, set
5899         the CurrentBlock property on the emitcontext, so that we resolve
5900         constants propertly.
5901
5902 2003-07-02  Martin Baulig  <martin@ximian.com>
5903
5904         * codegen.cs (EmitContext.NeedExplicitReturn): New public variable.
5905         (EmitContext.EmitTopBlock): Emit an explicit return if it's set.
5906
5907         * statement.cs (Try.Resolve): Set ec.NeedExplicitReturn rather
5908         than emitting it here.
5909
5910         * statement.cs: Fixed some more flow analysis bugs.
5911
5912 2003-07-02  Martin Baulig  <martin@ximian.com>
5913
5914         * class.cs (MethodData.Define): When implementing interface
5915         methods, set Final unless we're Virtual.
5916
5917         * decl.cs (MemberCore.CheckMethodAgainstBase): Make the CS0506
5918         check work for interface methods.
5919
5920 2003-07-01  Martin Baulig  <martin@ximian.com>
5921
5922         * ecore.cs (EmitContext.This): Replaced this property with a
5923         GetThis() method which takes a Location argument.  This ensures
5924         that we get the correct error location for a CS0188.
5925
5926 2003-07-01  Miguel de Icaza  <miguel@ximian.com>
5927
5928         * ecore.cs: (Convert.ConvertIntLiteral): Add test for
5929         ImplicitStandardConversion.
5930
5931         * class.cs (TypeContainer.GetClassBases): Small bug fix for 45649.
5932
5933 2003-07-01  Zoltan Varga  <vargaz@freemail.hu>
5934
5935         * expression.cs (ResolveOperator): Fix Concat (string, string, string)
5936         optimization.
5937
5938 2003-06-30  Miguel de Icaza  <miguel@ximian.com>
5939
5940         * class.cs (Constructor.Define): Turn off initlocals for unsafe
5941         constructors.
5942
5943         (MethodData.Define): Turn off initlocals for unsafe methods.
5944
5945 2003-06-29  Miguel de Icaza  <miguel@ximian.com>
5946
5947         * decl.cs (DeclSpace.CheckAccessLevel): Make this routine
5948         complete;  Fixes #37521.
5949
5950         * delegate.cs: Use Modifiers.TypeAttr to compute the
5951         TypeAttributes, instead of rolling our own.  This makes the flags
5952         correct for the delegates.
5953
5954 2003-06-28  Miguel de Icaza  <miguel@ximian.com>
5955
5956         * class.cs (Constructor.Define): Set the private flag for static
5957         constructors as well.
5958
5959         * cs-parser.jay (statement_expression): Set the return value to
5960         null, to avoid a crash when we catch an error.
5961
5962 2003-06-24  Miguel de Icaza  <miguel@ximian.com>
5963
5964         * cs-parser.jay: Applied patch from Jackson that adds support for
5965         extern and unsafe modifiers to destructor declarations.
5966
5967         * expression.cs: Report error 21 if the user is trying to index a
5968         System.Array.
5969
5970         * driver.cs: Add an error message, suggested by the bug report.
5971
5972         * class.cs (TypeContainer.Emit): Only call EmitFieldInitializers
5973         if we do not have a ": this ()" constructor initializer.  Fixes 45149
5974
5975 2003-06-14  Miguel de Icaza  <miguel@ximian.com>
5976
5977         * namespace.cs: Add some information to reduce FAQs.
5978
5979 2003-06-13  Miguel de Icaza  <miguel@ximian.com>
5980
5981         * cfold.cs (BinaryFold): BitwiseAnd, BitwiseOr: handle other
5982         underlying enumeration types.  Fixes #43915.
5983
5984         * expression.cs: Treat ushort/short as legal values to be used in
5985         bitwise operations.
5986
5987 Wed Jun 4 13:19:04 CEST 2003 Paolo Molaro <lupus@ximian.com>
5988
5989         * delegate.cs: transfer custom attributes for paramenters from
5990         the delegate declaration to Invoke and BeginInvoke.
5991
5992 Tue Jun 3 11:11:08 CEST 2003 Paolo Molaro <lupus@ximian.com>
5993
5994         * attribute.cs: handle custom marshalers and emit marshal info
5995         for fields, too.
5996
5997 2003-05-28  Hector E. Gomez Morales  <hgomez_36@flashmail.com>
5998
5999         * makefile.gnu: Added anonymous.cs to the compiler sources.
6000
6001 2003-05-28  Miguel de Icaza  <miguel@ximian.com>
6002
6003         * iterators.cs: Change the name of the proxy class to include two
6004         underscores.
6005
6006         * cs-parser.jay: Update grammar to include anonymous methods.
6007
6008         * anonymous.cs: new file.
6009
6010 2003-05-27  Miguel de Icaza  <miguel@ximian.com>
6011
6012         * class.cs (Field.Define): Add missing test for pointers and
6013         safety. 
6014
6015 2003-05-27  Ravi Pratap  <ravi@ximian.com>
6016
6017         * expression.cs (ArrayAccess.GetStoreOpCode): For System.IntPtr,
6018         we use the stobj opcode.
6019
6020         (ArrayCreation.EmitDynamicInitializers): Revert Miguel's patch
6021         since it wasn't the correct fix. 
6022
6023         It still is puzzling that we are required to use stobj for IntPtr
6024         which seems to be a ValueType.
6025
6026 2003-05-26  Miguel de Icaza  <miguel@ximian.com>
6027
6028         * ecore.cs (SimpleName.SimpleNameResolve): Consider using aliases
6029         during regular simple name resolution.   Now, the trick is that
6030         instead of returning for processing the simplename, we do a
6031         TypeManager.LookupType (ie, a rooted lookup as opposed to a
6032         contextual lookup type).   If a match is found, return that, if
6033         not, return for further composition.
6034
6035         This fixes long-standing 30485.
6036
6037         * expression.cs (ArrayCreation.EmitDynamicInitializers): When
6038         using the address to initialize an object, do an Stobj instead of
6039         using the regular Stelem.
6040
6041         (IndexerAccess.Emit, IndexerAccess.EmitAssign):
6042         Pass `is_base_indexer' to Invocation.EmitCall instead of false.
6043         Because if we are a BaseIndexerAccess that value will be true.
6044         Fixes 43643.
6045
6046         * statement.cs (GotoCase.Resolve): Return after reporting an
6047         error, do not attempt to continue. 
6048
6049         * expression.cs (PointerArithmetic.Emit): If our operand is a
6050         long, convert our constants to match the operand before
6051         multiplying.  Convert to I type before adding.   Fixes 43670.
6052
6053 2003-05-14  Ravi Pratap  <ravi@ximian.com>
6054
6055         * enum.cs (ImplicitConversionExists) : Rename to
6056         ImplicitEnumConversionExists to remove ambiguity. 
6057
6058         * ecore.cs (NullCast): New type of cast expression class which
6059         basically is very similar to EmptyCast with the difference being
6060         it still is a constant since it is used only to cast a null to
6061         something else
6062         (eg. (string) null)
6063
6064         * convert.cs (ImplicitReferenceConversion): When casting a null
6065         literal, we return a NullCast.
6066
6067         * literal.cs (NullLiteralTyped): Remove - I don't see why this
6068         should be around anymore.
6069
6070         The renaming (reported was slightly wrong). Corrections:
6071
6072         ConvertImplicitStandard -> ImplicitConversionStandard
6073         ConvertExplicitStandard -> ExplicitConversionStandard
6074
6075         * expression.cs (StaticCallExpr.MakeSimpleCall): Resolve arguments
6076         before passing them in !
6077
6078         * convert.cs (ImplicitConversionStandard): When comparing for
6079         equal expr and target types, ensure that expr is not a
6080         NullLiteral.
6081
6082         In general, we must not be checking (expr_type ==
6083         target_type) in the top level conversion methods
6084         (ImplicitConversion, ExplicitConversion etc). This checking is
6085         done in the methods that they delegate to.
6086
6087 2003-05-20  Miguel de Icaza  <miguel@ximian.com>
6088
6089         * convert.cs: Move Error_CannotConvertType,
6090         ImplicitReferenceConversion, ImplicitReferenceConversionExists,
6091         ImplicitNumericConversion, ImplicitConversionExists,
6092         ImplicitUserConversionExists, StandardConversionExists,
6093         FindMostEncompassedType, FindMostSpecificSource,
6094         FindMostSpecificTarget, ImplicitUserConversion,
6095         ExplicitUserConversion, GetConversionOperators,
6096         UserDefinedConversion, ConvertImplicit, ConvertImplicitStandard,
6097         TryImplicitIntConversion, Error_CannotConvertImplicit,
6098         ConvertImplicitRequired, ConvertNumericExplicit,
6099         ExplicitReferenceConversionExists, ConvertReferenceExplicit,
6100         ConvertExplicit, ConvertExplicitStandard from the ecore.cs into
6101         its own file.
6102
6103         Perform the following renames:
6104
6105         StandardConversionExists -> ImplicitStandardConversionExists
6106         ConvertImplicit -> ImplicitConversion
6107         ConvertImplicitStandard -> ImplicitStandardConversion
6108         TryImplicitIntConversion -> ImplicitIntConversion
6109         ConvertImplicitRequired -> ImplicitConversionRequired
6110         ConvertNumericExplicit -> ExplicitNumericConversion
6111         ConvertReferenceExplicit -> ExplicitReferenceConversion
6112         ConvertExplicit -> ExplicitConversion
6113         ConvertExplicitStandard -> ExplicitStandardConversion
6114
6115 2003-05-19  Martin Baulig  <martin@ximian.com>
6116
6117         * statement.cs (TypeInfo.StructInfo): Made this type protected.
6118         (TypeInfo): Added support for structs having structs as fields.
6119
6120         * ecore.cs (FieldExpr): Implement IVariable.
6121         (FieldExpr.DoResolve): Call VariableInfo.GetSubStruct() to get the
6122         VariableInfo for the field.
6123
6124 2003-05-18  Martin Baulig  <martin@ximian.com>
6125
6126         * expression.cs (This.DoResolve): Report a CS0027 if we're
6127         emitting a field initializer.
6128
6129 2003-05-18  Martin Baulig  <martin@ximian.com>
6130
6131         * expression.cs (This.ResolveBase): New public function.
6132         (This.DoResolve): Check for CS0188.
6133
6134         * codegen.cs (EmitContext.This): Just call This.ResolveBase(), not
6135         This.Resolve().
6136
6137         * ecore.cs (MethodGroupExpr.DoResolve): Set the
6138         `instance_expression' to null if we don't have any non-static
6139         methods.
6140
6141 2003-05-18  Martin Baulig  <martin@ximian.com>
6142
6143         Reworked the way how local variables and parameters are handled by
6144         the flow analysis code.
6145
6146         * statement.cs (TypeInfo, VariableMap): New public classes.
6147         (VariableInfo): New public class.  This is now responsible for
6148         checking whether a variable has been assigned.  It is used for
6149         parameters and local variables.
6150         (Block.EmitMeta): Take the InternalParameters as argument; compute
6151         the layout of the flow vectors here.
6152         (Block.LocalMap, Block.ParameterMap): New public properties.
6153         (FlowBranching): The .ctor doesn't get the InternalParameters
6154         anymore since Block.EmitMeta() now computes the layout of the flow
6155         vector.
6156         (MyStructInfo): This class is now known as `StructInfo' and nested
6157         in `TypeInfo'; we don't access this directly anymore.
6158
6159         * ecore.cs (IVariable): Added `VariableInfo VariableInfo'
6160         property and removed IsAssigned(), IsFieldAssigned(),
6161         SetAssigned() and SetFieldAssigned(); we now call them on the
6162         VariableInfo so we don't need to duplicate this code everywhere.
6163
6164         * expression.cs (ParameterReference): Added `Block block' argument
6165         to the .ctor.
6166         (LocalVariableReference, ParameterReference, This): The new
6167         VariableInfo class is now responsible for all the definite
6168         assignment stuff.
6169
6170         * codegen.cs (EmitContext.IsVariableAssigned, SetVariableAssigned,
6171         IsParameterAssigned, SetParameterAssigned): Removed.
6172
6173 2003-05-18  Martin Baulig  <martin@ximian.com>
6174
6175         * typemanager.cs (InitCoreTypes): Try calling
6176         SetCorlibTypeBuilders() with 4 args; if that fails, fall back to
6177         the 3-args-version.  Corlib now also needs our `void_type'.
6178         (GetMethod): Added overloaded version which takes an optional
6179         `bool report_errors' to allow lookups of optional methods.
6180
6181 2003-05-12  Martin Baulig  <martin@ximian.com>
6182
6183         * statement.cs (VariableInfo): Renamed to LocalInfo since it's
6184         only used for locals and not for parameters.
6185
6186 2003-05-12  Miguel de Icaza  <miguel@ximian.com>
6187
6188         * support.cs (InternalParameters.ParameterType): Return the
6189         ExternalType of the parameter.
6190
6191         * parameter.cs (Parameter.ExternalType): drop the two arguments,
6192         they were unused.
6193
6194 2003-05-11  Miguel de Icaza  <miguel@ximian.com>
6195
6196         * class.cs (MethodData.Define): Do not set the `newslot' on
6197         interface members, if they are also flagged as "override".
6198
6199         * expression.cs (UnaryMutator.EmitCode): Simple workaround to emit
6200         better code for ++i and i++.  This only works for static fields
6201         and local variables.
6202
6203         * typemanager.cs (LookupDeclSpace): Add new method, sometimes we
6204         want to pull the DeclSpace out of the builder_to_declspace instead
6205         of the TypeBuilder (like in TypeContainer.FindMembers).
6206
6207         * class.cs (TypeContainer.FindMembers): Use LookupDeclSpace
6208         instead of LookupTypeContainer.  Fixes the crash on .NET for
6209         looking up interface members.
6210
6211         * const.cs: Create our own emit context during the Definition
6212         stage, so that constants are evaluated in the proper context, when
6213         a recursive definition happens.
6214
6215 2003-05-11  Martin Baulig  <martin@ximian.com>
6216
6217         * statement.cs (Block.CreateSwitchBlock): New method.  Creates a
6218         new block for a switch section.
6219         (Block.AddLabel, Block.LookupLabel): If we're a switch section, do
6220         the adding/lookup in the switch block.  Fixes #39828.
6221
6222 2003-05-09  Miguel de Icaza  <miguel@ximian.com>
6223
6224         * expression.cs (UnaryMutator.LoadOneAndEmitOp): Missing
6225         functionality: I needed to convert the data after I had performed
6226         the add/sub operation into the operands type size.
6227
6228         * ecore.cs (ImplicitReferenceConversion): When boxing an interface
6229         pass the type for the box operation, otherwise the resulting
6230         object would have been of type object.
6231
6232         (BoxedCast): Add constructor to specify the type to box as.
6233
6234 2003-05-07  Miguel de Icaza  <miguel@ximian.com>
6235
6236         * iterators.cs: I was reusing the `count' variable inadvertently,
6237         take steps to not allow this to happen.
6238
6239 2003-05-06  Miguel de Icaza  <miguel@ximian.com>
6240
6241         * attribute.cs (Attribute.Resolve): Params attributes are encoded
6242         by creating an array at the point where the params starts and
6243         putting all those arguments there, then adjusting the size of the
6244         array.
6245
6246 2003-05-05  Miguel de Icaza  <miguel@ximian.com>
6247
6248         * expression.cs (New.AddressOf): Implement interface
6249         IMemoryLocation.  This is used when the `new' operator is used in
6250         the context of an invocation to a method on a value type.
6251
6252         See http://bugzilla.ximian.com/show_bug.cgi?id=#42390 for an
6253         example. 
6254
6255         * namespace.cs: Also check the using aliases here.
6256
6257         * driver.cs: Move the test for using validity after the types have
6258         been entered, so we do a single pass that also includes the using
6259         aliases. 
6260
6261         * statement.cs (Try.Resolve): Avoid crashing if there is a failure
6262         in the regular case.   CreateSiblingForFinally is doing extra
6263         error checking.
6264
6265         * attribute.cs (GetAttributeArgumentExpression): Store the result
6266         on an out value, and use the return value to indicate failure
6267         instead of using null (which is a valid return for Constant.GetValue).
6268
6269         * statement.cs: Perform the analysis flow for the increment
6270         portion after the statement, because this will be the real flow of
6271         execution.  Fixes #42385
6272
6273         * codegen.cs (EmitContext.EmitArgument,
6274         EmitContext.EmitStoreArgument): New helper functions when the
6275         RemapToProxy flag is set.
6276
6277         * expression.cs (ParameterReference.EmitLdarg): Expose this useful
6278         function.
6279
6280         Add support for remapping parameters. 
6281
6282         * iterators.cs: Propagate parameter values;  Store parameter
6283         values in the proxy classes.
6284
6285 2003-05-04  Miguel de Icaza  <miguel@ximian.com>
6286
6287         * ecore.cs (FieldExpr): Fix an obvious bug.  static fields do not
6288         need a proxy reference;  I do not know what I was thinking
6289
6290         * cs-parser.jay (constructor_initializer): catch another error,
6291         and display nice message.
6292
6293         (field_declaration): catch void field declaration
6294         to flag a better error. 
6295
6296         * class.cs (MemberBase.CheckBase): Report an error instead of a
6297         warning if a new protected member is declared in a struct. 
6298         (Field.Define): catch the error of readonly/volatile.
6299
6300         * ecore.cs (FieldExpr.EmitAssign): reuse the field lookup.
6301
6302         (FieldExpr.AddressOf): ditto.  Catch error where the address of a
6303         volatile variable is taken
6304
6305 2003-05-02  Miguel de Icaza  <miguel@ximian.com>
6306
6307         * statement.cs (Fixed.Resolve): Report an error if we are not in
6308         an unsafe context.
6309
6310 2003-05-01  Miguel de Icaza  <miguel@ximian.com>
6311
6312         * typemanager.cs: reuse the code that handles type clashes for
6313         delegates and enumerations.
6314
6315         * class.cs (Report28): Always report.
6316
6317         * expression.cs (EncodeAsAttribute): Allow nulls here.
6318
6319 2003-04-28  Miguel de Icaza  <miguel@ximian.com>
6320
6321         * attribute.cs (Attribute.GetAttributeArgumentExpression): Moved
6322         the functionality for testing whether an expression is valid for
6323         an attribute here.  Also handle the case of arrays of elements
6324         being stored. 
6325
6326         * expression.cs (ArrayCreation.EncodeAsAttribute): Add support for
6327         encoding a linear array into an array of objects that are suitable
6328         to be passed to an CustomAttributeBuilder.
6329
6330         * delegate.cs: Check unsafe types being used outside of an Unsafe context.
6331
6332         * ecore.cs: (FieldExpr): Handle field remapping here.
6333
6334         * iteratators.cs: Pass the instance variable (if the method is an
6335         instance method) to the constructors, so we can access the field
6336         variables on the class.
6337
6338         TODO: Test this with structs.  I think the THIS variable on
6339         structs might have to be a pointer, and not a refenrece
6340
6341 2003-04-27  Miguel de Icaza  <miguel@ximian.com>
6342
6343         * codegen.cs (EmitContext.Mapvariable): Adds a mechanism to map
6344         local variables to fields in a proxy class.
6345
6346         * iterators.cs (PopulateProxy): Rename our internal fields to
6347         <XXX>.  
6348         Create a <THIS> field if we are an instance method, so we can
6349         reference our parent container variables.
6350         (MapVariable): Called back from the EmitContext code to enter a
6351         new variable to field mapping into the proxy class (we just create
6352         a FieldBuilder).
6353
6354         * expression.cs
6355         (LocalVariableReference.{Emit,EmitAssign,AddressOf}): Add support
6356         for using the remapped locals to fields.
6357
6358         I placed the code here, because that gives the same semantics to
6359         local variables, and only changes the Emit code.
6360
6361         * statement.cs (Fixed.Resolve): it is not allowed to have fixed
6362         statements inside iterators.
6363         (VariableInfo): Add a FieldBuilder for the cases when we are
6364         remapping local variables to fields in a proxy class
6365
6366         * ecore.cs (SimpleNameResolve): Avoid testing two times for
6367         current_block != null.
6368
6369         * statement.cs (Swithc.SimpleSwitchEmit): Removed code that did
6370         not cope with strings, as it has been moved to the
6371         TableSwitchEmit.  Fixed bug in switch generation.
6372
6373         * expression.cs (New.DoResolve): Provide more context for the user
6374         when reporting an error.
6375
6376         * ecore.cs (Expression.LoadFromPtr): Use ldind_i when loading
6377         pointers. 
6378
6379         * expression.cs (MemberAccess.DoResolve): When we get a type back,
6380         check the permissions for it.  Note than in a type-resolution
6381         context the check was already present in DeclSpace.ResolveType,
6382         but was missing from the MemberAccess.
6383
6384         (ArrayCreation.CheckIndices): warn if the user has
6385         more nested levels of expressions, but there are no more
6386         dimensions specified.  Avoids crash on bug 41906.
6387
6388 2003-04-26  Miguel de Icaza  <miguel@ximian.com>
6389
6390         * statement.cs (Block): replace Implicit bool, for a generic
6391         flags.   
6392         New flag: `Unchecked'.  This is used during the EmitMeta phase
6393         (which is out-of-line with the regular Resolve/Emit process for a
6394         statement, as this is done ahead of time, but still gets a chance
6395         to call constant resolve).
6396
6397         (Block.Flags): new enum for adding a new flag.
6398
6399         (Block.EmitMeta): track the state of unchecked.
6400
6401         (Unchecked): Set the "UnChecked" flags on any blocks we enclose,
6402         to enable constant resolution to work there as well.
6403
6404 2003-04-22  Miguel de Icaza  <miguel@ximian.com>
6405
6406         * typemanager.cs (ienumerable_type): Also look up
6407         System.Collections.IEnumerable. 
6408
6409 2003-04-21  Miguel de Icaza  <miguel@ximian.com>
6410
6411         TODO: Test more than one conditional per method.
6412
6413         * class.cs (Indexer.Define): Report the location where the user is
6414         referencing the unsupported feature.
6415
6416         (MethodData): Overload the use of `conditionals' to
6417         minimize the creation of needless ArrayLists.   This saves roughly
6418         212kb on my machine.
6419
6420         (Method): Implement the new IIteratorContainer interface.
6421         (Method.SetYields): Implement the method by setting the ModFlags
6422         to contain METHOD_YIELDS.
6423
6424         * expression.cs (Unary.ResolveOperator): Use expr_type, not Expr,
6425         which just got set to null.
6426
6427         * iterators.cs: New file.
6428
6429         (Yield, YieldBreak): New statements.
6430
6431         * statement.cs (Return.Resolve): Flag an error if we are used in
6432         an iterator method.
6433
6434         * codegen.cs (InIterator): New flag set if the code is being
6435         compiled in an iterator method.
6436
6437         * modifiers.cs: New flag METHOD_YIELDS.  This modifier is an
6438         internal modifier, and we just use it to avoid adding extra
6439         fields, as this is seldom used.  
6440
6441         * cs-parser.jay: Add yield_statement (yield and yield break).
6442
6443         * driver.cs: New flag -v2 to turn on version 2 features. 
6444
6445         * cs-tokenizer.cs (Tokenizer): Add yield and __yield to the
6446         hashtable when v2 is enabled.
6447
6448 2003-04-20  Miguel de Icaza  <miguel@ximian.com>
6449
6450         * typemanager.cs (TypeManager.NamespaceClash): Use to check if
6451         there is already a namespace defined with this name.
6452
6453         (TypeManager.InitCoreTypes): Remove the temporary workaround, as
6454         people upgraded their corlibs.
6455
6456         (TypeManager.CoreLookupType): Use LookupTypeDirect, as we
6457         always use fully qualified types, no need to use the compiler
6458         front end.
6459
6460         (TypeManager.IsNamespace): Use binarysearch.
6461
6462         * class.cs (AddClass, AddStruct, AddInterface, AddEvent,
6463         AddDelegate): I did not quite use the new IsValid API properly: I
6464         have to pass the short-name and the fullname.  I was passing only
6465         the basename instead of the fullname sometimes. 
6466
6467         (TypeContainer.DefineType): call NamespaceClash.
6468
6469         * interface.cs (Interface.DefineType): use NamespaceClash before
6470         defining the type.
6471
6472         * delegate.cs (Delegate.DefineType): use NamespaceClash before
6473         defining the type.
6474
6475         * enum.cs: (Enum.DefineType): use NamespaceClash before
6476         defining the type.
6477
6478         * typemanager.cs (: 3-line patch that gives us some tasty 11%
6479         speed increase.  First, use the negative_hits cache when we get a
6480         negative.  Second, add the type with its full original name
6481         instead of the new . and + encoded name (reflection uses + to
6482         separate type from a nested type).  Use LookupTypeReflection
6483         directly which bypasses the type->name hashtable (that we already
6484         know does not contain the type.
6485
6486         * decl.cs (DeclSpace.ResolveTypeExpr): track the
6487         location/container type. 
6488
6489         * driver.cs: When passing utf8, use directly the UTF8Encoding.
6490
6491 2003-04-19  Miguel de Icaza  <miguel@ximian.com>
6492
6493         * decl.cs (ResolveTypeExpr): Mirror check acess here too.
6494
6495         * delegate.cs (NewDelegate.Resolve): Test whether an instance
6496         method is being referenced in the method group from a static
6497         context, and report error 120 if so.
6498
6499         * expression.cs, ecore.cs (Error_UnexpectedKind): New name for
6500         Error118. 
6501
6502         * typemanager.cs: Add intermediate namespaces (if a namespace A.B
6503         is created, we create the A namespace).
6504
6505         * cs-parser.jay: A namespace also introduces a DeclarationFound.
6506         Fixes #41591
6507
6508 2003-04-18  Miguel de Icaza  <miguel@ximian.com>
6509
6510         * typemanager.cs (GetReferenceType, GetPointerType): In .NET each
6511         invocation to ModuleBuilder.GetType with the same values will
6512         return a new type instance, so we need to cache its return
6513         values. 
6514
6515         * expression.cs (Binary.ResolveOperator): Only allow the compare
6516         operators on enums if they are of the same type.
6517
6518         * ecore.cs (Expression.ImplicitReferenceConversion): handle target
6519         types of ValueType on their own case.  Before we were giving them
6520         the same treatment as objects.
6521
6522         * decl.cs (DeclSpace.IsValid): IsValid takes the short name and
6523         fullname.  Short name is used to compare against container name.
6524         Fullname is used to check against defined namespace names.
6525
6526         * class.cs (AddProperty, AddField, AddClass, AddStruct, AddEnum,
6527         AddDelegate, AddEvent): Pass new parameter to DeclSpace.IsValid
6528
6529         (Method.CheckBase): Call parent.
6530         (MemberBase.CheckBase): Check for protected members on sealed
6531         classes.
6532         (PropertyBase.CheckBase): Call parent.
6533         (Field.Define): Call parent.
6534
6535         * report.cs: Negative error codes are now mapped to 8000 - code,
6536         so that the display is render more nicely.
6537
6538         * typemanager.cs: Do not use try/catch, instead report a regular
6539         error. 
6540
6541         (GetPointerType, GetReferenceType): These methods provide
6542         mechanisms to obtain the T* and T& from a T.  We had the code
6543         previously scattered around the code base, and it also used
6544         TypeManager.LookupType that would go through plenty of caches.
6545         This one goes directly to the type source.
6546
6547         In some places we did the Type.GetType followed by
6548         ModuleBuilder.GetType, but not in others, so this unifies the
6549         processing as well.
6550
6551         * namespace.cs (VerifyUsing): Perform a non-lazy approach to using
6552         statements now that we have namespace information.
6553
6554         * typemanager.cs (IsNamespace): New method, returns whether the
6555         string presented is a namespace or not.
6556
6557         (ComputeNamespaces): New public entry point, computes the list of
6558         available namespaces, using the GetNamespaces API call in Mono, or
6559         the slower version in MS.NET.   
6560
6561         Now before we start the semantic analysis phase, we have a
6562         complete list of namespaces including everything that the user has
6563         provided.
6564
6565         Deleted old code to cache namespaces in .nsc files.
6566
6567 2003-04-17  Miguel de Icaza  <miguel@ximian.com>
6568
6569         * class.cs: (TypeContainer.DefineDefaultConstructor): Use the
6570         class/struct location definition Location for the implicit
6571         constructor location.
6572
6573         (Operator.Define): Use the location of the operator for the
6574         implicit Method definition.
6575
6576         (Constructor.Emit): use the constructor location for the implicit
6577         base initializer constructor.
6578
6579         * ecore.cs: Remove ITypeExpression.  This interface is now gone,
6580         and the Expression class now contains two new methods:
6581
6582         ResolveAsTypeStep and ResolveAsTypeTerminal.  This is used to
6583         isolate type lookup from the rest of the resolution process.
6584
6585         Since we use Expressions to hold type definitions due to the way
6586         we parse the input we have historically overloaded Resolve to
6587         perform the Type lookups if a special flag is passed.  Now this is
6588         eliminated and two methods take their place. 
6589
6590         The differences in the two methods between xStep and xTerminal is
6591         that xStep is involved in our current lookup system that uses
6592         SimpleNames to compose a name, while xTerminal is used just to
6593         catch the case where the simplename lookup failed.
6594
6595 2003-04-16  Miguel de Icaza  <miguel@ximian.com>
6596
6597         * expression.cs (ResolveMemberAccess): Remove redundant code.
6598         TypeExpr expressions are always born fully resolved.
6599
6600         * interface.cs (PopulateMethod): Do not lookup the types twice.
6601         We were doing it once during SemanticAnalysis and once during
6602         PopulateMethod.
6603
6604         * cs-parser.jay: Due to our hack in the grammar, things like A.B[]
6605         in local variable type definitions, were being returned as a
6606         SimpleName (we decomposed everything into a string), that is
6607         because primary_expression was being used instead of a type in the
6608         grammar (reduce/reduce conflicts).
6609
6610         The part that was wrong is that we converted the expression into a
6611         string (an oversimplification in one hand, compounded with primary
6612         expressions doing string concatenation).
6613
6614         So things like:
6615
6616         A.B.C [] x;
6617
6618         Would return "A.B.C[]" as a SimpleName.  This stopped things like
6619         using clauses from working on this particular context.  And a type
6620         was being matched directly against "A.B.C[]".
6621
6622         We now use the correct approach, and allow for ComposedCast to be
6623         part of the unary expression.  So the "A.B.C []" become a composed
6624         cast of "A.B.C" (as a nested group of MemberAccess with a
6625         SimpleName at the end) plus the rank composition "[]". 
6626
6627         Also fixes 35567
6628
6629 2003-04-10  Miguel de Icaza  <miguel@ximian.com>
6630
6631         * decl.cs (CheckAccessLevel): Implement the NestedPrivate rules
6632         for the access level checking.
6633
6634         * class.cs: Cosmetic changes.  Renamed `TypeContainer parent' to
6635         `TypeContainer container', because I kept getting confused when I
6636         was debugging this code.
6637
6638         * expression.cs (Indexers): Instead of tracking getters/setters,
6639         we now track them in parallel.  We create one arraylist less, but
6640         most importantly it is possible now for the LValue code to find a
6641         matching get for a set.
6642
6643         (IndexerAccess.DoResolveLValue): Update the code.
6644         GetIndexersForType has been modified already to extract all the
6645         indexers from a type.  The code assumed it did not.
6646
6647         Also make the code set the correct return type for the indexer.
6648         This was fixed a long time ago for properties, but was missing for
6649         indexers.  It used to be void_type.
6650
6651         (Binary.Emit): Test first for doubles instead of
6652         floats, as they are more common.
6653
6654         (Binary.EmitBranchable): Use the .un version of the branch opcodes
6655         when dealing with floats and the <=, >= operators.  This fixes bug
6656         #39314 
6657
6658         * statement.cs (Foreach.EmitArrayForeach): bug fix: The code used
6659         to load the array value by emitting a load on the foreach variable
6660         type.  This was incorrect.  
6661
6662         We now emit the code to load an element using the the array
6663         variable type, and then we emit the conversion operator.
6664
6665         Fixed #40176
6666
6667 2003-04-10  Zoltan Varga  <vargaz@freemail.hu>
6668
6669         * attribute.cs: Avoid allocation of ArrayLists in the common case.
6670
6671 2003-04-09  Miguel de Icaza  <miguel@ximian.com>
6672
6673         * class.cs (MethodSignature.InheritableMemberSignatureCompare):
6674         test for protection before we test for signatures. 
6675
6676         (MethodSignature.ToString): implement.
6677
6678         * expression.cs (Unary.TryReduceNegative): Add missing minus sign
6679         to the case where we reduced into a LongConstant.
6680
6681         * decl.cs (CheckAccessLevel): If the type is an array, we can not
6682         depend on whether the information is acurrate, because the
6683         Microsoft runtime will always claim that the array type is public,
6684         regardless of the real state.
6685
6686         If the type is a pointer, another problem happens: the type is
6687         reported as non-public in Microsoft.  
6688
6689         In both cases we have to call CheckAccessLevel recursively with
6690         the underlying type as the argument to be tested.
6691
6692 2003-04-08  Miguel de Icaza  <miguel@ximian.com>
6693
6694         * assign.cs (Assign.Emit): If we are dealing with a compound
6695         assignment expression, we should use the code path that stores the
6696         intermediate result in a temporary value.  This fixes #40903.
6697
6698         *expression.cs (Indirection.ToString): Provide ToString method for
6699         debugging. 
6700
6701 2003-04-08  Zoltan Varga  <vargaz@freemail.hu>
6702
6703         * class.cs: Null out fields holding references to Block objects so
6704         they can be garbage collected.
6705
6706         * expression.cs (OverloadResolve): Remove unused local.
6707
6708 2003-04-07  Martin Baulig  <martin@ximian.com>
6709
6710         * codegen.cs (EmitContext.CurrentFile): New public field.
6711         (EmitContext.Mark): Use the CurrentFile to check whether the
6712         location is in the correct file.
6713         (EmitContext.EmitTopBlock): Initialize CurrentFile here.
6714
6715 2003-04-07  Martin Baulig  <martin@ximian.com>
6716
6717         * ecore.cs (Expression.ResolveBoolean): Don't call ec.Mark().
6718
6719         * codegen.cs (EmitContext.EmitTopBlock): Don't call Mark() on the
6720         location.  [FIXME: The location argument which gets passed to this
6721         method is sometimes wrong!]
6722
6723 2003-04-07  Nick Drochak <ndrochak@gol.com>
6724
6725         * codegen.cs: Be more verbose when we can't find the symbol writer dll.
6726
6727 2003-04-07  Miguel de Icaza  <miguel@ximian.com>
6728
6729         * expression.cs (Indirection.EmitAssign): We were using the
6730         temporary, but returning immediately instead of continuing the
6731         EmitAssing flow.
6732
6733 2003-04-06  Martin Baulig  <martin@ximian.com>
6734
6735         * ecore.cs (SimpleName.SimpleNameResolve): Don't report an error
6736         if it's a nested child, but also deriving from the outer class.
6737         See test 190.cs.
6738
6739         * typemanager.cs (IsNestedChildOf): Make this work if it's a
6740         nested child, but also deriving from the outer class.  See
6741         test-190.cs.
6742         (FilterWithClosure): We may access private members of the outer
6743         class if we're a nested child and deriving from the outer class.
6744         (RealMemberLookup): Only set `closure_private_ok' if the
6745         `original_bf' contained BindingFlags.NonPublic.
6746
6747 2003-04-05  Martin Baulig  <martin@ximian.com>
6748
6749         * expression.cs (SizeOf.DoResolve): Use ResolveTypeExpr, so we can
6750         probe if its a type parameter, and if so, flag an error.
6751
6752         * decl.cs: Move here the SetParameterInfo code from class.cs.
6753         Handle IsGeneric here.
6754
6755         Handle a variety of errors in the parameter info definition.
6756
6757         * ecore.cs (SimpleName.DoResolveType): Handle look ups for generic
6758         type parameters here.
6759
6760         * cs-parser.jay (class_declaration): report errors for parameters
6761         here as well.
6762
6763 2003-01-21  Miguel de Icaza  <miguel@ximian.com>
6764
6765         * generic.cs: New file, contains support code for generics.
6766
6767         * cs-parser.jay: Remove OP_SHIFT_LEFT, OP_SHIFT_RIGHT,
6768         OP_SHIFT_LEFT_ASSIGN, OP_SHIFT_RIGHT_ASSIGN.
6769
6770         Update parser for the above removals.
6771
6772         * cs-tokenizer.cs: Do not handle <<= or >>= specially.  This is
6773         now taken care of in the parser.
6774
6775 2003-04-02  Miguel de Icaza  <miguel@ximian.com>
6776
6777         * class.cs (Event.Define): Do not allow abstract events to have
6778         initializers. 
6779
6780 2003-04-01  Miguel de Icaza  <miguel@ximian.com>
6781
6782         * cs-parser.jay: Add error productions for ADD/REMOVE missing a
6783         block in event declarations.
6784
6785         * ecore.cs (FieldExpr.AddressOf): If our instance expression is a
6786         value type, get its address.
6787
6788         * expression.cs (Is.Emit): For action `LeaveOnStack' we were
6789         leaving a class on the stack instead of a boolean value (int
6790         0/1).  Change the code so we compare against null, and then the
6791         result against zero.
6792
6793         * class.cs (TypeContainer.GetClassBases): We were checking for the
6794         parent class being sealed too late.
6795
6796         * expression.cs (Binary.Emit): For <= and >= when dealing with
6797         floating point values, use cgt.un and clt.un instead of cgt and
6798         clt alone.
6799
6800 2003-04-01  Zoltan Varga  <vargaz@freemail.hu>
6801
6802         * statement.cs: Apply the same optimization as MS: skip the 
6803         GetEnumerator returning an IEnumerator, and use the one returning a 
6804         CharEnumerator instead. This allows us to avoid the try-finally block 
6805         and the boxing.
6806
6807 2003-03-31  Gaurav Vaish <gvaish_mono@lycos.com>
6808
6809         * cs-parser.jay: Attributes cannot be applied to
6810                          namespaces. Fixes #40473
6811
6812 2003-03-31  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6813
6814         * class.cs:
6815         (Add*): check if the name is valid using the full name for constants,
6816         fields, properties and events.
6817
6818 2003-03-28  Miguel de Icaza  <miguel@ximian.com>
6819
6820         * enum.cs (Enum.DefineType, Enum.IsValidEnumConstant): Also allow
6821         char constants to be part of the enumeration.
6822
6823         * expression.cs (Conditional.DoResolve): Add support for operator
6824         true. Implements the missing functionality from 14.12
6825
6826         * class.cs (TypeContainer.CheckPairedOperators): Report error for missmatch on
6827         operator true/false as required by the spec.
6828
6829         * expression.cs (Unary.ResolveOperator): In LogicalNot, do an
6830         implicit conversion to boolean.
6831
6832         * statement.cs (Statement.ResolveBoolean): A boolean expression is
6833         also one where the type implements `operator true'. 
6834
6835         * ecore.cs (Expression.GetOperatorTrue): New helper routine to
6836         get an expression that will invoke operator true based on an
6837         expression.  
6838
6839         (GetConversionOperators): Removed the hack that called op_True
6840         here.  
6841
6842         (Expression.ResolveBoolean): Move this from Statement.
6843
6844 2003-03-17  Miguel de Icaza  <miguel@ximian.com>
6845
6846         * ecore.cs (FieldExpr): do not allow initialization of initonly
6847         fields on derived classes
6848
6849 2003-03-13  Martin Baulig  <martin@ximian.com>
6850
6851         * statement.cs (Block.Emit): Call ig.BeginScope() and
6852         ig.EndScope() when compiling with debugging info; call
6853         LocalBuilder.SetLocalSymInfo _after_ opening the scope.
6854
6855 2003-03-08  Miguel de Icaza  <miguel@ximian.com>
6856
6857         * expression.cs (Indexers): Do not construct immediately, allow
6858         for new members to be appended as we go.  Fixes 38143
6859
6860 2003-03-07  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6861
6862         * expression.cs: save/restore context when resolving an unchecked
6863         expression.
6864
6865 2003-03-05  Miguel de Icaza  <miguel@ximian.com>
6866
6867         * cfold.cs: Catch division by zero in modulus operator during
6868         constant folding.
6869
6870 2003-03-03  Miguel de Icaza  <miguel@ximian.com>
6871
6872         * interface.cs (Interface.DefineMembers): Avoid defining members
6873         twice. 
6874
6875 2003-02-27  Miguel de Icaza  <miguel@ximian.com>
6876
6877         * driver.cs: handle the +/- options for -noconfig
6878
6879         * statement.cs (Unckeched.Resolve): Also track the state of
6880         unchecked in the Resolve phase.
6881
6882 2003-02-27  Martin Baulig  <martin@ximian.com>
6883
6884         * ecore.cs (Expression.MemberLookup): Don't create a
6885         MethodGroupExpr for something which is not a method.  Fixes #38291.
6886
6887 2003-02-25  Miguel de Icaza  <miguel@ximian.com>
6888
6889         * class.cs (MemberBase.CheckParameters): Also check that the type
6890         is unmanaged if it is a pointer.
6891
6892         * expression.cs (SizeOf.Resolve): Add location information.
6893
6894         * statement.cs (Block.EmitMeta): Flag error (208) if a pointer to
6895         a managed type is declared.
6896
6897         * expression.cs (Invocation.VerifyArgumentsCompat): Check for the
6898         parameter modifiers as well.  Fixes bug 38606
6899
6900         * class.cs: Very sad.  Am backing out the speed up changes
6901         introduced by the ArrayList -> Array in the TypeContainer, as they
6902         were not actually that much faster, and introduced a bug (no error
6903         reports on duplicated methods).
6904
6905         * assign.cs (CompoundAssign.DoLResolve): Resolve the original
6906         source first, this will guarantee that we have a valid expression
6907         before calling in lower levels functions that will require a
6908         resolved object.  Then use this original_source in the
6909         target.ResolveLValue instead of the original source that was
6910         passed to us.
6911
6912         Another change.  Use target.Resolve instead of LValueResolve.
6913         Although we are resolving for LValues, we will let the Assign code
6914         take care of that (it will be called again from Resolve).  This
6915         basically allows code like this:
6916
6917         class X { X operator + (X x, object o) {} X this [int idx] { get; set; } }
6918         class Y { void A (X x) { x [0] += o; }
6919
6920         The problem was that the indexer was trying to resolve for
6921         set_Item (idx, object o) and never finding one.  The real set_Item
6922         was set_Item (idx, X).  By delaying the process we get the right
6923         semantics. 
6924
6925         Fixes bug 36505
6926
6927 2003-02-23  Martin Baulig  <martin@ximian.com>
6928
6929         * statement.cs (Block.Emit): Override this and set ec.CurrentBlock
6930         while calling DoEmit ().
6931
6932         * codegen.cs (EmitContext.Mark): Don't mark locations in other
6933         source files; if you use the #line directive inside a method, the
6934         compiler stops emitting line numbers for the debugger until it
6935         reaches the end of the method or another #line directive which
6936         restores the original file.
6937
6938 2003-02-23  Martin Baulig  <martin@ximian.com>
6939
6940         * statement.cs (FlowBranching.UsageVector.MergeChildren): Fix bug #37708.
6941
6942 2003-02-23  Martin Baulig  <martin@ximian.com>
6943
6944         * statement.cs (Block.AddChildVariableNames): We need to call this
6945         recursively, not just for our immediate children.
6946
6947 2003-02-23  Martin Baulig  <martin@ximian.com>
6948
6949         * class.cs (Event.Define): Always make the field private, like csc does.
6950
6951         * typemanager.cs (TypeManager.RealMemberLookup): Make events
6952         actually work, fixes bug #37521.
6953
6954 2003-02-23  Miguel de Icaza  <miguel@ximian.com>
6955
6956         * delegate.cs: When creating the various temporary "Parameters"
6957         classes, make sure that we call the ComputeAndDefineParameterTypes
6958         on those new parameters (just like we do with the formal ones), to
6959         allow them to be resolved in the context of the DeclSpace.
6960
6961         This fixes the bug that Dick observed in Bugzilla #38530.
6962
6963 2003-02-22  Miguel de Icaza  <miguel@ximian.com>
6964
6965         * expression.cs (ResolveMemberAccess): When resolving a constant,
6966         do not attempt to pull a constant if the value was not able to
6967         generate a valid constant.
6968
6969         * const.cs (LookupConstantValue): Do not report more errors than required.
6970
6971 2003-02-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
6972
6973         * expression.cs: fixes bug #38328.
6974
6975 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
6976
6977         * class.cs: Changed all the various members that can be part of a
6978         class from being an ArrayList to be an Array of the right type.
6979         During the DefineType type_list, interface_list, delegate_list and
6980         enum_list are turned into types, interfaces, delegates and enums
6981         arrays.  
6982
6983         And during the member population, indexer_list, event_list,
6984         constant_list, field_list, instance_constructor_list, method_list,
6985         operator_list and property_list are turned into their real arrays.
6986
6987         Although we could probably perform this operation earlier, for
6988         good error reporting we need to keep the lists and remove the
6989         lists for longer than required.
6990
6991         This optimization was triggered by Paolo profiling the compiler
6992         speed on the output of `gen-sample-program.pl' perl script. 
6993
6994         * decl.cs (DeclSpace.ResolveType): Set the ContainerType, so we do
6995         not crash in methods like MemberLookupFailed that use this field.  
6996
6997         This problem arises when the compiler fails to resolve a type
6998         during interface type definition for example.
6999
7000 2003-02-18  Miguel de Icaza  <miguel@ximian.com>
7001
7002         * expression.cs (Indexers.GetIndexersForType): Interfaces do not
7003         inherit from System.Object, so we have to stop at null, not only
7004         when reaching System.Object.
7005
7006 2003-02-17  Miguel de Icaza  <miguel@ximian.com>
7007
7008         * expression.cs: (Indexers.GetIndexersForType): Martin's fix used
7009         DeclaredOnly because the parent indexer might have had a different
7010         name, but did not loop until the top of the hierarchy was reached.
7011
7012         The problem this one fixes is 35492: when a class implemented an
7013         indexer from an interface, we were getting the interface method
7014         (which was abstract) and we were flagging an error (can not invoke
7015         abstract method).
7016
7017         This also keeps bug 33089 functioning, and test-148 functioning.
7018
7019         * typemanager.cs (IsSpecialMethod): The correct way of figuring
7020         out if a method is special is to see if it is declared in a
7021         property or event, or whether it is one of the predefined operator
7022         names.   This should fix correctly #36804.
7023
7024 2003-02-15  Miguel de Icaza  <miguel@ximian.com>
7025
7026         The goal here is to remove the dependency on EmptyCast.Peel ().
7027         Killing it completely.
7028
7029         The problem is that currently in a number of places where
7030         constants are expected, we have to "probe" for an EmptyCast, and
7031         Peel, which is not the correct thing to do, as this will be
7032         repetitive and will likely lead to errors. 
7033
7034         The idea is to remove any EmptyCasts that are used in casts that
7035         can be reduced to constants, so we only have to cope with
7036         constants. 
7037
7038         This bug hunt was triggered by Bug 37363 and the desire to remove
7039         the duplicate pattern where we were "peeling" emptycasts to check
7040         whether they were constants.  Now constants will always be
7041         constants.
7042
7043         * ecore.cs: Use an enumconstant here instead of wrapping with
7044         EmptyCast.  
7045
7046         * expression.cs (Cast.TryReduce): Ah, the tricky EnumConstant was
7047         throwing me off.  By handling this we can get rid of a few hacks.
7048
7049         * statement.cs (Switch): Removed Peel() code.
7050
7051 2003-02-14  Miguel de Icaza  <miguel@ximian.com>
7052
7053         * class.cs: Location information for error 508
7054
7055         * expression.cs (New.DoResolve): Add a guard against double
7056         resolution of an expression.  
7057
7058         The New DoResolve might be called twice when initializing field
7059         expressions (see EmitFieldInitializers, the call to
7060         GetInitializerExpression will perform a resolve on the expression,
7061         and later the assign will trigger another resolution
7062
7063         This leads to bugs (#37014)
7064
7065         * delegate.cs: The signature for EndInvoke should contain any ref
7066         or out parameters as well.  We were not doing this in the past. 
7067
7068         * class.cs (Field.Define): Do not overwrite the type definition
7069         inside the `volatile' group.  Turns out that volatile enumerations
7070         were changing the type here to perform a validity test, which
7071         broke conversions. 
7072
7073 2003-02-12  Miguel de Icaza  <miguel@ximian.com>
7074
7075         * ecore.cs (FieldExpr.AddressOf): In the particular case of This
7076         and structs, we do not want to load the instance variable
7077
7078         (ImplicitReferenceConversion, ImplicitReferenceConversionExists):
7079         enum_type has to be handled like an object reference (implicit
7080         conversions exists from this to object), but the regular IsClass
7081         and IsValueType tests will never return true for this one.
7082
7083         Also we use TypeManager.IsValueType instead of type.IsValueType,
7084         just for consistency with the rest of the code (this is only
7085         needed if we ever use the construct exposed by test-180.cs inside
7086         corlib, which we dont today).
7087
7088 2003-02-12  Zoltan Varga  <vargaz@freemail.hu>
7089
7090         * attribute.cs (ApplyAttributes): apply all MethodImplAttributes, not
7091         just InternalCall.
7092
7093 2003-02-09  Martin Baulig  <martin@ximian.com>
7094
7095         * namespace.cs (Namespace..ctor): Added SourceFile argument.
7096         (Namespace.DefineNamespaces): New static public method; this is
7097         called when we're compiling with debugging to add all namespaces
7098         to the symbol file.
7099
7100         * tree.cs (Tree.RecordNamespace): Added SourceFile argument and
7101         pass it to the Namespace's .ctor.
7102
7103         * symbolwriter.cs (SymbolWriter.OpenMethod): Added TypeContainer
7104         and MethodBase arguments; pass the namespace ID to the symwriter;
7105         pass the MethodBase instead of the token to the symwriter.
7106         (SymbolWriter.DefineNamespace): New method to add a namespace to
7107         the symbol file.
7108
7109 2003-02-09  Martin Baulig  <martin@ximian.com>
7110
7111         * symbolwriter.cs: New file.  This is a wrapper around
7112         ISymbolWriter with a cleaner API.  We'll dynamically Invoke()
7113         methods here in near future.
7114
7115 2003-02-09  Martin Baulig  <martin@ximian.com>
7116
7117         * codegen.cs (EmitContext.Mark): Just pass the arguments to
7118         ILGenerator.MarkSequencePoint() which are actually used by the
7119         symbol writer.
7120
7121 2003-02-09  Martin Baulig  <martin@ximian.com>
7122
7123         * location.cs (SourceFile): New public sealed class.  This
7124         contains the name and an index which is used in the location's token.
7125         (Location): Reserve an appropriate number of bits in the token for
7126         the source file instead of walking over that list, this gives us a
7127         really huge performance improvement when compiling with debugging.
7128
7129         * driver.cs (Driver.parse, Driver.tokenize_file): Take a
7130         `SourceFile' argument instead of a string.
7131         (Driver.ProcessFile): Add all the files via Location.AddFile(),
7132         but don't parse/tokenize here, we need to generate the list of all
7133         source files before we do that.
7134         (Driver.ProcessFiles): New static function.  Parses/tokenizes all
7135         the files.
7136
7137         * cs-parser.jay (CSharpParser): Take a `SourceFile' argument
7138         instead of a string.
7139
7140         * cs-tokenizer.cs (Tokenizer): Take `SourceFile' argument instead
7141         of a string.
7142
7143 2003-02-09  Martin Baulig  <martin@ximian.com>
7144
7145         * cs-tokenizer.cs (Tokenizer.PreProcessLine): Also reset the
7146         filename on `#line default'.
7147
7148 Sat Feb 8 17:03:16 CET 2003 Paolo Molaro <lupus@ximian.com>
7149
7150         * statement.cs: don't clear the pinned var when the fixed statement
7151         returns from the method (fixes bug#37752).
7152
7153 Sat Feb 8 12:58:06 CET 2003 Paolo Molaro <lupus@ximian.com>
7154
7155         * typemanager.cs: fix from mathpup@mylinuxisp.com (Marcus Urban) 
7156         to IsValueType.
7157
7158 2003-02-07  Martin Baulig  <martin@ximian.com>
7159
7160         * driver.cs: Removed the `--debug-args' command line argument.
7161
7162         * codegen.cs (CodeGen.SaveSymbols): Removed, this is now done
7163         automatically by the AsssemblyBuilder.
7164         (CodeGen.InitializeSymbolWriter): We don't need to call any
7165         initialization function on the symbol writer anymore.  This method
7166         doesn't take any arguments.
7167
7168 2003-02-03  Miguel de Icaza  <miguel@ximian.com>
7169
7170         * driver.cs: (AddAssemblyAndDeps, LoadAssembly): Enter the types
7171         from referenced assemblies as well.
7172
7173 2003-02-02  Martin Baulig  <martin@ximian.com>
7174
7175         * class.cs (MethodData.Emit): Generate debugging info for external methods.
7176
7177 2003-02-02  Martin Baulig  <martin@ximian.com>
7178
7179         * class.cs (Constructor.Emit): Open the symbol writer before
7180         emitting the constructor initializer.
7181         (ConstructorInitializer.Emit): Call ec.Mark() to allow
7182         single-stepping through constructor initializers.
7183
7184 2003-01-30  Miguel de Icaza  <miguel@ximian.com>
7185
7186         * class.cs: Handle error 549: do not allow virtual methods in
7187         sealed classes. 
7188
7189 2003-02-01 Jackson Harper <jackson@latitudegeo.com>
7190
7191         * decl.cs: Check access levels when resolving types
7192
7193 2003-01-31 Jackson Harper <jackson@latitudegeo.com>
7194
7195         * statement.cs: Add parameters and locals set in catch blocks that might 
7196         return to set vector
7197
7198 2003-01-29  Miguel de Icaza  <miguel@ximian.com>
7199
7200         * class.cs (Operator): Set the SpecialName flags for operators.
7201
7202         * expression.cs (Invocation.DoResolve): Only block calls to
7203         accessors and operators on SpecialName methods.
7204
7205         (Cast.TryReduce): Handle conversions from char constants.
7206
7207
7208 Tue Jan 28 17:30:57 CET 2003 Paolo Molaro <lupus@ximian.com>
7209
7210         * statement.cs: small memory and time optimization in FlowBranching.
7211
7212 2003-01-28  Pedro Mart  <yoros@wanadoo.es>
7213
7214         * expression.cs (IndexerAccess.DoResolveLValue): Resolve the same
7215         problem that the last fix but in the other sid (Set).
7216
7217         * expression.cs (IndexerAccess.DoResolve): Fix a problem with a null
7218         access when there is no indexer in the hierarchy.
7219
7220 2003-01-27 Jackson Harper <jackson@latitudegeo.com>
7221
7222         * class.cs: Combine some if statements.
7223
7224 2003-01-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7225
7226         * driver.cs: fixed bug #37187.
7227
7228 2003-01-27  Pedro Martinez Juliá  <yoros@wanadoo.es>
7229
7230         * expression.cs (IndexerAccess.DoResolve): Before trying to resolve
7231         any indexer, it's needed to build a list with all the indexers in the
7232         hierarchy (AllGetters), else we have problems. Fixes #35653.
7233
7234 2003-01-23  Miguel de Icaza  <miguel@ximian.com>
7235
7236         * class.cs (MethodData.Define): It is wrong for an interface
7237         implementation to be static in both cases: explicit and implicit.
7238         We were only handling this in one case.
7239
7240         Improve the if situation there to not have negations.
7241
7242         * class.cs (Field.Define): Turns out that we do not need to check
7243         the unsafe bit on field definition, only on usage.  Remove the test.
7244
7245 2003-01-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7246
7247         * driver.cs: use assembly.Location instead of Codebase (the latest
7248         patch made mcs fail when using MS assemblies).
7249
7250 2003-01-21  Tim Haynes <thaynes@openlinksw.com>
7251
7252         * driver.cs: use DirectorySeparatorChar instead of a hardcoded "/" to
7253         get the path to *corlib.dll.
7254
7255 2003-01-21  Nick Drochak <ndrochak@gol.com>
7256
7257         * cs-tokenizer.cs:
7258         * pending.cs:
7259         * typemanager.cs: Remove compiler warnings
7260
7261 2003-01-20  Duncan Mak  <duncan@ximian.com>
7262
7263         * AssemblyInfo.cs: Bump the version number to 0.19.
7264
7265 2003-01-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7266
7267         * cs-tokenizer.cs: little fixes to line numbering when #line is used.
7268
7269 2003-01-18  Zoltan Varga  <vargaz@freemail.hu>
7270
7271         * class.cs (Constructor::Emit): Emit debugging info for constructors.
7272
7273 2003-01-17  Miguel de Icaza  <miguel@ximian.com>
7274
7275         * cs-parser.jay: Small fix: we were not comparing the constructor
7276         name correctly.   Thanks to Zoltan for the initial pointer.
7277
7278 2003-01-16 Jackson Harper <jackson@latitudegeo.com>
7279
7280         * cs-tokenizer.cs: Set file name when specified with #line
7281
7282 2003-01-15  Miguel de Icaza  <miguel@ximian.com>
7283
7284         * cs-parser.jay: Only perform the constructor checks here if we
7285         are named like the class;  This will help provider a better
7286         error.  The constructor path is taken when a type definition is
7287         not found, but most likely the user forgot to add the type, so
7288         report that rather than the constructor error.
7289
7290 Tue Jan 14 10:36:49 CET 2003 Paolo Molaro <lupus@ximian.com>
7291
7292         * class.cs, rootcontext.cs: small changes to avoid unnecessary memory
7293         allocations.
7294
7295 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7296
7297         * cs-parser.jay: Add cleanup call.
7298
7299 2003-01-13  Duncan Mak  <duncan@ximian.com>
7300
7301         * cs-tokenizer.cs (Cleanup): Rename to 'cleanup' to make it more
7302         consistent with other methods.
7303
7304 2003-01-13 Jackson Harper <jackson@latitudegeo.com>
7305
7306         * cs-tokenizer.cs: Add Cleanup method, also fix #region error messages.
7307
7308 Sun Jan 12 19:58:42 CET 2003 Paolo Molaro <lupus@ximian.com>
7309
7310         * attribute.cs: only set GuidAttr to true when we have a
7311         GuidAttribute.
7312
7313 2003-01-09  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7314
7315         * ecore.cs:
7316         * expression.cs:
7317         * typemanager.cs: fixes to allow mcs compile corlib with the new
7318         Type.IsSubclassOf fix.
7319
7320 2003-01-08  Miguel de Icaza  <miguel@ximian.com>
7321
7322         * expression.cs (LocalVariableReference.DoResolve): Classify a
7323         constant as a value, not as a variable.   Also, set the type for
7324         the variable.
7325
7326         * cs-parser.jay (fixed_statement): take a type instead of a
7327         pointer_type, so we can produce a better error message later.
7328
7329         * statement.cs (Fixed.Resolve): Flag types that are not pointers
7330         as an error.  
7331
7332         (For.DoEmit): Make inifinite loops have a
7333         non-conditional branch back.
7334
7335         (Fixed.DoEmit): First populate the pinned variables, then emit the
7336         statement, then clear the variables.  Before I was emitting the
7337         code once for each fixed piece.
7338
7339
7340 2003-01-08  Martin Baulig  <martin@ximian.com>
7341
7342         * statement.cs (FlowBranching.MergeChild): A break in a
7343         SWITCH_SECTION does not leave a loop.  Fixes #36155.
7344
7345 2003-01-08  Martin Baulig  <martin@ximian.com>
7346
7347         * statement.cs (FlowBranching.CheckOutParameters): `struct_params'
7348         lives in the same number space than `param_map'.  Fixes #36154.
7349
7350 2003-01-07  Miguel de Icaza  <miguel@ximian.com>
7351
7352         * cs-parser.jay (constructor_declaration): Set the
7353         Constructor.ModFlags before probing for it.  This makes the
7354         compiler report 514, 515 and 132 (the code was there, but got
7355         broken). 
7356
7357         * statement.cs (Goto.Resolve): Set `Returns' to ALWAYS.
7358         (GotoDefault.Resolve): Set `Returns' to ALWAYS.
7359         (GotoCase.Resolve): Set `Returns' to ALWAYS.
7360
7361 Tue Jan 7 18:32:24 CET 2003 Paolo Molaro <lupus@ximian.com>
7362
7363         * enum.cs: create the enum static fields using the enum type.
7364
7365 Tue Jan 7 18:23:44 CET 2003 Paolo Molaro <lupus@ximian.com>
7366
7367         * class.cs: don't try to create the ParamBuilder for the return
7368         type if it's not needed (and handle it breaking for the ms runtime
7369         anyway).
7370
7371 2003-01-06 Jackson Harper <jackson@latitudegeo.com>
7372
7373         * cs-tokenizer.cs: Add REGION flag to #region directives, and add checks to make sure that regions are being poped correctly
7374
7375 2002-12-29  Miguel de Icaza  <miguel@ximian.com>
7376
7377         * cs-tokenizer.cs (get_cmd_arg): Fixups to allow \r to terminate
7378         the command.   This showed up while compiling the JANET source
7379         code, which used \r as its only newline separator.
7380
7381 2002-12-28  Miguel de Icaza  <miguel@ximian.com>
7382
7383         * class.cs (Method.Define): If we are an operator (because it
7384         reuses our code), then set the SpecialName and HideBySig.  #36128
7385
7386 2002-12-22  Miguel de Icaza  <miguel@ximian.com>
7387
7388         * ecore.cs (FieldExpr.DoResolve): Instead of throwing an
7389         exception, report error 120 `object reference required'.
7390
7391         * driver.cs: Add --pause option, used during to measure the size
7392         of the process as it goes with --timestamp.
7393
7394         * expression.cs (Invocation.DoResolve): Do not allow methods with
7395         SpecialName to be invoked.
7396
7397 2002-12-21  Miguel de Icaza  <miguel@ximian.com>
7398
7399         * cs-tokenizer.cs: Small fix to the parser: compute the ascii
7400         number before adding it.
7401
7402 2002-12-21  Ravi Pratap  <ravi@ximian.com>
7403
7404         * ecore.cs (StandardImplicitConversion): When in an unsafe
7405         context, we allow conversion between void * to any other pointer
7406         type. This fixes bug #35973.
7407
7408 2002-12-20 Jackson Harper <jackson@latitudegeo.com>
7409
7410         * codegen.cs: Use Path.GetFileNameWithoutExtension so an exception
7411         is not thrown when extensionless outputs are used 
7412
7413 2002-12-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7414
7415         * rootcontext.cs: fixed compilation of corlib.
7416
7417 2002-12-19  Miguel de Icaza  <miguel@ximian.com>
7418
7419         * attribute.cs (Attributes.Contains): Add new method.
7420
7421         * class.cs (MethodCore.LabelParameters): if the parameter is an
7422         `out' parameter, check that no attribute `[In]' has been passed.
7423
7424         * enum.cs: Handle the `value__' name in an enumeration.
7425
7426 2002-12-14  Jaroslaw Kowalski <jarek@atm.com.pl>
7427
7428         * decl.cs: Added special case to allow overrides on "protected
7429         internal" methods
7430
7431 2002-12-18  Ravi Pratap  <ravi@ximian.com>
7432
7433         * attribute.cs (Attributes.AddAttributeSection): Rename to this
7434         since it makes much more sense.
7435
7436         (Attributes.ctor): Don't require a Location parameter.
7437
7438         * rootcontext.cs (AddGlobalAttributeSection): Rename again.
7439
7440         * attribute.cs (ApplyAttributes): Remove extra Location parameters
7441         since we already have that information per attribute.
7442
7443         * everywhere : make appropriate changes.
7444
7445         * class.cs (LabelParameters): Write the code which actually
7446         applies attributes to the return type. We can't do this on the MS
7447         .NET runtime so we flag a warning in the case an exception is
7448         thrown.
7449
7450 2002-12-18  Miguel de Icaza  <miguel@ximian.com>
7451
7452         * const.cs: Handle implicit null conversions here too.
7453
7454 2002-12-17  Ravi Pratap  <ravi@ximian.com>
7455
7456         * class.cs (MethodCore.LabelParameters): Remove the extra
7457         Type [] parameter since it is completely unnecessary. Instead
7458         pass in the method's attributes so that we can extract
7459         the "return" attribute.
7460
7461 2002-12-17  Miguel de Icaza  <miguel@ximian.com>
7462
7463         * cs-parser.jay (parse): Use Report.Error to flag errors instead
7464         of ignoring it and letting the compile continue.
7465
7466         * typemanager.cs (ChangeType): use an extra argument to return an
7467         error condition instead of throwing an exception.
7468
7469 2002-12-15  Miguel de Icaza  <miguel@ximian.com>
7470
7471         * expression.cs (Unary.TryReduce): mimic the code for the regular
7472         code path.  Perform an implicit cast in the cases where we can
7473         implicitly convert to one of the integral types, and then reduce
7474         based on that constant.   This fixes bug #35483.
7475
7476 2002-12-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7477
7478         * typemanager.cs: fixed cut & paste error in GetRemoveMethod.
7479
7480 2002-12-13  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7481
7482         * namespace.cs: fixed bug #35489.
7483
7484 2002-12-12  Miguel de Icaza  <miguel@ximian.com>
7485
7486         * class.cs: Remove some dead code.
7487
7488         * cs-parser.jay: Estimate the number of methods needed
7489         (RootContext.MethodCount);
7490
7491         * cs-tokenizer.cs: Use char arrays for parsing identifiers and
7492         numbers instead of StringBuilders.
7493
7494         * support.cs (PtrHashtable): Add constructor with initial size;
7495         We can now reduce reallocations of the method table.
7496
7497 2002-12-10  Ravi Pratap  <ravi@ximian.com>
7498
7499         * attribute.cs (ApplyAttributes): Keep track of the emitted
7500         attributes on a per-target basis. This fixes bug #35413.
7501
7502 2002-12-10  Miguel de Icaza  <miguel@ximian.com>
7503
7504         * driver.cs (MainDriver): On rotor encoding 28591 does not exist,
7505         default to the Windows 1252 encoding.
7506
7507         (UnixParseOption): Support version, thanks to Alp for the missing
7508         pointer. 
7509
7510         * AssemblyInfo.cs: Add nice assembly information.
7511
7512         * cs-tokenizer.cs: Add fix from Felix to the #if/#else handler
7513         (bug 35169).
7514
7515         * cs-parser.jay: Allow a trailing comma before the close bracked
7516         in the attribute_section production.
7517
7518         * ecore.cs (FieldExpr.AddressOf): Until I figure out why the
7519         address of the instance was being taken, I will take this out,
7520         because we take the address of the object immediately here.
7521
7522 2002-12-09  Ravi Pratap  <ravi@ximian.com>
7523
7524         * typemanager.cs (AreMultipleAllowed): Take care of the most
7525         obvious case where attribute type is not in the current assembly -
7526         stupid me ;-)
7527
7528 2002-12-08  Miguel de Icaza  <miguel@ximian.com>
7529
7530         * ecore.cs (SimpleName.DoResolve): First perform lookups on using
7531         definitions, instead of doing that afterwards.  
7532
7533         Also we use a nice little hack, depending on the constructor, we
7534         know if we are a "composed" name or a simple name.  Hence, we
7535         avoid the IndexOf test, and we avoid 
7536
7537         * codegen.cs: Add code to assist in a bug reporter to track down
7538         the source of a compiler crash. 
7539
7540 2002-12-07  Ravi Pratap  <ravi@ximian.com>
7541
7542         * attribute.cs (Attribute.ApplyAttributes) : Keep track of which attribute
7543         types have been emitted for a given element and flag an error
7544         if something which does not have AllowMultiple set is used more
7545         than once.
7546
7547         * typemanager.cs (RegisterAttributeAllowMultiple): Keep track of
7548         attribute types and their corresponding AllowMultiple properties
7549
7550         (AreMultipleAllowed): Check the property for a given type.
7551
7552         * attribute.cs (Attribute.ApplyAttributes): Register the AllowMultiple
7553         property in the case we have a TypeContainer.
7554
7555         (Attributes.AddAttribute): Detect duplicates and just skip on
7556         adding them. This trivial fix catches a pretty gross error in our
7557         attribute emission - global attributes were being emitted twice!
7558
7559         Bugzilla bug #33187 is now fixed.
7560
7561 2002-12-06  Miguel de Icaza  <miguel@ximian.com>
7562
7563         * cs-tokenizer.cs (pp_expr): Properly recurse here (use pp_expr
7564         instead of pp_and).
7565
7566         * expression.cs (Binary.ResolveOperator): I can only use the
7567         Concat (string, string, string) and Concat (string, string,
7568         string, string) if the child is actually a concatenation of
7569         strings. 
7570
7571 2002-12-04  Miguel de Icaza  <miguel@ximian.com>
7572
7573         * cs-tokenizer.cs: Small fix, because decimal_digits is used in a
7574         context where we need a 2-character lookahead.
7575
7576         * pending.cs (PendingImplementation): Rework so we can keep track
7577         of interface types all the time, and flag those which were
7578         implemented by parents as optional.
7579
7580 2002-12-03  Miguel de Icaza  <miguel@ximian.com>
7581
7582         * expression.cs (Binary.ResolveOperator): Use
7583         String.Concat(string,string,string) or
7584         String.Concat(string,string,string,string) when possible. 
7585
7586         * typemanager: More helper methods.
7587
7588
7589 Tue Dec 3 19:32:04 CET 2002 Paolo Molaro <lupus@ximian.com>
7590
7591         * pending.cs: remove the bogus return from GetMissingInterfaces()
7592         (see the 2002-11-06 entry: the mono runtime is now fixed in cvs).
7593
7594 2002-12-02  Gonzalo Paniagua Javier <gonzalo@ximian.com>
7595
7596         * namespace.cs: avoid duplicated 'using xxx' being added to
7597         using_clauses. This prevents mcs from issuing and 'ambiguous type' error
7598         when we get more than one 'using' statement for the same namespace.
7599         Report a CS0105 warning for it.
7600
7601 2002-11-30  Miguel de Icaza  <miguel@ximian.com>
7602
7603         * cs-tokenizer.cs (consume_identifier): use read directly, instead
7604         of calling getChar/putback, uses internal knowledge of it.    
7605
7606         (xtoken): Reorder tokenizer so most common patterns are checked
7607         first.  This reduces the compilation time in another 5% (from 8.11s
7608         average to 7.73s for bootstrapping mcs on my Mobile p4/1.8ghz).
7609
7610         The parsing time is 22% of the compilation in mcs, and from that
7611         64% is spent on the tokenization process.  
7612
7613         I tried using a binary search for keywords, but this is slower
7614         than the hashtable.  Another option would be to do a couple of
7615         things:
7616
7617                 * Not use a StringBuilder, instead use an array of chars,
7618                   with a set value.  Notice that this way we could catch
7619                   the 645 error without having to do it *afterwards*.
7620
7621                 * We could write a hand-parser to avoid the hashtable
7622                   compares altogether.
7623
7624         The identifier consumption process takes 37% of the tokenization
7625         time.  Another 15% is spent on is_number.  56% of the time spent
7626         on is_number is spent on Int64.Parse:
7627
7628                 * We could probably choose based on the string length to
7629                   use Int32.Parse or Int64.Parse and avoid all the 64-bit
7630                   computations. 
7631
7632         Another 3% is spend on wrapping `xtoken' in the `token' function.
7633
7634         Handle 0xa0 as whitespace (#34752)
7635
7636 2002-11-26  Miguel de Icaza  <miguel@ximian.com>
7637
7638         * typemanager.cs (IsCLRType): New routine to tell whether a type
7639         is one of the builtin types.  
7640
7641         Maybe it needs to use TypeCodes to be faster.  Maybe we could use
7642         typecode in more places instead of doing pointer comparissions.
7643         We could leverage some knowledge about the way the typecodes are
7644         laid out.
7645
7646         New code to cache namespaces in assemblies, it is currently not
7647         invoked, to be used soon.
7648
7649         * decl.cs (DeclSpace.MakeFQN): Simple optimization.
7650
7651         * expression.cs (Binary.ResolveOperator): specially handle
7652         strings, and do not perform user-defined operator overloading for
7653         built-in types.
7654
7655 2002-11-24  Miguel de Icaza  <miguel@ximian.com>
7656
7657         * cs-tokenizer.cs: Avoid calling Char.IsDigit which is an
7658         internalcall as it is a pretty simple operation;  Avoid whenever
7659         possible to call Char.IsLetter.
7660
7661         (consume_identifier): Cut by half the number of
7662         hashtable calls by merging the is_keyword and GetKeyword behavior.
7663
7664         Do not short-circuit, because if we do, we
7665         report errors (ie, #if false && true would produce an invalid
7666         directive error);
7667
7668
7669 2002-11-24  Martin Baulig  <martin@ximian.com>
7670
7671         * expression.cs (Cast.TryReduce): If we're in checked syntax,
7672         check constant ranges and report a CS0221.  Fixes #33186.
7673
7674 2002-11-24  Martin Baulig  <martin@ximian.com>
7675
7676         * cs-parser.jay: Make this work for uninitialized variable
7677         declarations in the `for' initializer.  Fixes #32416.
7678
7679 2002-11-24  Martin Baulig  <martin@ximian.com>
7680
7681         * ecore.cs (Expression.ConvertExplicit): Make casting from/to
7682         System.Enum actually work.  Fixes bug #32269, added verify-6.cs.
7683
7684 2002-11-24  Martin Baulig  <martin@ximian.com>
7685
7686         * expression.cs (Binary.DoNumericPromotions): Added `check_user_conv'
7687         argument; if true, we also check for user-defined conversions.
7688         This is only needed if both arguments are of a user-defined type.
7689         Fixes #30443, added test-175.cs.
7690         (Binary.ForceConversion): Pass the location argument to ConvertImplicit.
7691
7692         * ecore.cs (Expression.ImplicitUserConversionExists): New method.
7693
7694 2002-11-24  Martin Baulig  <martin@ximian.com>
7695
7696         * expression.cs (ArrayAccess.GetStoreOpcode): New public static
7697         function to get the store opcode.
7698         (Invocation.EmitParams): Call ArrayAccess.GetStoreOpcode() and
7699         only emit the Ldelema if the store opcode is Stobj.  You must run
7700         both test-34 and test-167 to test this.  Fixes #34529.
7701
7702 2002-11-23  Martin Baulig  <martin@ximian.com>
7703
7704         * ecore.cs (Expression.MemberLookup): Added additional
7705         `qualifier_type' argument which is used when we're being called
7706         from MemberAccess.DoResolve() and null if we're called from a
7707         SimpleName lookup.
7708         (Expression.MemberLookupFailed): New method to report errors; this
7709         does the CS1540 check and reports the correct error message.
7710
7711         * typemanager.cs (MemberLookup): Added additional `qualifier_type'
7712         argument for the CS1540 check and redone the way how we're dealing
7713         with private members.  See the comment in the source code for details.
7714         (FilterWithClosure): Reverted this back to revision 1.197; renamed
7715         `closure_start_type' to `closure_qualifier_type' and check whether
7716         it's not null.  It was not this filter being broken, it was just
7717         being called with the wrong arguments.
7718
7719         * expression.cs (MemberAccess.DoResolve): use MemberLookupFinal()
7720         and pass it the correct `qualifier_type'; this also does the error
7721         handling for us.
7722
7723 2002-11-22  Miguel de Icaza  <miguel@ximian.com>
7724
7725         * expression.cs (Invocation.EmitParams): If the we are dealing
7726         with a non-built-in value type, load its address as well.
7727
7728         (ArrayCreation): Use a a pretty constant instead
7729         of the hardcoded value 2.   Use 6 instead of 2 for the number of
7730         static initializers.  
7731
7732         (ArrayCreation.EmitDynamicInitializers): Peel enumerations,
7733         because they are not really value types, just glorified integers. 
7734
7735         * driver.cs: Do not append .exe, the CSC compiler does not do it.
7736
7737         * ecore.cs: Remove redundant code for enumerations, make them use
7738         the same code path as everything else, fixes the casting issue
7739         with enumerations in Windows.Forms.
7740
7741         * attribute.cs: Do only cast to string if it is a string, the
7742         validation happens later.
7743
7744         * typemanager.cs: Temproary hack to avoid a bootstrap issue until
7745         people upgrade their corlibs.
7746
7747         * ecore.cs: Oops, enumerations were not following the entire code path
7748
7749 2002-11-21  Miguel de Icaza  <miguel@ximian.com>
7750
7751         * typemanager.cs (FilterWithClosure): Commented out the test for
7752         1540 in typemanager.cs, as it has problems when accessing
7753         protected methods from a parent class (see test-174.cs). 
7754
7755         * attribute.cs (Attribute.ValidateGuid): new method.
7756         (Attribute.Resolve): Use above.
7757
7758 2002-11-19  Miguel de Icaza  <miguel@ximian.com>
7759
7760         * enum.cs: In FindMembers, perform a recursive lookup for values. (34308)
7761
7762         * ecore.cs (SimpleName.SimpleNameResolve): Remove the special
7763         handling for enumerations, as we only needed the TypeContainer
7764         functionality to begin with (this is required for the fix below to
7765         work for enums that reference constants in a container class for
7766         example). 
7767
7768         * codegen.cs (EmitContext): Make TypeContainer a DeclSpace.
7769
7770         * enum.cs (Enum.Define): Use `this' instead of parent, so we have
7771         a valid TypeBuilder to perform lookups on.o
7772
7773         * class.cs (InheritableMemberSignatureCompare): Use true in the
7774         call to GetGetMethod and GetSetMethod, because we are comparing
7775         the signature, and we need to get the methods *even* if they are
7776         private. 
7777
7778         (PropertyBase.CheckBase): ditto.
7779
7780         * statement.cs (Switch.ResolveAndReduce, Block.EmitMeta,
7781         GotoCase.Resolve): Use Peel on EmpytCasts.
7782
7783         * ecore.cs (EmptyCast): drop child, add Peel method.
7784
7785 2002-11-17  Martin Baulig  <martin@ximian.com>
7786
7787         * ecore.cs (EmptyCast.Child): New public property.
7788
7789         * statement.cs (SwitchLabel.ResolveAndReduce): Check whether the
7790         label resolved to an EmptyCast.  Fixes #34162.
7791         (GotoCase.Resolve): Likewise.
7792         (Block.EmitMeta): Likewise.
7793
7794 2002-11-17  Martin Baulig  <martin@ximian.com>
7795
7796         * expression.cs (Invocation.BetterConversion): Prefer int over
7797         uint; short over ushort; long over ulong for integer literals.
7798         Use ImplicitConversionExists instead of StandardConversionExists
7799         since we also need to check for user-defined implicit conversions.
7800         Fixes #34165.  Added test-173.cs.
7801
7802 2002-11-16  Martin Baulig  <martin@ximian.com>
7803
7804         * expression.cs (Binary.EmitBranchable): Eliminate comparisions
7805         with the `true' and `false' literals.  Fixes #33151.
7806
7807 2002-11-16  Martin Baulig  <martin@ximian.com>
7808
7809         * typemanager.cs (RealMemberLookup): Reverted Miguel's patch from
7810         October 22nd; don't do the cs1540 check for static members.
7811
7812         * ecore.cs (PropertyExpr.ResolveAccessors): Rewrote this; we're
7813         now using our own filter here and doing the cs1540 check again.
7814
7815 2002-11-16  Martin Baulig  <martin@ximian.com>
7816
7817         * support.cs (InternalParameters): Don't crash if we don't have
7818         any fixed parameters.  Fixes #33532.
7819
7820 2002-11-16  Martin Baulig  <martin@ximian.com>
7821
7822         * decl.cs (MemberCache.AddMethods): Use BindingFlags.FlattenHierarchy
7823         when looking up static methods to make this work on Windows.
7824         Fixes #33773.
7825
7826 2002-11-16  Martin Baulig  <martin@ximian.com>
7827
7828         * ecore.cs (PropertyExpr.VerifyAssignable): Check whether we have
7829         a setter rather than using PropertyInfo.CanWrite.
7830
7831 2002-11-15  Nick Drochak  <ndrochak@gol.com>
7832
7833         * class.cs: Allow acces to block member by subclasses. Fixes build
7834         breaker.
7835
7836 2002-11-14  Martin Baulig  <martin@ximian.com>
7837
7838         * class.cs (Constructor.Emit): Added the extern/block check.
7839         Fixes bug #33678.
7840
7841 2002-11-14  Martin Baulig  <martin@ximian.com>
7842
7843         * expression.cs (IndexerAccess.DoResolve): Do a DeclaredOnly
7844         iteration while looking for indexers, this is needed because the
7845         indexer may have a different name in our base classes.  Fixed the
7846         error reporting (no indexers at all, not get accessor, no
7847         overloaded match).  Fixes bug #33089.
7848         (IndexerAccess.DoResolveLValue): Likewise.
7849
7850 2002-11-14  Martin Baulig  <martin@ximian.com>
7851
7852         * class.cs (PropertyBase.CheckBase): Make this work for multiple
7853         indexers.  Fixes the first part of bug #33089.
7854         (MethodSignature.InheritableMemberSignatureCompare): Added support
7855         for properties.
7856
7857 2002-11-13  Ravi Pratap  <ravi@ximian.com>
7858
7859         * attribute.cs (Attribute.Resolve): Catch the
7860         NullReferenceException and report it since it isn't supposed to
7861         happen. 
7862
7863 2002-11-12  Miguel de Icaza  <miguel@ximian.com>
7864
7865         * expression.cs (Binary.EmitBranchable): Also handle the cases for
7866         LogicalOr and LogicalAnd that can benefit from recursively
7867         handling EmitBranchable.  The code now should be nice for Paolo.
7868
7869 2002-11-08  Miguel de Icaza  <miguel@ximian.com>
7870
7871         * typemanager.cs (LookupType): Added a negative-hit hashtable for
7872         the Type lookups, as we perform quite a number of lookups on
7873         non-Types.  This can be removed once we can deterministically tell
7874         whether we have a type or a namespace in advance.
7875
7876         But this might require special hacks from our corlib.
7877
7878         * TODO: updated.
7879
7880         * ecore.cs (TryImplicitIntConversion): Handle conversions to float
7881         and double which avoids a conversion from an integer to a double.
7882
7883         * expression.cs: tiny optimization, avoid calling IsConstant,
7884         because it effectively performs the lookup twice.
7885
7886 2002-11-06  Miguel de Icaza  <miguel@ximian.com>
7887
7888         But a bogus return here to keep the semantics of the old code
7889         until the Mono runtime is fixed.
7890
7891         * pending.cs (GetMissingInterfaces): New method used to remove all
7892         the interfaces that are already implemented by our parent
7893         classes from the list of pending methods. 
7894
7895         * interface.cs: Add checks for calls after ResolveTypeExpr.
7896
7897 2002-11-05  Miguel de Icaza  <miguel@ximian.com>
7898
7899         * class.cs (Class.Emit): Report warning 67: event not used if the
7900         warning level is beyond 3.
7901
7902         * ecore.cs (Expression.ConvertExplicit): Missed a check for expr
7903         being a NullLiteral.
7904
7905         * cs-parser.jay: Fix, Gonzalo reverted the order of the rank
7906         specifiers. 
7907
7908         * class.cs (TypeContainer.GetClassBases): Cover a missing code
7909         path that might fail if a type can not be resolved.
7910
7911         * expression.cs (Binary.Emit): Emit unsigned versions of the
7912         operators. 
7913
7914         * driver.cs: use error 5.
7915
7916 2002-11-02  Gonzalo Paniagua Javier <gonzalo@gnome-db.org>
7917
7918         * cs-parser.jay: simplified a rule and 5 SR conflicts dissapeared.
7919
7920 2002-11-01  Miguel de Icaza  <miguel@ximian.com>
7921
7922         * cs-parser.jay (switch_section): A beautiful patch from Martin
7923         Baulig that fixed 33094.
7924
7925 2002-10-31  Miguel de Icaza  <miguel@ximian.com>
7926
7927         * ecore.cs (PropertyExpr.DoResolveLValue, PropertyExpr.DoResolve):
7928         Check whether the base is abstract and report an error if so.
7929
7930         * expression.cs (IndexerAccess.DoResolveLValue,
7931         IndexerAccess.DoResolve): ditto. 
7932
7933         (Invocation.DoResolve): ditto.
7934
7935         (Invocation.FullMethodDesc): Improve the report string.
7936
7937         * statement.cs (Block): Eliminate IsVariableDefined as it is
7938         basically just a wrapper for GetVariableInfo.
7939
7940         * ecore.cs (SimpleName): Use new 
7941
7942         * support.cs (ReflectionParamter.ParameterType): We unwrap the
7943         type, as we return the actual parameter ref/unref state on a
7944         different call.
7945
7946 2002-10-30  Miguel de Icaza  <miguel@ximian.com>
7947
7948         * support.cs: Return proper flags REF/OUT fixing the previous
7949         commit.  
7950
7951         * expression.cs: Reverted last patch, that was wrong.  Is_ref is
7952         not used to mean `ref' but `ref or out' in ParameterReference
7953
7954         * delegate.cs (FullDelegateDesc): use ParameterDesc to get the
7955         full type signature instead of calling TypeManger.CSharpName
7956         ourselves. 
7957
7958         * support.cs (InternalParameters.ParameterDesc): Do not compare
7959         directly to the modflags, because REF/OUT will actually be bitsets
7960         if set. 
7961
7962         * delegate.cs (VerifyMethod): Check also the modifiers.
7963
7964         * cs-tokenizer.cs: Fix bug where floating point values with an
7965         exponent where a sign was missing was ignored.
7966
7967         * driver.cs: Allow multiple assemblies to be specified in a single
7968         /r: argument
7969
7970 2002-10-28  Miguel de Icaza  <miguel@ximian.com>
7971
7972         * cs-parser.jay: Ugly.  We had to add a multiplicative_expression,
7973         because identifiers after a parenthesis would end up in this kind
7974         of production, and we needed to desamiguate it for having casts
7975         like:
7976
7977                 (UserDefinedType *) xxx
7978
7979 2002-10-24  Miguel de Icaza  <miguel@ximian.com>
7980
7981         * typemanager.cs (RealMemberLookup): when we deal with a subclass,
7982         we should set on the Bindingflags.NonPublic, but not turn on
7983         private_ok.  private_ok controls whether a Private member is
7984         returned (this is chekced on the filter routine), while the
7985         BindingFlags.NonPublic just controls whether private/protected
7986         will be allowed.   This fixes the problem part of the problem of
7987         private properties being allowed to be used in derived classes.
7988
7989         * expression.cs (BaseAccess): Provide an DoResolveLValue method,
7990         so we can call the children DoResolveLValue method (this will
7991         properly signal errors on lvalue assignments to base properties)
7992
7993         * ecore.cs (PropertyExpr.ResolveAccessors): If both setter and
7994         getter are null, and we have a property info, we know that this
7995         happened because the lookup failed, so we report an error 122 for
7996         protection level violation.
7997
7998         We also silently return if setter and getter are null in the
7999         resolve functions, this condition only happens if we have flagged
8000         the error before.  This is the other half of the problem. 
8001
8002         (PropertyExpr.ResolveAccessors): Turns out that PropertyInfo does
8003         not have accessibility information, that is why we were returning
8004         true in the filter function in typemanager.cs.
8005
8006         To properly report 122 (property is inaccessible because of its
8007         protection level) correctly, we report this error in ResolveAccess
8008         by failing if both the setter and the getter are lacking (ie, the
8009         lookup failed). 
8010
8011         DoResolve and DoLResolve have been modified to check for both
8012         setter/getter being null and returning silently, the reason being
8013         that I did not want to put the knowledge about this error in upper
8014         layers, like:
8015
8016         int old = Report.Errors;
8017         x = new PropertyExpr (...);
8018         if (old != Report.Errors)
8019                 return null;
8020         else
8021                 return x;
8022
8023         So the property expr is returned, but it is invalid, so the error
8024         will be flagged during the resolve process. 
8025
8026         * class.cs: Remove InheritablePropertySignatureCompare from the
8027         class, as we no longer depend on the property signature to compute
8028         whether it is possible to implement a method or not.
8029
8030         The reason is that calling PropertyInfo.GetGetMethod will return
8031         null (in .NET, in Mono it works, and we should change this), in
8032         cases where the Get Method does not exist in that particular
8033         class.
8034
8035         So this code:
8036
8037         class X { public virtual int A { get { return 1; } } }
8038         class Y : X { }
8039         class Z : Y { public override int A { get { return 2; } } }
8040
8041         Would fail in Z because the parent (Y) would not have the property
8042         defined.  So we avoid this completely now (because the alternative
8043         fix was ugly and slow), and we now depend exclusively on the
8044         method names.
8045
8046         (PropertyBase.CheckBase): Use a method-base mechanism to find our
8047         reference method, instead of using the property.
8048
8049         * typemanager.cs (GetPropertyGetter, GetPropertySetter): These
8050         routines are gone now.
8051
8052         * typemanager.cs (GetPropertyGetter, GetPropertySetter): swap the
8053         names, they were incorrectly named.
8054
8055         * cs-tokenizer.cs: Return are more gentle token on failure. 
8056
8057         * pending.cs (PendingImplementation.InterfaceMethod): This routine
8058         had an out-of-sync index variable, which caused it to remove from
8059         the list of pending methods the wrong method sometimes.
8060
8061 2002-10-22  Miguel de Icaza  <miguel@ximian.com>
8062
8063         * ecore.cs (PropertyExpr): Do not use PropertyInfo.CanRead,
8064         CanWrite, because those refer to this particular instance of the
8065         property, and do not take into account the fact that we can
8066         override single members of a property.
8067
8068         Constructor requires an EmitContext.  The resolution process does
8069         not happen here, but we need to compute the accessors before,
8070         because the resolution does not always happen for properties.
8071
8072         * typemanager.cs (RealMemberLookup): Set private_ok if we are a
8073         subclass, before we did not update this flag, but we did update
8074         bindingflags. 
8075
8076         (GetAccessors): Drop this routine, as it did not work in the
8077         presence of partially overwritten set/get methods. 
8078
8079         Notice that this broke the cs1540 detection, but that will require
8080         more thinking. 
8081
8082 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8083
8084         * class.cs:
8085         * codegen.cs:
8086         * driver.cs: issue a warning instead of an error if we don't support
8087         debugging for the platform. Also ignore a couple of errors that may
8088         arise when trying to write the symbols. Undo my previous patch.
8089
8090 2002-10-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8091
8092         * driver.cs: ignore /debug switch except for Unix platforms.
8093
8094 2002-10-23  Nick Drochak  <ndrochak@gol.com>
8095
8096         * makefile: Remove mcs2.exe and mcs3.exe on 'make clean'
8097
8098 2002-10-21  Miguel de Icaza  <miguel@ximian.com>
8099
8100         * driver.cs: Do not make mcs-debug conditional, so we do not break
8101         builds that use it.
8102
8103         * statement.cs (UsageVector.MergeChildren): I would like Martin to
8104         review this patch.  But basically after all the children variables
8105         have been merged, the value of "Breaks" was not being set to
8106         new_breaks for Switch blocks.  I think that it should be set after
8107         it has executed.  Currently I set this to the value of new_breaks,
8108         but only if new_breaks is FlowReturn.ALWAYS, which is a bit
8109         conservative, but I do not understand this code very well.
8110
8111         I did not break anything in the build, so that is good ;-)
8112
8113         * cs-tokenizer.cs: Also allow \r in comments as a line separator.
8114
8115 2002-10-20  Mark Crichton  <crichton@gimp.org>
8116
8117         * cfold.cs: Fixed compile blocker.  Really fixed it this time.
8118
8119 2002-10-20  Nick Drochak  <ndrochak@gol.com>
8120
8121         * cfold.cs: Fixed compile blocker.
8122
8123 2002-10-20  Miguel de Icaza  <miguel@ximian.com>
8124
8125         * driver.cs: I was chekcing the key, not the file.
8126
8127 2002-10-19  Ravi Pratap  <ravi@ximian.com>
8128
8129         * ecore.cs (UserDefinedConversion): Get rid of the bogus error
8130         message that we were generating - we just need to silently return
8131         a null.
8132
8133 2002-10-19  Miguel de Icaza  <miguel@ximian.com>
8134
8135         * class.cs (Event.Define): Change my previous commit, as this
8136         breaks the debugger.  This is a temporary hack, as it seems like
8137         the compiler is generating events incorrectly to begin with.
8138
8139         * expression.cs (Binary.ResolveOperator): Added support for 
8140         "U operator - (E x, E y)"
8141
8142         * cfold.cs (BinaryFold): Added support for "U operator - (E x, E
8143         y)".
8144
8145         * ecore.cs (FieldExpr.AddressOf): We had a special code path for
8146         init-only variables, but this path did not take into account that
8147         there might be also instance readonly variables.  Correct this
8148         problem. 
8149
8150         This fixes bug 32253
8151
8152         * delegate.cs (NewDelegate.DoResolve): Catch creation of unsafe
8153         delegates as well.
8154
8155         * driver.cs: Change the extension for modules to `netmodule'
8156
8157         * cs-parser.jay: Improved slightly the location tracking for
8158         the debugger symbols.
8159
8160         * class.cs (Event.Define): Use Modifiers.FieldAttr on the
8161         modifiers that were specified instead of the hardcoded value
8162         (FamAndAssem).  This was basically ignoring the static modifier,
8163         and others.  Fixes 32429.
8164
8165         * statement.cs (Switch.SimpleSwitchEmit): Simplified the code, and
8166         fixed a bug in the process (32476)
8167
8168         * expression.cs (ArrayAccess.EmitAssign): Patch from
8169         hwang_rob@yahoo.ca that fixes bug 31834.3
8170
8171 2002-10-18  Miguel de Icaza  <miguel@ximian.com>
8172
8173         * driver.cs: Make the module extension .netmodule.
8174
8175 2002-10-16  Miguel de Icaza  <miguel@ximian.com>
8176
8177         * driver.cs: Report an error if the resource file is not found
8178         instead of crashing.
8179
8180         * ecore.cs (PropertyExpr.EmitAssign): Pass IsBase instead of
8181         false, like Emit does.
8182
8183 2002-10-16  Nick Drochak  <ndrochak@gol.com>
8184
8185         * typemanager.cs: Remove unused private member.  Also reported mcs
8186         bug to report this as a warning like csc.
8187
8188 2002-10-15  Martin Baulig  <martin@gnome.org>
8189
8190         * statement.cs (Statement.Emit): Made this a virtual method; emits
8191         the line number info and calls DoEmit().
8192         (Statement.DoEmit): New protected abstract method, formerly knows
8193         as Statement.Emit().
8194
8195         * codegen.cs (EmitContext.Mark): Check whether we have a symbol writer.
8196
8197 2002-10-11  Miguel de Icaza  <miguel@ximian.com>
8198
8199         * class.cs: Following the comment from 2002-09-26 to AddMethod, I
8200         have fixed a remaining problem: not every AddXXXX was adding a
8201         fully qualified name.  
8202
8203         Now everyone registers a fully qualified name in the DeclSpace as
8204         being defined instead of the partial name.  
8205
8206         Downsides: we are slower than we need to be due to the excess
8207         copies and the names being registered this way.  
8208
8209         The reason for this is that we currently depend (on the corlib
8210         bootstrap for instance) that types are fully qualified, because
8211         we dump all the types in the namespace, and we should really have
8212         types inserted into the proper namespace, so we can only store the
8213         basenames in the defined_names array.
8214
8215 2002-10-10  Martin Baulig  <martin@gnome.org>
8216
8217         * expression.cs (ArrayAccess.EmitStoreOpcode): Reverted the patch
8218         from bug #31834, see the bug report for a testcase which is
8219         miscompiled.
8220
8221 2002-10-10  Martin Baulig  <martin@gnome.org>
8222
8223         * codegen.cs (EmitContext.Breaks): Removed, we're now using the
8224         flow analysis code for this.
8225
8226         * statement.cs (Do, While, For): Tell the flow analysis code about
8227         infinite loops.
8228         (FlowBranching.UsageVector): Added support for infinite loops.
8229         (Block.Resolve): Moved the dead code elimination here and use flow
8230         analysis to do it.
8231
8232 2002-10-09  Miguel de Icaza  <miguel@ximian.com>
8233
8234         * class.cs (Field.Define): Catch cycles on struct type
8235         definitions. 
8236
8237         * typemanager.cs (IsUnmanagedtype): Do not recursively check
8238         fields if the fields are static.  We only need to check instance
8239         fields. 
8240
8241         * expression.cs (As.DoResolve): Test for reference type.
8242
8243         * statement.cs (Using.ResolveExpression): Use
8244         ConvertImplicitRequired, not ConvertImplicit which reports an
8245         error on failture
8246         (Using.ResolveLocalVariableDecls): ditto.
8247
8248         * expression.cs (Binary.ResolveOperator): Report errors in a few
8249         places where we had to.
8250
8251         * typemanager.cs (IsUnmanagedtype): Finish implementation.
8252
8253 2002-10-08  Miguel de Icaza  <miguel@ximian.com>
8254
8255         * expression.cs: Use StoreFromPtr instead of extracting the type
8256         and then trying to use Stelem.  Patch is from hwang_rob@yahoo.ca
8257
8258         * ecore.cs (ImplicitReferenceConversion): It is possible to assign
8259         an enumeration value to a System.Enum, but System.Enum is not a
8260         value type, but an class type, so we need to box.
8261
8262         (Expression.ConvertExplicit): One codepath could return
8263         errors but not flag them.  Fix this.  Fixes #31853
8264
8265         * parameter.cs (Resolve): Do not allow void as a parameter type.
8266
8267 2002-10-06  Martin Baulig  <martin@gnome.org>
8268
8269         * statemenc.cs (FlowBranching.SetParameterAssigned): Don't crash
8270         if it's a class type and not a struct.  Fixes #31815.
8271
8272 2002-10-06  Martin Baulig  <martin@gnome.org>
8273
8274         * statement.cs: Reworked the flow analysis code a bit to make it
8275         usable for dead code elimination.
8276
8277 2002-10-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8278
8279         * cs-parser.jay: allow empty source files. Fixes bug #31781.
8280
8281 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8282
8283         * expression.cs (ComposedCast.DoResolveType): A quick workaround
8284         to fix the test 165, will investigate deeper.
8285
8286 2002-10-04  Martin Baulig  <martin@gnome.org>
8287
8288         * statement.cs (FlowBranching.UsageVector.MergeChildren): Make
8289         finally blocks actually work.
8290         (Try.Resolve): We don't need to create a sibling for `finally' if
8291         there is no finally block.
8292
8293 2002-10-04  Martin Baulig  <martin@gnome.org>
8294
8295         * class.cs (Constructor.Define): The default accessibility for a
8296         non-default constructor is private, not public.
8297
8298 2002-10-04  Miguel de Icaza  <miguel@ximian.com>
8299
8300         * class.cs (Constructor): Make AllowedModifiers public, add
8301         EXTERN.
8302
8303         * cs-parser.jay: Perform the modifiers test here, as the
8304         constructor for the Constructor class usually receives a zero
8305         because of the way we create it (first we create, later we
8306         customize, and we were never checking the modifiers).
8307
8308         * typemanager.cs (Typemanager.LookupTypeDirect): This new function
8309         is a version of LookupTypeReflection that includes the type-name
8310         cache.  This can be used as a fast path for functions that know
8311         the fully qualified name and are only calling into *.GetType() to
8312         obtain a composed type.
8313
8314         This is also used by TypeManager.LookupType during its type
8315         composition.
8316
8317         (LookupType): We now also track the real type name, as sometimes
8318         we can get a quey for the real type name from things like
8319         ComposedCast.  This fixes bug 31422.
8320
8321         * expression.cs (ComposedCast.Resolve): Since we are obtaining a
8322         complete type fullname, it does not have to go through the type
8323         resolution system to obtain the composed version of the type (for
8324         obtaining arrays or pointers).
8325
8326         (Conditional.Emit): Use the EmitBoolExpression to
8327         generate nicer code, as requested by Paolo.
8328
8329         (ArrayCreation.CheckIndices): Use the patch from
8330         hwang_rob@yahoo.ca to validate the array initializers. 
8331
8332 2002-10-03  Miguel de Icaza  <miguel@ximian.com>
8333
8334         * class.cs (ConstructorInitializer.Emit): simplify code by using
8335         Invocation.EmitCall, and at the same time, fix the bugs in calling
8336         parent constructors that took variable arguments. 
8337
8338         * ecore.cs (Expression.ConvertNumericExplicit,
8339         Expression.ImplicitNumericConversion): Remove the code that
8340         manually wrapped decimal (InternalTypeConstructor call is now gone
8341         as well).
8342
8343         * expression.cs (Cast.TryReduce): Also handle decimal types when
8344         trying to perform a constant fold on the type.
8345
8346         * typemanager.cs (IsUnmanagedtype): Partially implemented.
8347
8348         * parameter.cs: Removed ResolveAndDefine, as it was not needed, as
8349         that only turned off an error report, and did nothing else. 
8350
8351 2002-10-02  Miguel de Icaza  <miguel@ximian.com>
8352
8353         * driver.cs: Handle and ignore /fullpaths
8354
8355 2002-10-01  Miguel de Icaza  <miguel@ximian.com>
8356
8357         * expression.cs (Binary.ResolveOperator): Catch the case where
8358         DoNumericPromotions returns true, 
8359
8360         (Binary.DoNumericPromotions): Simplify the code, and the tests.
8361
8362 2002-09-27  Miguel de Icaza  <miguel@ximian.com>
8363
8364         * ecore.cs (EventExpr.Emit): Instead of emitting an exception,
8365         report error 70.
8366
8367 2002-09-26  Miguel de Icaza  <miguel@ximian.com>
8368
8369         * ecore.cs (ConvertNumericExplicit): It is not enough that the
8370         conversion exists, but it is also required that the conversion be
8371         performed.  This manifested in "(Type64Enum) 2".  
8372
8373         * class.cs (TypeManager.AddMethod): The fix is not to change
8374         AddEnum, because that one was using a fully qualified name (every
8375         DeclSpace derivative does), but to change the AddMethod routine
8376         that was using an un-namespaced name.  This now correctly reports
8377         the duplicated name.
8378
8379         Revert patch until I can properly fix it.  The issue
8380         is that we have a shared Type space across all namespaces
8381         currently, which is wrong.
8382
8383         Options include making the Namespace a DeclSpace, and merge
8384         current_namespace/current_container in the parser.
8385
8386 2002-09-25  Miguel de Icaza  <miguel@ximian.com>
8387
8388         * cs-parser.jay: Improve error reporting when we get a different
8389         kind of expression in local_variable_type and
8390         local_variable_pointer_type. 
8391
8392         Propagate this to avoid missleading errors being reported.
8393
8394         * ecore.cs (ImplicitReferenceConversion): treat
8395         TypeManager.value_type as a target just like object_type.   As
8396         code like this:
8397
8398         ValueType v = 1;
8399
8400         Is valid, and needs to result in the int 1 being boxed before it
8401         is assigned to the value type v.
8402
8403         * class.cs (TypeContainer.AddEnum): Use the basename, not the name
8404         to validate the enumeration name.
8405
8406         * expression.cs (ArrayAccess.EmitAssign): Mimic the same test from
8407         EmitDynamicInitializers for the criteria to use Ldelema.  Thanks
8408         to hwang_rob@yahoo.ca for finding the bug and providing a patch.
8409
8410         * ecore.cs (TryImplicitIntConversion): When doing an
8411         implicit-enumeration-conversion, check if the type is 64-bits and
8412         perform a conversion before passing to EnumConstant.
8413
8414 2002-09-23  Miguel de Icaza  <miguel@ximian.com>
8415
8416         * decl.cs (Error_AmbiguousTypeReference); New routine used to
8417         report ambiguous type references.  Unlike the MS version, we
8418         report what the ambiguity is.   Innovation at work ;-)
8419
8420         (DeclSpace.FindType): Require a location argument to
8421         display when we display an ambiguous error.
8422
8423         * ecore.cs: (SimpleName.DoResolveType): Pass location to FindType.
8424
8425         * interface.cs (GetInterfaceTypeByName): Pass location to FindType.
8426
8427         * expression.cs (EmitDynamicInitializers): Apply patch from
8428         hwang_rob@yahoo.ca that fixes the order in which we emit our
8429         initializers. 
8430
8431 2002-09-21  Martin Baulig  <martin@gnome.org>
8432
8433         * delegate.cs (Delegate.VerifyApplicability): Make this work if the
8434         delegate takes no arguments.
8435
8436 2002-09-20  Miguel de Icaza  <miguel@ximian.com>
8437
8438         * constant.cs: Use Conv_U8 instead of Conv_I8 when loading longs
8439         from integers.
8440
8441         * expression.cs: Extract the underlying type.
8442
8443         * ecore.cs (StoreFromPtr): Use TypeManager.IsEnumType instad of IsEnum
8444
8445         * decl.cs (FindType): Sorry about this, fixed the type lookup bug.
8446
8447 2002-09-19  Miguel de Icaza  <miguel@ximian.com>
8448
8449         * class.cs (TypeContainer.DefineType): We can not use the nice
8450         PackingSize with the size set to 1 DefineType method, because it
8451         will not allow us to define the interfaces that the struct
8452         implements.
8453
8454         This completes the fixing of bug 27287
8455
8456         * ecore.cs (Expresion.ImplicitReferenceConversion): `class-type S'
8457         means also structs.  This fixes part of the problem. 
8458         (Expresion.ImplicitReferenceConversionExists): ditto.
8459
8460         * decl.cs (DeclSparce.ResolveType): Only report the type-not-found
8461         error if there were no errors reported during the type lookup
8462         process, to avoid duplicates or redundant errors.  Without this
8463         you would get an ambiguous errors plus a type not found.  We have
8464         beaten the user enough with the first error.  
8465
8466         (DeclSparce.FindType): Emit a warning if we have an ambiguous
8467         reference. 
8468
8469         * ecore.cs (SimpleName.DoResolveType): If an error is emitted
8470         during the resolution process, stop the lookup, this avoids
8471         repeated error reports (same error twice).
8472
8473         * rootcontext.cs: Emit a warning if we have an ambiguous reference.
8474
8475         * typemanager.cs (LookupType): Redo the type lookup code to match
8476         the needs of System.Reflection.  
8477
8478         The issue is that System.Reflection requires references to nested
8479         types to begin with a "+" sign instead of a dot.  So toplevel
8480         types look like: "NameSpace.TopLevelClass", and nested ones look
8481         like "Namespace.TopLevelClass+Nested", with arbitrary nesting
8482         levels. 
8483
8484 2002-09-19  Martin Baulig  <martin@gnome.org>
8485
8486         * codegen.cs (EmitContext.EmitTopBlock): If control flow analysis
8487         says that a method always returns or always throws an exception,
8488         don't report the CS0161.
8489
8490         * statement.cs (FlowBranching.UsageVector.MergeChildren): Always
8491         set `Returns = new_returns'.
8492
8493 2002-09-19  Martin Baulig  <martin@gnome.org>
8494
8495         * expression.cs (MemberAccess.ResolveMemberAccess): When resolving
8496         to an enum constant, check for a CS0176.
8497
8498 2002-09-18  Miguel de Icaza  <miguel@ximian.com>
8499
8500         * class.cs (TypeContainer.CheckPairedOperators): Now we check
8501         for operators that must be in pairs and report errors.
8502
8503         * ecore.cs (SimpleName.DoResolveType): During the initial type
8504         resolution process, when we define types recursively, we must
8505         check first for types in our current scope before we perform
8506         lookups in the enclosing scopes.
8507
8508         * expression.cs (MakeByteBlob): Handle Decimal blobs.
8509
8510         (Invocation.VerifyArgumentsCompat): Call
8511         TypeManager.TypeToCoreType on the parameter_type.GetElementType.
8512         I thought we were supposed to always call this, but there are a
8513         few places in the code where we dont do it.
8514
8515 2002-09-17  Miguel de Icaza  <miguel@ximian.com>
8516
8517         * driver.cs: Add support in -linkres and -resource to specify the
8518         name of the identifier.
8519
8520 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8521
8522         * ecore.cs (StandardConversionExists): Sync with the conversion
8523         code: allow anything-* to void* conversions.
8524
8525         (FindMostSpecificSource): Use an Expression argument
8526         instead of a Type, because we might be handed over a Literal which
8527         gets a few more implicit conversions that plain types do not.  So
8528         this information was being lost.
8529
8530         Also, we drop the temporary type-holder expression when not
8531         required.
8532
8533 2002-09-17  Martin Baulig  <martin@gnome.org>
8534
8535         * class.cs (PropertyBase.CheckBase): Don't check the base class if
8536         this is an explicit interface implementation.
8537
8538 2002-09-17  Martin Baulig  <martin@gnome.org>
8539
8540         * class.cs (PropertyBase.CheckBase): Make this work for indexers with
8541         different `IndexerName' attributes.
8542
8543         * expression.cs (BaseIndexerAccess): Rewrote this class to use IndexerAccess.
8544         (IndexerAccess): Added special protected ctor for BaseIndexerAccess and
8545         virtual CommonResolve().
8546
8547 2002-09-16  Miguel de Icaza  <miguel@ximian.com>
8548
8549         * enum.cs (LookupEnumValue): Use the EnumConstant declared type,
8550         and convert that to the UnderlyingType.
8551
8552         * statement.cs (Foreach.Resolve): Indexers are just like variables
8553         or PropertyAccesses.
8554
8555         * cs-tokenizer.cs (consume_string): Track line numbers and columns
8556         inside quoted strings, we were not doing this before.
8557
8558 2002-09-16  Martin Baulig  <martin@gnome.org>
8559
8560         * ecore.cs (MethodGroupExpr.DoResolve): If we have an instance expression,
8561         resolve it.  This is needed for the definite assignment check of the
8562         instance expression, fixes bug #29846.
8563         (PropertyExpr.DoResolve, EventExpr.DoResolve): Likewise.
8564
8565 2002-09-16  Nick Drochak  <ndrochak@gol.com>
8566
8567         * parameter.cs: Fix compile error.  Cannot reference static member
8568         from an instance object.  Is this an mcs bug?
8569
8570 2002-09-14  Martin Baulig  <martin@gnome.org>
8571
8572         * decl.cs (MemberCache.SetupCacheForInterface): Don't add an interface
8573         multiple times.  Fixes bug #30295, added test-166.cs.
8574
8575 2002-09-14  Martin Baulig  <martin@gnome.org>
8576
8577         * statement.cs (Block.Emit): Don't emit unreachable code.
8578         (Switch.SimpleSwitchEmit, Switch.TableSwitchEmit): Check for missing
8579         `break' statements.
8580         (Goto.Emit, Continue.Emit): Set ec.Breaks = true.
8581
8582 2002-09-14  Martin Baulig  <martin@gnome.org>
8583
8584         * parameter.cs (Parameter.Attributes): Make this work if Modifier.ISBYREF
8585         is set.
8586
8587 2002-09-14  Martin Baulig  <martin@gnome.org>
8588
8589         * typemanager.cs (TypeManager.IsNestedChildOf): This must return false
8590         if `type == parent' since in this case `type.IsSubclassOf (parent)' will
8591         be false on the ms runtime.
8592
8593 2002-09-13  Martin Baulig  <martin@gnome.org>
8594
8595         * ecore.cs (SimpleName.SimpleNameResolve): Include the member name in
8596         the CS0038 error message.
8597
8598 2002-09-12  Miguel de Icaza  <miguel@ximian.com>
8599
8600         * expression.cs (CheckedExpr, UnCheckedExpr): If we have a
8601         constant inside, return it.
8602
8603 2002-09-12  Martin Baulig  <martin@gnome.org>
8604
8605         * cfold.cs (ConstantFold.DoConstantNumericPromotions): Check whether an
8606         implicit conversion can be done between enum types.
8607
8608         * enum.cs (Enum.LookupEnumValue): If the value is an EnumConstant,
8609         check whether an implicit conversion to the current enum's UnderlyingType
8610         exists and report an error if not.
8611
8612         * codegen.cs (CodeGen.Init): Delete the symbol file when compiling
8613         without debugging support.
8614
8615         * delegate.cs (Delegate.CloseDelegate): Removed, use CloseType instead.
8616         Fixes bug #30235.  Thanks to Ricardo Fernández Pascual.
8617
8618 2002-09-12  Martin Baulig  <martin@gnome.org>
8619
8620         * typemanager.cs (TypeManager.IsNestedChildOf): New method.
8621
8622         * ecore.cs (IMemberExpr.DeclaringType): New property.
8623         (SimpleName.SimpleNameResolve): Check whether we're accessing a
8624         nonstatic member of an outer type (CS0038).
8625
8626 2002-09-11  Miguel de Icaza  <miguel@ximian.com>
8627
8628         * driver.cs: Activate the using-error detector at warning level
8629         4 (at least for MS-compatible APIs).
8630
8631         * namespace.cs (VerifyUsing): Small buglett fix.
8632
8633         * pending.cs (PendingImplementation): pass the container pointer. 
8634
8635         * interface.cs (GetMethods): Allow for recursive definition.  Long
8636         term, I would like to move every type to support recursive
8637         definitions, not the current ordering mechanism that we have right
8638         now.
8639
8640         The situation is this: Attributes are handled before interfaces,
8641         so we can apply attributes to interfaces.  But some attributes
8642         implement interfaces, we will now handle the simple cases
8643         (recursive definitions will just get an error).  
8644
8645         * parameter.cs: Only invalidate types at the end if we fail to
8646         lookup all types.  
8647
8648 2002-09-09  Martin Baulig  <martin@gnome.org>
8649
8650         * ecore.cs (PropertyExpr.Emit): Also check for
8651         TypeManager.system_int_array_get_length so this'll also work when
8652         compiling corlib.  Fixes #30003.
8653
8654 2002-09-09  Martin Baulig  <martin@gnome.org>
8655
8656         * expression.cs (ArrayCreation.MakeByteBlob): Added support for enums
8657         and throw an exception if we can't get the type's size.  Fixed #30040,
8658         added test-165.cs.
8659
8660 2002-09-09  Martin Baulig  <martin@gnome.org>
8661
8662         * ecore.cs (PropertyExpr.DoResolve): Added check for static properies.
8663
8664         * expression.cs (SizeOf.DoResolve): Sizeof is only allowed in unsafe
8665         context.  Fixes bug #30027.
8666
8667         * delegate.cs (NewDelegate.Emit): Use OpCodes.Ldvirtftn for
8668         virtual functions.  Fixes bug #30043, added test-164.cs.
8669
8670 2002-09-08  Ravi Pratap  <ravi@ximian.com>
8671
8672         * attribute.cs : Fix a small NullRef crash thanks to my stupidity.
8673
8674 2002-09-08  Nick Drochak  <ndrochak@gol.com>
8675
8676         * driver.cs: Use an object to get the windows codepage since it's not a
8677         static property.
8678
8679 2002-09-08  Miguel de Icaza  <miguel@ximian.com>
8680
8681         * statement.cs (For.Emit): for infinite loops (test == null)
8682         return whether there is a break inside, not always "true".
8683
8684         * namespace.cs (UsingEntry): New struct to hold the name of the
8685         using definition, the location where it is defined, and whether it
8686         has been used in a successful type lookup.
8687
8688         * rootcontext.cs (NamespaceLookup): Use UsingEntries instead of
8689         strings.
8690
8691         * decl.cs: ditto.
8692
8693 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8694
8695         * attribute.cs : Fix incorrect code which relied on catching
8696         a NullReferenceException to detect a null being passed in
8697         where an object was expected.
8698
8699 2002-09-06  Miguel de Icaza  <miguel@ximian.com>
8700
8701         * statement.cs (Try): flag the catch variable as assigned
8702
8703         * expression.cs (Cast): Simplified by using ResolveType instead of
8704         manually resolving.
8705
8706         * statement.cs (Catch): Fix bug by using ResolveType.
8707
8708 2002-09-06  Ravi Pratap  <ravi@ximian.com>
8709
8710         * expression.cs (BetterConversion): Special case for when we have
8711         a NullLiteral as the argument and we have to choose between string
8712         and object types - we choose string the way csc does.
8713
8714         * attribute.cs (Attribute.Resolve): Catch the
8715         NullReferenceException and report error #182 since the Mono
8716         runtime no more has the bug and having this exception raised means
8717         we tried to select a constructor which takes an object and is
8718         passed a null.
8719
8720 2002-09-05  Ravi Pratap  <ravi@ximian.com>
8721
8722         * expression.cs (Invocation.OverloadResolve): Flag a nicer error
8723         message (1502, 1503) when we can't locate a method after overload
8724         resolution. This is much more informative and closes the bug
8725         Miguel reported.
8726
8727         * interface.cs (PopulateMethod): Return if there are no argument
8728         types. Fixes a NullReferenceException bug.
8729
8730         * attribute.cs (Attribute.Resolve): Ensure we allow TypeOf
8731         expressions too. Previously we were checking only in one place for
8732         positional arguments leaving out named arguments.
8733
8734         * ecore.cs (ImplicitNumericConversion): Conversion from underlying
8735         type to the enum type is not allowed. Remove code corresponding to
8736         that.
8737
8738         (ConvertNumericExplicit): Allow explicit conversions from
8739         the underlying type to enum type. This precisely follows the spec
8740         and closes a bug filed by Gonzalo.
8741
8742 2002-09-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8743
8744         * compiler.csproj:
8745         * compiler.csproj.user: patch from Adam Chester (achester@bigpond.com).
8746
8747 2002-09-03  Miguel de Icaza  <miguel@ximian.com>
8748
8749         * statement.cs (SwitchLabel.ResolveAndReduce): In the string case,
8750         it was important that we stored the right value after the
8751         reduction in `converted'.
8752
8753 2002-09-04  Martin Baulig  <martin@gnome.org>
8754
8755         * location.cs (Location.SymbolDocument): Use full pathnames for the
8756         source files.
8757
8758 2002-08-30  Miguel de Icaza  <miguel@ximian.com>
8759
8760         * expression.cs (ComposedCast): Use DeclSparce.ResolveType instead
8761         of the expression resolve mechanism, because that will catch the
8762         SimpleName error failures.
8763
8764         (Conditional): If we can not resolve the
8765         expression, return, do not crash.
8766
8767 2002-08-29  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8768
8769         * cs-tokenizer.cs:
8770         (location): display token name instead of its number.
8771
8772 2002-08-28  Martin Baulig  <martin@gnome.org>
8773
8774         * expression.cs (Binary.ResolveOperator): Don't silently return
8775         but return an error if an operator cannot be applied between two
8776         enum types.
8777
8778 2002-08-28  Martin Baulig  <martin@gnome.org>
8779
8780         * class.cs (Constructor.Define): Set the permission attributes
8781         correctly instead of making all constructors public.
8782
8783 2002-08-28  Martin Baulig  <martin@gnome.org>
8784
8785         * ecore.cs (Expression.DoResolve): Do a TypeManager.MemberLook
8786         for private members before reporting a CS0103; if we find anything,
8787         it's a CS0122.
8788
8789 2002-08-28  Martin Baulig  <martin@gnome.org>
8790
8791         * typemanager.cs (TypeManager.FilterWithClosure): It's not enough
8792         to check whether `closure_start_type == closure_invocation_type',
8793         we also need to check whether `m.DeclaringType == closure_invocation_type'
8794         before bypassing the permission checks.  We might be accessing
8795         protected/private members from the base class.
8796         (TypeManager.RealMemberLookup): Only set private_ok if private
8797         members were requested via BindingFlags.NonPublic.
8798
8799         * ecore.cs (MethodGroupExpr.IsExplicitImpl): New property.
8800
8801         * expression.cs (MemberAccess.ResolveMemberAccess): Set
8802         MethodGroupExpr.IsExplicitImpl if appropriate.
8803         (Invocation.DoResolve): Don't report the CS0120 for explicit
8804         interface implementations.
8805
8806 2002-08-27  Martin Baulig  <martin@gnome.org>
8807
8808         * expression.cs (Invocation.DoResolve): If this is a static
8809         method and we don't have an InstanceExpression, we must report
8810         a CS0120.
8811
8812 2002-08-25  Martin Baulig  <martin@gnome.org>
8813
8814         * expression.cs (Binary.ResolveOperator): Don't allow `!=' and
8815         `==' between a valuetype and an object.
8816
8817 2002-08-25  Miguel de Icaza  <miguel@ximian.com>
8818
8819         * ecore.cs (TypeExpr): Provide a ToString method.
8820
8821 2002-08-24  Martin Baulig  <martin@gnome.org>
8822
8823         * codegen.cs (CodeGen.InitMonoSymbolWriter): The symbol file is
8824         now called proggie.dbg and it's a binary file.
8825
8826 2002-08-23  Martin Baulig  <martin@gnome.org>
8827
8828         * decl.cs (MemberCache.AddMethods): Ignore varargs methods.
8829
8830 2002-08-23  Martin Baulig  <martin@gnome.org>
8831
8832         * struct.cs (MyStructInfo.ctor): Make this work with empty
8833         structs; it's not allowed to use foreach() on null.
8834
8835 2002-08-23  Martin Baulig  <martin@gnome.org>
8836
8837         * codegen.cs (CodeGen.InitMonoSymbolWriter): Tell the symbol
8838         writer the full pathname of the generated assembly.
8839
8840 2002-08-23  Martin Baulig  <martin@gnome.org>
8841
8842         * statements.cs (FlowBranching.UsageVector.MergeChildren):
8843         A `finally' block never returns or breaks; improved handling of
8844         unreachable code.
8845
8846 2002-08-23  Martin Baulig  <martin@gnome.org>
8847
8848         * statement.cs (Throw.Resolve): Allow `throw null'.
8849
8850 2002-08-23  Martin Baulig  <martin@gnome.org>
8851
8852         * expression.cs (MemberAccess.ResolveMemberAccess): If this is an
8853         EventExpr, don't do a DeclaredOnly MemberLookup, but check whether
8854         `ee.EventInfo.DeclaringType == ec.ContainerType'.  The
8855         MemberLookup would return a wrong event if this is an explicit
8856         interface implementation and the class has an event with the same
8857         name.
8858
8859 2002-08-23  Martin Baulig  <martin@gnome.org>
8860
8861         * statement.cs (Block.AddChildVariableNames): New public method.
8862         (Block.AddChildVariableName): Likewise.
8863         (Block.IsVariableNameUsedInChildBlock): Likewise.
8864         (Block.AddVariable): Check whether a variable name has already
8865         been used in a child block.
8866
8867         * cs-parser.jay (declare_local_variables): Mark all variable names
8868         from the current block as being used in a child block in the
8869         implicit block.
8870
8871 2002-08-23  Martin Baulig  <martin@gnome.org>
8872
8873         * codegen.cs (CodeGen.InitializeSymbolWriter): Abort if we can't
8874         find the symbol writer.
8875
8876         * driver.cs: csc also allows the arguments to /define being
8877         separated by commas, not only by semicolons.
8878
8879 2002-08-23  Martin Baulig  <martin@gnome.org>
8880
8881         * interface.cs (Interface.GetMembers): Added static check for events.
8882
8883 2002-08-15  Martin Baulig  <martin@gnome.org>
8884
8885         * class.cs (MethodData.EmitDestructor): In the Expression.MemberLookup
8886         call, use ec.ContainerType.BaseType as queried_type and invocation_type.
8887
8888         * ecore.cs (Expression.MemberLookup): Added documentation and explained
8889         why the MethodData.EmitDestructor() change was necessary.
8890
8891 2002-08-20  Martin Baulig  <martin@gnome.org>
8892
8893         * class.cs (TypeContainer.FindMembers): Added static check for events.
8894
8895         * decl.cs (MemberCache.AddMembers): Handle events like normal members.
8896
8897         * typemanager.cs (TypeHandle.GetMembers): When queried for events only,
8898         use Type.GetEvents(), not Type.FindMembers().
8899
8900 2002-08-20  Martin Baulig  <martin@gnome.org>
8901
8902         * decl.cs (MemberCache): Added a special method cache which will
8903         be used for method-only searched.  This ensures that a method
8904         search will return a MethodInfo with the correct ReflectedType for
8905         inherited methods.      
8906
8907 2002-08-20  Martin Baulig  <martin@gnome.org>
8908
8909         * decl.cs (DeclSpace.FindMembers): Made this public.
8910
8911 2002-08-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
8912
8913         * delegate.cs: fixed build on windows.
8914         [FIXME:  Filed as bug #29150: MCS must report these errors.]
8915
8916 2002-08-19  Ravi Pratap  <ravi@ximian.com>
8917
8918         * ecore.cs (StandardConversionExists): Return a false
8919         if we are trying to convert the void type to anything else
8920         since that is not allowed.
8921
8922         * delegate.cs (DelegateInvocation.DoResolve): Ensure that
8923         we flag error 70 in the event an event is trying to be accessed
8924         directly from outside the declaring type.
8925
8926 2002-08-20  Martin Baulig  <martin@gnome.org>
8927
8928         * typemanager.cs, decl.cs: Moved MemberList, IMemberContainer and
8929         MemberCache from typemanager.cs to decl.cs.
8930
8931 2002-08-19  Martin Baulig  <martin@gnome.org>
8932
8933         * class.cs (TypeContainer): Implement IMemberContainer.
8934         (TypeContainer.DefineMembers): Create the MemberCache.
8935         (TypeContainer.FindMembers): Do better BindingFlags checking; only
8936         return public members if BindingFlags.Public was given, check
8937         whether members are static.
8938
8939 2002-08-16  Martin Baulig  <martin@gnome.org>
8940
8941         * decl.cs (DeclSpace.Define): Splitted this in Define and
8942         DefineMembers.  DefineMembers is called first and initializes the
8943         MemberCache.
8944
8945         * rootcontext.cs (RootContext.DefineMembers): New function.  Calls
8946         DefineMembers() on all our DeclSpaces.
8947
8948         * class.cs (TypeContainer.Define): Moved all code to DefineMembers(),
8949         but call DefineMembers() on all nested interfaces.  We call their
8950         Define() in our new Define() function.
8951
8952         * interface.cs (Interface): Implement IMemberContainer.
8953         (Interface.Define): Moved all code except the attribute stuf to
8954         DefineMembers().
8955         (Interface.DefineMembers): Initialize the member cache.
8956
8957         * typemanager.cs (IMemberFinder): Removed this interface, we don't
8958         need this anymore since we can use MemberCache.FindMembers directly.
8959
8960 2002-08-19  Martin Baulig  <martin@gnome.org>
8961
8962         * typemanager.cs (MemberCache): When creating the cache for an
8963         interface type, add all inherited members.
8964         (TypeManager.MemberLookup_FindMembers): Changed `ref bool searching'
8965         to `out bool used_cache' and documented it.
8966         (TypeManager.MemberLookup): If we already used the cache in the first
8967         iteration, we don't need to do the interfaces check.
8968
8969 2002-08-19  Martin Baulig  <martin@gnome.org>
8970
8971         * decl.cs (DeclSpace.FindMembers): New abstract method.  Moved this
8972         here from IMemberFinder and don't implement this interface anymore.
8973         (DeclSpace.MemberCache): Moved here from IMemberFinder.
8974
8975         * typemanager.cs (IMemberFinder): This interface is now only used by
8976         classes which actually support the member cache.
8977         (TypeManager.builder_to_member_finder): Renamed to builder_to_declspace
8978         since we only put DeclSpaces into this Hashtable.
8979         (MemberLookup_FindMembers): Use `builder_to_declspace' if the type is
8980         a dynamic type and TypeHandle.GetTypeHandle() otherwise.
8981
8982 2002-08-16  Martin Baulig  <martin@gnome.org>
8983
8984         * typemanager.cs (ICachingMemberFinder): Removed.
8985         (IMemberFinder.MemberCache): New property.
8986         (TypeManager.FindMembers): Merged this with RealFindMembers().
8987         This function will never be called from TypeManager.MemberLookup()
8988         so we can't use the cache here, just the IMemberFinder.
8989         (TypeManager.MemberLookup_FindMembers): Check whether the
8990         IMemberFinder has a MemberCache and call the cache's FindMembers
8991         function.
8992         (MemberCache): Rewrote larger parts of this yet another time and
8993         cleaned it up a bit.
8994
8995 2002-08-15  Miguel de Icaza  <miguel@ximian.com>
8996
8997         * driver.cs (LoadArgs): Support quoting.
8998
8999         (Usage): Show the CSC-like command line arguments.
9000
9001         Improved a few error messages.
9002
9003 2002-08-15  Martin Baulig  <martin@gnome.org>
9004
9005         * typemanager.cs (IMemberContainer.Type): New property.
9006         (IMemberContainer.IsInterface): New property.
9007
9008         The following changes are conditional to BROKEN_RUNTIME, which is
9009         defined at the top of the file.
9010
9011         * typemanager.cs (MemberCache.MemberCache): Don't add the base
9012         class'es members, but add all members from TypeHandle.ObjectType
9013         if we're an interface.
9014         (MemberCache.AddMembers): Set the Declared flag if member.DeclaringType
9015         is the current type.
9016         (MemberCache.CacheEntry.Container): Removed this field.
9017         (TypeHandle.GetMembers): Include inherited members.
9018
9019 2002-08-14  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9020
9021         * typemanager.cs: fixed compilation and added a comment on a field that
9022         is never used.
9023
9024 2002-08-15  Martin Baulig  <martin@gnome.org>
9025
9026         * class.cs (ConstructorInitializer.Resolve): In the
9027         Expression.MemberLookup call, use the queried_type as
9028         invocation_type.
9029
9030         * typemanager.cs (IMemberContainer.GetMembers): Removed the `bool
9031         declared' attribute, it's always true.
9032         (IMemberContainer.Parent, IMemberContainer.Name): New properties.
9033         (TypeManager.MemberLookup_FindMembers): [FIXME FIXME FIXME] Added
9034         temporary wrapper for FindMembers which tells MemberLookup whether
9035         members from the base classes are included in the return value.
9036         This will go away soon.
9037         (TypeManager.MemberLookup): Use this temporary hack here; once the
9038         new MemberCache is completed, we don't need to do the DeclaredOnly
9039         looping here anymore since the MemberCache will take care of this.
9040         (TypeManager.IsSubclassOrNestedChildOf): Allow `type == parent'.
9041         (MemberCache): When creating the MemberCache for a class, get
9042         members from the current class and all its base classes.
9043         (MemberCache.CacheEntry.Container): New field.  This is a
9044         temporary hack until the Mono runtime is fixed to distinguish
9045         between ReflectedType and DeclaringType.  It allows us to use MCS
9046         with both the MS runtime and the unfixed Mono runtime without
9047         problems and without accecting performance.
9048         (MemberCache.SearchMembers): The DeclaredOnly looping from
9049         TypeManager.MemberLookup is now done here.      
9050
9051 2002-08-14  Martin Baulig  <martin@gnome.org>
9052
9053         * statement.cs (MyStructInfo.MyStructInfo): Don't call
9054         Type.GetFields on dynamic types but get the fields from the
9055         corresponding TypeContainer.
9056         (MyStructInfo.GetStructInfo): Added check for enum types.
9057
9058         * typemanager.cs (MemberList.IsSynchronized): Implemented.
9059         (MemberList.SyncRoot): Implemented.
9060         (TypeManager.FilterWithClosure): No need to check permissions if
9061         closure_start_type == closure_invocation_type, don't crash if
9062         closure_invocation_type is null.
9063
9064 2002-08-13  Martin Baulig  <martin@gnome.org>
9065
9066         Rewrote TypeContainer.FindMembers to use a member cache.  This
9067         gives us a speed increase of about 35% for the self-hosting MCS
9068         build and of about 15-20% for the class libs (both on GNU/Linux).
9069
9070         * report.cs (Timer): New class to get enhanced profiling.  This
9071         whole class is "TIMER" conditional since it remarkably slows down
9072         compilation speed.
9073
9074         * class.cs (MemberList): New class.  This is an IList wrapper
9075         which we're now using instead of passing MemberInfo[]'s around to
9076         avoid copying this array unnecessarily.
9077         (IMemberFinder.FindMember): Return a MemberList, not a MemberInfo [].
9078         (ICachingMemberFinder, IMemberContainer): New interface.
9079         (TypeManager.FilterWithClosure): If `criteria' is null, the name
9080         has already been checked, otherwise use it for the name comparision.
9081         (TypeManager.FindMembers): Renamed to RealMemberFinder and
9082         provided wrapper which tries to use ICachingMemberFinder.FindMembers
9083         if possible.  Returns a MemberList, not a MemberInfo [].
9084         (TypeHandle): New class, implements IMemberContainer.  We create
9085         one instance of this class per type, it contains a MemberCache
9086         which is used to do the member lookups.
9087         (MemberCache): New class.  Each instance of this class contains
9088         all members of a type and a name-based hash table.
9089         (MemberCache.FindMembers): This is our new member lookup
9090         function.  First, it looks up all members of the requested name in
9091         the hash table.  Then, it walks this list and sorts out all
9092         applicable members and returns them.
9093
9094 2002-08-13  Martin Baulig  <martin@gnome.org>
9095
9096         In addition to a nice code cleanup, this gives us a performance
9097         increase of about 1.4% on GNU/Linux - not much, but it's already
9098         half a second for the self-hosting MCS compilation.
9099
9100         * typemanager.cs (IMemberFinder): New interface.  It is used by
9101         TypeManager.FindMembers to call FindMembers on a TypeContainer,
9102         Enum, Delegate or Interface.
9103         (TypeManager.finder_to_member_finder): New PtrHashtable.
9104         (TypeManager.finder_to_container): Removed.
9105         (TypeManager.finder_to_delegate): Removed.
9106         (TypeManager.finder_to_interface): Removed.
9107         (TypeManager.finder_to_enum): Removed.
9108
9109         * interface.cs (Interface): Implement IMemberFinder.
9110
9111         * delegate.cs (Delegate): Implement IMemberFinder.
9112
9113         * enum.cs (Enum): Implement IMemberFinder.
9114
9115         * class.cs (TypeContainer): Implement IMemberFinder.
9116
9117 2002-08-12  Martin Baulig  <martin@gnome.org>
9118
9119         * ecore.cs (TypeExpr.DoResolveType): Mark this as virtual.
9120
9121 2002-08-12  Martin Baulig  <martin@gnome.org>
9122
9123         * ecore.cs (ITypeExpression): New interface for expressions which
9124         resolve to a type.
9125         (TypeExpression): Renamed to TypeLookupExpression.
9126         (Expression.DoResolve): If we're doing a types-only lookup, the
9127         expression must implement the ITypeExpression interface and we
9128         call DoResolveType() on it.
9129         (SimpleName): Implement the new ITypeExpression interface.
9130         (SimpleName.SimpleNameResolve): Removed the ec.OnlyLookupTypes
9131         hack, the situation that we're only looking up types can't happen
9132         anymore when this method is called.  Moved the type lookup code to
9133         DoResolveType() and call it.
9134         (SimpleName.DoResolveType): This ITypeExpression interface method
9135         is now doing the types-only lookup.
9136         (TypeExpr, TypeLookupExpression): Implement ITypeExpression.
9137         (ResolveFlags): Added MaskExprClass.
9138
9139         * expression.cs (MemberAccess): Implement the ITypeExpression
9140         interface.
9141         (MemberAccess.DoResolve): Added support for a types-only lookup
9142         when we're called via ITypeExpression.DoResolveType().
9143         (ComposedCast): Implement the ITypeExpression interface.
9144
9145         * codegen.cs (EmitContext.OnlyLookupTypes): Removed.  Call
9146         Expression.Resolve() with ResolveFlags.Type instead.
9147
9148 2002-08-12  Martin Baulig  <martin@gnome.org>
9149
9150         * interface.cs (Interface.Define): Apply attributes.
9151
9152         * attribute.cs (Attribute.ApplyAttributes): Added support for
9153         interface attributes.
9154
9155 2002-08-11  Martin Baulig  <martin@gnome.org>
9156
9157         * statement.cs (Block.Emit): Only check the "this" variable if we
9158         do not always throw an exception.
9159
9160         * ecore.cs (PropertyExpr.DoResolveLValue): Implemented, check
9161         whether the property has a set accessor.
9162
9163 2002-08-11  Martin Baulig  <martin@gnome.org>
9164
9165         Added control flow analysis support for structs.
9166
9167         * ecore.cs (ResolveFlags): Added `DisableFlowAnalysis' to resolve
9168         with control flow analysis turned off.
9169         (IVariable): New interface.
9170         (SimpleName.SimpleNameResolve): If MemberAccess.ResolveMemberAccess
9171         returns an IMemberExpr, call DoResolve/DoResolveLValue on it.
9172         (FieldExpr.DoResolve): Resolve the instance expression with flow
9173         analysis turned off and do the definite assignment check after the
9174         resolving when we know what the expression will resolve to.
9175
9176         * expression.cs (LocalVariableReference, ParameterReference):
9177         Implement the new IVariable interface, only call the flow analysis
9178         code if ec.DoFlowAnalysis is true.
9179         (This): Added constructor which takes a Block argument.  Implement
9180         the new IVariable interface.
9181         (MemberAccess.DoResolve, MemberAccess.DoResolveLValue): Call
9182         DoResolve/DoResolveLValue on the result of ResolveMemberLookup().
9183         This does the definite assignment checks for struct members.
9184
9185         * class.cs (Constructor.Emit): If this is a non-static `struct'
9186         constructor which doesn't have any initializer, call
9187         Block.AddThisVariable() to tell the flow analysis code that all
9188         struct elements must be initialized before control returns from
9189         the constructor.
9190
9191         * statement.cs (MyStructInfo): New public class.
9192         (UsageVector.this [VariableInfo vi]): Added `int field_idx'
9193         argument to this indexer.  If non-zero, check an individual struct
9194         member, not the whole struct.
9195         (FlowBranching.CheckOutParameters): Check struct members.
9196         (FlowBranching.IsVariableAssigned, SetVariableAssigned): Added
9197         overloaded versions of these methods which take an additional
9198         `int field_idx' argument to check struct members.
9199         (FlowBranching.IsParameterAssigned, SetParameterAssigned): Added
9200         overloaded versions of these methods which take an additional
9201         `string field_name' argument to check struct member.s
9202         (VariableInfo): Implement the IVariable interface.
9203         (VariableInfo.StructInfo): New public property.  Returns the
9204         MyStructInfo instance of the variable if it's a struct or null.
9205         (Block.AddThisVariable): New public method.  This is called from
9206         Constructor.Emit() for non-static `struct' constructor which do
9207         not have any initializer.  It creates a special variable for the
9208         "this" instance variable which will be checked by the flow
9209         analysis code to ensure that all of the struct's fields are
9210         initialized before control returns from the constructor.
9211         (UsageVector): Added support for struct members.  If a
9212         variable/parameter is a struct with N members, we reserve a slot
9213         in the usage vector for each member.  A struct is considered fully
9214         initialized if either the struct itself (slot 0) or all its
9215         members are initialized.
9216
9217 2002-08-08  Martin Baulig  <martin@gnome.org>
9218
9219         * driver.cs (Driver.MainDriver): Only report an error CS5001
9220         if there were no compilation errors.
9221
9222         * codegen.cs (EmitContext.EmitContext): Use the DeclSpace's
9223         `UnsafeContext' property to determine whether the parent is in
9224         unsafe context rather than checking the parent's ModFlags:
9225         classes nested in an unsafe class are unsafe as well.
9226
9227 2002-08-08  Martin Baulig  <martin@gnome.org>
9228
9229         * statement.cs (UsageVector.MergeChildren): Distinguish between
9230         `Breaks' and `Returns' everywhere, don't set `Breaks' anymore if
9231         we return.  Added test17() and test18() to test-154.cs.
9232
9233 2002-08-08  Martin Baulig  <martin@gnome.org>
9234
9235         * typemanager.cs (TypeManager.FilterWithClosure): If we have
9236         Family access, make sure the invoking type isn't a subclass of the
9237         queried type (that'd be a CS1540).
9238
9239         * ecore.cs (Expression.MemberLookup): Added overloaded version of
9240         this method which takes an additional `Type invocation_type'.
9241
9242         * expression.cs (BaseAccess.DoResolve): Use the base type as
9243         invocation and query type.
9244         (MemberAccess.DoResolve): If the lookup failed and we're about to
9245         report a CS0122, try a lookup with the ec.ContainerType - if this
9246         succeeds, we must report a CS1540.
9247
9248 2002-08-08  Martin Baulig  <martin@gnome.org>
9249
9250         * ecore.cs (IMemberExpr): Added `bool IsInstance' property.
9251         (MethodGroupExpr): Implement the IMemberExpr interface.
9252
9253         * expression (MemberAccess.ResolveMemberAccess): No need to have
9254         any special code for MethodGroupExprs anymore, they're now
9255         IMemberExprs.   
9256
9257 2002-08-08  Martin Baulig  <martin@gnome.org>
9258
9259         * typemanager.cs (TypeManager.FilterWithClosure): Check Assembly,
9260         Family, FamANDAssem and FamORAssem permissions.
9261         (TypeManager.IsSubclassOrNestedChildOf): New public method.
9262
9263 2002-08-08  Martin Baulig  <martin@gnome.org>
9264
9265         * statement.cs (FlowBranchingType): Added LOOP_BLOCK.
9266         (UsageVector.MergeChildren): `break' breaks unless we're in a switch
9267         or loop block.
9268
9269 Thu Aug 8 10:28:07 CEST 2002 Paolo Molaro <lupus@ximian.com>
9270
9271         * driver.cs: implemented /resource option to embed managed resources.
9272
9273 2002-08-07  Martin Baulig  <martin@gnome.org>
9274
9275         * class.cs (FieldBase.Initializer): Renamed to `init' and made private.
9276         (FieldBase.HasFieldInitializer): New public property.
9277         (FieldBase.GetInitializerExpression): New public method.  Resolves and
9278         returns the field initializer and makes sure it is only resolved once.
9279         (TypeContainer.EmitFieldInitializers): Call
9280         FieldBase.GetInitializerExpression to get the initializer, this ensures
9281         that it isn't resolved multiple times.
9282
9283         * codegen.cs (EmitContext): Added `bool IsFieldInitialier'.  This tells
9284         the resolving process (SimpleName/MemberLookup) that we're currently
9285         emitting a field initializer (which must not access any instance members,
9286         this is an error CS0236).
9287
9288         * ecore.cs (SimpleName.Error_ObjectRefRequired): Added EmitContext
9289         argument, if the `IsFieldInitializer' flag is set, we must report and
9290         error CS0236 and not an error CS0120.   
9291
9292 2002-08-07  Martin Baulig  <martin@gnome.org>
9293
9294         * ecore.cs (IMemberExpr): New public interface.
9295         (FieldExpr, PropertyExpr, EventExpr): Implement IMemberExpr.
9296         (SimpleName.SimpleNameResolve): Call MemberAccess.ResolveMemberAccess
9297         if the expression is an IMemberExpr.
9298
9299         * expression.cs (MemberAccess.ResolveMemberAccess): Allow `left'
9300         to be null, implicitly default to `this' if we're non-static in
9301         this case.  Simplified the code a lot by using the new IMemberExpr
9302         interface.  Also fixed bug #28176 here.
9303
9304 2002-08-06  Martin Baulig  <martin@gnome.org>
9305
9306         * cs-parser.jay (SimpleLookup): Removed.  We need to create
9307         ParameterReferences during semantic analysis so that we can do a
9308         type-only search when resolving Cast, TypeOf and SizeOf.
9309         (block): Pass the `current_local_parameters' to the Block's
9310         constructor.
9311
9312         * class.cs (ConstructorInitializer): Added `Parameters parameters'
9313         argument to the constructor.
9314         (ConstructorInitializer.Resolve): Create a temporary implicit
9315         block with the parameters.
9316
9317         * ecore.cs (SimpleName.SimpleNameResolve): Resolve parameter
9318         references here if we aren't doing a type-only search.
9319
9320         * statement.cs (Block): Added constructor which takes a
9321         `Parameters parameters' argument.
9322         (Block.Parameters): New public property.
9323
9324         * support.cs (InternalParameters.Parameters): Renamed `parameters'
9325         to `Parameters' and made it public readonly.
9326
9327 2002-08-06  Martin Baulig  <martin@gnome.org>
9328
9329         * ecore.cs (Expression.Warning): Made this public as well.
9330
9331         * report.cs (Report.Debug): Print the contents of collections.
9332
9333 2002-08-06  Martin Baulig  <martin@gnome.org>
9334
9335         * ecore.cs (Expression.ResolveFlags): New [Flags] enum.  This is
9336         used to tell Resolve() which kinds of expressions it may return.
9337         (Expression.Resolve): Added overloaded version of this method which
9338         takes a `ResolveFlags flags' argument.  This can be used to tell
9339         Resolve() which kinds of expressions it may return.  Reports a
9340         CS0118 on error.
9341         (Expression.ResolveWithSimpleName): Removed, use Resolve() with
9342         ResolveFlags.SimpleName.
9343         (Expression.Error118): Added overloaded version of this method which
9344         takes a `ResolveFlags flags' argument.  It uses the flags to determine
9345         which kinds of expressions are allowed.
9346
9347         * expression.cs (Argument.ResolveMethodGroup): New public method.
9348         Resolves an argument, but allows a MethodGroup to be returned.
9349         This is used when invoking a delegate.
9350
9351         * TODO: Updated a bit.
9352
9353 2002-08-06  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9354
9355         Fixed compilation with csc.
9356
9357         * ecore.cs: Expression.Error made public. Is this correct? Should
9358         Warning be made public too?
9359
9360         * expression.cs: use ea.Location instead of ea.loc.
9361         [FIXME:  Filed as bug #28607: MCS must report these errors.]
9362
9363 2002-08-06  Martin Baulig  <martin@gnome.org>
9364
9365         * ecore.cs (Expression.loc): Moved the location here instead of
9366         duplicating it in all derived classes.
9367         (Expression.Location): New public property.
9368         (Expression.Error, Expression.Warning): Made them non-static and
9369         removed the location argument.
9370         (Expression.Warning): Added overloaded version which takes an
9371         `int level' argument.
9372         (Expression.Error118): Make this non-static and removed the
9373         expression and location arguments.
9374         (TypeExpr): Added location argument to the constructor.
9375
9376         * expression.cs (StaticCallExpr): Added location argument to
9377         the constructor.
9378         (Indirection, PointerArithmetic): Likewise.
9379         (CheckedExpr, UnCheckedExpr): Likewise.
9380         (ArrayAccess, IndexerAccess, UserCast, ArrayPtr): Likewise.
9381         (StringPtr): Likewise.
9382
9383
9384 2002-08-05  Martin Baulig  <martin@gnome.org>
9385
9386         * expression.cs (BaseAccess.DoResolve): Actually report errors.
9387
9388         * assign.cs (Assign.DoResolve): Check whether the source
9389         expression is a value or variable.
9390
9391         * statement.cs (Try.Resolve): Set ec.InTry/InCatch/InFinally
9392         while resolving the corresponding blocks.
9393
9394         * interface.cs (Interface.GetInterfaceTypeByName): Actually report
9395         an error, don't silently return null.
9396
9397         * statement.cs (Block.AddVariable): Do the error reporting here
9398         and distinguish between CS0128 and CS0136.
9399         (Block.DoResolve): Report all unused labels (warning CS0164).
9400         (LabeledStatement): Pass the location to the constructor.
9401         (LabeledStatement.HasBeenReferenced): New property.
9402         (LabeledStatement.Resolve): Set it to true here.
9403
9404         * statement.cs (Return.Emit): Return success even after reporting
9405         a type mismatch error (CS0126 or CS0127), this is what csc does and
9406         it avoids confusing the users with any consecutive errors.
9407
9408 2002-08-05  Martin Baulig  <martin@gnome.org>
9409
9410         * enum.cs (Enum.LookupEnumValue): Catch circular definitions.
9411
9412         * const.cs (Const.LookupConstantValue): Catch circular definitions.
9413
9414         * expression.cs (MemberAccess.DoResolve): Silently return if an
9415         error has already been reported.
9416
9417         * ecore.cs (Expression.MemberLookupFinal): Silently return if an
9418         error has already been reported.
9419
9420 2002-08-05  Martin Baulig  <martin@gnome.org>
9421
9422         * statement.cs (UsageVector): Only initialize the `parameters'
9423         vector if we actually have any "out" parameters.
9424
9425 2002-08-05  Martin Baulig  <martin@gnome.org>
9426
9427         * expression.cs (Binary.ResolveOperator): When combining delegates,
9428         they must have the same type.
9429
9430 2002-08-05  Martin Baulig  <martin@gnome.org>
9431
9432         * typemanager.cs (TypeManager.GetArgumentTypes): Don't call
9433         PropertyInfo.GetIndexParameters() on dynamic types, this doesn't
9434         work with the ms runtime and we also don't need it: if we're a
9435         PropertyBuilder and not in the `indexer_arguments' hash, then we
9436         are a property and not an indexer.
9437
9438         * class.cs (TypeContainer.AsAccessible): Use Type.IsArray,
9439         Type.IsPointer and Type.IsByRef instead of Type.HasElementType
9440         since the latter one doesn't work with the ms runtime.
9441
9442 2002-08-03  Martin Baulig  <martin@gnome.org>
9443
9444         Fixed bugs #27998 and #22735.
9445
9446         * class.cs (Method.IsOperator): New public field.
9447         (Method.CheckBase): Report CS0111 if there's already a method
9448         with the same parameters in the current class.  Report CS0508 when
9449         attempting to change the return type of an inherited method.
9450         (MethodData.Emit): Report CS0179 if a method doesn't have a body
9451         and it's not marked abstract or extern.
9452         (PropertyBase): New abstract base class for Property and Indexer.
9453         (PropertyBase.CheckBase): Moved here from Property and made it work
9454         for indexers.
9455         (PropertyBase.Emit): Moved here from Property.Emit, Indexer.Emit is
9456         the same so we can reuse it there.
9457         (Property, Indexer): Derive from PropertyBase.
9458         (MethodSignature.inheritable_property_signature_filter): New delegate
9459         to find properties and indexers.
9460
9461         * decl.cs (MemberCore.CheckMethodAgainstBase): Added `string name'
9462         argument and improved error reporting.
9463
9464         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): Renamed to
9465         EmptyReadOnlyParameters and made it a property.
9466
9467         * typemanager.cs (TypeManager.GetArgumentTypes): Added overloaded
9468         version of this method which takes a `PropertyInfo indexer'.
9469         (TypeManager.RegisterIndexer): New method.
9470
9471         * class.cs: Added myself as author of this file :-)
9472
9473 2002-08-03  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9474
9475         * class.cs: fixed compilation on windoze.
9476
9477 2002-08-03  Martin Baulig  <martin@gnome.org>
9478
9479         * interface.cs (Interface.GetInterfaceBases): Check whether all
9480         base interfaces are at least as accessible than the current one.
9481
9482         * class.cs (TypeContainer.GetClassBases): Check whether base types
9483         are at least as accessible than the current type.
9484         (TypeContainer.AsAccessible): Implemented and made non-static.
9485         (MemberBase.CheckParameters): Report errors if the accessibility
9486         checks fail.
9487
9488         * delegate.cs (Delegate.Delegate): The default visibility is
9489         internal for top-level types and private for nested types.
9490         (Delegate.Define): Report errors if the accessibility checks fail.
9491
9492         * enum.cs (Enum.Enum): The default visibility is internal for
9493         top-level types and private for nested types.
9494         (Enum.DefineType): Compute the correct visibility.
9495
9496         * modifiers.cs (Modifiers.TypeAttr): Added a version of this
9497         function which takes a `bool is_toplevel' instead of a TypeContainer.
9498
9499         * typemanager.cs (TypeManager.IsBuiltinType): `void' is also a
9500         builtin type.
9501
9502 2002-08-02  Martin Baulig  <martin@gnome.org>
9503
9504         * expression.cs (LocalVariableReferenc): Added constructor which
9505         takes additional `VariableInfo vi' and `bool is_readonly' arguments.
9506         (LocalVariableReference.IsReadOnly): New property.
9507         (LocalVariableReference.DoResolveLValue): Report a CS1604 if the
9508         variable is readonly, use our own readonly flag to do this; you can
9509         use the new constructor to get a writable reference to a read-only
9510         variable.
9511
9512         * cs-parser.jay (foreach_statement, using_statement): Get a writable
9513         reference to the local variable.
9514
9515 2002-08-01  Miguel de Icaza  <miguel@ximian.com>
9516
9517         * rootcontext.cs (ResolveCore): Also include System.Exception
9518
9519         * statement.cs (Block.Emit): Do not emit the dead-code warnings if
9520         we reach an EmptyStatement.
9521
9522         (Catch.DoResolve, Throw.DoResolve): Throwing the System.Exception
9523         is also fine.
9524
9525         * expression.cs (Binary.ResolveOperator): Check error result in
9526         two places.
9527
9528         use brtrue/brfalse directly and avoid compares to null.
9529
9530 2002-08-02  Martin Baulig  <martin@gnome.org>
9531
9532         * class.cs (TypeContainer.Define): Define all nested interfaces here.
9533         Fixes bug #28407, added test-155.cs.
9534
9535 2002-08-01  Martin Baulig  <martin@gnome.org>
9536
9537         * class.cs (Event.EmitDefaultMethod): Make this work with static
9538         events.  Fixes #28311, added verify-3.cs.
9539
9540 2002-08-01  Martin Baulig  <martin@gnome.org>
9541
9542         * statement.cs (ForeachHelperMethods): Added `enumerator_type' and
9543         `is_disposable' fields.
9544         (Foreach.GetEnumeratorFilter): Set `hm.enumerator_type' and
9545         `hm.is_disposable' if we're using the collection pattern.
9546         (Foreach.EmitCollectionForeach): Use the correct type for the
9547         enumerator's local variable, only emit the try/finally block if
9548         necessary (fixes #27713).
9549
9550 2002-08-01  Martin Baulig  <martin@gnome.org>
9551
9552         * ecore.cs (Expression.report118): Renamed to Error118 and made
9553         it public static.
9554
9555         * statement.cs (Throw.Resolve): Check whether the expression is of
9556         the correct type (CS0118) and whether the type derives from
9557         System.Exception (CS0155).
9558         (Catch.Resolve): New method.  Do the type lookup here and check
9559         whether it derives from System.Exception (CS0155).
9560         (Catch.CatchType, Catch.IsGeneral): New public properties.
9561
9562         * typemanager.cs (TypeManager.exception_type): Added.
9563
9564 2002-07-31  Miguel de Icaza  <miguel@ximian.com>
9565
9566         * driver.cs: Updated About function.
9567
9568 2002-07-31  Martin Baulig  <martin@gnome.org>
9569
9570         Implemented Control Flow Analysis.
9571
9572         * codegen.cs (EmitContext.DoFlowAnalysis): New public variable.
9573         (EmitContext.CurrentBranching): Added.
9574         (EmitContext.StartFlowBranching): Added.
9575         (EmitContext.EndFlowBranching): Added.
9576         (EmitContext.KillFlowBranching): Added.
9577         (EmitContext.IsVariableAssigned): Added.
9578         (EmitContext.SetVariableAssigned): Added.
9579         (EmitContext.IsParameterAssigned): Added.
9580         (EmitContext.SetParameterAssigned): Added.
9581         (EmitContext.EmitTopBlock): Added `InternalParameters ip' argument.
9582         Added control flow analysis stuff here.
9583
9584         * expression.cs (Unary.DoResolve): If the operator is Oper.AddressOf,
9585         resolve the expression as lvalue.
9586         (LocalVariableReference.DoResolve): Check whether the variable has
9587         already been assigned.
9588         (ParameterReference.DoResolveLValue): Override lvalue resolve to mark
9589         the parameter as assigned here.
9590         (ParameterReference.DoResolve): Check whether the parameter has already
9591         been assigned.
9592         (Argument.Resolve): If it's a `ref' or `out' argument, resolve the
9593         expression as lvalue.
9594
9595         * statement.cs (FlowBranching): New class for the flow analysis code.
9596         (Goto): Resolve the label in Resolve, not in Emit; added flow analysis.
9597         (LabeledStatement.IsDefined): New public property.
9598         (LabeledStatement.AddUsageVector): New public method to tell flow
9599         analyis that the label may be reached via a forward jump.
9600         (GotoCase): Lookup and resolve the label in Resolve, not in Emit; added
9601         flow analysis.
9602         (VariableInfo.Number): New public field.  This is used by flow analysis
9603         to number all locals of a block.
9604         (Block.CountVariables): New public property.  This is the number of
9605         local variables in this block (including the locals from all parent
9606         blocks).
9607         (Block.EmitMeta): Number all the variables.
9608
9609         * statement.cs: Added flow analysis support to all classes.
9610
9611 2002-07-31  Martin Baulig  <martin@gnome.org>
9612
9613         * driver.cs: Added "--mcs-debug" argument if MCS_DEBUG is defined.
9614         To get debugging messages, compile mcs with /define:MCS_DEBUG and
9615         then use this argument.
9616
9617         * report.cs (Report.Debug): Renamed to conditional to "MCS_DEBUG".
9618
9619         * makefile.gnu (MCS_FLAGS): Include $(MCS_DEFINES), the user may
9620         use this to specify /define options.
9621
9622 2002-07-29  Martin Baulig  <martin@gnome.org>
9623
9624         * statement.cs (Fixed): Moved all code that does variable lookups
9625         and resolvings from Emit to Resolve.
9626
9627         * statement.cs (For): Moved all code that does variable lookups
9628         and resolvings from Emit to Resolve.
9629
9630         * statement.cs (Using): Moved all code that does variable lookups
9631         and resolvings from Emit to Resolve.
9632
9633 2002-07-29  Martin Baulig  <martin@gnome.org>
9634
9635         * attribute.cs (Attribute.Resolve): Explicitly catch a
9636         System.NullReferenceException when creating the
9637         CustromAttributeBuilder and report a different warning message.
9638
9639 2002-07-29  Martin Baulig  <martin@gnome.org>
9640
9641         * support.cs (ParameterData.ParameterName): Added method to
9642         get the name of a parameter.
9643
9644         * typemanager.cs (TypeManager.IsValueType): New public method.
9645
9646 2002-07-29  Martin Baulig  <martin@gnome.org>
9647
9648         * parameter.cs (Parameter.Modifier): Added `ISBYREF = 8'.  This
9649         is a flag which specifies that it's either ref or out.
9650         (Parameter.GetParameterInfo (DeclSpace, int, out bool)): Changed
9651         the out parameter to `out Parameter.Modifier mod', also set the
9652         Parameter.Modifier.ISBYREF flag on it if it's either ref or out.
9653
9654         * support.cs (InternalParameters.ParameterModifier): Distinguish
9655         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9656         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9657
9658         * expression.cs (Argument.GetParameterModifier): Distinguish
9659         between Parameter.Modifier.OUT and Parameter.Modifier.REF, set the
9660         Parameter.Modifier.ISBYREF flag if it's either ref or out.
9661
9662 2002-07-29  Martin Baulig  <martin@gnome.org>
9663
9664         * expression.cs (ParameterReference.ParameterReference): Added
9665         `Location loc' argument to the constructor.
9666
9667         * cs-parser.jay: Pass location to ParameterReference.
9668
9669 2002-07-28  Miguel de Icaza  <miguel@ximian.com>
9670
9671         * statement.cs (Try): Initialize the location.
9672
9673         * cs-parser.jay: pass location to Try.
9674
9675         * expression.cs (Unary.Reduce): Change the prototype to return
9676         whether a constant fold could be performed or not.  The result is
9677         returned in an out parameters.  In the case of Indirection and
9678         AddressOf, we want to perform the full tests.
9679
9680 2002-07-26  Miguel de Icaza  <miguel@ximian.com>
9681
9682         * statement.cs (Statement.Emit): Flag dead code.
9683
9684 2002-07-27  Andrew Birkett  <andy@nobugs.org>
9685
9686         * expression.cs (Unary.Reduce): Handle AddressOf and Indirection.
9687
9688 2002-07-27  Martin Baulig  <martin@gnome.org>
9689
9690         * class.cs (MethodData.Define): Put back call to
9691         TypeManager.AddMethod(), accidentally commented this out.
9692
9693         * report.cs (Debug): New public method to print debugging information,
9694         this is `[Conditional ("DEBUG")]'.
9695
9696 2002-07-26  Martin Baulig  <martin@gnome.org>
9697
9698         * cs-parser.jay (CSharpParser): Added `Stack switch_stack'.
9699         (switch_statement): Push the current_block to the switch_stack and
9700         pop it again when we're done with the switch.
9701         (switch_section): The new block is a child of the current_block.
9702         Fixes bug #24007, added test-152.cs.
9703
9704 2002-07-27  Martin Baulig  <martin@gnome.org>
9705
9706         * expression.cs (Invocation.EmitArguments): When calling a varargs
9707         function with only its fixed arguments, we need to pass an empty
9708         array.
9709
9710 2002-07-27  Martin Baulig  <martin@gnome.org>
9711
9712         Mono 0.13 has been released.
9713
9714 2002-07-25  Miguel de Icaza  <miguel@ximian.com>
9715
9716         * driver.cs: Rename --resource to --linkres, because that is what
9717         we do currently, we dont support --resource yet.
9718
9719         * cs-tokenizer.cs: Fix test for reporting endif mismatches.
9720
9721 2002-07-25  Martin Baulig  <martin@gnome.org>
9722
9723         * class.cs (MethodData): New public class.  This is a `method builder'
9724         class for a method or one accessor of a Property/Indexer/Event.
9725         (MethodData.GetMethodFlags): Moved here from MemberBase.
9726         (MethodData.ApplyAttributes): Likewise.
9727         (MethodData.ApplyObsoleteAttribute): Likewise.
9728         (MethodData.ApplyConditionalAttribute): Likewise.
9729         (MethodData.ApplyDllImportAttribute): Likewise.
9730         (MethodData.CheckAbstractAndExternal): Likewise.
9731         (MethodData.Define): Formerly knows as MemberBase.DefineMethod().
9732         (MethodData.Emit): Formerly known as Method.Emit().
9733         (MemberBase): Moved everything which was specific to a single
9734         accessor/method to MethodData.
9735         (Method): Create a new MethodData and call Define() and Emit() on it.
9736         (Property, Indexer, Event): Create a new MethodData objects for each
9737         accessor and call Define() and Emit() on them.
9738
9739 2002-07-25  Martin Baulig  <martin@gnome.org>
9740
9741         Made MethodCore derive from MemberBase to reuse the code from there.
9742         MemberBase now also checks for attributes.
9743
9744         * class.cs (MethodCore): Derive from MemberBase, not MemberCore.
9745         (MemberBase.GetMethodFlags): Moved here from class Method and marked
9746         as virtual.
9747         (MemberBase.DefineAccessor): Renamed to DefineMethod(), added
9748         `CallingConventions cc' and `Attributes opt_attrs' arguments.
9749         (MemberBase.ApplyAttributes): New virtual method; applies the
9750         attributes to a method or accessor.
9751         (MemberBase.ApplyObsoleteAttribute): New protected virtual method.
9752         (MemberBase.ApplyConditionalAttribute): Likewise.
9753         (MemberBase.ApplyDllImportAttribute): Likewise.
9754         (MemberBase.CheckAbstractAndExternal): Likewise.
9755         (MethodCore.ParameterTypes): This is now a property instead of a
9756         method, it's initialized from DoDefineParameters().
9757         (MethodCore.ParameterInfo): Removed the set accessor.
9758         (MethodCore.DoDefineParameters): New protected virtual method to
9759         initialize ParameterTypes and ParameterInfo.
9760         (Method.GetReturnType): We can now simply return the MemberType.
9761         (Method.GetMethodFlags): Override the MemberBase version and add
9762         the conditional flags.
9763         (Method.CheckBase): Moved some code from Define() here, call
9764         DoDefineParameters() here.
9765         (Method.Define): Use DoDefine() and DefineMethod() from MemberBase
9766         here to avoid some larger code duplication.
9767         (Property.Emit, Indexer.Emit): Call CheckAbstractAndExternal() to
9768         ensure that abstract and external accessors don't declare a body.
9769
9770         * attribute.cs (Attribute.GetValidPieces): Make this actually work:
9771         `System.Attribute.GetCustomAttributes (attr.Type)' does a recursive
9772         lookup in the attribute's parent classes, so we need to abort as soon
9773         as we found the first match.
9774         (Attribute.Obsolete_GetObsoleteMessage): Return the empty string if
9775         the attribute has no arguments.
9776
9777         * typemanager.cs (TypeManager.AddMethod): Now takes a MemberBase instead
9778         of a Method.
9779
9780 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9781
9782         * cs-parser.jay: reverted previous patch.
9783
9784 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9785
9786         * cs-parser.jay: fixed bug #22119.
9787
9788 2002-07-24  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9789
9790         * attribute.cs: fixed compilation. The error was:
9791         "attribute.cs(571,17): error CS0177: The out parameter 'is_error' must 
9792         be assigned to before control leaves the current method."
9793         [FIXME:  Filed as bug #28186: MCS must report this error.]
9794
9795 2002-07-25  Martin Baulig  <martin@gnome.org>
9796
9797         * attribute.cs (Attribute.Conditional_GetConditionName): New static
9798         method to pull the condition name ouf of a Conditional attribute.
9799         (Attribute.Obsolete_GetObsoleteMessage): New static method to pull
9800         the obsolete message and error flag out of an Obsolete attribute.
9801
9802         * class.cs (Method.GetMethodFlags): New public method to get the
9803         TypeManager.MethodFlags for this method.
9804         (Method.ApplyConditionalAttribute, Method.ApplyObsoleteAttribute): New
9805         private methods.
9806         (Method.Define): Get and apply the Obsolete and Conditional attributes;
9807         if we're overriding a virtual function, set the new private variable
9808         `parent_method'; call the new TypeManager.AddMethod().
9809
9810         * typemanager.cs (TypeManager.AddMethod): New static method.  Stores
9811         the MethodBuilder and the Method in a PtrHashtable.
9812         (TypeManager.builder_to_method): Added for this purpose.
9813         (TypeManager.MethodFlags): Added IsObsoleteError.
9814         (TypeManager.GetMethodFlags): Added `Location loc' argument.  Lookup
9815         Obsolete and Conditional arguments in MethodBuilders.  If we discover
9816         an Obsolete attribute, emit an appropriate warning 618 / error 619 with
9817         the message from the attribute.
9818
9819 2002-07-24  Martin Baulig  <martin@gnome.org>
9820
9821         * cs-tokenizer.cs: Eat up trailing whitespaces and one-line comments in
9822         preprocessor directives, ensure that the argument to #define/#undef is
9823         exactly one identifier and that it's actually an identifier.
9824
9825         Some weeks ago I did a `#define DEBUG 1' myself and wondered why this
9826         did not work ....
9827
9828 2002-07-24  Martin Baulig  <martin@gnome.org>
9829
9830         * statement.cs (Foreach.ForeachHelperMethods): Added `Type element_type',
9831         initialize it to TypeManager.object_type in the constructor.
9832         (Foreach.GetEnumeratorFilter): Set `hm.element_type' to the return type
9833         of the `hm.get_current' method if we're using the collection pattern.
9834         (Foreach.EmitCollectionForeach): Use `hm.element_type' as the source type
9835         for the explicit conversion to make it work when we're using the collection
9836         pattern and the `Current' property has a different return type than `object'.
9837         Fixes #27713.
9838
9839 2002-07-24  Martin Baulig  <martin@gnome.org>
9840
9841         * delegate.cs (Delegate.VerifyMethod): Simply return null if the method
9842         does not match, but don't report any errors.  This method is called in
9843         order for all methods in a MethodGroupExpr until a matching method is
9844         found, so we don't want to bail out if the first method doesn't match.
9845         (NewDelegate.DoResolve): If none of the methods in the MethodGroupExpr
9846         matches, report the 123.  Fixes #28070.
9847
9848 2002-07-24  Martin Baulig  <martin@gnome.org>
9849
9850         * expression.cs (ArrayAccess.EmitStoreOpcode): Moved the
9851         TypeManager.TypeToCoreType() to the top of the method so the
9852         following equality checks will work.  Fixes #28107.
9853
9854 2002-07-24  Martin Baulig  <martin@gnome.org>
9855
9856         * cfold.cs (ConstantFold.DoConstantNumericPromotions): "If either
9857         operand is of type uint, and the other operand is of type sbyte,
9858         short or int, the operands are converted to type long." -
9859         Actually do what this comment already told us.  Fixes bug #28106,
9860         added test-150.cs.
9861
9862 2002-07-24  Martin Baulig  <martin@gnome.org>
9863
9864         * class.cs (MethodBase): New abstract class.  This is now a base
9865         class for Property, Indexer and Event to avoid some code duplication
9866         in their Define() and DefineMethods() methods.
9867         (MethodBase.DoDefine, MethodBase.DefineAccessor): Provide virtual
9868         generic methods for Define() and DefineMethods().
9869         (FieldBase): Derive from MemberBase, not MemberCore.
9870         (Property): Derive from MemberBase, not MemberCore.
9871         (Property.DefineMethod): Moved all the code from this method to the
9872         new MethodBase.DefineAccessor(), just call it with appropriate
9873         argumetnts.
9874         (Property.Define): Call the new Property.DoDefine(), this does some
9875         sanity checks and we don't need to duplicate the code everywhere.
9876         (Event): Derive from MemberBase, not MemberCore.
9877         (Event.Define): Use the new MethodBase.DefineAccessor() to define the
9878         accessors, this will also make them work with interface events.
9879         (Indexer): Derive from MemberBase, not MemberCore.
9880         (Indexer.DefineMethod): Removed, call MethodBase.DefineAccessor() insstead.
9881         (Indexer.Define): Use the new MethodBase functions.
9882
9883         * interface.cs (InterfaceEvent.InterfaceEvent): Added `Location loc'
9884         argument to the constructor.
9885         (Interface.FindMembers): Added support for interface events.
9886         (Interface.PopluateEvent): Implemented.
9887
9888         Added test-149.cs for this.  This also fixes bugs #26067 and #24256.
9889
9890 2002-07-22  Miguel de Icaza  <miguel@ximian.com>
9891
9892         * class.cs (TypeContainer.AddMethod): Adding methods do not use IsValid,
9893         but this is required to check for a method name being the same as
9894         the containing class.  
9895
9896         Handle this now.
9897
9898 2002-07-22  Gonzalo Paniagua Javier <gonzalo@ximian.com>
9899
9900         * interface.cs: initialize variable.
9901
9902 2002-07-23  Martin Baulig  <martin@gnome.org>
9903
9904         Implemented the IndexerName attribute in interfaces.
9905
9906         * class.cs (TypeContainer.DefineIndexers): Don't set the indexer
9907         name if this is an explicit interface implementation.
9908         (Indexer.InterfaceIndexerName): New public variable.  If we're
9909         implementing an interface indexer, this is the IndexerName in that
9910         interface.  Otherwise, it's the IndexerName.
9911         (Indexer.DefineMethod): If we're implementing interface indexer,
9912         set InterfaceIndexerName.  Use the new Pending.IsInterfaceIndexer
9913         and Pending.ImplementIndexer methods.
9914         (Indexer.Define): Also define the PropertyBuilder if we're
9915         implementing an interface indexer and this is neither an explicit
9916         interface implementation nor do the IndexerName match the one in
9917         the interface.
9918
9919         * pending.cs (TypeAndMethods): Added `MethodInfo [] need_proxy'.
9920         If a method is defined here, then we always need to create a proxy
9921         for it.  This is used when implementing interface indexers.
9922         (Pending.IsInterfaceIndexer): New public method.
9923         (Pending.ImplementIndexer): New public method.
9924         (Pending.InterfaceMethod): Added `MethodInfo need_proxy' argument.
9925         This is used when implementing interface indexers to define a proxy
9926         if necessary.
9927         (Pending.VerifyPendingMethods): Look in the `need_proxy' array and
9928         define a proxy if necessary.
9929
9930         * interface.cs (Interface.IndexerName): New public variable.
9931         (Interface.PopulateIndexer): Set the IndexerName.
9932         (Interface.DefineIndexers): New private method.  Populate all the
9933         indexers and make sure their IndexerNames match.
9934
9935         * typemanager.cs (IndexerPropertyName): Added support for interface
9936         indexers.
9937
9938 2002-07-22  Martin Baulig  <martin@gnome.org>
9939
9940         * codegen.cs (EmitContext.HasReturnLabel): New public variable.
9941         (EmitContext.EmitTopBlock): Always mark the ReturnLabel and emit a
9942         ret if HasReturnLabel.
9943         (EmitContext.TryCatchLevel, LoopBeginTryCatchLevel): New public
9944         variables.
9945
9946         * statement.cs (Do.Emit, While.Emit, For.Emit, Foreach.Emit): Save
9947         and set the ec.LoopBeginTryCatchLevel.
9948         (Try.Emit): Increment the ec.TryCatchLevel while emitting the block.
9949         (Continue.Emit): If the ec.LoopBeginTryCatchLevel is smaller than
9950         the current ec.TryCatchLevel, the branch goes out of an exception
9951         block.  In this case, we need to use Leave and not Br.
9952
9953 2002-07-22  Martin Baulig  <martin@gnome.org>
9954
9955         * statement.cs (Try.Emit): Emit an explicit ret after the end of the
9956         block unless the block does not always return or it is contained in
9957         another try { ... } catch { ... } block.  Fixes bug #26506.
9958         Added verify-1.cs to the test suite.
9959
9960 2002-07-22  Martin Baulig  <martin@gnome.org>
9961
9962         * statement.cs (Switch.TableSwitchEmit): If we don't have a default,
9963         then we do not always return.  Fixes bug #24985.
9964
9965 2002-07-22  Martin Baulig  <martin@gnome.org>
9966
9967         * expression.cs (Invocation.OverloadedResolve): Do the BetterFunction()
9968         lookup on a per-class level; ie. walk up the class hierarchy until we
9969         found at least one applicable method, then choose the best among them.
9970         Fixes bug #24463 and test-29.cs.
9971
9972 2002-07-22  Martin Baulig  <martin@gnome.org>
9973
9974         * typemanager.cs (TypeManager.ArrayContainsMethod): Don't check the
9975         return types of the methods.  The return type is not part of the
9976         signature and we must not check it to make the `new' modifier work.
9977         Fixes bug #27999, also added test-147.cs.
9978         (TypeManager.TypeToCoreType): Added TypeManager.type_type.
9979
9980         * expression.cs (Invocation.DoResolve): Call TypeManager.TypeToCoreType()
9981         on the method's return type.
9982
9983 2002-07-21  Martin Baulig  <martin@gnome.org>
9984
9985         * assign.cs: Make this work if the rightmost source is a constant and
9986         we need to do an implicit type conversion.  Also adding a few more tests
9987         to test-38.cs which should have caught this.
9988
9989         * makefile.gnu: Disable debugging, there's already the mcs-mono2.exe
9990         target in the makefile for this.  The makefile.gnu is primarily intended
9991         for end-users who don't want to debug the compiler.
9992
9993 2002-07-21  Martin Baulig  <martin@gnome.org>
9994
9995         * assign.cs: Improved the Assign class so it can now handle embedded
9996         assignments (X = Y = Z = something).  As a side-effect this'll now also
9997         consume less local variables.  test-38.cs now passes with MCS, added
9998         a few new test cases to that test.
9999
10000 2002-07-20  Martin Baulig  <martin@gnome.org>
10001
10002         * expression.cs (Binary.EmitBranchable): Emit correct unsigned branch
10003         instructions.  Fixes bug #27977, also added test-146.cs.
10004
10005 2002-07-19  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10006
10007         * cs-tokenizer.cs: fixed getHex ().
10008
10009 2002-07-19  Martin Baulig  <martin@gnome.org>
10010
10011         * expression.cs (Invocation.EmitParams): Use TypeManager.LookupType(),
10012         not Type.GetType() to lookup the array type.  This is needed when
10013         we're constructing an array of a user-defined type.
10014         (ArrayAccess.EmitDynamicInitializers): Only emit the Ldelema for
10015         single-dimensional arrays, but also for single-dimensial arrays of
10016         type decimal.
10017
10018 2002-07-19  Martin Baulig  <martin@gnome.org>
10019
10020         * expression.cs (New.DoEmit): Create a new LocalTemporary each time
10021         this function is called, it's not allowed to share LocalBuilders
10022         among ILGenerators.
10023
10024 2002-07-19  Martin Baulig  <martin@gnome.org>
10025
10026         * expression.cs (Argument.Resolve): Report an error 118 when trying
10027         to pass a type as argument.
10028
10029 2002-07-18  Martin Baulig  <martin@gnome.org>
10030
10031         * ecore.cs (Expression.ImplicitNumericConversion): Don't emit a
10032         Conv_R_Un for the signed `long' type.
10033
10034 2002-07-15  Miguel de Icaza  <miguel@ximian.com>
10035
10036         * expression.cs (MemberAccess.DoResolve): Do not reuse the field
10037         `expr' for the temporary result, as that will fail if we do
10038         multiple resolves on the same expression.
10039
10040 2002-07-05  Miguel de Icaza  <miguel@ximian.com>
10041
10042         * ecore.cs (SimpleNameResolve): Use ec.DeclSpace instead of
10043         ec.TypeContainer for looking up aliases. 
10044
10045         * class.cs (TypeContainer): Remove LookupAlias from here.
10046
10047         * decl.cs (DeclSpace); Move here.
10048
10049 2002-07-01  Miguel de Icaza  <miguel@ximian.com>
10050
10051         * class.cs (FindMembers): Only call filter if the constructor
10052         bulider is not null.
10053
10054         Also handle delegates in `NestedTypes' now.  Now we will perform
10055         type lookups using the standard resolution process.  This also
10056         fixes a bug.
10057
10058         * decl.cs (DeclSpace.ResolveType): New type resolution routine.
10059         This uses Expressions (the limited kind that can be parsed by the
10060         tree) instead of strings.
10061
10062         * expression.cs (ComposedCast.ToString): Implement, used to flag
10063         errors since now we have to render expressions.
10064
10065         (ArrayCreation): Kill FormElementType.  Use ComposedCasts in
10066         FormArrayType. 
10067
10068         * ecore.cs (SimpleName.ToString): ditto.
10069
10070         * cs-parser.jay: Instead of using strings to assemble types, use
10071         Expressions to assemble the type (using SimpleName, ComposedCast,
10072         MemberAccess).  This should fix the type lookups in declarations,
10073         because we were using a different code path for this.
10074
10075         * statement.cs (Block.Resolve): Continue processing statements
10076         even when there is an error.
10077
10078 2002-07-17  Miguel de Icaza  <miguel@ximian.com>
10079
10080         * class.cs (Event.Define): Also remove the `remove' method from
10081         the list of pending items.
10082
10083         * expression.cs (ParameterReference): Use ldarg.N (0..3) to
10084         generate more compact code. 
10085
10086 2002-07-17  Martin Baulig  <martin@gnome.org>
10087
10088         * const.cs (Const.LookupConstantValue): Add support for constant
10089         `unchecked' and `checked' expressions.
10090         Also adding test case test-140.cs for this.
10091
10092 2002-07-17  Martin Baulig  <martin@gnome.org>
10093
10094         * statement.cs (Foreach.GetEnumeratorFilter): When compiling corlib,
10095         check whether mi.ReturnType implements the IEnumerator interface; the
10096         `==' and the IsAssignableFrom() will fail in this situation.
10097
10098 2002-07-16  Ravi Pratap  <ravi@ximian.com>
10099
10100         * ecore.cs (SimpleName.SimpleNameResolve) : Apply Gonzalo's fix 
10101         here too.
10102
10103 2002-07-16  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10104
10105         * expression.cs: fixed bug #27811.
10106
10107 2002-07-14  Miguel de Icaza  <miguel@ximian.com>
10108
10109         * expression.cs (ParameterReference.AddressOf): Patch from Paolo
10110         Molaro: when we are a ref, the value already contains a pointer
10111         value, do not take the address of it.
10112
10113 2002-07-14 Rafael Teixeira <rafaelteixeirabr@hotmail.com>
10114         * removed mb-parser.jay and mb-tokenizer.cs
10115
10116 Sat Jul 13 19:38:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10117
10118         * expression.cs: check against the building corlib void type.
10119
10120 Sat Jul 13 19:35:58 CEST 2002 Paolo Molaro <lupus@ximian.com>
10121
10122         * ecore.cs: fix for valuetype static readonly fields: when 
10123         initializing them, we need their address, not the address of a copy.
10124
10125 Sat Jul 13 17:32:53 CEST 2002 Paolo Molaro <lupus@ximian.com>
10126
10127         * typemanager.cs: register also enum_type in corlib.
10128
10129 Sat Jul 13 15:59:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10130
10131         * class.cs: allow calling this (but not base) initializers in structs.
10132
10133 Sat Jul 13 15:12:06 CEST 2002 Paolo Molaro <lupus@ximian.com>
10134
10135         * ecore.cs: make sure we compare against the building base types
10136         in GetTypeSize ().
10137
10138 Sat Jul 13 15:10:32 CEST 2002 Paolo Molaro <lupus@ximian.com>
10139
10140         * typemanager.cs: fix TypeToCoreType() to handle void and object
10141         (corlib gets no more typerefs after this change).
10142
10143 2002-07-12  Miguel de Icaza  <miguel@ximian.com>
10144
10145         * expression.cs (ArrayCreation.EmitArrayArguments): use
10146         Conv.Ovf.U4 for unsigned and Conv.Ovf.I4 for signed.
10147
10148         (ArrayAccess.LoadArrayAndArguments): Use Conv_Ovf_I and
10149         Conv_Ovf_I_Un for the array arguments.  Even if C# allows longs as
10150         array indexes, the runtime actually forbids them.
10151
10152         * ecore.cs (ExpressionToArrayArgument): Move the conversion code
10153         for array arguments here.
10154
10155         * expression.cs (EmitLoadOpcode): System.Char is a U2, use that
10156         instead of the default for ValueTypes.
10157
10158         (New.DoEmit): Use IsValueType instead of
10159         IsSubclassOf (value_type)
10160         (New.DoResolve): ditto.
10161         (Invocation.EmitCall): ditto.
10162
10163         * assign.cs (Assign): ditto.
10164
10165         * statement.cs (Unsafe): Ok, so I got the semantics wrong.
10166         Statements *are* currently doing part of their resolution during
10167         Emit.  
10168
10169         Expressions do always resolve during resolve, but statements are
10170         only required to propagate resolution to their children.
10171
10172 2002-07-11  Miguel de Icaza  <miguel@ximian.com>
10173
10174         * driver.cs (CSCParseOption): Finish the /r: and /lib: support.
10175
10176         (LoadAssembly): Do not add the dll if it is already specified
10177
10178         (MainDriver): Add the System directory to the link path at the end,
10179         after all the other -L arguments. 
10180
10181         * expression.cs (ArrayAccess.EmitLoadOpcode): I was using the
10182         wrong opcode for loading bytes and bools (ldelem.i1 instead of
10183         ldelem.u1) and using the opposite for sbytes.
10184
10185         This fixes Digger, and we can finally run it.
10186
10187         * driver.cs (UnixParseOption): Move the option parsing here.  
10188         (CSCParseOption): Implement CSC-like parsing of options.
10189
10190         We now support both modes of operation, the old Unix way, and the
10191         new CSC-like way.  This should help those who wanted to make cross
10192         platform makefiles.
10193
10194         The only thing broken is that /r:, /reference: and /lib: are not
10195         implemented, because I want to make those have the same semantics
10196         as the CSC compiler has, and kill once and for all the confussion
10197         around this.   Will be doing this tomorrow.
10198
10199         * statement.cs (Unsafe.Resolve): The state is checked during
10200         resolve, not emit, so we have to set the flags for IsUnsfe here.
10201
10202 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10203
10204         * expression.cs (MemberAccess.ResolveMemberAccess): Since we can
10205         not catch the Error_ObjectRefRequired in SimpleName (as it is
10206         possible to have a class/instance variable name that later gets
10207         deambiguated), we have to check this here.      
10208
10209 2002-07-10  Ravi Pratap  <ravi@ximian.com>
10210
10211         * class.cs (TypeContainer.GetFieldFromEvent): Move away from here,
10212         make static and put into Expression.
10213
10214         (Event.Define): Register the private field of the event with the 
10215         TypeManager so that GetFieldFromEvent can get at it.
10216
10217         (TypeManager.RegisterPrivateFieldOfEvent): Implement to
10218         keep track of the private field associated with an event which
10219         has no accessors.
10220
10221         (TypeManager.GetPrivateFieldOfEvent): Implement to get at the
10222         private field.
10223
10224         * ecore.cs (GetFieldFromEvent): RE-write to use the above methods.
10225
10226 2002-07-10  Miguel de Icaza  <miguel@ximian.com>
10227
10228         * expression.cs (Binary.EmitBranchable): this routine emits the
10229         Binary expression in a branchable context.  This basically means:
10230         we need to branch somewhere, not just get the value on the stack.
10231
10232         This works together with Statement.EmitBoolExpression.
10233
10234         * statement.cs (Statement.EmitBoolExpression): Use
10235         EmitBranchable. 
10236
10237 2002-07-09  Miguel de Icaza  <miguel@ximian.com>
10238
10239         * statement.cs (For): Reduce the number of jumps in loops.
10240
10241         (For): Implement loop inversion for the For statement.
10242
10243         (Break): We can be breaking out of a Try/Catch controlled section
10244         (foreach might have an implicit try/catch clause), so we need to
10245         use Leave instead of Br.
10246
10247         * ecore.cs (FieldExpr.AddressOf): Fix for test-139 (augmented
10248         now).  If the instace expression supports IMemoryLocation, we use
10249         the AddressOf method from the IMemoryLocation to extract the
10250         address instead of emitting the instance.
10251
10252         This showed up with `This', as we were emitting the instance
10253         always (Emit) instead of the Address of This.  Particularly
10254         interesting when This is a value type, as we dont want the Emit
10255         effect (which was to load the object).
10256
10257 2002-07-08  Miguel de Icaza  <miguel@ximian.com>
10258
10259         * attribute.cs: Pass the entry point to the DefinePInvokeMethod
10260
10261         * statement.cs (Checked): Set the CheckedState during the resolve
10262         process too, as the ConvCast operations track the checked state on
10263         the resolve process, and not emit.
10264
10265         * cs-parser.jay (namespace_member_declaration): Flag that we have
10266         found a declaration when we do.  This is used to flag error 1529
10267
10268         * driver.cs: Report ok when we display the help only.
10269
10270 2002-07-06  Andrew Birkett  <adb@tardis.ed.ac.uk>
10271
10272         * cs-tokenizer.cs (xtoken): Improve handling of string literals.
10273
10274 2002-07-04  Miguel de Icaza  <miguel@ximian.com>
10275
10276         * cs-tokenizer.cs (define): We also have to track locally the
10277         defines.  AllDefines is just used for the Conditional Attribute,
10278         but we also need the local defines for the current source code. 
10279
10280 2002-07-03  Miguel de Icaza  <miguel@ximian.com>
10281
10282         * statement.cs (While, For, Do): These loops can exit through a
10283         Break statement, use this information to tell whether the
10284         statement is the last piece of code.
10285
10286         (Break): Flag that we break.
10287
10288         * codegen.cs (EmitContexts): New `Breaks' state variable.
10289
10290 2002-07-03  Martin Baulig  <martin@gnome.org>
10291
10292         * class.cs (TypeContainer.MethodModifiersValid): Allow override
10293         modifiers in method declarations in structs.  Otherwise, you won't
10294         be able to override things like Object.Equals().
10295
10296 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10297
10298         * class.cs (Method, Property, Indexer): Do not allow the public
10299         modifier to be used in explicit interface implementations.
10300
10301         (TypeContainer.MethodModifiersValid): Catch virtual, abstract and
10302         override modifiers in method declarations in structs
10303
10304 2002-07-02   Andrew Birkett <adb@tardis.ed.ac.uk>
10305
10306         * cs-tokenizer.cs (adjust_int, adjust_real): Do not abort on
10307         integer or real overflow, report an error
10308
10309 2002-07-02  Martin Baulig  <martin@gnome.org>
10310
10311         * typemanager.cs (TypeManager.InitCoreTypes): When compiling
10312         corlib, dynamically call AssemblyBuilder.SetCorlibTypeBuilders()
10313         to tell the runtime about our newly created System.Object and
10314         System.ValueType types.
10315
10316 2002-07-02  Miguel de Icaza  <miguel@ximian.com>
10317
10318         * expression.cs (This): Use Stobj/Ldobj when we are a member of a
10319         struct instead of Ldarg/Starg.
10320
10321 2002-07-02  Martin Baulig  <martin@gnome.org>
10322
10323         * expression.cs (Indirection.Indirection): Call
10324         TypeManager.TypeToCoreType() on `expr.Type.GetElementType ()'.
10325
10326 2002-07-02  Martin Baulig  <martin@gnome.org>
10327
10328         * expression.cs (ArrayAccess.EmitStoreOpcode): If the type is a
10329         ValueType, call TypeManager.TypeToCoreType() on it.
10330         (Invocations.EmitParams): Call TypeManager.TypeToCoreType() on
10331         the OpCodes.Newarr argument.
10332
10333 2002-07-02  Martin Baulig  <martin@gnome.org>
10334
10335         * expression.cs (Invocation.EmitCall): When compiling corlib,
10336         replace all calls to the system's System.Array type to calls to
10337         the newly created one.
10338
10339         * typemanager.cs (TypeManager.InitCodeHelpers): Added a few more
10340         System.Array methods.
10341         (TypeManager.InitCoreTypes): When compiling corlib, get the methods
10342         from the system's System.Array type which must be replaced.
10343
10344 Tue Jul 2 19:05:05 CEST 2002 Paolo Molaro <lupus@ximian.com>
10345
10346         * typemanager.cs: load unverifiable_code_ctor so we can build
10347         corlib using the correct type. Avoid using GetTypeCode() with
10348         TypeBuilders.
10349         * rootcontext.cs: uses TypeManager.unverifiable_code_ctor and
10350         TypeManager.object_type to allow building corlib.
10351
10352 Tue Jul 2 19:03:19 CEST 2002 Paolo Molaro <lupus@ximian.com>
10353
10354         * ecore.cs: handle System.Enum separately in LoadFromPtr().
10355
10356 2002-07-01  Martin Baulig  <martin@gnome.org>
10357
10358         * class.cs: Make the last change actually work, we need to check
10359         whether `ifaces != null' to avoid a crash.
10360
10361 Mon Jul 1 16:15:03 CEST 2002 Paolo Molaro <lupus@ximian.com>
10362
10363         * class.cs: when we build structs without fields that implement
10364         interfaces, we need to add the interfaces separately, since there is
10365         no API to both set the size and add the interfaces at type creation
10366         time.
10367
10368 Mon Jul 1 14:50:47 CEST 2002 Paolo Molaro <lupus@ximian.com>
10369
10370         * expression.cs: the dimension arguments to the array constructors
10371         need to be converted if they are a long.
10372
10373 Mon Jul 1 12:26:12 CEST 2002 Paolo Molaro <lupus@ximian.com>
10374
10375         * class.cs: don't emit ldarg.0 if there is no parent constructor
10376         (fixes showstopper for corlib).
10377
10378 2002-06-29  Martin Baulig  <martin@gnome.org>
10379
10380         MCS now compiles corlib on GNU/Linux :-)
10381
10382         * attribute.cs (Attribute.ApplyAttributes): Treat Accessors like Method,
10383         ie. check for MethodImplOptions.InternalCall.
10384
10385         * class.cs (TypeContainer.DefineType): When compiling corlib, both parent
10386         and TypeManager.attribute_type are null, so we must explicitly check
10387         whether parent is not null to find out whether it's an attribute type.
10388         (Property.Emit): Always call Attribute.ApplyAttributes() on the GetBuilder
10389         and SetBuilder, not only if the property is neither abstract nor external.
10390         This is necessary to set the MethodImplOptions on the accessor methods.
10391         (Indexer.Emit): Call Attribute.ApplyAttributes() on the GetBuilder and
10392         SetBuilder, see Property.Emit().
10393
10394         * rootcontext.cs (RootContext.PopulateTypes): When compiling corlib, don't
10395         populate "System.Object", "System.ValueType" and "System.Attribute" since
10396         they've already been populated from BootCorlib_PopulateCoreTypes().
10397
10398 2002-06-29  Martin Baulig  <martin@gnome.org>
10399
10400         * ecore.cs (Expression.ImplicitReferenceConversionExists): If expr
10401         is the NullLiteral, we also need to make sure that target_type is not
10402         an enum type.   
10403
10404 2002-06-29  Martin Baulig  <martin@gnome.org>
10405
10406         * rootcontext.cs (RootContext.ResolveCore): We must initialize
10407         `TypeManager.multicast_delegate_type' and `TypeManager.delegate_type'
10408         before calling BootstrapCorlib_ResolveDelegate ().
10409
10410 2002-06-27  Gonzalo Paniagua Javier <gonzalo@ximian.com>
10411
10412         * statement.cs: fixed build-breaker. All tests passed ok.
10413
10414 2002-06-27  Martin Baulig  <martin@gnome.org>
10415
10416         * typemanager.cs (TypeManager.VerifyUnManaged): Added explicit check
10417         for System.Decimal when compiling corlib.
10418
10419 2002-06-27  Martin Baulig  <martin@gnome.org>
10420
10421         * statement.cs (Switch.TableSwitchEmit): Make this work with empty
10422         switch blocks which contain nothing but a default clause.
10423
10424 2002-06-26  Andrew  <adb@tardis.ed.ac.uk>
10425
10426        * ../errors/cs1501-3.cs: Added new test for struct ctr typechecks.
10427
10428 2002-06-27  Martin Baulig  <martin@gnome.org>
10429
10430         * ecore.cs (PropertyExpr.PropertyExpr): Call
10431         TypeManager.TypeToCoreType() on the `pi.PropertyType'.
10432
10433         * typemanager.cs (TypeManager.TypeToCoreType): Return if the type
10434         is already a TypeBuilder.
10435
10436 2002-06-27  Martin Baulig  <martin@gnome.org>
10437
10438         * ecore.cs (Expression.ImplicitReferenceConversionExists): Use
10439         `target_type == TypeManager.array_type', not IsAssignableFrom() in
10440         the "from an array-type to System.Array" case.  This makes it work
10441         when compiling corlib.
10442
10443 2002-06-27  Martin Baulig  <martin@gnome.org>
10444
10445         * ecore.cs (Expression.SimpleNameResolve): If the expression is a
10446         non-static PropertyExpr, set its InstanceExpression.  This makes
10447         the `ICollection.Count' property work in System/Array.cs.
10448
10449 2002-06-25  Andrew Birkett  <adb@tardis.ed.ac.uk>
10450
10451         * driver.cs: Made error handling more consistent.  Errors now
10452         tracked by Report class, so many methods which used to return int
10453         now return void.  Main() now prints success/failure and 
10454         errors/warnings message.
10455
10456         Renamed '--probe' compiler argument to '--expect-error'.  Removed
10457         the magic number return values (123 and 124).  Now, if the
10458         expected error occurs, the compiler exits with success (exit value
10459         0).  If the compilation completes without seeing that particular
10460         error, the compiler exits with failure (exit value 1).  The
10461         makefile in mcs/errors has been changed to handle the new behaviour.
10462
10463         * report.cs: Made 'expected error' number a property and renamed
10464         it from 'Probe' to 'ExpectedError'.
10465
10466         * genericparser.cs: Removed error handling support, since it is
10467         now all done by Report class.
10468
10469         * cs-parser.jay, mb-parser.jay: Errors are tracked by Report
10470         class, so parse() no longer returns an int.
10471
10472         * namespace.cs: Use Report.Error instead of GenericParser.error
10473
10474 2002-06-22  Miguel de Icaza  <miguel@ximian.com>
10475
10476         * class.cs (TypeContainer.AddMethod, TypeContainer.AddIndexer,
10477         TypeContainer.AddOperator): At the front of the list put the
10478         explicit implementations, so they get resolved/defined first. 
10479
10480 2002-06-21  Miguel de Icaza  <miguel@ximian.com>
10481
10482         * class.cs (TypeContainer.VerifyImplements): Verifies that a given
10483         interface type is implemented by this TypeContainer.  Used during
10484         explicit interface implementation.
10485
10486         (Property.Define, Indexer.Define, Method.Define): Validate that
10487         the given interface in the explicit implementation is one of the
10488         base classes for the containing type.
10489
10490         Also if we are explicitly implementing an interface, but there is
10491         no match in the pending implementation table, report an error.
10492
10493         (Property.Define): Only define the property if we are
10494         not explicitly implementing a property from an interface.  Use the
10495         correct name also for those properties (the same CSC uses,
10496         although that is really not needed).
10497
10498         (Property.Emit): Do not emit attributes for explicitly implemented
10499         properties, as there is no TypeBuilder.
10500
10501         (Indexer.Emit): ditto.
10502
10503         Hiding then means that we do not really *implement* a pending
10504         implementation, which makes code fail.
10505
10506 2002-06-22  Martin Baulig  <martin@gnome.org>
10507
10508         * ecore.cs (Expression.Constantify): Call TypeManager.TypeToCoreType() on
10509         the return value of Object.GetType().  [FIXME: we need to do this whenever
10510         we get a type back from the reflection library].
10511
10512 Fri Jun 21 13:37:57 CEST 2002 Paolo Molaro <lupus@ximian.com>
10513
10514         * typemanager.cs: make ExpandInterfaces() slip duplicated interfaces.
10515
10516 2002-06-20  Miguel de Icaza  <miguel@ximian.com>
10517
10518         * attribute.cs: Return null if we can not look up the type.
10519
10520         * class.cs (TypeContainer.GetClassBases): Use ExpandInterfaces on
10521         the interface types found.
10522
10523         * interface.cs (Interface.GetInterfaceBases): Use ExpandInterfaces on the
10524         interface types found.
10525
10526         * typemanager.cs (GetInterfaces): Make this routine returns alll
10527         the interfaces and work around the lame differences between
10528         System.Type and System.Reflection.Emit.TypeBuilder in the results
10529         result for GetInterfaces.
10530
10531         (ExpandInterfaces): Given an array of interface types, expand and
10532         eliminate repeated ocurrences of an interface.  This expands in
10533         context like: IA; IB : IA; IC : IA, IB; the interface "IC" to
10534         be IA, IB, IC.
10535
10536 2002-06-21  Martin Baulig  <martin@gnome.org>
10537
10538         * typemanager.cs (TypeManager.EnumToUnderlying): It's now safe to call this function
10539         on System.Enum.
10540
10541 2002-06-21  Martin Baulig  <martin@gnome.org>
10542
10543         * typemanager.cs (TypeManager.TypeToCoreType): New function.  When compiling corlib
10544         and called with one of the core types, return the corresponding typebuilder for
10545         that type.
10546
10547         * expression.cs (ArrayAccess.DoResolve): Call TypeManager.TypeToCoreType() on the
10548         element type.
10549
10550 2002-06-21  Martin Baulig  <martin@gnome.org>
10551
10552         * ecore.cs (Expression.ExplicitReferenceConversionExists): Use
10553         `target_type.IsArray' instead of `target_type.IsSubclassOf (TypeManager.array_type)'.
10554         (Expression.ConvertReferenceExplicit): Likewise.
10555
10556         * expression.cs (ElementAccess.DoResolve): Likewise.
10557         (ElementAccess.DoResolveLValue): Likewise.
10558
10559 2002-06-10  Martin Baulig  <martin@gnome.org>
10560
10561         * interface.cs (Interface.PopulateIndexer): When creating the setter, we need to
10562         add the "value" parameter to the parameter list.
10563
10564         * statement.cs (Fixed.Emit): Pass the return value of the child block's Emit()
10565         to our caller.
10566
10567 2002-06-19  Miguel de Icaza  <miguel@ximian.com>
10568
10569         * expression.cs (ArrayCreation.ExpressionToArrayArgument): Convert
10570         the argument to an int, uint, long or ulong, per the spec.  Also
10571         catch negative constants in array creation.
10572
10573 Thu Jun 20 17:56:48 CEST 2002 Paolo Molaro <lupus@ximian.com>
10574
10575         * class.cs: do not allow the same interface to appear twice in
10576         the definition list.
10577
10578 Wed Jun 19 22:33:37 CEST 2002 Paolo Molaro <lupus@ximian.com>
10579
10580         * ecore.cs: don't use ldlen with System.Array.
10581
10582 Wed Jun 19 20:57:40 CEST 2002 Paolo Molaro <lupus@ximian.com>
10583
10584         * ecore.cs: stobj requires a type argument. Handle indirect stores on enums.
10585
10586 Wed Jun 19 20:17:59 CEST 2002 Paolo Molaro <lupus@ximian.com>
10587
10588         * modifiers.cs: produce correct field attributes for protected
10589         internal. Easy fix so miguel can work on ther harder stuff:-)
10590
10591 2002-06-18  Miguel de Icaza  <miguel@ximian.com>
10592
10593         * pending.cs: New file.  Move the code from class.cs here.
10594         Support clearning the pending flag for all methods (when not doing
10595         explicit interface implementation).
10596
10597 Tue Jun 18 10:36:22 CEST 2002 Paolo Molaro <lupus@ximian.com>
10598
10599         * rootcontext.cs: added a couple more types needed to bootstrap.
10600
10601 2002-06-17  Miguel de Icaza  <miguel@ximian.com>
10602
10603         * typemanager.cs (GetConstructor): Use DeclaredOnly to look the
10604         constructor in the type, instead of any constructor in the type
10605         hierarchy.  Thanks to Paolo for finding this bug (it showed up as
10606         a bug in the Mono runtime when applying the params attribute). 
10607
10608 2002-06-16  Rafael Teixeira  <rafaelteixeirabr@hotmail.com>
10609         * changed namespace.cs to use "GenericParser.error(...)" instead of "CSharpParser.error(...)"
10610
10611 2002-06-14  Rachel Hestilow  <hestilow@ximian.com>
10612
10613         * expression.cs (Unary.ResolveOperator): Use TypeManager
10614         to resolve the type.
10615
10616 2002-06-13  Ravi Pratap  <ravi@ximian.com>
10617
10618         * cs-parser.jay (enum_member_declaration): Pass in the attributes
10619         attached.
10620
10621         * enum.cs (AddEnumMember): Add support to store the attributes associated 
10622         with each member too.
10623
10624         * attribute.cs (CheckAttribute, ApplyAttributes): Update to handle
10625         field builders too - this takes care of the enum member case.
10626
10627 2002-06-10  Rachel Hestilow  <hestilow@ximian.com>
10628
10629         * typemanager.cs (TypeManager.VerifyUnManaged): Allow
10630         address-of operator on both value types and pointers.
10631
10632 2002-06-10  Martin Baulig  <martin@gnome.org>
10633
10634         * interface.cs (Interface.PopulateIndexer): Add the indexer's
10635         PropertyBuilder to the `property_builders' list.
10636
10637         * expression.cs (Indexers.GetIndexersForTypeOrInterface): New private method.
10638         (Indexers.GetIndexersForType): Call GetIndexersForTypeOrInterface() on the
10639         `lookup_type' and all its interfaces.  Unfortunately, Type.FindMembers() won't
10640         find any indexers which are inherited from an interface.
10641
10642 2002-06-09  Martin Baulig  <martin@gnome.org>
10643
10644         * const.cs (Const.LookupConstantValue): Convert `Expr' to a literal of
10645         the same type as the constant if necessary.  There's also a test-130.cs
10646         for this.
10647
10648         * enum.cs (Enum.ChangeEnumType): Moved to typemanager.cs and made public.
10649
10650         * typemanager.cs (TypeManager.ChangeType): Previously known as
10651         Enum.ChangeEnumType().
10652
10653 2002-06-09  Martin Baulig  <martin@gnome.org>
10654
10655         * expression.cs (Cast.TryReduce): Added support for consts.
10656
10657 2002-06-08  Ravi Pratap  <ravi@ximian.com>
10658
10659         * class.cs (Accessor): Hold attributes information so we can pass
10660         it along.
10661
10662         * cs-parser.jay (get_accessor_declaration, set_accessor_declaration):
10663         Modify to pass in attributes attached to the methods.
10664
10665         (add_accessor_declaration, remove_accessor_declaration): Ditto.
10666
10667         * attribute.cs (ApplyAttributes, CheckAttribute): Update accordingly
10668         to handle the Accessor kind :-)
10669
10670         * class.cs (Property.Emit, Event.Emit): Apply attributes to the accessors
10671
10672 2002-06-08  Martin Baulig  <martin@gnome.org>
10673
10674         * expression.cs (Unary.TryReduceNegative): Added support for
10675         ULongConstants.
10676
10677 2002-06-08  Martin Baulig  <martin@gnome.org>
10678
10679         * enum.cs (Enum.LookupEnumValue): Don't report an error if the
10680         name can't be found in the `defined_names' - the caller will do a
10681         MemberLookup in this case and thus find methods in System.Enum
10682         such as Enum.IsDefined().
10683
10684 2002-06-08  Martin Baulig  <martin@gnome.org>
10685
10686         * enum.cs (Enum.ChangeEnumType): This is a custom version of
10687         Convert.ChangeType() which works with TypeBuilder created types.
10688         (Enum.LookupEnumValue, Enum.Define): Use it here.
10689
10690         * class.cs (TypeContainer.RegisterRequiredImplementations): Added
10691         `TypeBuilder.BaseType != null' check.
10692         (TypeContainer.FindMembers): Only lookup parent members if we
10693         actually have a parent.
10694         (Method.EmitDestructor): Added `ec.ContainerType.BaseType != null' check.
10695         (ConstructorInitializer.Resolve): Likewise.
10696
10697         * interface.cs (Interface.FindMembers): Added
10698         `TypeBuilder.BaseType != null' check.
10699
10700         * rootcontext.cs (RootContext.ResolveCore): Added
10701         "System.Runtime.CompilerServices.IndexerNameAttribute" to
10702         classes_second_stage.
10703
10704         * typemanager.cs (TypeManager.InitCoreTypes): Don't initialize
10705         debug_type and trace_type when compiling with --nostdlib.       
10706
10707 2002-06-07  Martin Baulig  <martin@gnome.org>
10708
10709         * class.cs (TypeContainer): Added `have_nonstatic_fields' field.
10710         (AddField): Set it to true when adding a non-static field.
10711         (DefineType): Use `have_nonstatic_fields' to find out whether we
10712         have non-static fields, not `Fields != null'.
10713
10714 2002-06-02  Miguel de Icaza  <miguel@ximian.com>
10715
10716         * ecore.cs (SimpleNameResolve): Removed simple bug (we were
10717         dereferencing a null on the static-field code path)
10718
10719 2002-05-30  Martin Baulig  <martin@gnome.org>
10720
10721         * codegen.cs (InitMonoSymbolWriter): Added `string[] args' argument
10722         to take command line arguments.  Use reflection to call the new
10723         custom `Initialize' function on the symbol writer and pass it the
10724         command line arguments.
10725
10726         * driver.cs (--debug-args): New command line argument to pass command
10727         line arguments to the symbol writer.
10728
10729 2002-05-28  Miguel de Icaza  <miguel@ximian.com>
10730
10731         * assign.cs (DoResolve): Forgot to do the implicit conversion to
10732         the target type for indexers and properties.  Thanks to Joe for
10733         catching this.
10734
10735 2002-05-27  Miguel de Icaza  <miguel@ximian.com>
10736
10737         * typemanager.cs (MethodFlags): returns the method flags
10738         (Obsolete/ShouldIgnore) that control warning emission and whether
10739         the invocation should be made, or ignored. 
10740
10741         * expression.cs (Invocation.Emit): Remove previous hack, we should
10742         not do this on matching a base type, we should do this based on an attribute
10743
10744         Only emit calls to System.Diagnostics.Debug and
10745         System.Diagnostics.Trace if the TRACE and DEBUG defines are passed
10746         on the command line.
10747
10748         * rootcontext.cs: Global settings for tracing and debugging.
10749
10750         * cs-tokenizer.cs (define): New utility function to track
10751         defines.   Set the global settings for TRACE and DEBUG if found.
10752
10753 2002-05-25  Ravi Pratap  <ravi@ximian.com>
10754
10755         * interface.cs (Populate*): Pass in the TypeContainer as well as
10756         the DeclSpace as parameters so that we can create EmitContexts and
10757         then use that to apply attributes etc.
10758
10759         (PopulateMethod, PopulateEvent, PopulateProperty)
10760         (PopulateIndexer): Apply attributes everywhere.
10761
10762         * attribute.cs (CheckAttribute): Include InterfaceMethod, InterfaceEvent
10763         etc.
10764
10765         (ApplyAttributes): Update accordingly.
10766
10767         We now apply interface attributes for all members too.
10768
10769 2002-05-26  Miguel de Icaza  <miguel@ximian.com>
10770
10771         * class.cs (Indexer.Define); Correctly check if we are explicit
10772         implementation (instead of checking the Name for a ".", we
10773         directly look up if the InterfaceType was specified).
10774
10775         Delay the creation of the PropertyBuilder.
10776
10777         Only create the PropertyBuilder if we are not an explicit
10778         interface implementation.   This means that explicit interface
10779         implementation members do not participate in regular function
10780         lookups, and hence fixes another major ambiguity problem in
10781         overload resolution (that was the visible effect).
10782
10783         (DefineMethod): Return whether we are doing an interface
10784         implementation. 
10785
10786         * typemanager.cs: Temporary hack until we get attributes in
10787         interfaces (Ravi is working on that) and we get IndexerName
10788         support in interfaces.
10789
10790         * interface.cs: Register the indexers as properties.
10791
10792         * attribute.cs (Attribute.Resolve): Catch the error, and emit a
10793         warning, I have verified that this is a bug in the .NET runtime
10794         (JavaScript suffers of the same problem).
10795
10796         * typemanager.cs (MemberLookup): When looking up members for
10797         interfaces, the parent of an interface is the implicit
10798         System.Object (so we succeed in searches of Object methods in an
10799         interface method invocation.  Example:  IEnumerable x;  x.ToString
10800         ()) 
10801
10802 2002-05-25  Miguel de Icaza  <miguel@ximian.com>
10803
10804         * class.cs (Event): Events should also register if they do
10805         implement the methods that an interface requires.
10806
10807         * typemanager.cs (MemberLookup); use the new GetInterfaces
10808         method. 
10809
10810         (GetInterfaces): The code used to lookup interfaces for a type is
10811         used in more than one place, factor it here. 
10812
10813         * driver.cs: Track the errors at the bottom of the file, we kept
10814         on going.
10815
10816         * delegate.cs (NewDelegate.Emit): We have to emit a null as the
10817         instance if the method we are calling is static!
10818
10819 2002-05-24  Miguel de Icaza  <miguel@ximian.com>
10820
10821         * attribute.cs (ApplyAttributes): Make this function filter out
10822         the IndexerName attribute (as that attribute in reality is never
10823         applied) and return the string constant for the IndexerName
10824         attribute. 
10825
10826         * class.cs (TypeContainer.Emit): Validate that all the indexers
10827         have the same IndexerName attribute, and if so, set the
10828         DefaultName attribute on the class. 
10829
10830         * typemanager.cs: The return value might contain other stuff (not
10831         only methods).  For instance, consider a method with an "Item"
10832         property and an Item method.
10833
10834         * class.cs: If there is a problem with the parameter types,
10835         return. 
10836
10837 2002-05-24  Ravi Pratap  <ravi@ximian.com>
10838
10839         * ecore.cs (ImplicitConversionExists): Wrapper function which also
10840         looks at user defined conversion after making a call to 
10841         StandardConversionExists - we need this for overload resolution.
10842
10843         * expression.cs : Update accordingly the various method calls.
10844
10845         This fixes 2 bugs filed against implicit user defined conversions 
10846
10847 2002-05-22  Miguel de Icaza  <miguel@ximian.com>
10848
10849         * statement.cs: Track the result of the assignment.
10850
10851 2002-05-21  Miguel de Icaza  <miguel@ximian.com>
10852
10853         * expression.cs (MemberAccess): Improved error reporting for
10854         inaccessible members.
10855
10856 2002-05-22  Martin Baulig  <martin@gnome.org>
10857
10858         * makefile (mcs-mono2.exe): New target.  This is mcs compiled with
10859         itself with debugging support.
10860
10861 2002-05-22  Martin Baulig  <martin@gnome.org>
10862
10863         * typemanager.cs ("System.Runtime.InteropServices.StructLayoutAttribute"):
10864         Removed, this isn't needed anymore.
10865
10866 2002-05-20  Martin Baulig  <martin@gnome.org>
10867
10868         * typemanager.cs (InitEnumUnderlyingTypes): "System.Char" can't
10869         be underlying type for an enum.
10870
10871 2002-05-20  Miguel de Icaza  <miguel@ximian.com>
10872
10873         * typemanager.cs (InitEnumUnderlyingTypes): New helper function
10874         that splits out the loading of just the core types.
10875
10876         * rootcontext.cs (ResolveCore): Split the struct resolution in
10877         two, so we can load the enumeration underlying types before any
10878         enums are used.
10879
10880         * expression.cs (Is): Bandaid until we fix properly Switch (see
10881         bug #24985 for details).
10882
10883         * typemanager.cs (ImplementsInterface): The hashtable will contain
10884         a null if there are no interfaces implemented.
10885
10886 2002-05-18  Miguel de Icaza  <miguel@ximian.com>
10887
10888         * cs-parser.jay (indexer_declarator): It is fine to have array
10889         parameters
10890
10891 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10892
10893         * typemanager.cs: (RegisterBuilder): New function used to register
10894         TypeBuilders that implement interfaces.  Since
10895         TypeBuilder.GetInterfaces (as usual) does not work with lame
10896         Reflection.Emit. 
10897         (AddUserType): register interfaces.
10898
10899         (ImplementsInterface): Use the builder_to_ifaces hash if we are
10900         dealing with TypeBuilder.  Also, arrays are showing up as
10901         SymbolTypes, which are not TypeBuilders, but whose GetInterfaces
10902         methods can not be invoked on them!
10903
10904         * ecore.cs (ExplicitReferenceConversionExists): Made public.
10905         (ImplicitReferenceConversionExists): Split out from
10906         StandardConversionExists. 
10907
10908         * expression.cs (As): We were only implementing one of the three
10909         cases for the as operator.  We now implement them all.
10910         (Is): Implement the various other cases for Is as well.
10911
10912         * typemanager.cs (CACHE): New define used to control if we want or
10913         not the FindMembers cache.  Seems to have a negative impact on
10914         performance currently
10915
10916         (MemberLookup): Nested types have full acess to
10917         enclosing type members
10918
10919         Remove code that coped with instance/static returns for events, we
10920         now catch this in RealFindMembers.
10921
10922         (RealFindMembers): only perform static lookup if the instance
10923         lookup did not return a type or an event.  
10924
10925 2002-05-17  Miguel de Icaza  <miguel@ximian.com>
10926
10927         * assign.cs (CompoundAssign): We pass more semantic information
10928         now to Compound Assignments than we did before: now we have all
10929         the information at hand, and now we resolve the target *before* we
10930         do the expression expansion, which allows the "CacheValue" method
10931         to have the effect we intended (before, a [x] += 1 would generate
10932         two differen ArrayAccess expressions from the ElementAccess,
10933         during the resolution process).
10934
10935         (CompoundAssign.DoResolve): Resolve target and original_source here.
10936
10937 2002-05-16  Miguel de Icaza  <miguel@ximian.com>
10938
10939         * expression.cs (ArrayAccess): dropped debugging information. 
10940
10941         * typemanager.cs: Small bug fix: I was always returning i_members,
10942         instead of one of i_members or s_members (depending on which had
10943         the content).
10944
10945         * assign.cs (IAssignMethod.CacheTemporaries): New method.  This
10946         method is invoked before any code generation takes place, and it
10947         is a mechanism to inform that the expression will be invoked more
10948         than once, and that the method should use temporary values to
10949         avoid having side effects
10950
10951         (Assign.Emit): Call CacheTemporaries in the IAssignMethod.
10952
10953         * ecore.cs (Expression.CacheTemporaries): Provide empty default
10954         implementation.
10955
10956         * expression.cs (Indirection, ArrayAccess): Add support for
10957         CacheTemporaries in these two bad boys. 
10958
10959         * ecore.cs (LoadFromPtr): figure out on our own if we need to use
10960         ldobj or ldind_ref.  
10961         (StoreFromPtr): Handle stobj as well.
10962
10963         * expression.cs (UnaryMutator): Share more code.
10964
10965         * typemanager.cs (FindMembers): Thanks to Paolo for tracking this
10966         down: I was not tracking the Filter function as well, which
10967         was affecting the results of the cache.
10968
10969 2002-05-15  Miguel de Icaza  <miguel@ximian.com>
10970
10971         * attribute.cs: Remove the hack to handle the CharSet property on
10972         StructLayouts. 
10973
10974 2002-05-14  Miguel de Icaza  <miguel@ximian.com>
10975
10976         * attribute.cs (DoResolve): More uglyness, we now only try to
10977         resolve the attribute partially, to extract the CharSet
10978         information (only if we are a StructLayout attribute).  Otherwise 
10979
10980         (GetExtraTypeInfo): Add some code to conditionally kill in the
10981         future this.   I am more and more convinced that the .NET
10982         framework has special code to handle the attribute setting on
10983         certain elements.
10984
10985         * expression.cs (IsParamsMethodApplicable): Revert my previous
10986         foreach change here, it was wrong.
10987
10988 2002-05-13  Miguel de Icaza  <miguel@ximian.com>
10989
10990         * cs-tokenizer.cs: (pp_primary): Eat the ')' at the end.
10991         (pp_expr): do not abort on unknown input, just return.
10992         (eval): abort if there are pending chars.
10993
10994         * attribute.cs (Attribute.Resolve): Positional parameters are
10995         optional.  Deal with that case.
10996
10997         * class.cs (DefineType): Call Attribute.GetExtraTypeInfo to fetch
10998         the Ansi/Unicode/Auto information for the type.
10999
11000         (TypeContainer.DefineType): instantiate the EmitContext here, as
11001         we will be using it during the type definition (to resolve
11002         attributes) and during the emit phase.
11003
11004         * attribute.cs (Attribute.GetExtraTypeInfo): This routine is used
11005         to pull type information out of the attributes
11006
11007         (Attribute.Resolve): track the constructor builder, and allow for
11008         multiple invocations (structs and classes will use this).
11009
11010         * ecore.cs (MemberLookupFinal): new version with all the
11011         parameters customizable.
11012
11013         * expression.cs (New.DoResolve): Use MemberLookupFinal to locate
11014         constructors.  Return if the result value is null (as the error
11015         would have been flagged already by MemberLookupFinal)
11016
11017         Do not allow instances of abstract classes or interfaces to be
11018         created.
11019
11020         * class.cs: (MethodSignature.InheritableMemberSignatureCompare):
11021         We have to compare the assembly property here when dealing with
11022         FamANDAssem and Assembly access modifiers, because we might be
11023         creating an assembly from *modules* (that means that we are not
11024         getting TypeBuilders for types defined in other modules that are
11025         part of this assembly).
11026
11027         (Method.Emit): If the method is marked abstract and has a body,
11028         emit an error. 
11029
11030         (TypeContainer.DefineMembers): If both the defined member and the
11031         parent name match are methods, then do not emit any warnings: let
11032         the Method.Define routine take care of flagging warnings.  But if
11033         there is a mismatch (method overrides something else, or method is
11034         overriwritten by something, then emit warning).
11035
11036         (MethodSignature.MemberSignatureCompare): If the sig.ret_type is
11037         set to null, this means `do not check for the return type on the
11038         signature'. 
11039
11040         (Method.Define): set the return type for the method signature to
11041         null, so that we get methods with the same name and parameters and
11042         different return types.  This is used to flag warning 114 (you are
11043         hiding a method, and you probably want to use the new/override
11044         keywords instead).
11045
11046         * typemanager.cs (MemberLookup): Implemented proper access
11047         control, closing a long standing set of bug reports.  The problem
11048         was that the Framework only has two bits: Public and NonPublic,
11049         and NonPublic includes private and protected methods, but we need
11050         to enforce the FamANDAssem, FamOrAssem and Family. 
11051
11052 2002-05-11  Miguel de Icaza  <miguel@ximian.com>
11053
11054         * statement.cs (GotoCase): Return true: Ammounts to giving up
11055         knowledge on whether we return or not, and letting the other case
11056         be responsible for it.
11057
11058 2002-05-10  Miguel de Icaza  <miguel@ximian.com>
11059
11060         * driver.cs: Do not load directories for each file processed, only
11061         do it if there is a pattern.
11062
11063         * ecore.cs: Report readonly assigns here as well, as we might have
11064         been resolved only by MemberAccess.
11065
11066         (SimpleName.SimpleNameResolve): Also be useful for LValue
11067         resolution.   We need this to propagate assign to local readonly variables
11068
11069         * typemanager.cs: Use a ptrhashtable for the criteria, because we
11070         do not want to reuse potential criteria memory.
11071
11072         * class.cs (MyEventBuilder): Set reflected_type;
11073
11074         * ecore.cs (Constantify): Added support for constifying bools.
11075
11076         (RootContext.LookupType): Added a cache for values looked up in
11077         the declaration space.
11078
11079         * typemanager.cs (FindMembers): Now is a front-end to
11080         RealFindMembers, and provides a two-level hashtable-based cache to
11081         the request.  
11082
11083         15% performance improvement: from 22.5 to 19.2 seconds.
11084
11085         * expression.cs (IsParamsMethodApplicable): use foreach.
11086         (Invocation.DoResolve): ditto.
11087         (New.DoResolve): ditto.
11088         (ArrayCreation.DoResolve): ditto.
11089
11090         * ecore.cs (FindMostEncompassingType): use foreach.
11091
11092         * delegate.cs (NewDelegate.DoResolve): Use foreach
11093
11094         * ecore.cs (Expression.FindMostSpecificSource): Use foreach.
11095         (RemoveMethods): use foreach.
11096
11097         * expression.cs (Invocation.MakeUnionSet): Optimization: Use two
11098         nested foreach statements instead of for, and also break out of
11099         the inner loop once a match is found.
11100
11101         (Invocation.OverloadResolve): Use foreach, simplify the code. 
11102
11103 2002-05-08  Miguel de Icaza  <miguel@ximian.com>
11104
11105         * cfold.cs (BinaryFold): During an enumeration evaluation context,
11106         we actually unwrap the expression to allow for extra information
11107         to be extracted. 
11108
11109         * expression.cs: Use Shr_Un on unsigned operations. 
11110
11111 2002-05-08  Ravi Pratap  <ravi@ximian.com>
11112
11113         * ecore.cs (FindMostEncompass*): Fix trivial bug where the set of 
11114         applicable operators was not being considered correctly. This closes
11115         the bug Miguel reported.
11116
11117 Wed May 8 16:40:50 CEST 2002 Paolo Molaro <lupus@ximian.com>
11118
11119         * attribute.cs: check that the type derives from System.Attribute
11120         and report the correct error in that case (moved the duplicate code to
11121         its own method, too).
11122
11123 Wed May 8 11:50:31 CEST 2002 Paolo Molaro <lupus@ximian.com>
11124
11125         * attribute.cs: lookup attribute type name as the spec says: first the
11126         bare attribute name and then name + "Attribute" (nant compiles with
11127         mcs after this fix).
11128
11129 2002-05-07  Miguel de Icaza  <miguel@ximian.com>
11130
11131         * expression.cs (Unary.TryReduceNegative): Ah!  Tricky!  Tricky!
11132         Because of the way we parse things, we should try to see if a
11133         UIntConstant can fit in an integer.
11134
11135 2002-05-07  Ravi Pratap  <ravi@ximian.com>
11136
11137         * ecore.cs (GetConversionOperators): Do not pick up op_True operators
11138         when we are in an explicit context.
11139
11140         (ConvertReferenceExplicit): When converting from Iface type S to Class
11141         T make sure the rules are implemented as an OR.
11142
11143         * parameter.cs (ParameterType): Make it a property for now although the
11144         purpose really isn't anything immediate.
11145
11146         * expression.cs (Is*Applicable): Do better checking on the parameter type
11147         of a ref/out parameter. The ones from the system assemblies are already 
11148         marked with the correct type so we don't need to do any correction.
11149
11150         * ecore.cs (StandardConversionExists): Conversion from Interface types to 
11151         the object type is standard too so include that.
11152
11153 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11154
11155         * ecore.cs (StandardConversionExists): Augment with missing code:
11156         deal with IntConstant, LongConstants and Enumerations.
11157
11158         * assign.cs: Report the error, instead of failing silently
11159
11160         * rootcontext.cs (AddGlobalAttributes): Track attributes on the
11161         typecontainer that they are declared, because the
11162         typecontainer/namespace will have the list of using clauses that
11163         need to be applied.
11164
11165         Assembly Attributes were escaping the normal registration
11166         mechanism. 
11167
11168         (EmitCode): Apply attributes within an EmitContext that represents
11169         the container they were declared on.
11170
11171         * cs-parser.jay: Track bases for structs.  How did I get this wrong?
11172
11173 2002-05-06  Ravi Pratap  <ravi@ximian.com>
11174
11175         * ecore.cs (FindMostEncompassingType, FindMostEncompassedType):
11176         Revamp completely - make much cleaner as we now operate only
11177         on a set of Types.
11178
11179         (FindMostSpecificSource, FindMostSpecificTarget): New methods
11180         to implement the logic detailed in the spec more correctly.
11181
11182         (UserDefinedConversion): Update accordingly.
11183
11184 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11185
11186         * statement.cs: Return flow analysis information up.
11187
11188         * cs-tokenizer.cs (adjust_real): Share code between LITERAL_DOUBLE
11189         and the default.
11190
11191         (token): Do not consume an extra character before calling
11192         decimal_digits.
11193
11194 2002-05-06  Piers Haken <piersh@friskit.com>
11195
11196         * cs-parser.jay: add 'override' attribute to System.Object.Finalize
11197
11198 2002-05-06  Miguel de Icaza  <miguel@ximian.com>
11199
11200         * class.cs (Constructor.Emit): Set the IsStatic flag in the
11201         EmitContext during the instance constructor initializer
11202         resolution, to stop access to instance variables.
11203
11204         This is mandated by the spec, last paragraph of the `constructor
11205         initializers' section. 
11206
11207 2002-05-05  Miguel de Icaza  <miguel@ximian.com>
11208
11209         * cs-parser.jay, class.cs (Accessor): new class used to represent
11210         an accessor (get or set).  In the past we used `null' to represent
11211         a missing accessor.  But this is ambiguous because there was no
11212         way to tell in abstract indexers/properties if one of them was
11213         specified.
11214
11215         Now there is a way of addressing that.
11216
11217         * expression.cs (Indexers.GetIndexersForType): Use TypeManager.MemberLookup
11218         instead of FindMembers.
11219
11220         * class.cs (TypeContainer.EmitFieldInitializer): Do not typecast
11221         the result of Assign.Resolve as Assign, but rather as ExpressionStatement.
11222
11223         * attribute.cs: Treat indexers and properties as the same in terms
11224         of applying attributes
11225
11226         * ecore.cs (FindMostEncompassedType): Use statically initialized
11227         EmptyExpressions()s like we do elsewhere to avoid creating useless
11228         objects (and we take this out of the tight loop).
11229
11230         (GetConversionOperators): Move the code to extract the actual
11231         operators to a separate routine to clean things up.
11232
11233 2002-05-04  Miguel de Icaza  <miguel@ximian.com>
11234
11235         * ecore.cs (FieldExpr): Remove un-needed tests for null, since now
11236         events are always registered FieldBuilders.
11237
11238         * class.cs (FieldBase): New class shared by Fields 
11239
11240         * delegate.cs: If we are a toplevel delegate, use our full name.
11241         If we are a nested delegate, then only use our tail name.
11242
11243 2002-05-02  Ravi Pratap  <ravi@ximian.com>
11244
11245         * expression.cs (IsApplicable): Ensure that we add the "&" to
11246         ref/out types before comparing it with the type of the argument.
11247
11248         (IsParamsMethodApplicable): Ditto.
11249
11250         (Argument.Type): Use TypeManager.LookupType instead of Type.GetType - 
11251         silly me ;-)
11252
11253         * delegate.cs : Handle the case when we have more than one applicable
11254         method. Flag an error only when we finish checking all.
11255
11256 2002-05-02  Miguel de Icaza  <miguel@ximian.com>
11257
11258         * expression.cs: Add support for boolean static initializers.
11259
11260 2002-05-01  Miguel de Icaza  <miguel@ximian.com>
11261
11262         * attribute.cs: Use proper cast for Events, since we use a MyEventBuilder.
11263
11264         * parameter.cs (ComputeParameterTypes,
11265         ComputeAndDefineParameterTypes): Better error handling: now we
11266         clear the `types' cache if we fail during any of the type lookups.
11267         We also return the status code correctly to our caller
11268
11269         * delegate.cs: If we fail to define a delegate, abort the extra
11270         steps. 
11271
11272         * expression.cs (Binary.ResolveOperator): for
11273         operator==(object,object) and operator !=(object, object) we also
11274         have to verify that there is an implicit conversion from one to
11275         the other.
11276
11277         (ArrayAccess.DoResolve): Array Access can operate on
11278         non-variables. 
11279
11280 2002-04-30  Miguel de Icaza  <miguel@ximian.com>
11281
11282         * assign.cs (CompoundAssign): A new class used as a "flag" that
11283         the assignment actually is happening as part of a compound
11284         assignment operator.
11285
11286         During compound assignment, a few new rules exist to enable things
11287         like:
11288
11289         byte b |= 1 + 2
11290
11291         From the spec:
11292
11293         x op= y can be evaluated as x = (T) (x op y) (ie, an explicit cast
11294         to the type of x) if y is implicitly convertible to the type of x,
11295         and the operator is a builtin operator and the return type of the
11296         operator is explicitly convertible to the type of x. 
11297
11298         * rootcontext.cs: Reset warning level to 2.  4 catches various
11299         "interesting" features in mcs, we must clean this up at some
11300         point, but currently am trying to kill other bugs ;-)
11301
11302         * ecore.cs (SimpleName.SimpleNameResolve): Perform member lookups
11303         in container classes as well.  
11304
11305         * expression.cs (Binary.ResolveOperator): Handle string case
11306         before anything else (as operator overloading does emit an error
11307         before doing anything else).
11308
11309         This code could go away when we move to a table driven model, but
11310         i could not come up with a good plan last night.
11311
11312 2002-04-30  Lawrence Pit <loz@cable.a2000.nl>
11313
11314         * typemanager.cs (CSharpName): reimplementation using regex.
11315         * class.cs: added null check for fields in Emit
11316         * rootcontext.cs: set warninglevel to 4
11317
11318 2002-04-29  Miguel de Icaza  <miguel@ximian.com>
11319
11320         * typemanager.cs (CSharpName): reimplemented with Lupus
11321         suggestion.
11322
11323 2002-04-28  Miguel de Icaza  <miguel@ximian.com>
11324
11325         * statement.cs (If): correclty implement Resolve, because we were
11326         not catching sem errors in there.  The same process is needed
11327         everywhere else. 
11328         (Return, StatementExpression, For, While, Do, Throw, Lock): Implement Resolve
11329
11330
11331         (Statement.Warning_DeadCodeFound): Factorize code.
11332         (While): Report dead code here too.
11333
11334         (Statement): Added Resolve virtual method to allow
11335         for resolution split from the emit code.
11336
11337 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11338
11339         * statement.cs (EmitBoolExpression): No longer try to resolve the
11340         expression here.    
11341         (MakeBoolean): New utility function that resolve, implicitly
11342         converts to boolean and tags the expression. 
11343
11344
11345         (If, Do): Implement dead code elimination.
11346         (While): Implement loop inversion
11347
11348         (Do, While, For, If): Resolve the expression prior to calling our
11349         code generation.
11350
11351 2002-04-22  Lawrence Pit <loz@cable.a2000.nl>
11352
11353         * class.cs:
11354           - added method Report28 (warning: program has more than one entry point)
11355           - added method IsEntryPoint, implements paragraph 10.1 of the spec
11356           - modified method Method.Define, the part at the end of the method
11357
11358         * rootcontext.cs: added static public Location EntryPointLocation;
11359           
11360         * ../errors/cs0028.cs : Add test case for the above warning.              
11361
11362         * typemanager.cs:
11363           - modified method CSharpName to allow arrays of primitive type to
11364             be printed nicely (e.g. instead of System.Int32[][] it now prints
11365             int[][])
11366           - added method CSharpSignature: returns the signature of a method
11367             in string format to be used in reporting errors, warnings, etc.
11368
11369         * support.cs: InternalParameters.ParameterDesc variable tmp initialized
11370         with String.Empty.
11371
11372 2002-04-26  Ravi Pratap  <ravi@ximian.com>
11373
11374         * delegate.cs (Define): Fix extremely silly bug where I was
11375         setting the type of the 'object' parameter of the BeginInvoke
11376         method to System.IAsyncResult instead of System.Object ;-)
11377
11378 2002-04-26  Miguel de Icaza  <miguel@ximian.com>
11379
11380         * class.cs (ConstructorInitializer.Resolve): Also use DeclaredOnly
11381         here. 
11382
11383         (Constructor.Emit): return if we fail to initialize the
11384         constructor.  Another door closed!  
11385
11386         * expression.cs (New.DoResolve): Improve error message (from -6 to
11387         1501).  Use DeclaredOnly lookup to find the exact constructor.
11388
11389         * typemanager.cs (MemberLookup): If DeclaredOnly is set, do not
11390         loop.  This is useful.
11391
11392         * cs-parser.jay: Adjust the default parameters so that destructors
11393         have the proper signature.
11394
11395 2002-04-26  Martin Baulig  <martin@gnome.org>
11396
11397         * driver.cs (LoadAssembly): If `assembly' contains any characters
11398         which are only valid in path names and not in assembly names
11399         (currently slash, backslash and point), use Assembly.LoadFrom ()
11400         instead of Assembly.Load () on the `assembly' (before iteration
11401         over the link_paths).
11402
11403 2002-04-26  Martin Baulig  <martin@gnome.org>
11404
11405         * cs-tokenizer.cs (is_hex): Correctly handle lowercase chars.
11406
11407 2002-04-25  Miguel de Icaza  <miguel@ximian.com>
11408
11409         * class.cs (Property): use the new typemanager.MemberLookup
11410
11411         (TypeContainer.MemberLookup): Implement using the
11412         TypeManager.MemberLookup now. 
11413
11414         * typemanager.cs: Make MemberLookup a function of the TypeManager,
11415         and return MemberInfos, so that these can be used without an
11416         EmitContext (what we had before).
11417
11418 2002-04-24  Miguel de Icaza  <miguel@ximian.com>
11419
11420         * expression.cs: Fix the case where the argument to params if the
11421         type of the params.  I omitted handling this before.   Fixed
11422
11423 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11424
11425         * driver.cs: Call BootCorlib_PopulateCoreType
11426
11427         * class.cs (Property.CheckBase): Check for properties only, not
11428         for all members. 
11429
11430         * interface.cs: Temporary hack: try/catch around the
11431         CustomAttributeBuilder, because I am getting an exception that I
11432         do not understand.
11433
11434         * rootcontext.cs (BootCorlib_PopulateCoreType): Populate some
11435         types whose definitions are required to be there (attributes are
11436         defined before standard types).
11437
11438         Compute definitions as we boot the various types, as they are used
11439         immediately (value_type class will need object_type, but if we do
11440         not initialize object_type, we will pass a null, which will let
11441         the runtime pick the System.Object from the existing corlib, which
11442         is not what we want).
11443
11444 2002-04-22  Patrik Torstensson <totte@labs2.com>
11445
11446         * cs-tokenizer.cs: fixed a number of trim() issues.
11447
11448 2002-04-22  Ravi Pratap  <ravi@ximian.com>
11449
11450         * expression.cs (Argument.Type): Ensure that we return the correct
11451         type when we have out or ref parameters [in which case we 
11452         append a "&"].
11453
11454 2002-04-22  Miguel de Icaza  <miguel@ximian.com>
11455
11456         * class.cs (Property, Indexer): Allow extern modifier in there. 
11457
11458         * typemanager.cs (InitBaseTypes): Initializes object_type and
11459         value_type, since those will be used early on during the bootstrap
11460         process to compile corlib.
11461
11462         (InitCoreTypes): Move code from here to InitBaseTypes.
11463
11464 2002-04-21  Miguel de Icaza  <miguel@ximian.com>
11465
11466         * ecore.cs (PropertyExpr): Optimize calls to Array::get_Length on
11467         single-dimension arrays as using the ldlen opcode.  
11468
11469         Daniel Lewis discovered this optimization.  
11470
11471         * typemanager.cs: Add signature for System.Array::get_Length
11472
11473 2002-04-20  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11474
11475         * statement.cs: report the error when the foreach does not apply to an
11476         array nor a collection.
11477
11478 2002-04-19  Miguel de Icaza  <miguel@ximian.com>
11479
11480         * expression.cs: Add implicit conversions to the operator ~.
11481
11482         * constant.cs (DecimalConstant.Emit): Emit decimal value.
11483
11484         * typemanager.cs: Locate the decimal constructor.
11485
11486 2002-04-17  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11487
11488         * attribute.cs: use the new property of TypeOf.
11489         * expression.cs: added 'get' property around typearg.
11490
11491         These changes fix a build breaker reported by NickD. Is this the
11492         correct way to fix?  If not, please, revert my changes and make it
11493         work :-).
11494
11495 2002-04-17  Miguel de Icaza  <miguel@ximian.com>
11496
11497         * attribute.cs: Add support for typeof in attribute invocations.
11498         I am not sure that this is right though.
11499
11500 2002-04-14  Duncan Mak  <duncan@ximian.com>
11501
11502         * cfold.cs (BinaryFold): Catch DivideByZeroException in the
11503         Binary.Operator.Division case.
11504
11505 2002-04-13  Ravi Pratap  <ravi@ximian.com>
11506
11507         * class.cs (DefineType): Ensure that we do a proper check on
11508         attribute types and also register it with the TypeManager.
11509
11510         (TypeContainer.Targets): The default for attribute types is
11511         AttributeTargets.All.
11512
11513         * attribute.cs (ApplyAttributes): Registering the attribute type
11514         is done elsewhere, not when we discover we have a Usage attribute.
11515
11516 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11517
11518         * expression.cs (VerifyArgumentsCompat): Implement Miguel's suggestion
11519         and get rid of is_delegate parameter.
11520
11521         * everywhere : update.
11522
11523 2002-04-12  Ravi Pratap  <ravi@ximian.com>
11524
11525         * cs-parser.jay (compilation_unit): Revamp completely to use
11526         some new ideas that I got from Rhys' grammar to solve the problems
11527         with assembly level attributes.
11528
11529         (outer_declaration): New grammar production.
11530
11531         (attribute_sections): Add.
11532
11533         (opt_attributes): Base on attribute_sections
11534
11535         (namespace_declaration): Allow opt_attributes to tackle the case
11536         when we have assembly level attributes - we are clever in this
11537         regard now ;-)
11538
11539         * attribute.cs (ApplyAttributes): Do not worry about assembly 
11540         attributes in the non-global context.
11541
11542         * rootcontext.cs (AddGlobalAttributes): Go back to using this
11543         instead of SetGlobalAttributes.
11544
11545         * class.cs, rootcontext.cs : Ensure we define and generate 
11546         attribute types before anything else.
11547
11548         * attribute.cs (CheckAttribute and GetValidPlaces): Handle the exception
11549         and flag the new error -20 for the case when the attribute type
11550         does not have valid targets specified. csc does not catch this.
11551
11552         * ../errors/errors.txt : update for error # -20
11553
11554 2002-04-11  Ravi Pratap  <ravi@ximian.com>
11555
11556         * support.cs (InternalParameters.ParameterModifier): Do some null
11557         checking and return sane values.
11558
11559         * class.cs (Method.Define): If we are a PInvoke method, ensure
11560         that we are static and extern. Report error # 601
11561
11562         * ../errors/cs0601.cs : Add test case for the above error.
11563
11564 2002-04-07  Ravi Pratap  <ravi@ximian.com>
11565
11566         * rootcontext.cs (attribute_types): We need to keep type of
11567         all attribute types separately and emit code for them first.
11568
11569         (RegisterAttribute) : Implement.
11570
11571         * class.cs (DefineType): Check if the current Type is a custom
11572         attribute type and register it accordingly.
11573
11574         * rootcontext.cs (AddGlobalAttributes): Fix silly bug where we were
11575         adding the first attribute twice and rename to
11576
11577         (SetGlobalAttributes): this.
11578
11579         * rootcontext.cs (NamespaceLookup): Run through the aliases too and perform
11580         lookups.
11581
11582         * attribute.cs (ApplyAttributes): Take an additional argument telling us
11583         if we are processing global arguments. Hmm, I am unsure of this.
11584
11585 2002-04-12  Gonzalo Paniagua Javier <gonzalo@ximian.com>
11586
11587         * expression.cs: added static array of strings to avoid calling
11588         Enum.ToString () for Operator in Binary. Significant recover of
11589         performance.
11590
11591 2002-04-10  Miguel de Icaza  <miguel@ximian.com>
11592
11593         * class.cs (FindMembers): Allow the Builders of the various
11594         members to be null.  If they are skip them.  This only happens
11595         during the PInvoke declaration.
11596
11597 2002-04-09  Miguel de Icaza  <miguel@ximian.com>
11598
11599         * parameter.cs (Parameters.ComputeParameterTypes): Flag the
11600         failure, so we do not keep going afterwards.
11601
11602         * expression.cs: (Invocation.OverloadResolve): I believe Ravi
11603         wanted to pass `false' as the `is_delegate' argument.  If this is
11604         the case, why not use delegate_type == null to mean `is_delegate =
11605         false' and anything else as is_delegate = true.
11606
11607 Tue Apr  9 05:40:12  2002 Piers Haken <piersh@friskit.com>
11608
11609         * statement.cs: fixed SimpleSwitchEmit to make 'goto case' goto the
11610         code for the section, not the beginning of the tests.
11611
11612 2002-04-08  Miguel de Icaza  <miguel@ximian.com>
11613
11614         * cfold.cs: Handle operator + (Enum x, Underlying x) 
11615
11616         * expression.cs (Binary): same.  Warn about errors where we have
11617         Enum/Enum in operator + as well.
11618
11619 Mon Apr  8 06:29:03  2002 Piers Haken <piersh@friskit.com>
11620
11621         * statement.cs:
11622                 - added support for switch(bool)
11623                 - optimize loading of I8/U8 constants (ldc.i4, iconv_i8)
11624                 - add TableSwitchEmit() to handle table-based switch statements
11625
11626 2002-04-05  Ravi Pratap  <ravi@ximian.com>
11627
11628         * expression.cs (Invocation.OverloadResolve): Factor out code which
11629         does parameter compatibility checking with arguments so that we can 
11630         re-use the code even from Delegate.VerifyApplicability
11631
11632         (VerifyArgumentsCompat): Move above code here.
11633
11634         * delegate.cs (VerifyApplicability): Get rid of duplicate code
11635         and instead make a call to the above method.
11636
11637 2002-03-31  Ravi Pratap  <ravi@ximian.com>
11638
11639         * typemanager.cs (attribute_type): Corresponds to System.Attribute.
11640         We use it to keep track of classes which are attribute types.
11641
11642 2002-04-02  Miguel de Icaza  <miguel@ximian.com>
11643
11644         * delegate.cs (Delegate.Define): Correctly define the types in the
11645         presence of fixed and array parameters.
11646
11647         * class.cs (TypeContainers.FindMembers): Use NonPublic flag while
11648         doing FindMembers.
11649
11650         * ecore.cs (Expression.MemberLookup): Reset binding flags to not
11651         include NonPublic after the first iteration.
11652
11653         * class.cs (Indexer.CheckBase): Only check if both parents are
11654         non-null. 
11655
11656         * cs-parser.jay (accessor_body): If empty, set to null.
11657
11658         * ecore.cs (SimpleName.SimpleNameResolve): We did not have the
11659         same code path here to resolve constants names that we did have in
11660         MemberAccess.DoResolve.  There is too much code duplicated here.
11661
11662 2002-04-01  Miguel de Icaza  <miguel@ximian.com>
11663
11664         * statement.cs, makefile: Drop Statementcollection and just use ArrayLists
11665
11666         * ecore.cs: Optimize UserDefinedConversion by minimizing the calls
11667         to MakeUnionSet.
11668
11669         * cs-tokenizer.cs: Reuse a single StringBuilder for assembling
11670         tokens, numbers and strings.
11671
11672         * ecore.cs (MethodGroupExpr): Make Emit warn about missing
11673         parenthesis.
11674
11675         * delegate.cs: Use ComputeAndDefineParameterTypes for both the
11676         asyncronous parameters and the regular parameters.  
11677
11678         * codegen.cs (CodeGen.Init): Use the constructor that allows us to
11679         specify the target directory.
11680
11681         * expression.cs: (This.DoResolve): Simplify
11682         (As.Emit): Optimize, do not generate IsInst if the expression is
11683         always of the given type.
11684
11685         (Is.DoResolve): Bug fix, we were reporting both always/never for
11686         the is expression.
11687
11688         * (Invocation.MakeUnionSet): Simplify vastly and optimize, we were
11689         creating too many unnecessary arrays.
11690
11691 2002-03-31  Miguel de Icaza  <miguel@ximian.com>
11692
11693         * class.cs (EmitFieldInitializer): Use Assign expression to assign
11694         fields instead of rolling our own initializer.   Takes care of all
11695         implicit conversions, and drops unnecessary static checks/argument.
11696
11697 2002-03-31  Dick Porter  <dick@ximian.com>
11698
11699         * driver.cs: use the GetDirectories() return values properly, and
11700         use "/" as path separator.
11701
11702 2002-03-30  Miguel de Icaza  <miguel@ximian.com>
11703
11704         * expression.cs (Unary): Optimize - - expr into expr.
11705         (Binary): Optimize a + (-b) into a -b.
11706
11707         * codegen.cs (CodeGen): Made all methods static.
11708
11709 2002-03-29  Miguel de Icaza  <miguel@ximian.com>
11710
11711         * rootcontext.cs: 
11712
11713         * decl.cs: Rename `definition' into `TypeBuilder' and drop the
11714         TypeBuilder property.
11715
11716         * cs-parser.jay: Drop the use of RecordXXX and use RecordDecl
11717         instead. 
11718
11719         * tree.cs: Removed the various RecordXXXX, and replaced with a
11720         single RecordDecl.  Removed all the accessor methods, and just
11721         left a single access point Type 
11722
11723         * enum.cs: Rename DefineEnum to DefineType.
11724
11725         * decl.cs: New abstract method `DefineType' used to unify the
11726         Defines for Enumerations, Interfaces, TypeContainers and
11727         Delegates.
11728
11729         (FindType): Moved LookupInterfaceOrClass here.  Moved the
11730         LookupBaseClasses method that used to live in class.cs and
11731         interface.cs here, and renamed to FindType.
11732
11733         * delegate.cs: Implement DefineType.  Take advantage of the
11734         refactored pattern for locating the parent builder without taking
11735         the parent_builder argument (which we know does not work if we are
11736         nested, and triggering a toplevel definition).
11737
11738 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11739
11740         * decl.cs (MemberCore.CheckMethodAgainstBase): Test if the
11741         accessibility of a member has changed during override and report
11742         an error if so.
11743
11744         * class.cs (Method.Define, Property.Define): Only complain on
11745         overrides if the method is private, any other accessibility is
11746         fine (and since we just checked the permission is the same, we are
11747         good to go).
11748
11749         * cs-tokenizer.cs: only line, region, endregion, if, endif, else
11750         and elif are processed always.  The other pre-processing
11751         directives are only processed if we are "taking" the path
11752
11753 2002-03-29  Martin Baulig  <martin@gnome.org>
11754
11755         * class.cs (Method.Emit): Only emit symbolic debugging info if the
11756         current location is not Null.
11757
11758         * codegen.cs (CodeGen.SaveSymbols): Split out symbol writing code into
11759         a separate method so we can profile it.
11760
11761         * driver.cs (ShowTime): We need to use `(int) span.TotalSeconds' since
11762         `span.Seconds' are just seconds, but no minutes or hours.
11763         (MainDriver): Profile the CodeGen.SaveSymbols calls.
11764
11765 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11766
11767         * class.cs (Method.Define), (Property.Define), (Indexer.Define):
11768         Remove the gratuitous set of Final:
11769
11770                                 // If an interface implementation, then we can set Final.
11771                                 if (((flags & MethodAttributes.Abstract) == 0) &&
11772                                     implementing.DeclaringType.IsInterface)
11773                                         flags |= MethodAttributes.Final;
11774
11775         I do not know what I was smoking when I used that.
11776
11777
11778         * cs-parser.jay, delegate.cs: Make Delegate be a DeclSpace, first
11779         step into fixing the name resolution issues for delegates and
11780         unifying the toplevel name resolution.
11781
11782 2002-03-28  Martin Baulig  <martin@gnome.org>
11783
11784         * class.cs (Method.Emit): If we have a symbol writer, call its
11785         OpenMethod(), CloseMethod() and SetMethodSourceRange() methods to
11786         tell it about the current method.
11787
11788         * codegen.cs (EmitContext.Mark): New public method. Tell the symbol
11789         writer that we're going to emit the first byte of IL code for a new
11790         statement (a new source line).
11791         (EmitContext.EmitTopBlock): If we have a symbol writer, call
11792         EmitContext.Mark() before emitting any code.
11793
11794         * location.cs (SymbolDocument): Return null when we're Null.
11795
11796         * statement.cs (Statement): Moved the `Location loc' variable here.
11797         (Statement.EmitBoolExpression): If we have a symbol writer, call
11798         ec.Mark() before emitting any code to tell it that we're at the
11799         beginning of a new statement.
11800         (StatementExpression): Added `Location' argument to the constructor.
11801         (Block): Added public readonly variable `StartLocation' and public
11802         variable `EndLocation'.  The latter is to be set using SetEndLocation().
11803         (Block): Added constructor which takes a start and end location.
11804         (Block.SetEndLocation): New method. This sets the end location.
11805         (Block.EmitMeta): If we have a symbol writer, tell it the names of the
11806         local variables we create.
11807         (Block.Emit): If we have a symbol writer, call ec.Mark() before emitting
11808         each statement and do also mark the begin and end of the block.
11809
11810         * cs-parser.jay (block : OPEN_BRACE): Use the new `Block' constructor to
11811         tell it the current lexer.Location, use Location.Null for the end of the
11812         block.
11813         (block : OPEN_BRACE opt_statement_list CLOSE_BRACE): When closing the
11814         current block, set its end location using SetEndLocation().
11815         (statement_expression): StatementExpression constructor now takes the
11816         lexer.Location as additional argument.
11817         (for_statement, declare_local_variables): Likewise.
11818         (declare_local_variables): When creating a new implicit block, use the
11819         new Block constructor and pass it the lexer.Location.
11820
11821 2002-03-28  Miguel de Icaza  <miguel@ximian.com>
11822
11823         * ecore.cs (Expression.MemberLookup): On interfaces, lookup
11824         members also on the parent interfaces recursively.
11825
11826 2002-03-27  Miguel de Icaza  <miguel@ximian.com>
11827
11828         * report.cs: Use new formats, since Gonzalo finished the missing
11829         bits. 
11830
11831         * expression.cs (Binary.ResolveOperator): added missing operator|
11832         operator& and operator^ for bool/bool.
11833
11834         * cs-parser.jay: CheckDef now takes a Location argument that is
11835         used to report errors more precisly (instead of reporting the end
11836         of a definition, we try to track something which is a lot closer
11837         to the source of the problem).
11838
11839         * cs-tokenizer.cs: Track global token use, so we can properly flag
11840         the use of #define/#undef after the first token has been seen.
11841
11842         Also, rename the reportXXXX to Error_DescriptiveName
11843
11844         * decl.cs (DeclSpace.IsTopLevel): Move property here from
11845         TypeContainer, so that Enum and Interface can use this too.
11846
11847         * class.cs (TypeContainer.LookupInterfaceOrClass,
11848         GetInterfaceOrClass, GetClassBases, DefineType): Drop the
11849         `builder' argument.  Typically this was used to pass the parent
11850         builder (a ModuleBuilder or a TypeBuilder from whoever triggered
11851         the definition).  
11852
11853         The problem is that a nested class could trigger the definition of
11854         a toplevel class, and the builder would be obviously wrong in that
11855         case. 
11856
11857         So we drop this argument, and we compute dynamically the
11858         TypeBuilder/ModuleBuilder (the correct information was available
11859         to us anyways from DeclSpace.Parent)
11860
11861         * interface.cs (Interface.DefineInterface): Drop builder
11862         parameter cleanup like class.cs
11863
11864         * enum.cs (Enum.DefineEnum): Drop builder parameter.  Clean up
11865         like class.cs
11866
11867         * statement.cs (Switch.EmitObjectInteger): Emit short/ushort
11868         values. 
11869
11870         (Try.Emit): Propagate the returns value from the statement.
11871
11872         (Return.Emit): Even if we are leavning 
11873
11874         * driver.cs: Catch IOExpcetion for Directory.GetFiles as well.
11875
11876         * modifiers.cs: Fix the computation of MethodAttributes flags.
11877
11878 Tue Mar 26 21:14:36 CET 2002 Paolo Molaro <lupus@ximian.com>
11879
11880         * driver.cs: allow compilation of files that start with '/'.
11881         Add a default case when checking the argument of --target.
11882
11883 2002-03-25  Miguel de Icaza  <miguel@ximian.com>
11884
11885         * interface.cs: Implement the same search algorithm for types in
11886         the interface code.
11887
11888         * delegate.cs: Do not allow multiple definition.
11889
11890         * Recovered ChangeLog that got accidentally amputated
11891
11892         * interface.cs (Interface.DefineInterface): Prevent from double definitions.
11893
11894         * rootcontext.cs: Load manually enum to allow core classes to
11895         contain enumerations.
11896
11897         * enum.cs, ecore.cs, driver.cs, attribute.cs, class.cs, expression.cs:
11898         Update to new static methods in TypeManager.
11899
11900         * typemanager.cs (GetMethod, GetConstructor): Use our
11901         implementation of FindMembers to find the members, since during
11902         corlib compilation, the types are TypeBuilders and GetMethod and
11903         GetConstructor do not work.
11904
11905         Make all methods in TypeManager static.
11906
11907         (InitCodeHelpers): Split the functionality from
11908         the InitCodeTypes function.
11909
11910         * driver.cs: Call InitCodeHelpers after we have populated the
11911         types. 
11912
11913         * cs-parser.jay (delegate_declaration): we did not used to compute
11914         the delegate name correctly for void delegates.
11915
11916 2002-03-24  Miguel de Icaza  <miguel@ximian.com>
11917
11918         * rootcontext.cs (RootContext): Init the interface_resolve_order
11919         and type_container_resolve_order always.
11920
11921         (ResolveCore, BootstrapCorlib_ResolveClass,
11922         BootstrapCorlib_ResolveStruct): New functions to bootstrap the
11923         compiler when compiling with --nostdlib
11924
11925         * class.cs (TypeContainer.DefineType): Check that our parent is
11926         not null.  This test is most important when we are bootstraping
11927         the core types.
11928
11929         * codegen.cs: Split out the symbol writing code.
11930
11931 2002-03-25  Martin Baulig  <martin@gnome.org>
11932
11933         * driver.cs (-g): Made -g an alias for --debug.
11934
11935 2002-03-24  Martin Baulig  <martin@gnome.org>
11936
11937         * codegen.cs (SymbolWriter): New public variable. Returns the
11938         current symbol writer.
11939         (CodeGen): Added `bool want_debugging_support' argument to the
11940          constructor. If true, tell the ModuleBuild that we want debugging
11941         support and ask it for the ISymbolWriter.
11942         (Save): If we have a symbol writer, call it's Close() method after
11943         saving the assembly.
11944
11945         * driver.c (--debug): New command line argument to create a
11946         debugger information file.
11947
11948         * location.cs (SymbolDocument): New public property. Returns an
11949         ISymbolDocumentWriter object for the current source file or null
11950         if we don't have a symbol writer.
11951
11952 2002-03-21  Miguel de Icaza  <miguel@ximian.com>
11953
11954         * driver.cs (LoadAssembly): Correctly return when all the paths
11955         have been tried and not before.
11956
11957         * statement.cs (Switch.Emit): return the actual coverage for this
11958         statement (returns/not-returns)
11959
11960         (Switch.SimpleSwitchEmit): Do not generate jumps to the end of the
11961         switch of the statement if we are the last switch section.  That
11962         kills two problems: try/catch problems (we used to emit an empty
11963         nop at the end) and switch statements where all branches would
11964         return. 
11965
11966 2002-03-19  Miguel de Icaza  <miguel@ximian.com>
11967
11968         * driver.cs: Add default assemblies (the equivalent to the
11969         Microsoft CSC.RSP file)
11970
11971         * cs-tokenizer.cs: When updating `cols and setting it to zero,
11972         also update tokens_seen and set it to false.
11973
11974         * driver.cs: Implement --recurse for Mike.
11975
11976         * driver.cs (SplitPathAndPattern): Small bug fix, I was not
11977         correctly splitting out the paths.
11978
11979 2002-03-18  Miguel de Icaza  <miguel@ximian.com>
11980
11981         * interface.cs (Interface.PopulateProperty): Instead of using
11982         `parent' as the declaration space for the set parameters, use
11983         `this' 
11984
11985         * support.cs (InternalParameters): InternalParameters constructor
11986         takes a DeclSpace instead of a TypeContainer.
11987
11988         * expression.cs (ArrayCreation.EmitDynamicInitializers): If value
11989         types are being initialized, load the address of it before calling
11990         the function.  
11991
11992         (New): Provide a mechanism to disable the generation of local
11993         value type temporaries when the caller will be providing us with
11994         an address to store it.
11995
11996         (ArrayCreation.EmitDynamicInitializers): Use it.
11997
11998 2002-03-17  Miguel de Icaza  <miguel@ximian.com>
11999
12000         * expression.cs (Invocation.EmitArguments): Only probe for array
12001         property if there is more than one argument.  Sorry about that.
12002
12003         * class.cs (Invocation.EmitArguments): Fix to emit arguments for
12004         empty param arrays.
12005
12006         * class.cs (Method.LabelParameters): Fix incorrect code path that
12007         prevented the `ParamArrayAttribute' from being applied to the
12008         params attribute.
12009
12010 2002-03-16  Miguel de Icaza  <miguel@ximian.com>
12011
12012         * support.cs (ReflectionParameters): Correctly compute whether the
12013         last argument is a params array.  Fixes the problem with
12014         string.Split ('a')
12015
12016         * typemanager.cs: Make the assemblies array always be non-null
12017         (empty, but non-null)
12018
12019         * tree.cs (RecordDecl): New function that abstracts the recording
12020         of names.  This reports error 101, and provides a pointer to the
12021         previous declaration.  Fixes a crash in the compiler.
12022
12023         * cs-parser.jay (constructor_declaration): Update to new grammar,
12024         and provide a constructor_body that can be empty.
12025
12026 2002-03-15  Miguel de Icaza  <miguel@ximian.com>
12027
12028         * driver.cs: Add support for --resources.
12029
12030         * expression.cs: (FetchGetMethod, FetchAddressMethod, EmitAssign):
12031         Make all types for the various array helper methods be integer.
12032
12033         * ecore.cs (Expression.ConvertNumericExplicit): Pass the
12034         CheckState to ConvCast.
12035
12036         (ConvCast): Now it takes a `checked' state argument, to avoid
12037         depending on the emit context for the conversion, and just using
12038         the resolve time setting.
12039
12040         * expression.cs (ArrayCreation.EmitArrayArguments): New function,
12041         instead of Invocation.EmitArguments.  We do not emit the original
12042         arguments, instead we emit those which have been converted to
12043         unsigned int expressions.
12044
12045         * statement.cs (Block.EmitMeta): Drop tracking of indexes.
12046
12047         * codegen.cs: ditto.
12048
12049         * expression.cs (LocalVariableReference): Drop the use of the
12050         Store function that depended on the variable index.
12051
12052         * statement.cs (VariableInfo): Drop the `Idx' property from this
12053         class, as this is not taking into account the indexes for
12054         temporaries tat we generate during the execution, getting the
12055         indexes wrong.
12056
12057         * class.cs: First emit class initializers, then call the parent
12058         constructor. 
12059
12060         * expression.cs (Binary): Fix opcode emision.
12061         (UnaryMutator.EmitCode): Support checked code generation
12062
12063         * ecore.cs (MemberLookup): TypeManager.FindMembers will return
12064         matches for events for both the Static and Instance scans,
12065         pointing to the same element.   Fix that.
12066
12067 2002-03-14  Miguel de Icaza  <miguel@ximian.com>
12068
12069         * rootcontext.cs (ResolveTree): Always set the
12070         interface_resolve_order, because nested interfaces will be calling
12071         into us.
12072
12073         * class.cs (GetInterfaceOrClass): Track the same resolution
12074         process used by TypeManager.LookupType.  This fixes the nested
12075         type lookups in class declarations (separate path from
12076         LookupType). 
12077
12078         (TypeContainer.DefineType): Also define nested interfaces.
12079         (TypeContainer.RegisterOrder): New public function used to
12080         register the order in which child interfaces need to be closed.
12081
12082         Nested interfaces need to be closed after their parents have been
12083         created. 
12084
12085         * interface.cs (InterfaceAttr): Put all the logic for computing
12086         the interface attribute here. 
12087
12088         (DefineInterface): Register our interface order with the
12089         RootContext or with the TypeContainer depending on the case.
12090
12091 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12092
12093         * cs-parser.jay: rework foreach statement to work with the new
12094         changes to the policy on SimpleNames.
12095
12096         * report.cs: support Stacktrace on warnings as well.
12097
12098         * makefile: drop --unsafe and /unsafe from the compile.
12099
12100 2002-03-13  Ravi Pratap  <ravi@ximian.com>
12101
12102         * ecore.cs (StandardConversionExists): Modify to take an Expression
12103         as the first parameter. Ensure we do null -> reference type conversion
12104         checking.
12105
12106         * Everywhere : update calls accordingly, making use of MyEmptyExpr to store
12107         temporary Expression objects.
12108
12109 Wed Mar 13 12:32:40 CET 2002 Paolo Molaro <lupus@ximian.com>
12110
12111         * interface.cs: workaround bug in method overloading resolution
12112         (there is already a bugzilla bug for it).
12113
12114 2002-03-12  Miguel de Icaza  <miguel@ximian.com>
12115
12116         We could also solve this problem by having a separate path for
12117         performing type lookups, instead of DoResolve, we could have a
12118         ResolveType entry point, and only participating pieces of the
12119         production (simplename, deref, array) would implement this. 
12120
12121         * codegen.cs (EmitContext): New field OnlyLookupTypes used to
12122         signal SimpleName to only resolve type names and not attempt to
12123         resolve anything else.
12124
12125         * expression.cs (Cast): Set the flag.
12126
12127         * ecore.cs (SimpleName): Use the OnlyLookupTypes flag
12128
12129         * class.cs: Only report 108 if there is no `new' modifier.
12130
12131         * cs-parser.jay: rework foreach statement to work with the new
12132         changes to the policy on SimpleNames.
12133         
12134         * report.cs: support Stacktrace on warnings as well.
12135
12136         * makefile: drop --unsafe and /unsafe from the compile.
12137
12138 2002-03-11  Miguel de Icaza  <miguel@ximian.com>
12139
12140         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12141         lookups here, instead of doing that at parse time.  This means
12142         that our grammar will not introduce `LocalVariableReferences' as
12143         expressions at this point.  That solves the problem of code like
12144         this:
12145
12146         class X {
12147            static void Main ()
12148            { int X = 1;
12149             { X x = null }}}
12150
12151         This is only half the fix.  The full fix requires parameters to
12152         also be handled in this way.
12153
12154         * Everywhere: Use ec.DeclSpace on calls to LookupType, as this
12155         makes the use more obvious of the DeclSpace.  The
12156         ec.TypeContainer.TypeBuilder is now only used to pull the
12157         TypeBuilder for it.
12158
12159         My theory is that I can get rid of the TypeBuilder completely from
12160         the EmitContext, and have typecasts where it is used (from
12161         DeclSpace to where it matters).  
12162
12163         The only pending problem is that the code that implements Aliases
12164         is on TypeContainer, and probably should go in DeclSpace.
12165
12166         * ecore.cs (SimpleName.SimpleNameResolve): Perform local variable
12167         lookups here, instead of doing that at parse time.  This means
12168         that our grammar will not introduce `LocalVariableReferences' as
12169         expressions at this point.  That solves the problem of code like
12170         this:
12171
12172         class X {
12173            static void Main ()
12174            { int X = 1;
12175             { X x = null }}}
12176
12177         This is only half the fix.  The full fix requires parameters to
12178         also be handled in this way.
12179
12180         * class.cs (Property.DefineMethod): When implementing an interface
12181         method, set newslot, when implementing an abstract method, do not
12182         set the flag (before we tried never setting it, or always setting
12183         it, which is the difference).
12184         (Indexer.DefineMethod): same.
12185         (Method.DefineMethod): same.
12186
12187         * ecore.cs: Only set the status used flag if we get back a Field.
12188
12189         * attribute.cs: Temporary hack, so Paolo can keep working.
12190
12191 2002-03-08  Ravi Pratap  <ravi@ximian.com>
12192
12193         * attribute.cs (Attribute.UnmanagedType): This is to keep track of
12194         the unmanaged type in the case we have a MarshalAs attribute.
12195
12196         (Resolve): Handle the case when we are parsing the special MarshalAs
12197         attribute [we need to store the unmanaged type to use later]
12198
12199         * typemanager.cs (marshal_as_attr_type): Built in type for the 
12200         MarshalAs Attribute.
12201
12202         * attribute.cs (ApplyAttributes): Recognize the MarshalAs attribute 
12203         on parameters and accordingly set the marshalling info.
12204
12205 2002-03-09  Miguel de Icaza  <miguel@ximian.com>
12206
12207         * class.cs: Optimizing slightly by removing redundant code after
12208         we switched to the `NoTypes' return value.
12209         (Property.DefineMethod): use NoTypes here too.
12210
12211         This fixes the bug I introduced in my last batch of changes.
12212
12213 2002-03-05  Ravi Pratap  <ravi@ximian.com>
12214
12215         * tree.cs (RecordEnum): Add. We now keep track of enums too.
12216
12217         * class.cs (LookupInterfaceOrClass): Check against the list of recorded
12218         Enums since those are types too. 
12219
12220         * cs-parser.jay (enum_declaration): Record enums as we parse them.
12221
12222         * enum.cs (DefineEnum): Return if the TypeBuilder has already been defined 
12223         thanks to a call during the lookup process.
12224
12225 2002-03-07  Miguel de Icaza  <miguel@ximian.com>
12226
12227         * statement.cs (Foreach): Lots of work to accomodate a particular
12228         kind of foreach statement that I had not kept in mind.  It is
12229         possible to have foreachs on classes that provide a GetEnumerator
12230         method that return objects that implement the "pattern" for using
12231         a foreach, there is no need to support GetEnumerator
12232         specifically. 
12233
12234         This is needed to compile nant.
12235
12236         * decl.cs: Only report 114 if the member is not `Finalize' and if
12237         the warning level is at least 2.
12238
12239         * class.cs: Moved the compare function from Method to
12240         MethodSignature. 
12241
12242         (MethodSignature.InheritableMemberSignatureCompare): Add new
12243         filter function that is used to extract inheritable methods from a
12244         class. 
12245
12246         (Method.Define): Use the new `inheritable_method_signature_filter'
12247         delegate
12248
12249         * cs-tokenizer.cs (get_cmd_arg): Do not add white space to the
12250         command. 
12251
12252 2002-03-06  Miguel de Icaza  <miguel@ximian.com>
12253
12254         * ecore.cs (Expression.ConvertReferenceExplicit): Removed dead code.
12255
12256         * cs-parser.jay: Add opt_semicolon to the interface declaration.
12257
12258         * expression.cs: Pass location information to
12259         ConvertImplicitStandard. 
12260
12261         * class.cs: Added debugging code to track return values from
12262         interfaces. 
12263
12264 2002-03-05  Miguel de Icaza  <miguel@ximian.com>
12265
12266         * expression.cs (Is.DoResolve): If either side of the `is' is an
12267         interface, do not flag the warning.
12268
12269         * ecore.cs (ImplicitReferenceConversion): We need a separate test
12270         for interfaces
12271
12272         * report.cs: Allow for --fatal to be used with --probe.
12273
12274         * typemanager.cs (NoTypes): Move the definition for the empty Type
12275         array here. 
12276
12277         * class.cs (TypeContainer.FindMembers): Also look for methods defined by
12278         properties. 
12279         (TypeContainer.DefineProxy): New function used to proxy to parent
12280         implementations when implementing interfaces.
12281         (TypeContainer.ParentImplements): used to lookup if our parent
12282         implements a public function that is required by an interface.
12283         (TypeContainer.VerifyPendingMethods): Hook this up.
12284
12285         * typemanager.cs (TypeManager, AddModule, AddAssembly): Make the
12286         `modules' and `assemblies' arraylists into arrays.  We only grow
12287         these are the very early start up of the program, so this improves
12288         the speedof LookupType (nicely measured).
12289
12290         * expression.cs (MakeByteBlob): Replaced unsafe code with
12291         BitConverter, as suggested by Paolo.
12292
12293         * cfold.cs (ConstantFold.Binary): Special case: perform constant
12294         folding of string concatenation, but if either side is a string,
12295         and the other is not, then return null, and let the runtime use
12296         the concatenation on the string plus the object (using
12297         `Object.ToString'). 
12298
12299 2002-03-04  Miguel de Icaza  <miguel@ximian.com>
12300
12301         Constant Folding has been implemented now.
12302
12303         * expression.cs (Unary.Reduce): Do not throw an exception, catch
12304         the error instead on types that are not supported in one's
12305         complement. 
12306
12307         * constant.cs (Constant and all children): New set of functions to
12308         perform implict and explicit conversions.
12309
12310         * ecore.cs (EnumConstant): Implement the new functions to perform
12311         conversion by proxying to the child expression.
12312
12313         * codegen.cs: (ConstantCheckState): Constant evaluation has its
12314         own separate setting that can not be turned off from the command
12315         line using --unchecked or --checked and is only controlled using
12316         the checked/unchecked statements and expressions.  This setting is
12317         used by the constant folder to flag errors.
12318
12319         * expression.cs (CheckedExpr, UncheckedExpr): Set the
12320         ConstantCheckState as well.   
12321
12322         During Resolve, they also have to flag the state, because the
12323         constant folder runs completely in the Resolve phase.
12324
12325         * statement.cs (Checked, Unchecked): Set the ConstantCheckState as
12326         well.
12327
12328 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12329
12330         * cfold.cs: New file, this file contains the constant folder.
12331
12332         * ecore.cs (IMemoryLocation.AddressOf): Now takes an extra
12333         argument to track whether we are using the resulting address to
12334         load or store a value and provide better error messages. 
12335
12336         (FieldExpr.Emit, FieldExpr.EmitAssign, FieldExpr.AddressOf): Use
12337         new AddressOf arguments.
12338
12339         * statement.cs (Foreach.EmitCollectionForeach): Update
12340
12341         * expression.cs (Argument.Emit): Call AddressOf with proper
12342         arguments to track usage.
12343
12344         (New.DoEmit): Call AddressOf with new arguments.
12345
12346         (Unary.Emit): Adjust AddressOf call.
12347
12348 2002-03-01  Ravi Pratap  <ravi@ximian.com>
12349
12350         * cs-parser.jay (member_access): Change the case for pre-defined types
12351         to use a MemberAccess instead of a SimpleName. Thanks to Felix again for 
12352         this suggestion.
12353
12354         * class.cs (Operator::Emit): If we are abstract or extern, we don't have
12355         a method body.
12356
12357         * attribute.cs (CheckAttribute, ApplyAttribute): Ensure that we treat operators
12358         essentially like methods and apply attributes like MethodImplOptions to them too.
12359
12360         * ecore.cs (SimpleName.SimpleNameResolve): Perform a check on ec.TypeContainer.TypeBuilder
12361         not being null.
12362
12363         * codegen.cs (EmitContext): The constructor now takes in an extra argument specifying the
12364         DeclSpace as the distinction is important. We provide sane defaults as usually the TypeContainer
12365         is the DeclSpace.
12366
12367         * Update code everywhere accordingly.
12368
12369         * ecore.cs : Change references to ec.TypeContainer to ec.DeclSpace where appropriate.
12370
12371         * cs-parser.jay (enum_declaration): Set the current namespace of the enum.
12372
12373 2002-02-28  Ravi Pratap  <ravi@ximian.com>
12374
12375         * rootcontext.cs (LookupType): As we cycle through the chain of namespaces
12376         try performing lookups against those instead of jumping straight into using
12377         the 'using' clauses.
12378
12379         (ImplicitParent): Add. Thanks to Felix Arrese-Igor for this idea.
12380
12381         (LookupType): Perform lookups in implicit parents too.
12382
12383         * class.cs (GetInterfaceOrClass): Modify to perform the exact same lookup
12384         sequence as RootContext.LookupType. 
12385
12386         * rootcontext.cs (NamespaceLookup): Split out code from LookupType which tries 
12387         the various cases of namespace lookups into this method.
12388
12389 2002-03-01  Miguel de Icaza  <miguel@ximian.com>
12390
12391         * cs-parser.jay: Add support for [Attribute ()] (empty arguments
12392         in positional arguments)
12393
12394         * class.cs (Operator): Update the AllowedModifiers to contain
12395         extern. 
12396
12397         * cs-parser.jay: Update operator declaration to allow for the
12398         operator body to be empty.
12399
12400         * cs-tokenizer.cs: Added '\u' unicode support in strings and hex
12401         values. 
12402
12403 2002-02-27  Miguel de Icaza  <miguel@ximian.com>
12404
12405         * class.cs (Method.Emit): Label parameters.
12406
12407         * driver.cs: Return 1 or 0 as the program exit code.
12408
12409 2002-02-26  Miguel de Icaza  <miguel@ximian.com>
12410
12411         * expression.cs: Special case the `null' object when trying to
12412         auto-compute the type, as anything can be explicitly converted to
12413         that. 
12414
12415         * ecore.cs (Expression.ConvertExplicit): Bug fix, thanks for
12416         spotting this Paolo.
12417
12418         (Expression.ImplicitNumericConversion): Perform comparissions of
12419         the type using the underlying type in the case of an enumeration
12420         rather than using the enumeration type for the compare.
12421
12422         Cope with the underlying == type case, which is not possible to
12423         catch before. 
12424
12425         (Expression.ConvertNumericExplicit): Perform comparissions of
12426         the type using the underlying type in the case of an enumeration
12427         rather than using the enumeration type for the compare.
12428
12429         * driver.cs: If the user does not supply an extension, assume .exe
12430
12431         * cs-parser.jay (if_statement): Rewrote so that we can track the
12432         location for the if statement.
12433
12434         * expression.cs (Binary.ConstantFold): Only concat strings when
12435         the operation is "+", not everything ;-)
12436
12437         * statement.cs (Statement.EmitBoolExpression): Take a location
12438         argument. 
12439         (If, While, Do): Track location.
12440
12441         * expression.cs (Binary.ResolveOperator): In the object + string
12442         case, I was missing a call to ConvertImplicit
12443
12444 2002-02-25  Ravi Pratap  <ravi@ximian.com>
12445
12446         * parameter.cs (Parameter.ExternalType): Take in extra DeclSpace and
12447         Location arguments. Ensure we use RootContext.LookupType to do our work
12448         and not try to do a direct Type.GetType and ModuleBuilder.GetType
12449
12450         * interface.cs (PopulateMethod): Handle the type of the parameter being
12451         null gracefully.
12452
12453         * expression.cs (Invocation.BetterFunction): Handle the case when we 
12454         have a params method with no fixed arguments and a call is made with no
12455         arguments.
12456
12457 2002-02-25  Miguel de Icaza  <miguel@ximian.com>
12458
12459         * cs-tokenizer.cs: Add support for the quote-escape-sequence in
12460         the verbatim-string-literal
12461
12462         * support.cs (InternalParameters.ParameterModifier): handle null
12463         fixed parameters.
12464         (InternalParameters.ParameterType): ditto.
12465
12466         * parameter.cs (VerifyArgs): Also check if the fixed parameter is
12467         duplicating the name of the variable parameter.
12468         (GetParameterByName): Fix bug where we were not looking up array
12469         paramters if they were the only present (thanks Paolo!).
12470         (GetParameterInfo): We only have an empty set of types if both
12471         fixed and array are set to null.
12472         (GetParameterInfo-idx): Handle FixedParameter == null
12473
12474         * cs-parser.jay: Handle the case where there is no catch
12475         statements (missing null test).
12476
12477 2002-02-22  Miguel de Icaza  <miguel@ximian.com>
12478
12479         * driver.cs (MainDriver): Be conservative on our command line
12480         handling.
12481
12482         Catch DirectoryNotFoundException when calling GetFiles.
12483
12484         (SplitPathAndPattern): Used to split the input specification into
12485         a path and a pattern that we can feed to Directory.GetFiles.
12486
12487 2002-02-21  Miguel de Icaza  <miguel@ximian.com>
12488
12489         * statement.cs (Fixed): Implement the last case of the Fixed
12490         statement (string handling).
12491
12492         * expression.cs (StringPtr): New class used to return a char * to
12493         a string;  Used by the Fixed statement.
12494
12495         * typemanager.cs: Add char_ptr_type.  Add get_OffsetToStringData method.
12496
12497         * expression.cs (Binary.ResolveOperator): Remove redundant
12498         MemberLookup pn parent type.
12499         Optimize union call, we do not need a union if the types are the same.
12500         (Unary.ResolveOperator): REmove redundant MemberLookup on parent
12501         type.
12502
12503         Specialize the use of MemberLookup everywhere, instead of using
12504         the default settings. 
12505
12506         (StackAlloc): Implement stackalloc keyword.
12507
12508         * cs-parser.jay: Add rule to parse stackalloc.
12509
12510         * driver.cs: Handle /h, /help, /?
12511
12512         * expression.cs (MakeByteBlob): Removed the hacks we had in place
12513         before we supported unsafe code.
12514
12515         * makefile: add --unsafe to the self compilation of mcs.
12516
12517 2002-02-20  Miguel de Icaza  <miguel@ximian.com>
12518
12519         * expression.cs (PointerArithmetic): New class that is used to
12520         perform pointer arithmetic.
12521         (Binary.Resolve): Handle pointer arithmetic
12522         Handle pointer comparission.
12523         (ArrayPtr): Utility expression class that is used to take the
12524         address of an array.
12525
12526         (ElementAccess): Implement array access for pointers
12527
12528         * statement.cs (Fixed): Implement fixed statement for arrays, we
12529         are missing one more case before we are done.
12530
12531         * expression.cs (Indirection): Implement EmitAssign and set the
12532         ExprClass to Variable.  This allows pointer dereferences to be
12533         treated as variables, and to have values assigned to them.
12534
12535         * ecore.cs (Expression.StoreFromPtr): New utility function to
12536         store values dereferencing.
12537
12538 2002-02-20  Ravi Pratap  <ravi@ximian.com>
12539
12540         * expression.cs (Binary.ResolveOperator): Ensure that we are
12541         not trying to operate on a void type - this fixes the reported
12542         bug.
12543
12544         * decl.cs (CheckMethodAgainstBase): Do not allow overriding if
12545         the parent implementation is sealed.
12546
12547         * ../errors/cs0239.cs : Add.
12548
12549         * attribute.cs (ApplyAttributes): Handle Modulebuilders too.
12550
12551         * typemanager.cs (unverifiable_code_type): Corresponds to 
12552         System.Security.UnverifiableCodeAttribute. We need to emit this for modules
12553         which have unsafe code in them.
12554
12555         * rootcontext.cs (EmitCode): Emit the above attribute when we are in an 
12556         unsafe context.
12557
12558 2002-02-19  Miguel de Icaza  <miguel@ximian.com>
12559
12560         * cs-tokenizer.cs: Add support for @"litreal strings"
12561
12562         Make tokenizer accept pre-processor directives
12563         on any column (remove the old C-like limitation). 
12564
12565         * rootcontext.cs (EmitCode): Emit any global attributes.
12566         (AddGlobalAttributes): Used to keep track of assembly attributes. 
12567
12568         * attribute.cs (ApplyAttributes): Support AssemblyAttributes.
12569
12570         * cs-parser.jay: Add support for global attributes.  
12571
12572 2002-02-17  Miguel de Icaza  <miguel@ximian.com>
12573
12574         * expression.cs (Indirection): New helper class.  Unary will
12575         create Indirection classes to be able to implement the
12576         IMemoryLocation interface on it.
12577
12578 2002-02-16  Miguel de Icaza  <miguel@ximian.com>
12579
12580         * cs-parser.jay (fixed_statement): reference the right statement.
12581
12582         * statement.cs (Fixed.Emit): Finish implementing the fixed
12583         statement for the &x case.
12584
12585 2002-02-14  Miguel de Icaza  <miguel@ximian.com>
12586
12587         * class.cs (Property.Define, Method.Define): Remove newslot when
12588         `implementing'.  
12589
12590         * modifiers.cs: My use of NewSlot when `Abstract' was set was
12591         wrong.  NewSlot should only be used if the `new' keyword is present.
12592
12593         * driver.cs (GetSystemDir): Use CodeBase instead of FullName for
12594         locating our system dir.  Sorry about this.
12595
12596 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12597
12598         * driver.cs (GetSystemDir): Compute correctly the location of our
12599         system assemblies.  I was using the compiler directory instead of
12600         the library directory.
12601
12602 2002-02-13  Ravi Pratap  <ravi@ximian.com>
12603
12604         * expression.cs (BetterFunction): Put back in what Miguel commented out
12605         since it is the correct fix. The problem is elsewhere ;-)
12606
12607         (IsParamsMethodApplicable): Fix bug where we were not checking that the fixed
12608         parameters of the parms method are themselves compatible or not !
12609
12610         (StandardConversionExists): Fix very dangerous bug where we were forgetting
12611         to check that a class implements an interface before saying that an implicit
12612         conversion was allowed. Use ImplementsInterface to do the checking.
12613
12614 2002-02-13  Miguel de Icaza  <miguel@ximian.com>
12615
12616         * class.cs (Method.Define): Track whether we are an explicit
12617         implementation or not.  And only call DefineMethodOverride if we
12618         are an explicit implementation.
12619
12620         (Property.DefineMethod): Ditto.
12621
12622 2002-02-11  Ravi Pratap  <ravi@ximian.com>
12623
12624         * expression.cs (BetterFunction): Catch hideous bug which was
12625          preventing us from detecting ambiguous calls due to implicit casts i.e
12626         cs0121.
12627
12628 2002-01-29  Miguel de Icaza  <miguel@ximian.com>
12629
12630         * support.cs (Pair): Remove un-needed method.  I figured why I was
12631         getting the error in cs-parser.jay, the variable in a foreach loop
12632         is readonly, and the compiler does not really treat this as a variable.
12633
12634         * cs-parser.jay (fixed_statement): Fix grammar.  Use ASSIGN
12635         instead of EQUALS in grammar.  
12636
12637         * typemanager.cs (VerifyUnmanaged): Report correct error (208)
12638
12639         * expression.cs (Unary.DoResolve): Check whether the argument is
12640         managed or not.
12641
12642 2002-01-28  Miguel de Icaza  <miguel@ximian.com>
12643
12644         * support.cs: Api for Pair to set a value.  Despite the fact that
12645         the variables are public the MS C# compiler refuses to compile
12646         code that accesses the field if the variable is part of a foreach
12647         statement. 
12648
12649         * statement.cs (Fixed): Begin implementation of the fixed
12650         statement.
12651
12652         (Block.AddVariable): Return the VariableInfo on success and null
12653         on failure instead of true/false. 
12654
12655         * cs-parser.jay (foreach): Catch errors on variables already
12656         defined (we were ignoring this value before) and properly unwind
12657         the block hierarchy
12658
12659         (fixed_statement): grammar for the fixed statement.
12660
12661 2002-01-25  Miguel de Icaza  <miguel@ximian.com>
12662
12663         * expression.cs (UnaryMutator.IsIncrementableNumber): Allow also
12664         pointer types to be incretemented.
12665
12666         (SizeOf): Implement.
12667
12668         * cs-parser.jay (pointer_member_access): Implement
12669         expr->IDENTIFIER production.
12670
12671         * expression.cs (IndexerAccess.DoResolve, ArrayAccess.DoResolve,
12672         MemberAccess.DoResolve, Invocation.DoResolve): Check for pointers
12673         on safe contexts.
12674
12675         (Unary): Implement indirection.
12676
12677         * ecore.cs (Expression.UnsafeError): Reports error 214 (pointer
12678         use in non-unsafe context).
12679
12680         (SimpleName.DoResolve): Check for pointers in field access on safe
12681         contexts. 
12682
12683         (Expression.LoadFromPtr): Factor the load-indirect code in this
12684         function.  This was duplicated in UnboxCast and ParameterReference
12685
12686 2002-01-24  Miguel de Icaza  <miguel@ximian.com>
12687
12688         * expression.cs (ComposedCast): report an error if a pointer cast
12689         is used in a safe region.
12690
12691         * ecore.cs (Expression.ConvertExplicit): Add rules for implicit
12692         pointer type casts in unsafe context.
12693
12694         * codegen.cs (EmitContext): Set up IsUnsafe.
12695
12696         * cs-parser.jay (non_expression_type): Add productions for pointer
12697         casts. 
12698
12699         * expression.cs (Invocation.EmitCall): Remove chunk of buggy
12700         code.  We should not use force into static mode if the method is
12701         not virtual.  Fixes bug in MIS
12702
12703         * statement.cs (Do.Emit, While.Emit, For.Emit,
12704         Statement.EmitBoolExpression): Add support to Do and While to
12705         propagate infinite loop as `I do return' semantics.
12706
12707         Improve the For case to also test for boolean constants.
12708
12709         * attribute.cs (Attribute.ApplyAttributes): Add ParameterBuilder
12710         to the list of attributes we can add.
12711
12712         Remove `EmitContext' argument.
12713
12714         * class.cs (Method.Define): Apply parameter attributes.
12715         (Constructor.Define): Apply parameter attributes.
12716         (MethodCore.LabelParameters): Move here the core of labeling
12717         parameters. 
12718
12719         * support.cs (ReflectionParameters.ParameterModifier,
12720         InternalParameters.ParameterModifier): Use IsByRef on the type and
12721         only return the OUT bit for these parameters instead of in/out/ref
12722         flags.
12723
12724         This is because I miss-understood things.  The ParameterInfo.IsIn
12725         and IsOut represent whether the parameter has the [In] and [Out]
12726         attributes set.  
12727
12728 2002-01-22  Miguel de Icaza  <miguel@ximian.com>
12729
12730         * ecore.cs (FieldExpr.Emit): Release temporaries.
12731
12732         * assign.cs (LocalTemporary.Release): new function.
12733
12734         * codegen.cs (EmitContext.GetTemporaryStorage,
12735         EmitContext.FreeTemporaryStorage): Rework the way we deal with
12736         temporary storage.  Now we can "put back" localbuilders when we
12737         are done with them
12738
12739 2002-01-21  Miguel de Icaza  <miguel@ximian.com>
12740
12741         * ecore.cs (FieldExpr.Emit): Handle initonly fields specially: we
12742         need to make a copy of the variable to generate verifiable code.
12743
12744 2002-01-19  Miguel de Icaza  <miguel@ximian.com>
12745
12746         * driver.cs: Compute dynamically the system directory.
12747
12748         * ecore.cs (CopyNewMethods): reworked, exposed, made public.
12749         Slower, but more generally useful.  Used by the abstract
12750         registering implementation. 
12751
12752         * expression.cs (ResolveMemberAccess): Reorder the way we evaluate
12753         the rules for the special rule on Type/instances.  First check if
12754         we have the same name, and if so, try that special static path
12755         rather than the instance path.
12756
12757 2002-01-18  Miguel de Icaza  <miguel@ximian.com>
12758
12759         * cs-parser.jay: Emit 642 (warning: possible empty statement) for
12760         for, while and if.
12761
12762         * class.cs (TypeBuilder.DefineType): Do not allow inheritance from
12763         Enum, ValueType, Delegate or Array for non-corlib compiles.
12764
12765         * cs-tokenizer.cs: Catch long identifiers (645)
12766
12767         * typemanager.cs (IndexerPropetyName): Ravi never tested this
12768         piece of code.
12769
12770         * class.cs (TypeContainer.RegisterRequiredImplementations): Bug
12771         fix, we were returning too early, so we were not registering
12772         pending methods from abstract classes.
12773
12774         Do not register pending methods if the class is abstract.
12775
12776         * expression.cs (Conditional.DoResolve): Report circular implicit
12777         conversions when we neecd to compute it for conditional
12778         expressions. 
12779
12780         (Is.DoResolve): If the expression is always of the provided type,
12781         flag warning 183.  If the expression can not ever be of the
12782         provided type flag warning 184.
12783
12784         * class.cs: Catch 169 as well.
12785
12786         * ecore.cs (FieldExpr): For now in AddressOf mark as assigned and
12787         read. 
12788
12789 2002-01-18  Nick Drochak  <ndrochak@gol.com>
12790
12791         * makefile: remove path to beta2 csc.exe.  path to csc.exe must be in PATH instead.
12792
12793 2002-01-17  Miguel de Icaza  <miguel@ximian.com>
12794
12795         * interface.cs: (PopulateMethod): Check for pointers being defined
12796         only if the unsafe context is active.
12797         (PopulateProperty): ditto.
12798         (PopulateIndexer): ditto.
12799
12800         * class.cs (Method, Method.Define): Allow `unsafe' modifier to be
12801         specified.  If pointers are present, make sure that they are
12802         present in an unsafe context.
12803         (Constructor, Constructor.Define): ditto.
12804         (Field, Field.Define): ditto.
12805         (Property, Property.Define): ditto.
12806         (Event, Event.Define): ditto.
12807
12808         * interface.cs (Interface.GetInterfaceTypeByName): Only lookup the
12809         hashtable if there are classes or structs defined.
12810
12811         * expression.cs (LocalVariableReference.DoResolve): Simplify this
12812         code, as the constant resolution moved.
12813
12814         * statement.cs (Block.EmitMeta): Resolve all constants as we emit
12815         the metadata, so we can flag error 133. 
12816
12817         * decl.cs (MemberCore.UnsafeOK): New function to test that a
12818         pointer is being declared in an unsafe context.
12819
12820 2002-01-16  Miguel de Icaza  <miguel@ximian.com>
12821
12822         * modifiers.cs (Modifiers.Check): Require a Location argument.
12823         Report error 227 for Unsafe use.
12824
12825         * typemanager.cs: Remove IsPointerType, we should be using Type.IsPointer
12826
12827         * statement.cs (For.Emit): If the test is null, then report that
12828         we do `return', as we wont reach anything afterwards.
12829
12830         (Switch.SwitchGoverningType): Track the expression that matched
12831         the conversion.
12832
12833         * driver.cs: Allow negative numbers as an error code to flag.
12834
12835         * cs-parser.jay: Handle 1551.
12836
12837         * namespace.cs: Add 1537 checking (repeated using alias namespaces).
12838
12839 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12840
12841         * cs-parser.jay: Report 1518 (type declaration can only contain
12842         class, struct, interface, enum or delegate)
12843
12844         (switch_label): Report 1523 (keywords `case' or `default' must
12845         preced code)
12846
12847         (opt_switch_sections): Report 1522 (empty switch)
12848
12849         * driver.cs: Report 1515 (response file specified multiple times)
12850         Report 1516 (Source file specified multiple times).
12851
12852         * expression.cs (Argument.Resolve): Signal 1510
12853
12854         (BaseAccess.Resolve, BaseIndexer.Resolve): Signal 1511 (base
12855         access not allowed in static code)
12856
12857 2002-01-11  Ravi Pratap  <ravi@ximian.com>
12858
12859         * typemanager.cs (IsPointerType): Utility method which we are going
12860         to need a lot.
12861
12862         * ecore.cs (ImplicitReferenceConversion): A pointer type cannot be cast to
12863         the object type, so we take care of that.
12864
12865         * expression.cs (FullMethodDesc): Also include the return type in descriptions.
12866
12867         * support.cs (ParameterDesc): Fix minor bug which was causing params tags to be
12868         added to non-params parameters :-)
12869
12870         * typemanager.cs (CSharpName): Include 'void' type too. 
12871
12872         (void_ptr_type): Include in the set of core types.
12873
12874         * ecore.cs (ConvertImplicit): Make use of ConvertImplicitStandard instead of 
12875         duplicating code.
12876
12877         (ConvertImplicitStandard): Handle standard implicit pointer conversions when we have 
12878         an unsafe context.
12879
12880         * cs-parser.jay (local_variable_pointer_type): Add support for 'void *' as I had 
12881         completely forgotten about it.
12882
12883 2002-01-10  Ravi Pratap  <ravi@ximian.com>
12884
12885         * cs-parser.jay (pointer_type): Add. This begins our implementation
12886         of parsing rules for unsafe code.
12887
12888         (unsafe_statement): Implement.
12889
12890         (embedded_statement): Modify to include the above.
12891
12892         * statement.cs (Unsafe): Implement new class for unsafe blocks.
12893
12894         * codegen.cs (EmitContext.InUnsafe): Add. This determines
12895         if the current context is an unsafe one.
12896
12897         * cs-parser.jay (local_variable_pointer_type): Since local variable types
12898         are handled differently, we need separate rules for them.
12899
12900         (local_variable_declaration): Update to use local_variable_pointer_type
12901         to allow variable declarations of unmanaged pointer types.
12902
12903         * expression.cs (Unary.ResolveOperator): Ensure that the '&' operator is used only
12904         in unsafe contexts.
12905
12906         * ../errors/cs0214.cs : Add.
12907
12908 2002-01-16  Nick Drochak  <ndrochak@gol.com>
12909
12910         * makefile: remove 'response' file when cleaning.
12911
12912 2002-01-15  Miguel de Icaza  <miguel@ximian.com>
12913
12914         * cs-parser.jay: Report 1524.
12915
12916 2002-01-14  Miguel de Icaza  <miguel@ximian.com>
12917
12918         * typemanager.cs (RegisterMethod): drop checking if we have
12919         registered this from here
12920
12921 2002-01-12  Miguel de Icaza  <miguel@ximian.com>
12922
12923         * class.cs (Method.EmitDestructor): Implement calling our base
12924         destructor. 
12925
12926         * statement.cs (Try.Emit): Fix to reset the InFinally to the old
12927         value of InFinally.
12928
12929         * codegen.cs (EmitContext.EmitTopBlock): Destructors will call
12930         this routine and will wrap the call in a try/catch block.  Deal
12931         with the case.
12932
12933 2002-01-11  Miguel de Icaza  <miguel@ximian.com>
12934
12935         * ecore.cs (Expression.MemberLookup): instead of taking a
12936         parameter `same_type' that was used to tell whether we could
12937         access private members we compute our containing type from the
12938         EmitContext.
12939
12940         (FieldExpr): Added partial support for volatile fields.  This does
12941         not work for volatile fields exposed from assemblies, as I can not
12942         figure out how to extract the modreq from it.
12943
12944         Updated all the source files to use this.
12945
12946         * codegen.cs (EmitContext): Compute ContainerType ahead of time,
12947         because it is referenced by MemberLookup very often. 
12948
12949 2002-01-09  Ravi Pratap  <ravi@ximian.com>
12950
12951         * typemanager.cs (IndexerPropertyName): If we have a TypeBuilder, use
12952         TypeBuilder.GetCustomAttributes to retrieve what we need.
12953
12954         Get rid of redundant default_member_attr_type as this is the same as
12955         default_member_type which already exists.
12956
12957         * interface.cs, attribute.cs : Update accordingly.
12958
12959 2002-01-08  Miguel de Icaza  <miguel@ximian.com>
12960
12961         * typemanager.cs: Enable IndexerPropertyName again.  It does not
12962         work for TYpeBuilders though.  Ravi, can you please fix this?
12963
12964         * cs-tokenizer.cs: Accept _ as a name in pp-expressions.
12965
12966         * expression.cs (Argument.Emit): Handle the case of ref objects
12967         being passed to ref functions;  
12968
12969         (ParameterReference.EmitLoad): Loads the content of the pointer
12970         without dereferencing.
12971
12972 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12973
12974         * cs-tokenizer.cs: Implemented the pre-processing expressions.
12975
12976 2002-01-08  Ravi Pratap  <ravi@ximian.com>
12977
12978         * class.cs (Indexer.DefineMethod): Incorporate the interface
12979         type in the name of the method if we are doing explicit interface
12980         implementation.
12981
12982         * expression.cs (ConversionExists): Remove as it is completely obsolete.
12983
12984         (BetterConversion): Fix extremely trivial bug where we were referring to
12985         ConversionExists instead of StandardConversionExists ! Hooray, things are fine
12986         again !
12987
12988         * ../errors/bug16.cs : Add although we have fixed it.
12989
12990 2002-01-07  Miguel de Icaza  <miguel@ximian.com>
12991
12992         * expression.cs (BaseIndexer): Begin implementation.
12993
12994         * class.cs (TypeContainer.IsInterfaceMethod): Bug fix.
12995
12996         * cs-parser.jay (indexer_declarator): Use qualified_identifier
12997         production directly to remove a shift/reduce, and implement
12998         explicit interface implementation.
12999
13000         * cs-tokenizer.cs: Fix tokenizer, it was consuming one extra char
13001         after a floating point suffix.
13002
13003         * expression.cs (DoNumericPromotions): Improved the conversion for
13004         uint/uint.  If we have a constant, we avoid doing a typecast to a
13005         larger type.
13006
13007         * class.cs (Indexer): Implement explicit interface implementation
13008         for indexers.
13009
13010 Sat Jan 5 16:08:23 CET 2002 Paolo Molaro <lupus@ximian.com>
13011
13012         * class.cs: make the default instance constructor public and hidebysig.
13013
13014 2001-01-03  Ravi Pratap  <ravi@ximian.com>
13015
13016         * interface.cs (EmitDefaultMemberAttr): Make this helper method static
13017         so we can call it from elsewhere.
13018
13019         * class.cs (TypeContainer.Emit): Emit the attribute here too. The rule is that
13020         we emit it internally if the class has a defined indexer; otherwise the user
13021         emits it by decorating the class definition with the DefaultMemberAttribute.
13022
13023         * attribute.cs (ApplyAttributes): Perform checks to see that the DefaultMember
13024         attribute is not used on a type which defines an indexer.
13025
13026         * cs-tokenizer.cs (get_cmd_arg): Ensure we trim whitespace and also include the tab
13027         character when we skip whitespace.
13028
13029         * ../errors/cs0646.cs : Add.
13030
13031 2002-01-03  Miguel de Icaza  <miguel@ximian.com>
13032
13033         * ecore.cs (SimpleName.ResolveSimpleName): Report error 120
13034         again. 
13035
13036         * makefile: Add practical target `mcs3.exe' which builds the third
13037         generation compiler. 
13038
13039         * expression.cs (New): Fix structures constructor calling.
13040
13041         * class.cs (Property, Method, Indexer): Emit Final flag on the
13042         method if we are an interface implementation and we are not
13043         abstract. 
13044
13045         * ecore.cs (PropertyExpr): New public field `IsBase', tells
13046         whether this property is referencing a `base' method.
13047
13048         * expression.cs (Invocation.EmitCall): take an extra argument:
13049         is_base, this is used to determine whether the `call' or
13050         `callvirt' opcode should be used.
13051
13052
13053         * delegate.cs: update EmitCall.
13054
13055         * class.cs (Method.Define): Set NewSlot for the cases where we are
13056         not implementing an interface method.
13057
13058         (Property.Define): ditto.
13059
13060 2002-01-02  Miguel de Icaza  <miguel@ximian.com>
13061
13062         * cs-tokenizer.cs: (Tokenizer.escape): Escape '\r' as '\r' not as
13063         'r'.  Allows mcs to parse itself fully.
13064
13065 2002-01-02  Ravi Pratap  <ravi@ximian.com>
13066
13067         * expression.cs (ArrayCreation.num_automatic_initializers): Keep track
13068         of the number of initializers that require the InitializeArray method.
13069
13070         (CheckIndices): Store the Expression in all cases - not the plain value. Also
13071         update the above field where necessary.
13072
13073         (MakeByteBlob): Update accordingly.
13074
13075         (DoEmit): Call EmitStaticInitializers only if the number of initializers is 
13076         greater than 2.
13077
13078         (EmitDynamicInitializers): Update in accordance with the new optimization.
13079
13080         (ArrayAccess.EmitStoreOpcode): Include char type along with short and ushort - the
13081         same OpCode applies.
13082
13083         * cs-parser.jay : Fix some glaring errors I introduced.
13084
13085 2002-01-01  Ravi Pratap  <ravi@ximian.com> 
13086
13087         * parameters.cs (AddVariable, AddConstant): Pass in current_local_parameters
13088         so that we can check for name clashes there too.
13089
13090         * typemanager.cs (default_member_attr_type): The attribute that we need to emit
13091         for interface indexers.
13092
13093         * interfaces.cs (Define): Emit the default member attribute.
13094
13095         * expression.cs (MakeByteBlob): Fix extremely trivial bug where the wrong
13096         variable was being referred to while setting the value ;-)
13097
13098 2002-01-01  Miguel de Icaza  <miguel@ximian.com>
13099
13100         * expression.cs (MakeByteBlob): Optimize: we do not need to fill
13101         byte-by-byte information when we know the data is zero.
13102
13103         Make the block always a multiple of 4, because
13104         DefineInitializedData has a bug.
13105
13106         * assign.cs: Fix, we should assign from the temporary, not from
13107         the source. 
13108
13109         * expression.cs (MakeByteBlob): Fix my incorrect code.
13110
13111 2001-12-31  Miguel de Icaza  <miguel@ximian.com>
13112
13113         * typemanager.cs (EnumToUnderlying): This function is used to get
13114         the underlying type from an enumeration, because it does not
13115         always work. 
13116
13117         * constant.cs: Use the I4_S form for values between -128 and 127.
13118
13119         * statement.cs (Block.LookupLabel): Looks up a label.
13120         (Block): Drop support for labeled blocks.
13121
13122         (LabeledStatement): New kind of statement that represents a label
13123         only.
13124
13125         (Goto): Finally implement this bad boy.
13126
13127         * cs-parser.jay: Update to reflect new mechanism to implement
13128         labels.
13129
13130 2001-12-30  Miguel de Icaza  <miguel@ximian.com>
13131
13132         * codegen.cs (EmitContext.This): a codegen property that keeps the
13133         a single instance of this instead of creating many different this
13134         instances. 
13135
13136         * delegate.cs (Delegate.DoResolve): Update to use the property;
13137
13138         * ecore.cs (SimpleName.SimpleNameResolve): Ditto
13139
13140         * expression.cs (BaseAccess.DoResolve): Ditto.
13141
13142 2001-12-29  Ravi Pratap  <ravi@ximian.com>
13143
13144         * typemanager.cs (methodimpl_attr_type): Add to hold the type
13145         corresponding to System.Runtime.CompilerServices.MethodImplAttribute.
13146
13147         (InitCoreTypes): Update accordingly.
13148
13149         * attribute.cs (Resolve): Remember if the attribute is a MethodImplAttribute
13150         so we can quickly store the state.
13151
13152         (ApplyAttributes): Set the correct implementation flags
13153         for InternalCall methods.
13154
13155 2001-12-29  Miguel de Icaza  <miguel@ximian.com>
13156
13157         * expression.cs (EmitCall): if a method is not virtual, then do
13158         not use callvirt on it.
13159
13160         (ArrayAccess.EmitAssign): storing non-builtin value types (ie,
13161         user defined stuff) requires the use of stobj, which takes an
13162         address on the stack instead of an array and an index.  So emit
13163         the Ldelema operation for it.
13164
13165         (EmitStoreOpcode): Use stobj for valuetypes.
13166
13167         (UnaryMutator.EmitCode): Use the right 1 value depending on
13168         whether we are dealing with int64/uint64, float or doubles.
13169
13170         * class.cs (TypeContainer.AddConstructor): Fix the logic to define
13171         constructors that I implemented last night.
13172
13173         (Constructor.IsDefault): Fix to work properly for static
13174         constructors.
13175
13176         * cs-parser.jay (CheckDef): report method signature errors.
13177         Update error number 103 to be 132.
13178
13179         * decl.cs: New AdditionResult enumeration value: MethodExists.
13180         Although we do this check for methods later on in the semantic
13181         analysis, catching repeated default constructors is so easy that
13182         we catch these here. 
13183
13184         * expression.cs (Binary.DoNumericPromotions): Fix the uint64 type
13185         promotions code.
13186
13187         (ParameterReference.EmitAssign, Emit): handle
13188         bools as bytes.
13189
13190         (ArrayAccess.EmitLoadOpcode): Handle bool type here.
13191         (ArrayAccess.EmitStoreOpcode): ditto.
13192
13193         * cs-tokenizer.cs (is_punct): Eliminated empty computation.
13194
13195         * expression.cs (MakeByteBlob): Complete all the missing types
13196         (uint, short, ushort, byte, sbyte)
13197
13198         * class.cs: Only init instance field initializers on instance
13199         constructors. 
13200
13201         Rename `constructors' to instance_constructors. 
13202
13203         (TypeContainer.AddConstructor): Only add constructors to the list
13204         if it is not static.
13205
13206         Make sure that we handle default_static_constructor independently
13207         everywhere where we handle instance_constructors
13208
13209 2001-12-28  Miguel de Icaza  <miguel@ximian.com>
13210
13211         * class.cs: Do not lookup or create a base initializer for a
13212         static constructor.
13213
13214         (ConstructorInitializer.Resolve): use the proper type to lookup
13215         for constructors.
13216
13217         * cs-parser.jay: Report error 1585 (modifiers between type and name).
13218
13219         * enum.cs, interface.cs: Remove CloseType, this is taken care by
13220         in DeclSpace. 
13221
13222         * decl.cs: CloseType is now an virtual method, the default
13223         implementation just closes this type.
13224
13225 2001-12-28  Ravi Pratap  <ravi@ximian.com>
13226
13227         * attribute.cs (DefinePInvokeMethod): Set the implementation flags
13228         to PreserveSig by default. Also emit HideBySig on such methods.
13229
13230         Basically, set the defaults to standard values.
13231
13232         * expression.cs (Invocation.BetterFunction): We need to make sure that for each
13233         argument, if candidate is better, it can't be worse than the best !
13234
13235         (Invocation): Re-write bits to differentiate between methods being
13236         applicable in their expanded form and their normal form - for params
13237         methods of course.
13238
13239         Get rid of use_standard everywhere as only standard conversions are allowed
13240         in overload resolution. 
13241
13242         More spec conformance.
13243
13244 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13245
13246         * driver.cs: Add --timestamp, to see where the compiler spends
13247         most of its time.
13248
13249         * ecore.cs (SimpleName.DoResolve): Do not create an implicit
13250         `this' in static code.
13251
13252         (SimpleName.DoResolve): Implement in terms of a helper function
13253         that allows static-references to be passed upstream to
13254         MemberAccess.
13255
13256         (Expression.ResolveWithSimpleName): Resolve specially simple
13257         names when called by MemberAccess to implement the special
13258         semantics. 
13259
13260         (Expression.ImplicitReferenceConversion): Handle conversions from
13261         Null to reference types before others, as Null's type is
13262         System.Object. 
13263
13264         * expression.cs (Invocation.EmitCall): Handle the special case of
13265         calling methods declared on a reference type from a ValueType
13266         (Base classes System.Object and System.Enum)
13267
13268         (MemberAccess.Resolve): Only perform lookups on Enumerations if
13269         the left hand side is a TypeExpr, not on every enumeration. 
13270
13271         (Binary.Resolve): If types are reference types, then do a cast to
13272         object on operators != and == of both arguments.
13273
13274         * typemanager.cs (FindMembers): Extract instance and static
13275         members if requested.
13276
13277         * interface.cs (PopulateProperty): Use void_type instead of null
13278         as the return type for the setter method.
13279
13280         (PopulateIndexer): ditto.
13281
13282 2001-12-27  Ravi Pratap  <ravi@ximian.com>
13283
13284         * support.cs (ReflectionParameters): Fix minor bug where we
13285         were examining the wrong parameter for the ParamArray attribute.
13286
13287         Cope with requests for the type of the parameter at position
13288         greater than the params parameter's. We now return the element
13289         type of the params array as that makes more sense.
13290
13291         * expression.cs (Invocation.IsParamsMethodApplicable): Update 
13292         accordingly as we no longer have to extract the element type
13293         ourselves.
13294
13295         (Invocation.OverloadResolve): Update.
13296
13297 2001-12-27  Miguel de Icaza  <miguel@ximian.com>
13298
13299         * statement.cs (Foreach.GetEnumeratorFilter): Do not compare
13300         against IEnumerator, test whether the return value is a descendant
13301         of the IEnumerator interface.
13302
13303         * class.cs (Indexer.Define): Use an auxiliary method to implement
13304         the other bits of the method definition.  Begin support for
13305         explicit interface implementation.
13306
13307         (Property.DefineMethod): Use TypeManager.void_type instead of null
13308         for an empty return value.
13309
13310 2001-12-26  Miguel de Icaza  <miguel@ximian.com>
13311
13312         * expression.cs (MemberAccess.ResolveMemberAccess): if we are
13313         dealing with a FieldExpr which is composed of a FieldBuilder, in
13314         the code path we did extract the constant, but we should have
13315         obtained the underlying value to be able to cast it (otherwise we
13316         end up in an infinite loop, this is what Ravi was running into).
13317
13318         (ArrayCreation.UpdateIndices): Arrays might be empty.
13319
13320         (MemberAccess.ResolveMemberAccess): Add support for section
13321         14.5.4.1 that deals with the special case of E.I when E is a type
13322         and something else, that I can be a reference to a static member.
13323
13324         (ArrayCreation.MakeByteBlob): It is not an error to not be able to
13325         handle a particular array type to create byte blobs, it is just
13326         something we dont generate byteblobs for.
13327
13328         * cs-tokenizer.cs (get_cmd_arg): Ignore \r in commands and
13329         arguments. 
13330
13331         * location.cs (Push): remove the key from the hashtable that we
13332         are about to add.   This happens for empty files.
13333
13334         * driver.cs: Dispose files after we have parsed them.
13335
13336         (tokenize): new function that only runs the tokenizer on its
13337         input, for speed testing.
13338
13339 2001-12-26  Ravi Pratap  <ravi@ximian.com>
13340
13341         * class.cs (Event.Define): Define the private field only if there
13342         are no accessors defined.
13343
13344         * expression.cs (ResolveMemberAccess): If there is no associated
13345         field with the event, that means we have an event defined with its
13346         own accessors and we should flag error cs0070 since transforming
13347         ourselves into a field is not valid in that case.
13348
13349         * ecore.cs (SimpleName.DoResolve): Same as above.
13350
13351         * attribute.cs (DefinePInvokeMethod): Set the default calling convention
13352         and charset to sane values.
13353
13354 2001-12-25  Ravi Pratap  <ravi@ximian.com>
13355
13356         * assign.cs (DoResolve): Perform check on events only if they 
13357         are being accessed outside the declaring type.
13358
13359         * cs-parser.jay (event_declarations): Update rules to correctly
13360         set the type of the implicit parameter etc.
13361
13362         (add_accessor, remove_accessor): Set current local parameters.
13363
13364         * expression.cs (Binary): For delegate addition and subtraction,
13365         cast the return value from the method into the appropriate delegate
13366         type.
13367
13368 2001-12-24  Ravi Pratap  <ravi@ximian.com>
13369
13370         * typemanager.cs (RegisterDelegateData, GetDelegateData): Get rid
13371         of these as the workaround is unnecessary.
13372
13373         * delegate.cs (NewDelegate.DoResolve): Get rid of bits which registered
13374         delegate data - none of that is needed at all.
13375
13376         Re-write bits to extract the instance expression and the delegate method
13377         correctly.
13378
13379         * expression.cs (Binary.ResolveOperator): Handle the '-' binary operator 
13380         on delegates too.
13381
13382         * attribute.cs (ApplyAttributes): New method to take care of common tasks
13383         of attaching attributes instead of duplicating code everywhere.
13384
13385         * everywhere : Update code to do attribute emission using the above method.
13386
13387 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13388
13389         * expression.cs (IsParamsMethodApplicable): if there are not
13390         parameters, return immediately.
13391
13392         * ecore.cs: The 0 literal can be implicity converted to an enum
13393         type. 
13394
13395         (SimpleName.DoResolve): First lookup the type, then lookup the
13396         members. 
13397
13398         (FieldExpr.Emit): If the InstanceExpression is a ValueType, we
13399         want to get its address.  If the InstanceExpression is not
13400         addressable, store the result in a temporary variable, then get
13401         the address of it.
13402
13403         * codegen.cs: Only display 219 errors on warning level or above. 
13404
13405         * expression.cs (ArrayAccess): Make it implement the
13406         IMemoryLocation interface.
13407
13408         (Binary.DoResolve): handle the operator == (object a, object b)
13409         and operator != (object a, object b) without incurring into a
13410         BoxedCast (because 5 != o should never be performed).
13411
13412         Handle binary enumerator operators.
13413
13414         (EmitLoadOpcode): Use Ldelema if the object we are loading is a
13415         value type, otherwise use Ldelem_ref.
13416
13417         Use precomputed names;
13418
13419         (AddressOf): Implement address of
13420
13421         * cs-parser.jay (labeled_statement): Fix recursive block
13422         addition by reworking the production.
13423
13424         * expression.cs (New.DoEmit): New has a special case:
13425                 
13426                  If we are dealing with a ValueType, we have a few
13427                  situations to deal with:
13428                 
13429                     * The target of New is a ValueType variable, that is
13430                       easy, we just pass this as the variable reference
13431                 
13432                     * The target of New is being passed as an argument,
13433                       to a boxing operation or a function that takes a
13434                       ValueType.
13435                 
13436                       In this case, we need to create a temporary variable
13437                       that is the argument of New.
13438
13439
13440 2001-12-23  Ravi Pratap  <ravi@ximian.com>
13441
13442         * rootcontext.cs (LookupType): Check that current_type is not null before
13443         going about looking at nested types.
13444
13445         * ecore.cs (EventExpr.EmitAddOrRemove): Rename from EmitAssign as we do
13446         not implement the IAssignMethod interface any more.
13447
13448         * expression.cs (MemberAccess.ResolveMemberAccess): Handle EventExprs specially
13449         where we tranform them into FieldExprs if they are being resolved from within
13450         the declaring type.
13451
13452         * ecore.cs (SimpleName.DoResolve): Do the same here.
13453
13454         * assign.cs (DoResolve, Emit): Clean up code considerably. 
13455
13456         * ../errors/bug10.cs : Add.
13457
13458         * ../errors/cs0070.cs : Add.
13459
13460         * typemanager.cs : Use PtrHashtable for Delegate data hashtable etc.
13461
13462         * assign.cs : Get rid of EventIsLocal everywhere.
13463
13464 2001-12-23  Miguel de Icaza  <miguel@ximian.com>
13465
13466         * ecore.cs (ConvertIntLiteral): finished the implementation.
13467
13468         * statement.cs (SwitchLabel): Convert the value we are using as a
13469         key before looking up the table.
13470
13471 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13472
13473         * codegen.cs (EmitTopBlock): Require a Location argument now.
13474
13475         * cs-parser.jay (constructor_declarator): We need to setup
13476         current_local_parameters before we parse the
13477         opt_constructor_initializer, to allow the variables to be bound
13478         to the constructor arguments.
13479
13480         * rootcontext.cs (LookupType): First lookup nested classes in our
13481         class and our parents before we go looking outside our class.
13482
13483         * expression.cs (ConstantFold): Extract/debox the values at the
13484         beginnning. 
13485
13486         * rootcontext.cs (EmitCode): Resolve the constants first before we
13487         resolve the types.  This is not really needed, but it helps debugging.
13488
13489         * statement.cs: report location.
13490
13491         * cs-parser.jay: pass location to throw statement.
13492
13493         * driver.cs: Small bug fix.
13494
13495         * report.cs: Updated format to be 4-zero filled digits.
13496
13497 2001-12-22  Ravi Pratap  <ravi@ximian.com>
13498
13499         * expression.cs (CheckIndices): Fix minor bug where the wrong
13500         variable was being referred to ;-)
13501
13502         (DoEmit): Do not call EmitStaticInitializers when the 
13503         underlying type is System.Object.
13504
13505 2001-12-21  Ravi Pratap  <ravi@ximian.com>
13506
13507         * ecore.cs (EventExpr.Resolve): Implement to correctly set the type
13508         and do the usual workaround for SRE.
13509
13510         * class.cs (MyEventBuilder.EventType): New member to get at the type
13511         of the event, quickly.
13512
13513         * expression.cs (Binary.ResolveOperator): Handle delegate addition.
13514
13515         * assign.cs (Assign.DoResolve): Handle the case when the target
13516         is an EventExpr and perform the necessary checks.
13517
13518         * ecore.cs (EventExpr.EmitAssign): Implement the IAssignMethod
13519         interface.
13520
13521         (SimpleName.MemberStaticCheck): Include check for EventExpr.
13522
13523         (EventExpr): Set the type in the constructor itself since we 
13524         are meant to be born fully resolved.
13525
13526         (EventExpr.Define): Revert code I wrote earlier.
13527                 
13528         * delegate.cs (NewDelegate.Resolve): Handle the case when the MethodGroup's
13529         instance expression is null. The instance expression is a This in that case
13530         or a null, depending on whether it is a static method or not.
13531
13532         Also flag an error if the reference to a method is ambiguous i.e the MethodGroupExpr
13533         refers to more than one method.
13534
13535         * assign.cs (DoResolve): Check whether the event belongs to the same Type container
13536         and accordingly flag errors.
13537
13538 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13539
13540         * statement.cs (Throw.Emit): Add support for re-throwing exceptions.
13541
13542 2001-12-22  Miguel de Icaza  <miguel@ximian.com>
13543
13544         * location.cs (ToString): Provide useful rutine.
13545
13546 2001-12-21  Miguel de Icaza  <miguel@ximian.com>
13547
13548         * ecore.cs (Expression.ConvertIntLiteral): Do not return Constant
13549         objects, return the actual integral boxed.
13550
13551         * statement.cs (SwitchLabel): define an ILLabel for each
13552         SwitchLabel. 
13553
13554         (Switch.CheckSwitch): If the value is a Literal, extract
13555         the underlying literal.
13556
13557         Also in the unused hashtable we had, add the SwitchLabel so we can
13558         quickly look this value up.
13559
13560         * constant.cs: Implement a bunch of new constants.  Rewrite
13561         Literal based on this.  Made changes everywhere to adapt to this.
13562
13563         * expression.cs (Expression.MakeByteBlob): Optimize routine by
13564         dereferencing array only once, and also copes with enumrations.
13565
13566         bytes are two bytes wide, not one.
13567
13568         (Cast): Perform constant conversions.
13569
13570         * ecore.cs (TryImplicitIntConversion): Return literals instead of
13571         wrappers to the literals here.
13572
13573         * expression.cs (DoNumericPromotions): long literals can converted
13574         to ulong implicity (this is taken care of elsewhere, but I was
13575         missing this spot).
13576
13577         * ecore.cs (Expression.Literalize): Make the return type Literal,
13578         to improve type checking.
13579
13580         * rootcontext.cs: Lookup for nested classes in our class hierarchy.
13581
13582 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13583
13584         * literal.cs: Revert code from ravi that checked the bounds.  The
13585         bounds are sane by the definition of the type itself. 
13586
13587         * typemanager.cs: Fix implementation of ImplementsInterface.  We
13588         need to actually look up in our parent hierarchy for interfaces
13589         implemented. 
13590
13591         * const.cs: Use the underlying type for enumerations
13592
13593         * delegate.cs: Compute the basename for the delegate creation,
13594         that should fix the delegate test case, and restore the correct
13595         Type Lookup semantics in rootcontext
13596
13597         * rootcontext.cs: Revert Ravi's last patch.  The correct way of
13598         referencing a nested type with the Reflection API is using the "+"
13599         sign. 
13600
13601         * cs-parser.jay: Do not require EOF token at the end.
13602
13603 2001-12-20  Ravi Pratap  <ravi@ximian.com>
13604
13605         * rootcontext.cs (LookupType): Concatenate type names with
13606         a '.' instead of a '+' The test suite passes again.
13607
13608         * enum.cs (Enum.DefineEnum): Set RTSpecialName on the 'value__'
13609         field of the enumeration.
13610
13611         * expression.cs (MemberAccess.ResolveMemberAccess): Add support for
13612         the case when the member is an EventExpr.
13613
13614         * ecore.cs (EventExpr.InstanceExpression): Every event which is not
13615         static has an associated instance expression.
13616
13617         * typemanager.cs (RegisterEvent): The usual workaround, now for events.
13618
13619         (GetAddMethod, GetRemoveMethod): Workarounds, as usual.
13620
13621         * class.cs (Event.Define): Register event and perform appropriate checks
13622         for error #111.
13623
13624         We define the Add and Remove methods even if the use provides none because
13625         in that case, we provide default implementations ourselves.
13626
13627         Define a private field of the type of the event. This is done by the CSC compiler
13628         and we should be doing it too ;-)
13629
13630         * typemanager.cs (delegate_combine_delegate_delegate, delegate_remove_delegate_delegate):
13631         More methods we use in code we generate.
13632
13633         (multicast_delegate_type, delegate_type): Two separate types since the distinction
13634         is important.
13635
13636         (InitCoreTypes): Update accordingly for the above.
13637
13638         * class.cs (Event.Emit): Generate code for default accessors that we provide
13639
13640         (EmitDefaultMethod): Do the job in the above.
13641
13642         * delegate.cs (DefineDelegate): Use TypeManager.multicast_delegate_type in the 
13643         appropriate place.
13644
13645 2001-12-20  Miguel de Icaza  <miguel@ximian.com>
13646
13647         * class.cs (Indexer.Define): Fix bug, we were setting both Get/Set
13648         builders even if we were missing one.
13649
13650         * interface.cs, class.cs, enum.cs: When calling DefineNestedType
13651         pass the Basename as our class name instead of the Name.  The
13652         basename will be correctly composed for us.
13653
13654         * parameter.cs (Paramters): Now takes a Location argument.
13655
13656         * decl.cs (DeclSpace.LookupType): Removed convenience function and
13657         make all the code call directly LookupType in RootContext and take
13658         this chance to pass the Location information everywhere.
13659
13660         * Everywhere: pass Location information.
13661
13662 2001-12-19  Miguel de Icaza  <miguel@ximian.com>
13663
13664         * class.cs (Constructor.Define): Updated way of detecting the
13665         length of the parameters.
13666
13667         (TypeContainer.DefineType): Use basename as the type name for
13668         nested types.
13669
13670         (TypeContainer.Define): Do not recursively define types here, as
13671         definition is taken care in order by the RootContext.
13672
13673         * tree.cs: Keep track of namespaces in a per-file basis.
13674
13675         * parameter.cs (Parameter.ComputeSignature): Update to use
13676         DeclSpace. 
13677
13678         (Parameters.GetSignature): ditto.
13679
13680         * interface.cs (InterfaceMethod.GetSignature): Take a DeclSpace
13681         instead of a TypeContainer.
13682
13683         (Interface.SemanticAnalysis): Use `this' instead of our parent to
13684         resolve names.  Because we need to be resolve in our context, not
13685         our parents.
13686
13687         * driver.cs: Implement response files.
13688
13689         * class.cs (TypeContainer.DefineType): If we are defined, do not
13690         redefine ourselves.
13691
13692         (Event.Emit): Emit the code for add/remove handlers.
13693         (Event.Define): Save the MethodBuilders for add/remove.
13694
13695         * typemanager.cs: Use pair here too.
13696
13697         * cs-parser.jay: Replaced use of DictionaryEntry for Pair because
13698         DictionaryEntry requires the first argument to be non-null.  
13699
13700         (enum_declaration): Compute full name for registering the
13701         enumeration.
13702
13703         (delegate_declaration): Instead of using
13704         formal_parameter_list, use opt_formal_parameter_list as the list
13705         can be empty.
13706
13707         * cs-tokenizer.cs (PropertyParsing): renamed from `properties'
13708         (EventParsing): New property that controls whether `add' and
13709         `remove' are returned as tokens or identifiers (for events);
13710
13711 2001-12-19  Ravi Pratap  <ravi@ximian.com>
13712
13713         * class.cs (Event.Define): Revamp use of EventBuilder completely. We now
13714         use MyEventBuilder only and let it wrap the real builder for us.
13715
13716         (MyEventBuilder): Revamp constructor etc.
13717
13718         Implement all operations that we perform on EventBuilder in precisely the same
13719         way here too.
13720
13721         (FindMembers): Update to use the EventBuilder member.
13722
13723         (Event.Emit): Update accordingly.
13724
13725 2001-12-18  Ravi Pratap  <ravi@ximian.com>
13726
13727         * class.cs (MyEventBuilder.Set*): Chain to the underlying builder
13728         by calling the appropriate methods.
13729
13730         (GetCustomAttributes): Make stubs as they cannot possibly do anything
13731         useful.
13732
13733         (Event.Emit): Use MyEventBuilder everywhere - even to set attributes.
13734
13735 2001-12-17  Ravi Pratap  <ravi@ximian.com>
13736
13737         * delegate.cs (Delegate.Populate): Check that the return type
13738         and various parameters types are indeed accessible.
13739
13740         * class.cs (Constructor.Define): Same here.
13741
13742         (Field.Define): Ditto.
13743
13744         (Event.Define): Ditto.
13745
13746         (Operator.Define): Check that the underlying Method defined itself
13747         correctly - so it's MethodBuilder should not be null.
13748
13749         * delegate.cs (DelegateInvocation.DoResolve): Bale out if the type of the Instance
13750         expression happens to be null.
13751
13752         * class.cs (MyEventBuilder): Workaround for SRE lameness. Implement various abstract
13753         members but as of now we don't seem to be able to do anything really useful with it.
13754
13755         (FindMembers): Handle events separately by returning the MyEventBuilder of the event,
13756         not the EventBuilder.
13757
13758 2001-12-18  Miguel de Icaza  <miguel@ximian.com>
13759
13760         * cs-tokenizer.cs: Add support for defines.
13761         Add support for #if, #elif, #else, #endif
13762
13763         (eval_var): evaluates a variable.
13764         (eval): stubbed for evaluating functions.
13765
13766         * cs-parser.jay: Pass the defines information
13767
13768         * driver.cs: Add --define command line option.
13769
13770         * decl.cs: Move MemberCore here.
13771
13772         Make it the base class for DeclSpace.  This allows us to catch and
13773         report 108 and 109 for everything now.
13774
13775         * class.cs (TypeContainer.Define): Extract all the members
13776         before populating and emit the warning 108 (new keyword required
13777         to override) instead of having each member implement this.
13778
13779         (MemberCore.Define): New abstract method, we will be using this in
13780         the warning reporting engine in Populate.
13781
13782         (Operator.Define): Adjust to new MemberCore protocol. 
13783
13784         * const.cs (Const): This does not derive from Expression, it is a
13785         temporary object we use to create fields, it is a MemberCore. 
13786
13787         * class.cs (Method.Define): Allow the entry point to be in a
13788         specific class.
13789
13790         * driver.cs: Rewrite the argument handler to clean it up a bit.
13791
13792         * rootcontext.cs: Made it just an auxiliary namespace feature by
13793         making everything static.
13794
13795         * driver.cs: Adapt code to use RootContext type name instead of
13796         instance variable.
13797
13798         * delegate.cs: Remove RootContext argument.
13799
13800         * class.cs: (Struct, TypeContainer, Class): Remove RootContext
13801         argument. 
13802
13803         * class.cs (Event.Define): The lookup can fail.
13804
13805         * cs-tokenizer.cs: Begin implementation of pre-procesor. 
13806
13807         * expression.cs: Resolve the this instance before invoking the code.
13808
13809 2001-12-17  Miguel de Icaza  <miguel@ximian.com>
13810
13811         * cs-parser.jay: Add a production in element_access that allows
13812         the thing to become a "type" reference.  This way we can parse
13813         things like "(string [])" as a type.
13814
13815         Note that this still does not handle the more complex rules of
13816         casts. 
13817
13818
13819         * delegate.cs (Delegate.Populate): Register the delegage constructor builder here. 
13820
13821         * ecore.cs: (CopyNewMethods): new utility function used to
13822         assemble the list of methods from running FindMembers.
13823
13824         (MemberLookup): Rework FindMembers so that 
13825
13826 2001-12-16  Miguel de Icaza  <miguel@ximian.com>
13827
13828         * class.cs (TypeContainer): Remove Delegates who fail to be
13829         defined.
13830
13831         * delegate.cs (Populate): Verify that we dont get null return
13832         values.   TODO: Check for AsAccessible.
13833
13834         * cs-parser.jay: Use basename to emit error 574 (destructor should
13835         have the same name as container class), not the full name.
13836
13837         * cs-tokenizer.cs (adjust_int): Fit the integer in the best
13838         possible representation.  
13839
13840         Also implements integer type suffixes U and L.
13841
13842 2001-12-15  Miguel de Icaza  <miguel@ximian.com>
13843
13844         * expression.cs (ArrayCreation.DoResolve): We need to do the
13845         argument resolution *always*.
13846
13847         * decl.cs: Make this hold the namespace.  Hold the root context as
13848         well.
13849         (LookupType): Move here.
13850
13851         * enum.cs, class.cs, interface.cs: Adapt to new hierarchy.
13852
13853         * location.cs (Row, Name): Fixed the code, it was always returning
13854         references to the first file.
13855
13856         * interface.cs: Register properties defined through interfaces.
13857
13858         * driver.cs: Add support for globbing on the command line
13859
13860         * class.cs (Field): Make it derive from MemberCore as well.
13861         (Event): ditto.
13862
13863 2001-12-15  Ravi Pratap  <ravi@ximian.com>
13864
13865         * class.cs (Event::Define): Check that the type of the event is a delegate
13866         type else flag error #66.
13867
13868         Also, re-use TypeContainer.MethodModifiersValid here too as the rules are the
13869         same.
13870
13871         * attribute.cs (DefinePInvokeMethod): Handle named arguments and process
13872         values of EntryPoint, CharSet etc etc.
13873
13874         Pass in the values to TypeBuilder.DefinePInvokeMethod; determine Type etc neatly.
13875
13876         * class.cs (FindMembers): If a method is in transit, its MethodBuilder will
13877         be null and we should ignore this. I am not sure if this is really clean. Apparently,
13878         there's no way of avoiding hitting this because the call is coming from SimpleName.DoResolve,
13879         which needs this to do its work.
13880
13881         * ../errors/cs0066.cs : Add.
13882
13883 2001-12-14  Miguel de Icaza  <miguel@ximian.com>
13884
13885         * typemanager.cs: (GetPropertyGetter, GetPropertyGetter): New
13886         helper functions.
13887
13888         * class.cs: (MethodSignature.MethodSignature): Removed hack that
13889         clears out the parameters field.
13890         (MemberSignatureCompare): Cleanup
13891
13892         (MemberCore): New base class used to share code between MethodCore
13893         and Property.
13894
13895         (RegisterRequiredImplementations) BindingFlags.Public requires
13896         either BindingFlags.Instace or Static.  Use instance here.
13897
13898         (Property): Refactored code to cope better with the full spec.
13899
13900         * parameter.cs (GetParameterInfo): Return an empty array instead
13901         of null on error.
13902
13903         * class.cs (Property): Abstract or extern properties have no bodies.
13904
13905         * parameter.cs (GetParameterInfo): return a zero-sized array.
13906
13907         * class.cs (TypeContainer.MethodModifiersValid): Move all the
13908         method modifier validation to the typecontainer so we can reuse
13909         this on properties.
13910
13911         (MethodCore.ParameterTypes): return an empty sized array of types.
13912
13913         (Property.Define): Test property modifier validity.
13914
13915         Add tests for sealed/override too.
13916
13917         (Method.Emit): abstract or extern methods have no bodies.
13918
13919 2001-12-14  Ravi Pratap  <ravi@ximian.com>
13920
13921         * class.cs (Method.IsPInvoke): Get rid of it as it is an expensive
13922         thing.
13923
13924         (Method::Define, ::Emit): Modify accordingly.
13925
13926         * expression.cs (Invocation::OverloadResolve): Handle error # 121.
13927
13928         (ArrayCreation::MakeByteBlob): Handle floats and doubles.
13929
13930         * makefile: Pass in /unsafe.
13931
13932 2001-12-13  Miguel de Icaza  <miguel@ximian.com>
13933
13934         * class.cs (MakeKey): Kill routine.
13935
13936         * class.cs (TypeContainer.Define): Correctly define explicit
13937         method implementations (they require the full interface name plus
13938         the method name).
13939
13940         * typemanager.cs: Deply the PtrHashtable here and stop using the
13941         lame keys.  Things work so much better.
13942
13943         This of course broke everyone who depended on `RegisterMethod' to
13944         do the `test for existance' test.  This has to be done elsewhere.
13945
13946         * support.cs (PtrHashtable): A hashtable that avoid comparing with
13947         the object stupid Equals method (because, that like fails all over
13948         the place).  We still do not use it.
13949
13950         * class.cs (TypeContainer.SetRequiredInterface,
13951         TypeContainer.RequireMethods): Killed these two routines and moved
13952         all the functionality to RegisterRequiredImplementations.
13953
13954         (TypeContainer.RegisterRequiredImplementations): This routine now
13955         registers all the implementations required in an array for the
13956         interfaces and abstract methods.  We use an array of structures
13957         which can be computed ahead of time to reduce memory usage and we
13958         also assume that lookups are cheap as most classes will not
13959         implement too many interfaces.
13960
13961         We also avoid creating too many MethodSignatures.
13962
13963         (TypeContainer.IsInterfaceMethod): Update and optionally does not
13964         clear the "pending" bit if we find that there are problems with
13965         the declaration.
13966
13967         (TypeContainer.VerifyPendingMethods): Update to report errors of
13968         methods that look like implementations but are not.
13969
13970         (TypeContainer.Define): Add support for explicit interface method
13971         implementation. 
13972
13973 2001-12-12  Miguel de Icaza  <miguel@ximian.com>
13974
13975         * typemanager.cs: Keep track of the parameters here instead of
13976         being a feature of the TypeContainer.
13977
13978         * class.cs: Drop the registration of parameters here, as
13979         InterfaceMethods are also interface declarations.
13980
13981         * delegate.cs: Register methods with the TypeManager not only with
13982         the TypeContainer.  This code was buggy.
13983
13984         * interface.cs: Full registation here.
13985
13986 2001-12-11  Miguel de Icaza  <miguel@ximian.com>
13987
13988         * expression.cs: Remove reducer for binary expressions, it can not
13989         be done this way.
13990
13991         * const.cs: Put here the code that used to go into constant.cs
13992
13993         * constant.cs: Put here the code for constants, this is a new base
13994         class for Literals.
13995
13996         * literal.cs: Make Literal derive from Constant.
13997
13998 2001-12-09  Miguel de Icaza  <miguel@ximian.com>
13999
14000         * statement.cs (Return.Emit): Report error 157 if the user
14001         attempts to return from a finally block.
14002
14003         (Return.Emit): Instead of emitting a return, jump to the end of
14004         the function.
14005
14006         * codegen.cs (EmitContext): ReturnValue, ReturnLabel: new
14007         LocalBuilder to store the result of the function.  ReturnLabel is
14008         the target where we jump.
14009
14010
14011 2001-12-09  Radek Doulik  <rodo@ximian.com>
14012
14013         * cs-parser.jay: remember alias in current namespace
14014
14015         * ecore.cs (SimpleName::DoResolve): use aliases for types or
14016         namespaces
14017
14018         * class.cs (LookupAlias): lookup alias in my_namespace
14019
14020         * namespace.cs (UsingAlias): add alias, namespace_or_type pair to
14021         aliases hashtable
14022         (LookupAlias): lookup alias in this and if needed in parent
14023         namespaces
14024
14025 2001-12-08  Miguel de Icaza  <miguel@ximian.com>
14026
14027         * support.cs: 
14028
14029         * rootcontext.cs: (ModuleBuilder) Made static, first step into
14030         making things static.  I need this to avoid passing the
14031         TypeContainer when calling ParameterType.
14032
14033         * support.cs (InternalParameters.ParameterType): Remove ugly hack
14034         that did string manipulation to compute the type and then call
14035         GetType.  Use Parameter.ParameterType instead.
14036
14037         * cs-tokenizer.cs: Consume the suffix for floating values.
14038
14039         * expression.cs (ParameterReference): figure out whether this is a
14040         reference parameter or not.  Kill an extra variable by computing
14041         the arg_idx during emission.
14042
14043         * parameter.cs (Parameters.GetParameterInfo): New overloaded
14044         function that returns whether a parameter is an out/ref value or not.
14045
14046         (Parameter.ParameterType): The type of the parameter (base,
14047         without ref/out applied).
14048
14049         (Parameter.Resolve): Perform resolution here.
14050         (Parameter.ExternalType): The full type (with ref/out applied).
14051
14052         * statement.cs (Using.Emit, Using.EmitExpression): Implement
14053         support for expressions on the using statement.
14054
14055 2001-12-07  Miguel de Icaza  <miguel@ximian.com>
14056
14057         * statement.cs (Using.EmitLocalVariableDecls): Split the
14058         localvariable handling of the using statement.
14059
14060         (Block.EmitMeta): Keep track of variable count across blocks.  We
14061         were reusing slots on separate branches of blocks.
14062
14063         (Try.Emit): Emit the general code block, we were not emitting it. 
14064
14065         Check the type of the declaration to be an IDisposable or
14066         something that can be implicity converted to it. 
14067
14068         Emit conversions if required.
14069
14070         * ecore.cs (EmptyExpression): New utility class.
14071         (Expression.ImplicitConversionExists): New utility function.
14072
14073 2001-12-06  Miguel de Icaza  <miguel@ximian.com>
14074
14075         * statement.cs (Using): Implement.
14076
14077         * expression.cs (LocalVariableReference): Support read only variables.
14078
14079         * statement.cs: Remove the explicit emit for the Leave opcode.
14080         (VariableInfo): Add a readonly field.
14081
14082 2001-12-05  Miguel de Icaza  <miguel@ximian.com>
14083
14084         * ecore.cs (ConvCast): new class used to encapsulate the various
14085         explicit integer conversions that works in both checked and
14086         unchecked contexts.
14087
14088         (Expression.ConvertNumericExplicit): Use new ConvCast class to
14089         properly generate the overflow opcodes.
14090
14091 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14092
14093         * statement.cs: The correct type for the EmptyExpression is the
14094         element_type, not the variable type.  Ravi pointed this out.
14095
14096 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14097
14098         * class.cs (Method::Define): Handle PInvoke methods specially
14099         by using DefinePInvokeMethod instead of the usual one.
14100
14101         * attribute.cs (DefinePInvokeMethod): Implement as this is what is called
14102         above to do the task of extracting information and defining the method.
14103
14104 2001-12-04  Ravi Pratap  <ravi@ximian.com>
14105
14106         * expression.cs (ArrayCreation::EmitStaticInitializers): Get rid
14107         of the condition for string type.
14108
14109         (Emit): Move that here. 
14110
14111         (ArrayCreation::CheckIndices): Keep string literals in their expression
14112         form.
14113
14114         (EmitDynamicInitializers): Handle strings appropriately.
14115
14116 2001-12-04  Miguel de Icaza  <miguel@ximian.com>
14117
14118         * codegen.cs (EmitContext): Replace multiple variables with a
14119         single pointer to the current Switch statement.
14120
14121         * statement.cs (GotoDefault, Switch): Adjust to cleaned up
14122         EmitContext.
14123
14124 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14125
14126         * statement.cs 
14127
14128         * statement.cs (GotoDefault), cs-parser.jay: Implement `goto
14129         default'.
14130
14131         (Foreach.Emit): Foreach on arrays was not setting
14132         up the loop variables (for break/continue).
14133
14134         (GotoCase): Semi-implented.
14135
14136 2001-12-03  Ravi Pratap  <ravi@ximian.com>
14137
14138         * attribute.cs (CheckAttribute): Handle system attributes by using
14139         Attribute.GetAttributes to examine information we need.
14140
14141         (GetValidPlaces): Same here.
14142
14143         * class.cs (Method::Define): Catch invalid use of extern and abstract together.
14144
14145         * typemanager.cs (dllimport_type): Core type for System.DllImportAttribute.
14146
14147         * class.cs (Method.IsPinvoke): Used to determine if we are a PInvoke method.
14148
14149         (Method::Define): Set appropriate flags if we have a DllImport attribute.
14150
14151         (Method::Emit): Handle the case when we are a PInvoke method.
14152
14153 2001-12-03  Miguel de Icaza  <miguel@ximian.com>
14154
14155         * expression.cs: Use ResolveWithSimpleName on compound names.
14156
14157 2001-12-02  Ravi Pratap  <ravi@ximian.com>
14158
14159         * constant.cs (EmitConstant): Make sure we resolve the associated expression
14160         before trying to reduce it.
14161
14162         * typemanager.cs (RegisterConstant, LookupConstant): Implement.
14163
14164         * constant.cs (LookupConstantValue): Implement.
14165
14166         (EmitConstant): Use the above in emitting the constant.
14167
14168         * expression.cs (MemberAccess::ResolveMemberAccess): Handle constants
14169         that are user-defined by doing a LookupConstantValue on them.
14170
14171         (SimpleName::DoResolve): When we have a FieldExpr, cope with constants
14172         too, like above.
14173
14174 2001-11-29  Miguel de Icaza  <miguel@ximian.com>
14175
14176         * expression.cs (BaseAccess, BaseIndexer): Also split this out.
14177
14178         (BaseAccess.DoResolve): Implement.
14179
14180         (MemberAccess.DoResolve): Split this routine into a
14181         ResolveMemberAccess routine that can be used independently
14182
14183 2001-11-28  Miguel de Icaza  <miguel@ximian.com>
14184
14185         * expression.cs (Probe, Is, As): Split Probe in two classes Is and
14186         As that share bits of the implementation.  Is returns a boolean,
14187         while As returns the Type that is being probed.
14188
14189 2001-12-01  Ravi Pratap  <ravi@ximian.com>
14190
14191         * enum.cs (LookupEnumValue): Re-write various bits, return an object value
14192         instead of a Literal - much easier.
14193
14194         (EnumInTransit): Remove - utterly useless :-)
14195
14196         (Populate): Re-write bits - remove duplicate code etc. The code is much neater now.
14197
14198         * expression.cs (MemberLookup): Cope with user-defined enums when they are in transit.
14199
14200         * enum.cs (LookupEnumValue): Auto-compute next values by going down the dependency
14201         chain when we have no associated expression.
14202
14203 2001-11-30  Ravi Pratap  <ravi@ximian.com>
14204
14205         * constant.cs (Define): Use Location while reporting the errror.
14206
14207         Also emit a warning when 'new' is used and there is no inherited
14208         member to hide.
14209
14210         * enum.cs (EnumInTransit): Used to tell if an enum type is in the process of being 
14211         populated.
14212
14213         (LookupEnumValue): Implement to lookup an enum member's value and define it
14214         if necessary.
14215
14216         (Populate): Re-write accordingly to use the above routine.
14217
14218 2001-11-27  Miguel de Icaza  <miguel@ximian.com>
14219
14220         * expression.cs (This): Fix prototype for DoResolveLValue to
14221         override the base class DoResolveLValue.
14222
14223         * cs-parser.cs: Report errors cs574 and cs575 (destructor
14224         declarations) 
14225
14226         * ecore.cs (FieldExpr.EmitAssign): Handle value types specially
14227         (we need to load the address of the field here).  This fixes
14228         test-22. 
14229
14230         (FieldExpr.DoResolveLValue): Call the DoResolve
14231         function to initialize the Instance expression.
14232
14233         * statement.cs (Foreach.Emit): Fix the bug where we did not invoke
14234         correctly the GetEnumerator operation on a value type.
14235
14236         * cs-parser.jay: Add more simple parsing error catches.
14237
14238         * statement.cs (Switch): Add support for string switches.
14239         Handle null specially.
14240
14241         * literal.cs (NullLiteral): Make NullLiteral objects singletons. 
14242
14243 2001-11-28  Ravi Pratap  <ravi@ximian.com>
14244
14245         * cs-parser.jay (local_constant_declaration): Use declare_local_constant.
14246
14247         (declare_local_constant): New helper function.
14248
14249         * statement.cs (AddConstant): Keep a separate record of constants
14250
14251         (IsConstant): Implement to determine if a variable is a constant.
14252
14253         (GetConstantExpression): Implement.
14254
14255         * expression.cs (LocalVariableReference): Handle the case when it is a constant.
14256
14257         * statement.cs (IsVariableDefined): Re-write.
14258
14259 2001-11-27  Ravi Pratap  <ravi@ximian.com>
14260
14261         * class.cs (TypeContainer::FindMembers): Look for constants
14262         in the case when we are looking for MemberTypes.Field
14263
14264         * expression.cs (MemberAccess::DoResolve): Check that in the
14265         case we are a FieldExpr and a Literal, we are not being accessed
14266         by an instance reference.
14267
14268         * cs-parser.jay (local_constant_declaration): Implement.
14269
14270         (declaration_statement): Implement for constant declarations.
14271
14272 2001-11-26  Miguel de Icaza  <miguel@ximian.com>
14273
14274         * statement.cs (Switch): Catch double defaults.
14275
14276         (Switch): More work on the switch() statement
14277         implementation.  It works for integral values now, need to finish
14278         string support.
14279
14280
14281 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14282
14283         * ecore.cs (Expression.ConvertIntLiteral): New function to convert
14284         integer literals into other integer literals.  To be used by
14285         switch. 
14286
14287 2001-11-24  Ravi Pratap  <ravi@ximian.com>
14288
14289         * expression.cs (ArrayCreation): Get rid of ArrayExprs : we save
14290         some memory.
14291
14292         (EmitDynamicInitializers): Cope with the above since we extract data
14293         directly from ArrayData now.
14294
14295         (ExpectInitializers): Keep track of whether initializers are mandatory
14296         or not.
14297
14298         (Bounds): Make it a hashtable to prevent the same dimension being 
14299         recorded for every element in that dimension.
14300
14301         (EmitDynamicInitializers): Fix bug which prevented the Set array method
14302         from being found.
14303
14304         Also fix bug which was causing the indices to be emitted in the reverse
14305         order.
14306
14307 2001-11-24  Miguel de Icaza  <miguel@ximian.com>
14308
14309         * expression.cs (ArrayCreation): Implement the bits that Ravi left
14310         unfinished.  They do not work, because the underlying code is
14311         sloppy.
14312
14313 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14314
14315         * cs-parser.jay: Remove bogus fixme.
14316
14317         * statement.cs (Switch, SwitchSection, SwithLabel): Started work
14318         on Switch statement.
14319
14320 2001-11-23  Ravi Pratap  <ravi@ximian.com>
14321
14322         * typemanager.cs (IsDelegateType, IsEnumType): Fix logic to determine
14323         the same. 
14324
14325         * expression.cs (ArrayCreation::CheckIndices): Get rid of the require_constant
14326         parameter. Apparently, any expression is allowed. 
14327
14328         (ValidateInitializers): Update accordingly.
14329
14330         (CheckIndices): Fix some tricky bugs thanks to recursion.
14331
14332         * delegate.cs (NewDelegate::DoResolve): Re-write large portions as 
14333         I was being completely brain-dead.
14334
14335         (VerifyMethod, VerifyApplicability, VerifyDelegate): Make static
14336         and re-write acordingly.
14337
14338         (DelegateInvocation): Re-write accordingly.
14339
14340         * expression.cs (ArrayCreation::Emit): Handle string initialization separately.
14341
14342         (MakeByteBlob): Handle types more correctly.
14343
14344         * expression.cs (ArrayCreation:Emit): Write preliminary code to do
14345         initialization from expressions but it is incomplete because I am a complete
14346         Dodo :-|
14347
14348 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14349
14350         * statement.cs (If.Emit): Fix a bug that generated incorrect code
14351         on If.  Basically, we have to return `true' (ie, we do return to
14352         our caller) only if both branches of the if return.
14353
14354         * expression.cs (Binary.Emit): LogicalOr and LogicalAnd are
14355         short-circuit operators, handle them as short circuit operators. 
14356
14357         (Cast.DoResolve): Resolve type.
14358         (Cast.Cast): Take an expression as the target type.
14359
14360         * cs-parser.jay (cast_expression): Remove old hack that only
14361         allowed a limited set of types to be handled.  Now we take a
14362         unary_expression and we resolve to a type during semantic
14363         analysis.
14364
14365         Use the grammar productions from Rhys to handle casts (this is
14366         not complete like Rhys syntax yet, we fail to handle that corner
14367         case that C# has regarding (-x), but we will get there.
14368
14369 2001-11-22  Ravi Pratap  <ravi@ximian.com>
14370
14371         * class.cs (EmitFieldInitializer): Take care of the case when we have a
14372         field which is an array type.
14373
14374         * cs-parser.jay (declare_local_variables): Support array initialization too.
14375
14376         * typemanager.cs (MakeKey): Implement.
14377
14378         (everywhere): Use the above appropriately.
14379
14380         * cs-parser.jay (for_statement): Update for array initialization while
14381         declaring variables.
14382
14383         * ecore.cs : The error message was correct, it's the variable's names that
14384         were misleading ;-) Make the code more readable.
14385
14386         (MemberAccess::DoResolve): Fix the code which handles Enum literals to set
14387         the correct type etc.
14388
14389         (ConvertExplicit): Handle Enum types by examining the underlying type.
14390
14391 2001-11-21  Ravi Pratap  <ravi@ximian.com>
14392
14393         * parameter.cs (GetCallingConvention): Always return
14394         CallingConventions.Standard for now.
14395
14396 2001-11-22  Miguel de Icaza  <miguel@ximian.com>
14397
14398         * expression.cs (Binary.ResolveOperator): Update the values of `l'
14399         and `r' after calling DoNumericPromotions.
14400
14401         * ecore.cs: Fix error message (the types were in the wrong order).
14402
14403         * statement.cs (Foreach.ProbeCollectionType): Need to pass
14404         BindingFlags.Instance as well 
14405
14406         * ecore.cs (Expression.TryImplicitIntConversion): Wrap the result
14407         implicit int literal conversion in an empty cast so that we
14408         propagate the right type upstream.
14409
14410         (UnboxCast): new class used to unbox value types.
14411         (Expression.ConvertExplicit): Add explicit type conversions done
14412         by unboxing.
14413
14414         (Expression.ImplicitNumericConversion): Oops, forgot to test for
14415         the target type before applying the implicit LongLiterals to ULong
14416         literal cast.
14417
14418 2001-11-21  Miguel de Icaza  <miguel@ximian.com>
14419
14420         * cs-parser.jay (for_statement): Reworked the way For works: now
14421         we declare manually any variables that are introduced in
14422         for_initializer to solve the problem of having out-of-band code
14423         emition (that is what got for broken).
14424
14425         (declaration_statement): Perform the actual variable declaration
14426         that used to be done in local_variable_declaration here.
14427
14428         (local_variable_declaration): Do not declare anything, just pass
14429         the information on a DictionaryEntry
14430
14431 2001-11-20  Ravi Pratap  <ravi@ximian.com>
14432
14433         * expression.cs (ArrayCreation::CheckIndices): The story continues :-) Complete
14434         re-write of the logic to now make it recursive.
14435
14436         (UpdateIndices): Re-write accordingly.
14437
14438         Store element data in a separate ArrayData list in the above methods.
14439
14440         (MakeByteBlob): Implement to dump the array data into a byte array.
14441
14442 2001-11-19  Ravi Pratap  <ravi@ximian.com>
14443
14444         * expression.cs (ArrayCreation): Factor out some code from ValidateInitializers
14445         into CheckIndices.
14446
14447         * constant.cs (Define): Implement.
14448
14449         (EmitConstant): Re-write fully.
14450
14451         Pass in location info.
14452
14453         * class.cs (Populate, Emit): Call Constant::Define and Constant::EmitConstant
14454         respectively.
14455
14456         * cs-parser.jay (constant_declarator): Use VariableDeclaration instead of
14457         DictionaryEntry since we need location info too.
14458
14459         (constant_declaration): Update accordingly.
14460
14461         * expression.cs (ArrayCreation): Make ValidateInitializers simpler by factoring
14462         code into another method : UpdateIndices.
14463
14464 2001-11-18  Ravi Pratap  <ravi@ximian.com>
14465
14466         * expression.cs (ArrayCreation::ValidateInitializers): Update to perform
14467         some type checking etc.
14468
14469 2001-11-17  Ravi Pratap  <ravi@ximian.com>
14470
14471         * expression.cs (ArrayCreation::ValidateInitializers): Implement
14472         bits to provide dimension info if the user skips doing that.
14473
14474         Update second constructor to store the rank correctly.
14475
14476 2001-11-16  Ravi Pratap  <ravi@ximian.com>
14477
14478         * expression.cs (ArrayCreation::ValidateInitializers): Poke around
14479         and try to implement.
14480
14481         * ../errors/cs0150.cs : Add.
14482
14483         * ../errors/cs0178.cs : Add.
14484
14485 2001-11-16  Miguel de Icaza  <miguel@ximian.com>
14486
14487         * statement.cs: Implement foreach on multi-dimensional arrays. 
14488
14489         * parameter.cs (Parameters.GetParameterByName): Also lookup the
14490         name of the params argument.
14491
14492         * expression.cs: Use EmitStoreOpcode to get the right opcode while
14493         initializing the array.
14494
14495         (ArrayAccess.EmitStoreOpcode): move the opcode generation here, so
14496         we can use this elsewhere.
14497
14498         * statement.cs: Finish implementation of foreach for single
14499         dimension arrays.
14500
14501         * cs-parser.jay: Use an out-of-band stack to pass information
14502         around, I wonder why I need this.
14503
14504         foreach_block: Make the new foreach_block the current_block.
14505
14506         * parameter.cs (Parameters.GetEmptyReadOnlyParameters): New
14507         function used to return a static Parameters structure.  Used for
14508         empty parameters, as those are created very frequently.
14509
14510         * cs-parser.jay, class.cs: Use GetEmptyReadOnlyParameters
14511
14512 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14513
14514         * interface.cs : Default modifier is private, not public. The
14515         make verify test passes again.
14516
14517 2001-11-15  Ravi Pratap  <ravi@ximian.com>
14518
14519         * support.cs (ReflectionParameters): Fix logic to determine
14520         whether the last parameter is a params one. Test 9 passes again.
14521
14522         * delegate.cs (Populate): Register the builders we define with
14523         RegisterParameterForBuilder. Test 19 passes again.
14524
14525         * cs-parser.jay (property_declaration): Reference $6 instead
14526         of $$ to get at the location.
14527
14528         (indexer_declaration): Similar stuff.
14529
14530         (attribute): Ditto.
14531
14532         * class.cs (Property): Register parameters for the Get and Set methods
14533         if they exist. Test 23 passes again.
14534
14535         * expression.cs (ArrayCreation::Emit): Pass null for the method in the
14536         call to EmitArguments as we are sure there aren't any params arguments. 
14537         Test 32 passes again.
14538
14539         * suppor.cs (ParameterDesc, ParameterModifier): Fix trivial bug causing
14540         IndexOutOfRangeException. 
14541
14542         * class.cs (Property::Define): Register property using TypeManager.RegisterProperty
14543         Test 33 now passes again.
14544
14545 2001-11-15  Miguel de Icaza  <miguel@ximian.com>
14546
14547         * cs-parser.jay: Kill horrendous hack ($??? = lexer.Location) that
14548         broke a bunch of things.  Will have to come up with a better way
14549         of tracking locations.
14550
14551         * statement.cs: Implemented foreach for single dimension arrays.
14552
14553 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14554
14555         * enum.cs (Enum.Emit): Delay the lookup of loc until we run into
14556         an error.  This removes the lookup from the critical path.
14557
14558         * cs-parser.jay: Removed use of temporary_loc, which is completely
14559         broken. 
14560
14561 2001-11-14  Miguel de Icaza  <miguel@ximian.com>
14562
14563         * support.cs (ReflectionParameters.ParameterModifier): Report
14564         whether the argument is a PARAMS argument or not.
14565
14566         * class.cs: Set the attribute `ParamArrayAttribute' on the
14567         parameter argument.
14568
14569         * typemanager.cs: Define param_array_type (ParamArrayAttribute)
14570         and cons_param_array_attribute (ConstructorInfo for
14571         ParamArrayAttribute)., 
14572
14573         * codegen.cs: Emit the return using the `Return' statement, that
14574         way we can report the error correctly for missing return values. 
14575
14576         * class.cs (Method.Emit): Clean up.
14577
14578         * expression.cs (Argument.Resolve): Take another argument: the
14579         location where this argument is used.  Notice that this is not
14580         part of the "Argument" class as to reduce the size of the
14581         structure (we know the approximate location anyways).
14582
14583         Test if the argument is a variable-reference, if not, then
14584         complain with a 206.
14585
14586         (Argument.Emit): Emit addresses of variables.
14587
14588         (Argument.FullDesc): Simplify.
14589
14590         (Invocation.DoResolve): Update for Argument.Resolve.
14591
14592         (ElementAccess.DoResolve): ditto.
14593
14594         * delegate.cs (DelegateInvocation.Emit): Invocation of Invoke
14595         method should be virtual, as this method is always virtual.
14596
14597         (NewDelegate.DoResolve): Update for Argument.Resolve.
14598
14599         * class.cs (ConstructorInitializer.DoResolve): ditto.
14600
14601         * attribute.cs (Attribute.Resolve): ditto.
14602
14603 2001-11-13  Miguel de Icaza  <miguel@ximian.com>
14604
14605         * statement.cs (Foreach.Emit): Use EmitAssign instead of Store.
14606
14607         * expression.cs (ParameterReference): Drop IStackStorage and implement
14608         IAssignMethod instead. 
14609
14610         (LocalVariableReference): ditto.
14611
14612         * ecore.cs (FieldExpr): Drop IStackStorage and implement
14613         IAssignMethod instead. 
14614
14615 2001-11-13  Miguel de Icaza <miguel@ximian.com>
14616
14617         * parameter.cs, expression.cs, class.cs, ecore.cs: Made all
14618         enumerations that are used in heavily used structures derive from
14619         byte in a laughable and pathetic attempt to reduce memory usage.
14620         This is the kind of pre-optimzations that you should not do at
14621         home without adult supervision.
14622
14623         * expression.cs (UnaryMutator): New class, used to handle ++ and
14624         -- separatedly from the other unary operators.  Cleans up the
14625         code, and kills the ExpressionStatement dependency in Unary.
14626
14627         (Unary): Removed `method' and `Arguments' from this class, making
14628         it smaller, and moving it all to SimpleCall, so I can reuse this
14629         code in other locations and avoid creating a lot of transient data
14630         strucutres when not required.
14631
14632         * cs-parser.jay: Adjust for new changes.
14633
14634 2001-11-11  Miguel de Icaza  <miguel@ximian.com>
14635
14636         * enum.cs (Enum.Populate): If there is a failure during
14637         definition, return
14638
14639         * cs-parser.jay (opt_enum_base): we used to catch type errors
14640         here, but this is really incorrect.  The type error should be
14641         catched during semantic analysis.
14642
14643 2001-12-11  Ravi Pratap  <ravi@ximian.com>
14644
14645         * cs-parser.jay (operator_declarator, conversion_operator_declarator): Set
14646         current_local_parameters as expected since I, in my stupidity, had forgotten
14647         to do this :-)
14648
14649         * attribute.cs (GetValidPlaces): Fix stupid bug.
14650
14651         * class.cs (Method::Emit): Perform check on applicability of attributes.
14652
14653         (Constructor::Emit): Ditto.
14654
14655         (Field::Emit): Ditto.
14656
14657         (Field.Location): Store location information.
14658
14659         (Property, Event, Indexer, Operator): Ditto.
14660
14661         * cs-parser.jay (field_declaration): Pass in location for each field.
14662
14663         * ../errors/cs0592.cs : Add.
14664
14665 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14666
14667         * typemanager.cs (attribute_usage_type): New static member for System.AttributeUsage.
14668
14669         (InitCoreTypes): Update accordingly.
14670
14671         (RegisterAttrType, LookupAttr): Implement.
14672
14673         * attribute.cs (Attribute.Targets, AllowMultiple, Inherited): New fields to hold
14674         info about the same.
14675
14676         (Resolve): Update to populate the above as necessary.
14677
14678         (Error592): Helper.
14679
14680         (GetValidPlaces): Helper to the above.
14681
14682         (CheckAttribute): Implement to perform validity of attributes on declarative elements.
14683
14684         * class.cs (TypeContainer::Emit): Update attribute emission code to perform checking etc.
14685
14686 2001-11-12  Ravi Pratap  <ravi@ximian.com>
14687
14688         * attribute.cs (Attribute::Resolve): Expand to handle named arguments too.
14689
14690         * ../errors/cs0617.cs : Add.
14691
14692 2001-11-11  Ravi Pratap  <ravi@ximian.com>
14693
14694         * enum.cs (Emit): Rename to Populate to be more consistent with what
14695         we expect it to do and when exactly it is called.
14696
14697         * class.cs, rootcontext.cs : Update accordingly.
14698
14699         * typemanager.cs (RegisterField, GetValue): Workarounds for the fact that
14700         FieldInfo.GetValue does not work on dynamic types ! S.R.E lameness strikes again !
14701
14702         * enum.cs (Populate): Register fields with TypeManager.RegisterField.
14703
14704         * expression.cs (MemberAccess.DoResolve): Adjust code to obtain the value
14705         of a fieldinfo using the above, when dealing with a FieldBuilder.
14706
14707 2001-11-10  Ravi Pratap  <ravi@ximian.com>
14708
14709         * ../errors/cs0031.cs : Add.
14710
14711         * ../errors/cs1008.cs : Add.
14712
14713         * ../errrors/cs0543.cs : Add.
14714
14715         * enum.cs (DefineEnum): Check the underlying type and report an error if not a valid
14716         enum type.
14717
14718         (FindMembers): Implement.
14719
14720         * typemanager.cs (FindMembers): Re-write to call the appropriate methods for
14721         enums and delegates too.
14722
14723         (enum_types): Rename to builder_to_enum.
14724
14725         (delegate_types): Rename to builder_to_delegate.
14726
14727         * delegate.cs (FindMembers): Implement.
14728
14729 2001-11-09  Ravi Pratap  <ravi@ximian.com>
14730
14731         * typemanager.cs (IsEnumType): Implement.
14732
14733         * enum.cs (Emit): Re-write parts to account for the underlying type
14734         better and perform checking etc.
14735
14736         (GetNextDefaultValue): Helper to ensure we don't overshoot max value
14737         of the underlying type.
14738
14739         * literal.cs (GetValue methods everywhere): Perform bounds checking and return
14740         value
14741
14742         * enum.cs (error31): Helper to report error #31.
14743
14744         * cs-parser.jay (enum_declaration): Store location of each member too.
14745
14746         * enum.cs (member_to_location): New hashtable. 
14747
14748         (AddEnumMember): Update location hashtable.
14749
14750         (Emit): Use the location of each member while reporting errors.
14751
14752 2001-11-09  Miguel de Icaza  <miguel@ximian.com>
14753
14754         * cs-parser.jay: A for_initializer if is a
14755         local_variable_declaration really ammount to have an implicit
14756         block with the variable declaration and no initializer for for.
14757
14758         * statement.cs (For.Emit): Cope with null initializers.
14759
14760         This fixes the infinite loop on for initializers.
14761
14762 2001-11-08  Miguel de Icaza  <miguel@ximian.com>
14763
14764         * enum.cs: More cleanup.
14765
14766         * ecore.cs: Remove dead code.
14767
14768         * class.cs (Property.Emit): More simplification.
14769         (Event.Emit): ditto.
14770
14771         Reworked to have less levels of indentation.
14772
14773 2001-11-08  Ravi Pratap  <ravi@ximian.com>
14774
14775         * class.cs (Property): Emit attributes.
14776
14777         (Field): Ditto.
14778
14779         (Event): Ditto.
14780
14781         (Indexer): Ditto.
14782
14783         (Operator): Ditto.
14784
14785         * enum.cs (Emit): Ditto.
14786
14787         * rootcontext.cs (ResolveTree, EmitCode, CloseTypes): Do the same for
14788         Enums too.
14789
14790         * class.cs (Field, Event, etc.): Move attribute generation into the
14791         Emit method everywhere.
14792
14793         * enum.cs (Enum): Revamp to use the same definition semantics as delegates so
14794         we have a DefineEnum, CloseEnum etc. The previous way of doing things was not right
14795         as we had no way of defining nested enums !
14796
14797         * rootcontext.cs : Adjust code accordingly.
14798
14799         * typemanager.cs (AddEnumType): To keep track of enum types separately.
14800
14801 2001-11-07  Ravi Pratap  <ravi@ximian.com>
14802
14803         * expression.cs (EvalConstantExpression): Move into ecore.cs
14804
14805         * enum.cs (Enum): Rename some members and make them public and readonly
14806         according to our convention.
14807
14808         * modifiers.cs (EnumAttr): Implement as we need to set only visibility flags,
14809         nothing else.
14810
14811         * enum.cs (Enum::Define): Use the above instead of TypeAttr.
14812
14813         (Enum::Emit): Write a simple version for now which doesn't try to compute
14814         expressions. I shall modify this to be more robust in just a while.
14815
14816         * class.cs (TypeContainer::Emit): Make sure we include Enums too.
14817
14818         (TypeContainer::CloseType): Create the Enum types too.
14819
14820         * attribute.cs (Resolve): Use the new Reduce method instead of EvalConstantExpression.
14821
14822         * expression.cs (EvalConstantExpression): Get rid of completely.
14823
14824         * enum.cs (Enum::Emit): Use the new expression reducer. Implement assigning
14825         user-defined values and other cases.
14826
14827         (IsValidEnumLiteral): Helper function.
14828
14829         * expression.cs (ExprClassfromMemberInfo): Modify to not do any literalizing 
14830         out there in the case we had a literal FieldExpr.
14831
14832         (MemberAccess:DoResolve): Do the literalizing of the FieldExpr here.
14833
14834         (Literalize): Revamp a bit to take two arguments.
14835
14836         (EnumLiteral): New class which derives from Literal to wrap enum literals.
14837
14838 2001-11-06  Ravi Pratap  <ravi@ximian.com>
14839
14840         * cs-parser.jay (compilation_unit): Remove extra opt_attributes for now.
14841
14842         * expression.cs (ArrayCreation::ValidateInitializers): Implement.
14843
14844         (Resolve): Use the above to ensure we have proper initializers.
14845
14846 2001-11-05  Ravi Pratap  <ravi@ximian.com>
14847
14848         * expression.cs (Expression::EvalConstantExpression): New method to 
14849         evaluate constant expressions.
14850
14851         * attribute.cs (Attribute::Resolve): Modify bits to use the above function.
14852
14853 2001-11-07  Miguel de Icaza  <miguel@ximian.com>
14854
14855         * expression.cs (ArrayCreation.Emit): Some bits to initialize data
14856         in an array.
14857
14858         (Binary.ResolveOperator): Handle operator != (object a, object b)
14859         and operator == (object a, object b);
14860
14861         (Binary.DoNumericPromotions): Indicate whether the numeric
14862         promotion was possible.
14863
14864         (ArrayAccess.DoResolve, ArrayAccess.Emit, ArrayAccess.EmitAssign):
14865         Implement.  
14866
14867         Made the ArrayAccess implement interface IAssignMethod instead of
14868         IStackStore as the order in which arguments are passed reflects
14869         this.
14870
14871         * assign.cs: Instead of using expr.ExprClass to select the way of
14872         assinging, probe for the IStackStore/IAssignMethod interfaces.
14873
14874         * typemanager.cs: Load InitializeArray definition.
14875
14876         * rootcontext.cs (RootContext.MakeStaticData): Used to define
14877         static data that can be used to initialize arrays. 
14878
14879 2001-11-05  Miguel de Icaza  <miguel@ximian.com>
14880
14881         * expression.cs: Handle operator== and operator!= for booleans.
14882
14883         (Conditioal.Reduce): Implement reducer for the ?: operator.
14884
14885         (Conditional.Resolve): Implement dead code elimination.
14886
14887         (Binary.Resolve): Catch string literals and return a new
14888         concatenated string.
14889
14890         (Unary.Reduce): Implement reduction of unary expressions.
14891
14892         * ecore.cs: Split out the expression core handling here.
14893
14894         (Expression.Reduce): New method used to perform constant folding
14895         and CSE.  This is needed to support constant-expressions. 
14896
14897         * statement.cs (Statement.EmitBoolExpression): Pass true and false
14898         targets, and optimize for !x.
14899
14900 2001-11-04  Ravi Pratap  <ravi@ximian.com>
14901
14902         * attribute.cs (Attribute::Resolve): Implement guts. Note that resolution
14903         of an attribute gives us a CustomAttributeBuilder which we use accordingly to
14904         set custom atttributes.
14905
14906         * literal.cs (Literal::GetValue): New abstract method to return the actual
14907         value of the literal, cast as an object.
14908
14909         (*Literal): Implement GetValue method.
14910
14911         * cs-parser.jay (positional_argument_list, named_argument_list): Add not just plain
14912         expressions to the arraylist but objects of type Argument.
14913
14914         * class.cs (TypeContainer::Emit): Emit our attributes too.
14915
14916         (Method::Emit, Constructor::Emit): Ditto.
14917
14918         * cs-parser.jay (constructor_declaration): Set attributes too, which we seemed
14919         to be ignoring earlier.
14920
14921 2001-11-03  Ravi Pratap  <ravi@ximian.com>
14922
14923         * attribute.cs (AttributeSection::Define): Implement to do the business
14924         of constructing a CustomAttributeBuilder.
14925
14926         (Attribute): New trivial class. Increases readability of code.  
14927
14928         * cs-parser.jay : Update accordingly.
14929
14930         (positional_argument_list, named_argument_list, named_argument): New rules
14931
14932         (attribute_arguments): Use the above so that we are more correct.
14933
14934 2001-11-02  Ravi Pratap  <ravi@ximian.com>
14935
14936         * expression.cs (Invocation::IsParamsMethodApplicable): Implement
14937         to perform all checks for a method with a params parameter.
14938
14939         (Invocation::OverloadResolve): Update to use the above method and therefore
14940         cope correctly with params method invocations.
14941
14942         * support.cs (InternalParameters::ParameterDesc): Provide a desc for 
14943         params too.
14944
14945         * class.cs (ConstructorInitializer::Resolve): Make sure we look for Non-public
14946         constructors in our parent too because we can't afford to miss out on 
14947         protected ones ;-)
14948
14949         * attribute.cs (AttributeSection): New name for the class Attribute
14950
14951         Other trivial changes to improve readability.
14952
14953         * cs-parser.jay (opt_attributes, attribute_section etc.): Modify to
14954         use the new class names.
14955
14956 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14957
14958         * class.cs (Method::Define): Complete definition for params types too
14959
14960         (Indexer::Define): Ditto.
14961
14962         * support.cs (InternalParameters::ParameterType, ParameterDesc, ParameterModifier):
14963         Cope everywhere with a request for info about the array parameter.
14964
14965 2001-11-01  Ravi Pratap  <ravi@ximian.com>
14966
14967         * tree.cs (RecordNamespace): Fix up to check for the correct key.
14968
14969         * cs-parser.jay (GetQualifiedIdentifier): New Helper method used in 
14970         local_variable_type to extract the string corresponding to the type.
14971
14972         (local_variable_type): Fixup the action to use the new helper method.
14973
14974         * codegen.cs : Get rid of RefOrOutParameter, it's not the right way to 
14975         go.
14976
14977         * expression.cs : Clean out code which uses the above.
14978
14979 2001-10-31  Ravi Pratap  <ravi@ximian.com>
14980
14981         * typemanager.cs (RegisterMethod): Check if we already have an existing key
14982         and bale out if necessary by returning a false.
14983
14984         (RegisterProperty): Ditto.
14985
14986         * class.cs (everywhere): Check the return value from TypeManager.RegisterMethod
14987         and print out appropriate error messages.
14988
14989         * interface.cs (everywhere): Ditto.
14990
14991         * cs-parser.jay (property_declaration, event_declaration, indexer_declaration): Pass
14992         location to constructor.
14993
14994         * class.cs (Property, Event, Indexer): Update accordingly.
14995
14996         * ../errors/cs111.cs : Added.
14997
14998         * expression.cs (Invocation::IsApplicable): New static method to determine applicability
14999         of a method, as laid down by the spec.
15000
15001         (Invocation::OverloadResolve): Use the above method.
15002
15003 2001-10-31  Ravi Pratap  <ravi@ximian.com>
15004
15005         * support.cs (InternalParameters): Get rid of crap taking in duplicate info. We
15006         now take a TypeContainer and a Parameters object.
15007
15008         (ParameterData): Modify return type of ParameterModifier method to be 
15009         Parameter.Modifier and not a string.
15010
15011         (ReflectionParameters, InternalParameters): Update accordingly.
15012
15013         * expression.cs (Argument::GetParameterModifier): Same here.
15014
15015         * support.cs (InternalParameters::ParameterType): Find a better way of determining
15016         if we are a ref/out parameter. Actually, the type shouldn't be holding the '&'
15017         symbol in it at all so maybe this is only for now.
15018
15019 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15020
15021         * support.cs (InternalParameters): Constructor now takes an extra argument 
15022         which is the actual Parameters class.
15023
15024         (ParameterDesc): Update to provide info on ref/out modifiers.
15025
15026         * class.cs (everywhere): Update call to InternalParameters to pass in
15027         the second argument too.
15028
15029         * support.cs (ParameterData): Add ParameterModifier, which is a method 
15030         to return the modifier info [ref/out etc]
15031
15032         (InternalParameters, ReflectionParameters): Implement the above.
15033
15034         * expression.cs (Argument::ParameterModifier): Similar function to return
15035         info about the argument's modifiers.
15036
15037         (Invocation::OverloadResolve): Update to take into account matching modifiers 
15038         too.
15039
15040         * class.cs (Indexer::Define): Actually define a Parameter object and put it onto
15041         a new SetFormalParameters object which we pass to InternalParameters.
15042
15043 2001-10-30  Ravi Pratap  <ravi@ximian.com>
15044
15045         * expression.cs (NewArray): Merge into the ArrayCreation class.
15046
15047 2001-10-29  Ravi Pratap  <ravi@ximian.com>
15048
15049         * expression.cs (NewArray): Merge classes NewBuiltinArray and 
15050         NewUserdefinedArray into one as there wasn't much of a use in having
15051         two separate ones.
15052
15053         * expression.cs (Argument): Change field's name to ArgType from Type.
15054
15055         (Type): New readonly property which returns the proper type, taking into 
15056         account ref/out modifiers.
15057
15058         (everywhere): Adjust code accordingly for the above.
15059
15060         * codegen.cs (EmitContext.RefOrOutParameter): New field to determine
15061         whether we are emitting for a ref or out parameter.
15062
15063         * expression.cs (Argument::Emit): Use the above field to set the state.
15064
15065         (LocalVariableReference::Emit): Update to honour the flag and emit the
15066         right stuff.
15067
15068         * parameter.cs (Attributes): Set the correct flags for ref parameters.
15069
15070         * expression.cs (Argument::FullDesc): New function to provide a full desc.
15071
15072         * support.cs (ParameterData): Add method ParameterDesc to the interface.
15073
15074         (ReflectionParameters, InternalParameters): Implement the above method.
15075
15076         * expression.cs (Invocation::OverloadResolve): Use the new desc methods in
15077         reporting errors.
15078
15079         (Invocation::FullMethodDesc): Ditto. 
15080
15081 2001-10-29  Miguel de Icaza  <miguel@ximian.com>
15082
15083         * cs-parser.jay: Add extra production for the second form of array
15084         creation. 
15085
15086         * expression.cs (ArrayCreation): Update to reflect the above
15087         change. 
15088
15089         * Small changes to prepare for Array initialization.
15090
15091 2001-10-28  Miguel de Icaza  <miguel@ximian.com>
15092
15093         * typemanager.cs (ImplementsInterface): interface might be null;
15094         Deal with this problem;
15095
15096         Also, we do store negative hits on the cache (null values), so use
15097         this instead of calling t.GetInterfaces on the type everytime.
15098
15099 2001-10-28  Ravi Pratap  <ravi@ximian.com>
15100
15101         * typemanager.cs (IsBuiltinType): New method to help determine the same.
15102
15103         * expression.cs (New::DoResolve): Get rid of array creation code and instead
15104         split functionality out into different classes.
15105
15106         (New::FormArrayType): Move into NewBuiltinArray.
15107
15108         (Invocation::EmitArguments): Get rid of the MethodBase argument. Appears
15109         quite useless.
15110
15111         (NewBuiltinArray): New class to handle creation of built-in arrays.
15112
15113         (NewBuiltinArray::DoResolve): Implement guts of array creation. Also take into
15114         account creation of one-dimensional arrays.
15115
15116         (::Emit): Implement to use Newarr and Newobj opcodes accordingly.
15117
15118         (NewUserdefinedArray::DoResolve): Implement.
15119
15120         * cs-parser.jay (local_variable_type): Fix up to add the rank to the variable too.
15121
15122         * typemanager.cs (AddModule): Used to add a ModuleBuilder to the list of modules
15123         we maintain inside the TypeManager. This is necessary to perform lookups on the
15124         module builder.
15125
15126         (LookupType): Update to perform GetType on the module builders too.     
15127
15128         * driver.cs (Driver): Add the ModuleBuilder to the list maintained by the TypeManager.
15129
15130         * exprssion.cs (NewUserdefinedArray::Emit): Implement.
15131
15132 2001-10-23  Ravi Pratap  <ravi@ximian.com>
15133
15134         * expression.cs (New::DoResolve): Implement guts of array creation.
15135
15136         (New::FormLookupType): Rename to FormArrayType and modify ever so slightly.
15137
15138 2001-10-27  Miguel de Icaza  <miguel@ximian.com>
15139
15140         * expression.cs: Fix bug I introduced lsat night that broke
15141         Delegates. 
15142
15143         (Expression.Resolve): Report a 246 error (can not resolve name)
15144         if we find a SimpleName in the stream.
15145
15146         (Expression.ResolveLValue): Ditto.
15147
15148         (Expression.ResolveWithSimpleName): This function is a variant of
15149         ResolveName, this one allows SimpleNames to be returned without a
15150         warning.  The only consumer of SimpleNames is MemberAccess
15151
15152 2001-10-26  Miguel de Icaza  <miguel@ximian.com>
15153
15154         * expression.cs (Invocation::DoResolve): Catch SimpleNames that
15155         might arrive here.  I have my doubts that this is correct.
15156
15157         * statement.cs (Lock): Implement lock statement.
15158
15159         * cs-parser.jay: Small fixes to support `lock' and `using'
15160
15161         * cs-tokenizer.cs: Remove extra space
15162
15163         * driver.cs: New flag --checked, allows to turn on integer math
15164         checking. 
15165
15166         * typemanger.cs: Load methodinfos for Threading.Monitor.Enter and
15167         Threading.Monitor.Exit 
15168
15169 2001-10-23  Miguel de Icaza  <miguel@ximian.com>
15170
15171         * expression.cs (IndexerAccess::DoResolveLValue): Set the
15172         Expression Class to be IndexerAccess.
15173
15174         Notice that Indexer::DoResolve sets the eclass to Value.
15175
15176 2001-10-22  Miguel de Icaza  <miguel@ximian.com>
15177
15178         * class.cs (TypeContainer::Emit): Emit code for indexers.
15179
15180         * assign.cs (IAssignMethod): New interface implemented by Indexers
15181         and Properties for handling assignment.
15182
15183         (Assign::Emit): Simplify and reuse code. 
15184
15185         * expression.cs (IndexerAccess, PropertyExpr): Implement
15186         IAssignMethod, clean up old code. 
15187
15188 2001-10-22  Ravi Pratap  <ravi@ximian.com>
15189
15190         * typemanager.cs (ImplementsInterface): New method to determine if a type
15191         implements a given interface. Provides a nice cache too.
15192
15193         * expression.cs (ImplicitReferenceConversion): Update checks to use the above
15194         method.
15195
15196         (ConvertReferenceExplicit): Ditto.
15197
15198         * delegate.cs (Delegate::Populate): Update to define the parameters on the 
15199         various methods, with correct names etc.
15200
15201         * class.cs (Operator::OpType): New members Operator.UnaryPlus and 
15202         Operator.UnaryNegation.
15203
15204         * cs-parser.jay (operator_declarator): Be a little clever in the case where
15205         we have a unary plus or minus operator.
15206
15207         * expression.cs (Unary): Rename memebers of Operator enum to UnaryPlus and 
15208         UnaryMinus.
15209
15210         * everywhere : update accordingly.
15211
15212         * everywhere : Change Negate and BitComplement to LogicalNot and OnesComplement
15213         respectively.
15214
15215         * class.cs (Method::Define): For the case where we are implementing a method
15216         inherited from an interface, we need to set the MethodAttributes.Final flag too. 
15217         Also set MethodAttributes.NewSlot and MethodAttributes.HideBySig.
15218
15219 2001-10-21  Ravi Pratap  <ravi@ximian.com>
15220
15221         * interface.cs (FindMembers): Implement to work around S.R.E
15222         lameness.
15223
15224         * typemanager.cs (IsInterfaceType): Implement.
15225
15226         (FindMembers): Update to handle interface types too.
15227
15228         * expression.cs (ImplicitReferenceConversion): Re-write bits which
15229         use IsAssignableFrom as that is not correct - it doesn't work.
15230
15231         * delegate.cs (DelegateInvocation): Derive from ExpressionStatement
15232         and accordingly override EmitStatement.
15233
15234         * expression.cs (ConvertReferenceExplicit): Re-write similary, this time
15235         using the correct logic :-)
15236
15237 2001-10-19  Ravi Pratap  <ravi@ximian.com>
15238
15239         * ../errors/cs-11.cs : Add to demonstrate error -11 
15240
15241 2001-10-17  Miguel de Icaza  <miguel@ximian.com>
15242
15243         * assign.cs (Assign::Resolve): Resolve right hand side first, and
15244         then pass this as a hint to ResolveLValue.
15245
15246         * expression.cs (FieldExpr): Add Location information
15247
15248         (FieldExpr::LValueResolve): Report assignment to readonly
15249         variable. 
15250
15251         (Expression::ExprClassFromMemberInfo): Pass location information.
15252
15253         (Expression::ResolveLValue): Add new method that resolves an
15254         LValue. 
15255
15256         (Expression::DoResolveLValue): Default invocation calls
15257         DoResolve. 
15258
15259         (Indexers): New class used to keep track of indexers in a given
15260         Type. 
15261
15262         (IStackStore): Renamed from LValue, as it did not really describe
15263         what this did.  Also ResolveLValue is gone from this interface and
15264         now is part of Expression.
15265
15266         (ElementAccess): Depending on the element access type
15267
15268         * typemanager.cs: Add `indexer_name_type' as a Core type
15269         (System.Runtime.CompilerServices.IndexerNameAttribute)
15270
15271         * statement.cs (Goto): Take a location.
15272
15273 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15274
15275         * delegate.cs (Delegate::VerifyDelegate): New method to verify
15276         if two delegates are compatible.
15277
15278         (NewDelegate::DoResolve): Update to take care of the case when
15279         we instantiate a delegate from another delegate.
15280
15281         * typemanager.cs (FindMembers): Don't even try to look up members
15282         of Delegate types for now.
15283
15284 2001-10-18  Ravi Pratap  <ravi@ximian.com>
15285
15286         * delegate.cs (NewDelegate): New class to take care of delegate
15287         instantiation.
15288
15289         * expression.cs (New): Split the delegate related code out into 
15290         the NewDelegate class.
15291
15292         * delegate.cs (DelegateInvocation): New class to handle delegate 
15293         invocation.
15294
15295         * expression.cs (Invocation): Split out delegate related code into
15296         the DelegateInvocation class.
15297
15298 2001-10-17  Ravi Pratap  <ravi@ximian.com>
15299
15300         * expression.cs (New::DoResolve): Implement delegate creation fully
15301         and according to the spec.
15302
15303         (New::DoEmit): Update to handle delegates differently.
15304
15305         (Invocation::FullMethodDesc): Fix major stupid bug thanks to me
15306         because of which we were printing out arguments in reverse order !
15307
15308         * delegate.cs (VerifyMethod): Implement to check if the given method
15309         matches the delegate.
15310
15311         (FullDelegateDesc): Implement.
15312
15313         (VerifyApplicability): Implement.
15314
15315         * expression.cs (Invocation::DoResolve): Update to accordingly handle
15316         delegate invocations too.
15317
15318         (Invocation::Emit): Ditto.
15319
15320         * ../errors/cs1593.cs : Added.
15321
15322         * ../errors/cs1594.cs : Added.
15323
15324         * delegate.cs (InstanceExpression, TargetMethod): New properties.
15325
15326 2001-10-16  Ravi Pratap  <ravi@ximian.com>
15327
15328         * typemanager.cs (intptr_type): Core type for System.IntPtr
15329
15330         (InitCoreTypes): Update for the same.
15331
15332         (iasyncresult_type, asynccallback_type): Ditto.
15333
15334         * delegate.cs (Populate): Fix to use System.Intptr as it is indeed
15335         correct.
15336
15337         * typemanager.cs (AddDelegateType): Store a pointer to the Delegate class
15338         too.
15339
15340         * delegate.cs (ConstructorBuilder, InvokeBuilder, ...): New members to hold
15341         the builders for the 4 members of a delegate type :-)
15342
15343         (Populate): Define the BeginInvoke and EndInvoke methods on the delegate
15344         type.
15345
15346         * expression.cs (New::DoResolve): Implement guts for delegate creation.
15347
15348         * ../errors/errors.txt : Update for an error (-11) which only we catch :-)
15349
15350 2001-10-15  Miguel de Icaza  <miguel@ximian.com>
15351
15352         * statement.cs (Break::Emit): Implement.   
15353         (Continue::Emit): Implement.
15354
15355         (For::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15356         (While::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15357         (Do::Emit): Track old being/end loops;  Set Begin loop, ack end loop
15358         (Foreach::Emit): Track old being/end loops;  Set Begin loop, ack
15359         end loop
15360
15361         * codegen.cs (EmitContext::LoopEnd, EmitContext::LoopBegin): New
15362         properties that track the label for the current loop (begin of the
15363         loop and end of the loop).
15364
15365 2001-10-15  Ravi Pratap  <ravi@ximian.com>
15366
15367         * delegate.cs (Emit): Get rid of it as there doesn't seem to be any ostensible
15368         use of emitting anything at all.
15369
15370         * class.cs, rootcontext.cs : Get rid of calls to the same.
15371
15372         * delegate.cs (DefineDelegate): Make sure the class we define is also sealed.
15373
15374         (Populate): Define the constructor correctly and set the implementation
15375         attributes.
15376
15377         * typemanager.cs (delegate_types): New hashtable to hold delegates that
15378         have been defined.
15379
15380         (AddDelegateType): Implement.
15381
15382         (IsDelegateType): Implement helper method.
15383
15384         * delegate.cs (DefineDelegate): Use AddDelegateType instead of AddUserType.
15385
15386         * expression.cs (New::DoResolve): Check if we are trying to instantiate a delegate type
15387         and accordingly handle it.
15388
15389         * delegate.cs (Populate): Take TypeContainer argument.
15390         Implement bits to define the Invoke method. However, I still haven't figured out
15391         how to take care of the native int bit :-(
15392
15393         * cs-parser.jay (delegate_declaration): Fixed the bug that I had introduced :-) 
15394         Qualify the name of the delegate, not its return type !
15395
15396         * expression.cs (ImplicitReferenceConversion): Implement guts of implicit array
15397         conversion.
15398
15399         (StandardConversionExists): Checking for array types turns out to be recursive.
15400
15401         (ConvertReferenceExplicit): Implement array conversion.
15402
15403         (ExplicitReferenceConversionExists): New method to determine precisely that :-)
15404
15405 2001-10-12  Ravi Pratap  <ravi@ximian.com>
15406
15407         * cs-parser.jay (delegate_declaration): Store the fully qualified
15408         name as it is a type declaration.
15409
15410         * delegate.cs (ReturnType, Name): Rename members to these. Make them 
15411         readonly.
15412
15413         (DefineDelegate): Renamed from Define. Does the same thing essentially,
15414         as TypeContainer::DefineType.
15415
15416         (Populate): Method in which all the definition of the various methods (Invoke)
15417         etc is done.
15418
15419         (Emit): Emit any code, if necessary. I am not sure about this really, but let's
15420         see.
15421
15422         (CloseDelegate): Finally creates the delegate.
15423
15424         * class.cs (TypeContainer::DefineType): Update to define delegates.
15425         (Populate, Emit and CloseType): Do the same thing here too.
15426
15427         * rootcontext.cs (ResolveTree, PopulateTypes, EmitCode, CloseTypes): Include
15428         delegates in all these operations.
15429
15430 2001-10-14  Miguel de Icaza  <miguel@ximian.com>
15431
15432         * expression.cs: LocalTemporary: a new expression used to
15433         reference a temporary that has been created.
15434
15435         * assign.cs: Handle PropertyAccess back here, so that we can
15436         provide the proper semantic access to properties.
15437
15438         * expression.cs (Expression::ConvertReferenceExplicit): Implement
15439         a few more explicit conversions. 
15440
15441         * modifiers.cs: `NEW' modifier maps to HideBySig.
15442
15443         * expression.cs (PropertyExpr): Make this into an
15444         ExpressionStatement, and support the EmitStatement code path. 
15445
15446         Perform get/set error checking, clean up the interface.
15447
15448         * assign.cs: recognize PropertyExprs as targets, and if so, turn
15449         them into toplevel access objects.
15450
15451 2001-10-12  Miguel de Icaza  <miguel@ximian.com>
15452
15453         * expression.cs: PropertyExpr::PropertyExpr: use work around the
15454         SRE.
15455
15456         * typemanager.cs: Keep track here of our PropertyBuilders again to
15457         work around lameness in SRE.
15458
15459 2001-10-11  Miguel de Icaza  <miguel@ximian.com>
15460
15461         * expression.cs (LValue::LValueResolve): New method in the
15462         interface, used to perform a second resolution pass for LValues. 
15463
15464         (This::DoResolve): Catch the use of this in static methods.
15465
15466         (This::LValueResolve): Implement.
15467
15468         (This::Store): Remove warning, assigning to `this' in structures
15469         is 
15470
15471         (Invocation::Emit): Deal with invocation of
15472         methods on value types.  We need to pass the address to structure
15473         methods rather than the object itself.  (The equivalent code to
15474         emit "this" for structures leaves the entire structure on the
15475         stack instead of a pointer to it). 
15476
15477         (ParameterReference::DoResolve): Compute the real index for the
15478         argument based on whether the method takes or not a `this' pointer
15479         (ie, the method is static).
15480
15481         * codegen.cs (EmitContext::GetTemporaryStorage): Used to store
15482         value types returned from functions when we need to invoke a
15483         method on the sturcture.
15484
15485
15486 2001-10-11  Ravi Pratap  <ravi@ximian.com>
15487
15488         * class.cs (TypeContainer::DefineType): Method to actually do the business of
15489         defining the type in the Modulebuilder or Typebuilder. This is to take
15490         care of nested types which need to be defined on the TypeBuilder using
15491         DefineNestedMethod.
15492
15493         (TypeContainer::GetClassBases): Implement. Essentially the code from the 
15494         methods in RootContext, only ported to be part of TypeContainer.
15495
15496         (TypeContainer::GetInterfaceOrClass): Ditto.
15497
15498         (TypeContainer::LookupInterfaceOrClass, ::MakeFQN): Ditto.
15499
15500         * interface.cs (Interface::DefineInterface): New method. Does exactly
15501         what RootContext.CreateInterface did earlier, only it takes care of nested types 
15502         too.
15503
15504         (Interface::GetInterfaces): Move from RootContext here and port.
15505
15506         (Interface::GetInterfaceByName): Same here.
15507
15508         * rootcontext.cs (ResolveTree): Re-write.
15509
15510         (PopulateTypes): Re-write.
15511
15512         * class.cs (TypeContainer::Populate): Populate nested types too.
15513         (TypeContainer::Emit): Emit nested members too.
15514
15515         * typemanager.cs (AddUserType): Do not make use of the FullName property,
15516         instead just use the name argument passed in as it is already fully
15517         qualified.
15518
15519         (FindMembers): Check in the Builders to TypeContainer mapping instead of the name
15520         to TypeContainer mapping to see if a type is user-defined.
15521
15522         * class.cs (TypeContainer::CloseType): Implement. 
15523
15524         (TypeContainer::DefineDefaultConstructor): Use Basename, not Name while creating
15525         the default constructor.
15526
15527         (TypeContainer::Populate): Fix minor bug which led to creating default constructors
15528         twice.
15529
15530         (Constructor::IsDefault): Fix up logic to determine if it is the default constructor
15531
15532         * interface.cs (CloseType): Create the type here.
15533
15534         * rootcontext.cs (CloseTypes): Re-write to recursively close types by running through
15535         the hierarchy.
15536
15537         Remove all the methods which are now in TypeContainer.
15538
15539 2001-10-10  Ravi Pratap  <ravi@ximian.com>
15540
15541         * delegate.cs (Define): Re-write bits to define the delegate
15542         correctly.
15543
15544 2001-10-10  Miguel de Icaza  <miguel@ximian.com>
15545
15546         * makefile: Renamed the compiler to `mcs.exe' instead of compiler.exe
15547
15548         * expression.cs (ImplicitReferenceConversion): handle null as well
15549         as a source to convert to any reference type.
15550
15551         * statement.cs (Return): Perform any implicit conversions to
15552         expected return type.  
15553
15554         Validate use of return statement.  
15555
15556         * codegen.cs (EmitContext): Pass the expected return type here.
15557
15558         * class.cs (Method, Constructor, Property): Pass expected return
15559         type to EmitContext.
15560
15561 2001-10-09  Miguel de Icaza  <miguel@ximian.com>
15562
15563         * expression.cs: Make DoResolve take an EmitContext instead of a
15564         TypeContainer.
15565
15566         Replaced `l' and `location' for `loc', for consistency.
15567
15568         (Error, Warning): Remove unneeded Tc argument.
15569
15570         * assign.cs, literal.cs, constant.cs: Update to new calling
15571         convention. 
15572
15573         * codegen.cs: EmitContext now contains a flag indicating whether
15574         code is being generated in a static method or not.
15575
15576         * cs-parser.jay: DecomposeQI, new function that replaces the old
15577         QualifiedIdentifier.  Now we always decompose the assembled
15578         strings from qualified_identifier productions into a group of
15579         memberaccesses.
15580
15581 2001-10-08  Miguel de Icaza  <miguel@ximian.com>
15582
15583         * rootcontext.cs: Deal with field-less struct types correctly now
15584         by passing the size option to Define Type.
15585
15586         * class.cs: Removed hack that created one static field. 
15587
15588 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15589
15590         * statement.cs: Moved most of the code generation here. 
15591
15592 2001-10-09  Ravi Pratap  <ravi@ximian.com>
15593
15594         * expression.cs (New::DoResolve): Revert changes for array creation, doesn't
15595         seem very right.
15596
15597         (ElementAccess): Remove useless bits for now - keep checks as the spec
15598         says.
15599
15600 2001-10-08  Ravi Pratap  <ravi@ximian.com>
15601
15602         * expression.cs (ElementAccess::DoResolve): Remove my crap code
15603         and start performing checks according to the spec.
15604
15605 2001-10-07  Ravi Pratap  <ravi@ximian.com>
15606
15607         * cs-parser.jay (type_suffix*): Remove - they are redundant. Use
15608         rank_specifiers instead.
15609
15610         (rank_specifiers): Change the order in which the rank specifiers are stored
15611
15612         (local_variable_declaration): Use opt_rank_specifier instead of type_suffixes.
15613
15614         * expression.cs (ElementAccess): Implement the LValue interface too.
15615
15616 2001-10-06  Ravi Pratap  <ravi@ximian.com>
15617
15618         * expression.cs (ConvertExplicitStandard): Add. Same as ConvertExplicit
15619         except that user defined conversions are not included.
15620
15621         (UserDefinedConversion): Update to use the ConvertExplicitStandard to 
15622         perform the conversion of the return type, if necessary.
15623
15624         (New::DoResolve): Check whether we are creating an array or an object
15625         and accordingly do the needful.
15626
15627         (New::Emit): Same here.
15628
15629         (New::DoResolve): Implement guts of array creation.
15630
15631         (New::FormLookupType): Helper function.
15632
15633 2001-10-07  Miguel de Icaza  <miguel@ximian.com>
15634
15635         * codegen.cs: Removed most of the code generation here, and move the
15636         corresponding code generation bits to the statement classes. 
15637
15638         Added support for try/catch/finalize and throw.
15639
15640         * cs-parser.jay: Added support for try/catch/finalize.
15641
15642         * class.cs: Catch static methods having the flags override,
15643         virtual or abstract.
15644
15645         * expression.cs (UserCast): This user cast was not really doing
15646         what it was supposed to do.  Which is to be born in fully resolved
15647         state.  Parts of the resolution were being performed at Emit time! 
15648
15649         Fixed this code.
15650
15651 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15652
15653         * expression.cs: Implicity convert the result from UserCast.
15654
15655 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15656
15657         * expression.cs (Expression::FindMostEncompassingType): Fix bug which
15658         prevented it from working correctly. 
15659
15660         (ConvertExplicit): Make the first try, a call to ConvertImplicitStandard, not
15661         merely ConvertImplicit.
15662
15663 2001-10-05  Miguel de Icaza  <miguel@ximian.com>
15664
15665         * typemanager.cs: Make the LookupTypeContainer function static,
15666         and not per-instance.  
15667
15668         * class.cs: Make static FindMembers (the one that takes a Type
15669         argument). 
15670
15671         * codegen.cs: Add EmitForeach here.
15672
15673         * cs-parser.jay: Make foreach a toplevel object instead of the
15674         inline expansion, as we need to perform semantic analysis on it. 
15675
15676 2001-10-05  Ravi Pratap  <ravi@ximian.com>
15677
15678         * expression.cs (Expression::ImplicitUserConversion): Rename to
15679         UserDefinedConversion.
15680
15681         (Expression::UserDefinedConversion): Take an extra argument specifying 
15682         whether we look for explicit user conversions too.
15683
15684         (Expression::ImplicitUserConversion): Make it a call to UserDefinedConversion.
15685
15686         (UserDefinedConversion): Incorporate support for user defined explicit conversions.
15687
15688         (ExplicitUserConversion): Make it a call to UserDefinedConversion
15689         with the appropriate arguments.
15690
15691         * cs-parser.jay (cast_expression): Record location too.
15692
15693         * expression.cs (Cast): Record location info.
15694
15695         (Expression::ConvertExplicit): Take location argument.
15696
15697         (UserImplicitCast): Change name to UserCast. Take an extra constructor argument
15698         to determine if we are doing explicit conversions.
15699
15700         (UserCast::Emit): Update accordingly.
15701
15702         (Expression::ConvertExplicit): Report an error if everything fails.
15703
15704         * ../errors/cs0030.cs : Add.
15705
15706 2001-10-04  Miguel de Icaza  <miguel@ximian.com>
15707
15708         * modifiers.cs: If the ABSTRACT keyword is present, also set the
15709         virtual and newslot bits. 
15710
15711         * class.cs (TypeContainer::RegisterRequiredImplementations):
15712         Record methods we need.
15713
15714         (TypeContainer::MakeKey): Helper function to make keys for
15715         MethodBases, since the Methodbase key is useless.
15716
15717         (TypeContainer::Populate): Call RegisterRequiredImplementations
15718         before defining the methods.   
15719
15720         Create a mapping for method_builders_to_methods ahead of time
15721         instead of inside a tight loop.
15722
15723         (::RequireMethods):  Accept an object as the data to set into the
15724         hashtable so we can report interface vs abstract method mismatch.
15725
15726 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15727
15728         * report.cs: Make all of it static.
15729
15730         * rootcontext.cs: Drop object_type and value_type computations, as
15731         we have those in the TypeManager anyways.
15732
15733         Drop report instance variable too, now it is a global.
15734
15735         * driver.cs: Use try/catch on command line handling.
15736
15737         Add --probe option to debug the error reporting system with a test
15738         suite. 
15739
15740         * report.cs: Add support for exiting program when a probe
15741         condition is reached.
15742
15743 2001-10-03  Ravi Pratap  <ravi@ximian.com>
15744
15745         * expression.cs (Binary::DoNumericPromotions): Fix the case when
15746         we do a forcible conversion regardless of type, to check if 
15747         ForceConversion returns a null.
15748
15749         (Binary::error19): Use location to report error.
15750
15751         (Unary::error23): Use location here too.
15752
15753         * ../errors/cs0019.cs : Check in.
15754
15755         * ../errors/cs0023.cs : Check in.
15756
15757         * expression.cs (Expression.MemberLookup): Return null for a rather esoteric
15758         case of a non-null MethodInfo object with a length of 0 !
15759
15760         (Binary::ResolveOperator): Flag error if overload resolution fails to find
15761         an applicable member - according to the spec :-)
15762         Also fix logic to find members in base types.
15763
15764         (Unary::ResolveOperator): Same here.
15765
15766         (Unary::report23): Change name to error23 and make first argument a TypeContainer
15767         as I was getting thoroughly confused between this and error19 :-)
15768
15769         * expression.cs (Expression::ImplicitUserConversion): Re-write fully
15770         (::FindMostEncompassedType): Implement.
15771         (::FindMostEncompassingType): Implement.
15772         (::StandardConversionExists): Implement.
15773
15774         (UserImplicitCast): Re-vamp. We now need info about most specific
15775         source and target types so that we can do the necessary conversions.
15776
15777         (Invocation::MakeUnionSet): Completely re-write to make sure we form a proper
15778         mathematical union with no duplicates.
15779
15780 2001-10-03  Miguel de Icaza  <miguel@ximian.com>
15781
15782         * rootcontext.cs (RootContext::PopulateTypes): Populate containers
15783         in order from base classes to child classes, so that we can in
15784         child classes look up in our parent for method names and
15785         attributes (required for handling abstract, virtual, new, override
15786         constructs: we need to instrospect our base class, and if we dont
15787         populate the classes in order, the introspection might be
15788         incorrect.  For example, a method could query its parent before
15789         the parent has any methods and would determine that the parent has
15790         no abstract methods (while it could have had them)).
15791
15792         (RootContext::CreateType): Record the order in which we define the
15793         classes.
15794
15795 2001-10-02  Miguel de Icaza  <miguel@ximian.com>
15796
15797         * class.cs (TypeContainer::Populate): Also method definitions can
15798         fail now, keep track of this.
15799
15800         (TypeContainer::FindMembers): Implement support for
15801         DeclaredOnly/noDeclaredOnly flag.
15802
15803         (Constructor::Emit) Return the ConstructorBuilder.
15804
15805         (Method::Emit) Return the MethodBuilder. 
15806         Check for abstract or virtual methods to be public.
15807
15808         * rootcontext.cs (RootContext::CreateType): Register all the
15809         abstract methods required for the class to be complete and the
15810         interface methods that must be implemented. 
15811
15812         * cs-parser.jay: Report error 501 (method requires body if it is
15813         not marked abstract or extern).
15814
15815         * expression.cs (TypeOf::Emit): Implement.
15816
15817         * typemanager.cs: runtime_handle_type, new global type.
15818
15819         * class.cs (Property::Emit): Generate code for properties.
15820
15821 2001-10-02  Ravi Pratap  <ravi@ximian.com>
15822
15823         * expression.cs (Unary::ResolveOperator): Find operators on base type
15824         too - we now conform exactly to the spec.
15825
15826         (Binary::ResolveOperator): Same here.
15827
15828         * class.cs (Operator::Define): Fix minor quirk in the tests.
15829
15830         * ../errors/cs0215.cs : Added.
15831
15832         * ../errors/cs0556.cs : Added.
15833
15834         * ../errors/cs0555.cs : Added.
15835
15836 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15837
15838         * cs-tokenizer.cs: Reimplemented Location to be a struct with a
15839         single integer which is really efficient
15840
15841 2001-10-01  Ravi Pratap  <ravi@ximian.com>
15842
15843         *  expression.cs (Expression::ImplicitUserConversion): Use location
15844         even in the case when we are examining True operators.
15845  
15846         * class.cs (Operator::Define): Perform extensive checks to conform
15847         with the rules for operator overloading in the spec.
15848
15849         * expression.cs (Expression::ImplicitReferenceConversion): Implement
15850         some of the other conversions mentioned in the spec.
15851
15852         * typemanager.cs (array_type): New static member for the System.Array built-in
15853         type.
15854
15855         (cloneable_interface): For System.ICloneable interface.
15856
15857         * driver.cs (Driver::Driver): Initialize TypeManager's core types even before
15858         we start resolving the tree and populating types.
15859
15860         * ../errors/errors.txt : Update for error numbers -7, -8, -9, -10
15861  
15862 2001-10-01  Miguel de Icaza  <miguel@ximian.com>
15863
15864         * expression.cs (Expression::ExprClassFromMemberInfo,
15865         Expression::Literalize): Create literal expressions from
15866         FieldInfos which are literals.
15867
15868         (ConvertNumericExplicit, ImplicitNumericConversion): Fix a few
15869         type casts, because they were wrong.  The test suite in tests
15870         caught these ones.
15871
15872         (ImplicitNumericConversion): ushort to ulong requires a widening
15873         cast. 
15874
15875         Int32 constant to long requires widening cast as well.
15876
15877         * literal.cs (LongLiteral::EmitLong): Do not generate i4 constants
15878         for integers because the type on the stack is not i4.
15879
15880 2001-09-30  Miguel de Icaza  <miguel@ximian.com>
15881
15882         * expression.cs (report118): require location argument. 
15883
15884         * parameter.cs: Do not dereference potential null value.
15885
15886         * class.cs: Catch methods that lack the `new' keyword when
15887         overriding a name.  Report warnings when `new' is used without
15888         anything being there to override.
15889
15890         * modifiers.cs: Handle `NEW' as MethodAttributes.NewSlot.
15891
15892         * class.cs: Only add constructor to hashtable if it is non-null
15893         (as now constructors can fail on define).
15894
15895         (TypeManager, Class, Struct): Take location arguments.
15896
15897         Catch field instance initialization in structs as errors.
15898
15899         accepting_filter: a new filter for FindMembers that is static so
15900         that we dont create an instance per invocation.
15901
15902         (Constructor::Define): Catch errors where a struct constructor is
15903         parameterless 
15904
15905         * cs-parser.jay: Pass location information for various new
15906         constructs. 
15907
15908         * delegate.cs (Delegate): take a location argument.
15909
15910         * driver.cs: Do not call EmitCode if there were problesm in the
15911         Definition of the types, as many Builders wont be there. 
15912
15913         * decl.cs (Decl::Decl): Require a location argument.
15914
15915         * cs-tokenizer.cs: Handle properly hex constants that can not fit
15916         into integers, and find the most appropiate integer for it.
15917
15918         * literal.cs: Implement ULongLiteral.
15919
15920         * rootcontext.cs: Provide better information about the location of
15921         failure when CreateType fails.
15922
15923 2001-09-29  Miguel de Icaza  <miguel@ximian.com>
15924
15925         * rootcontext.cs (RootContext::PopulateTypes): Populates structs
15926         as well.
15927
15928         * expression.cs (Binary::CheckShiftArguments): Add missing type
15929         computation.
15930         (Binary::ResolveOperator): Add type to the logical and and logical
15931         or, Bitwise And/Or and Exclusive Or code paths, it was missing
15932         before.
15933
15934         (Binary::DoNumericPromotions): In the case where either argument
15935         is ulong (and most signed types combined with ulong cause an
15936         error) perform implicit integer constant conversions as well.
15937
15938 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
15939
15940         * expression.cs (UserImplicitCast): Method should always be
15941         non-null. 
15942         (Invocation::BetterConversion): Simplified test for IntLiteral.
15943
15944         (Expression::ImplicitNumericConversion): Split this routine out.
15945         Put the code that performs implicit constant integer conversions
15946         here. 
15947
15948         (Expression::Resolve): Become a wrapper around DoResolve so we can
15949         check eclass and type being set after resolve.
15950
15951         (Invocation::Badness): Remove this dead function
15952
15953         (Binary::ResolveOperator): Do not compute the expensive argumnets
15954         unless we have a union for it.
15955
15956         (Probe::Emit): Is needs to do an isinst and then
15957         compare against null.
15958
15959         (::CanConvert): Added Location argument.  If the Location argument
15960         is null (Location.Null), then we do not report errors.  This is
15961         used by the `probe' mechanism of the Explicit conversion.  We do
15962         not want to generate an error for something that the user
15963         explicitly requested to be casted.  But the pipeline for an
15964         explicit cast first tests for potential implicit casts.
15965
15966         So for now, if the Location is null, it means `Probe only' to
15967         avoid adding another argument.   Might have to revise this
15968         strategy later.
15969
15970         (ClassCast): New class used to type cast objects into arbitrary
15971         classes (used in Explicit Reference Conversions).
15972
15973         Implement `as' as well.
15974
15975         Reverted all the patches from Ravi below: they were broken:
15976
15977                 * The use of `level' as a mechanism to stop recursive
15978                   invocations is wrong.  That was there just to catch the
15979                   bug with a strack trace but not as a way of addressing
15980                   the problem.
15981
15982                   To fix the problem we have to *understand* what is going
15983                   on and the interactions and come up with a plan, not
15984                   just get things going.
15985
15986                 * The use of the type conversion cache that I proposed
15987                   last night had an open topic: How does this work across
15988                   protection domains.  A user defined conversion might not
15989                   be public in the location where we are applying the
15990                   conversion, a different conversion might be selected
15991                   (ie, private A->B (better) but public B->A (worse),
15992                   inside A, A->B applies, but outside it, B->A will
15993                   apply).
15994
15995                 * On top of that (ie, even if the above is solved),
15996                   conversions in a cache need to be abstract.  Ie, `To
15997                   convert from an Int to a Short use an OpcodeCast', not
15998                   `To convert from an Int to a Short use the OpcodeCast on
15999                   the variable 5' (which is what this patch was doing).
16000
16001 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16002
16003         * expression.cs (Invocation::ConversionExists): Re-write to use
16004         the conversion cache
16005
16006         (Expression::ConvertImplicit): Automatic bailing out if level != 0. Also
16007         cache all conversions done, not just user-defined ones.
16008
16009         (Invocation::BetterConversion): The real culprit. Use ConversionExists
16010         to determine if a conversion exists instead of acutually trying to 
16011         perform the conversion. It's faster too.
16012
16013         (Expression::ConvertExplicit): Modify to use ConversionExists to check
16014         and only then attempt the implicit conversion.
16015
16016 2001-09-28  Ravi Pratap  <ravi@ximian.com>
16017
16018         * expression.cs (ConvertImplicit): Use a cache for conversions
16019         already found. Check level of recursion and bail out if necessary.
16020
16021 2001-09-28  Miguel de Icaza  <miguel@ximian.com>
16022
16023         * typemanager.cs (string_concat_string_string, string_concat_object_object):
16024         Export standard methods that we expect for string operations.
16025
16026         * statement.cs (Block::UsageWarning): Track usage of variables and
16027         report the errors for not used variables.
16028
16029         * expression.cs (Conditional::Resolve, ::Emit): Implement ?:
16030         operator. 
16031
16032 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16033
16034         * codegen.cs: remove unnneded code 
16035
16036         * expression.cs: Removed BuiltinTypeAccess class
16037
16038         Fix the order in which implicit conversions are
16039         done.  
16040
16041         The previous fixed dropped support for boxed conversions (adding a
16042         test to the test suite now)
16043
16044         (UserImplicitCast::CanConvert): Remove test for source being null,
16045         that code is broken.  We should not feed a null to begin with, if
16046         we do, then we should track the bug where the problem originates
16047         and not try to cover it up here.
16048
16049         Return a resolved expression of type UserImplicitCast on success
16050         rather than true/false.  Ravi: this is what I was talking about,
16051         the pattern is to use a static method as a "constructor" for
16052         objects. 
16053
16054         Also, do not create arguments until the very last minute,
16055         otherwise we always create the arguments even for lookups that
16056         will never be performed. 
16057
16058         (UserImplicitCast::Resolve): Eliminate, objects of type
16059         UserImplicitCast are born in a fully resolved state. 
16060
16061         * typemanager.cs (InitCoreTypes): Init also value_type
16062         (System.ValueType). 
16063
16064         * expression.cs (Cast::Resolve): First resolve the child expression.
16065
16066         (LValue): Add new method AddressOf to be used by
16067         the `&' operator.  
16068
16069         Change the argument of Store to take an EmitContext instead of an
16070         ILGenerator, because things like FieldExpr need to be able to call
16071         their children expression to generate the instance code. 
16072
16073         (Expression::Error, Expression::Warning): Sugar functions for
16074         reporting errors.
16075
16076         (Expression::MemberLookup): Accept a TypeContainer instead of a
16077         Report as the first argument.
16078
16079         (Expression::ResolvePrimary): Killed.  I still want to improve
16080         this as currently the code is just not right.
16081
16082         (Expression::ResolveMemberAccess): Simplify, but it is still
16083         wrong. 
16084
16085         (Unary::Resolve): Catch errors in AddressOf operators.
16086
16087         (LocalVariableReference::Emit, ::Store, ::AddressOf): typecast
16088         index to a byte for the short-version, or the compiler will choose
16089         the wrong Emit call, which generates the wrong data.
16090
16091         (ParameterReference::Emit, ::Store): same.
16092
16093         (FieldExpr::AddressOf): Implement.
16094
16095         * typemanager.cs: TypeManager: made public variable instead of
16096         property.
16097
16098         * driver.cs: document --fatal.
16099
16100         * report.cs (ErrorMessage, WarningMessage): new names for the old
16101         Error and Warning classes.
16102
16103         * cs-parser.jay (member_access): Turn built-in access to types
16104         into a normal simplename
16105
16106 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16107
16108         * expression.cs (Invocation::BetterConversion): Fix to cope
16109         with q being null, since this was introducing a bug.
16110
16111         * expression.cs (ConvertImplicit): Do built-in conversions first.
16112
16113 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16114
16115         * expression.cs (UserImplicitCast::Resolve): Fix bug.
16116
16117 2001-09-27  Ravi Pratap  <ravi@ximian.com>
16118
16119         * class.cs (TypeContainer::AddConstructor): Fix a stupid bug
16120         I had introduced long ago (what's new ?).
16121
16122         * expression.cs (UserImplicitCast::CanConvert): Static method to do 
16123         the work of all the checking. 
16124         (ConvertImplicit): Call CanConvert and only then create object if necessary.
16125         (UserImplicitCast::CanConvert, ::Resolve): Re-write.
16126
16127         (Unary::Operator): Rename Add and Subtract to Addition and Subtraction because
16128         that is the right way. 
16129
16130         (Invocation::MakeUnionSet): Convenience function to make unions of sets for 
16131         overloading resolution. Use everywhere instead of cutting and pasting code.
16132
16133         (Binary::ResolveOperator): Use MakeUnionSet.
16134
16135         (UserImplicitCast::CanConvert, ::Resolve): Update to take care of the case when 
16136         we have to convert to bool types. Not complete yet.
16137
16138 2001-09-27  Miguel de Icaza  <miguel@ximian.com>
16139
16140         * typemanager.cs (TypeManager::CSharpName): support ushort.
16141
16142         * expression.cs (Expression::TryImplicitIntConversion): Attempts
16143         to provide an expression that performsn an implicit constant int
16144         conversion (section 6.1.6).
16145         (Expression::ConvertImplicitRequired): Reworked to include
16146         implicit constant expression conversions.
16147
16148         (Expression::ConvertNumericExplicit): Finished.
16149
16150         (Invocation::Emit): If InstanceExpression is null, then it means
16151         that we perform a call on this.
16152
16153 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16154
16155         * expression.cs (Unary::Emit): Remove some dead code.
16156         (Probe): Implement Resolve and Emit for `is'.
16157         (Expression::ConvertImplicitRequired): Attempt to do constant
16158         expression conversions here.  Maybe should be moved to
16159         ConvertImplicit, but I am not sure.
16160         (Expression::ImplicitLongConstantConversionPossible,
16161         Expression::ImplicitIntConstantConversionPossible): New functions
16162         that tell whether is it possible to apply an implicit constant
16163         expression conversion.
16164
16165         (ConvertNumericExplicit): Started work on explicit numeric
16166         conversions.
16167
16168         * cs-parser.jay: Update operator constants.
16169
16170         * parameter.cs (Parameters::GetParameterInfo): Hook up VerifyArgs
16171         (Parameters::GetSignature): Hook up VerifyArgs here.
16172         (Parameters::VerifyArgs): Verifies that no two arguments have the
16173         same name. 
16174
16175         * class.cs (Operator): Update the operator names to reflect the
16176         ones that the spec expects (as we are just stringizing the
16177         operator names).
16178
16179         * expression.cs (Unary::ResolveOperator): Fix bug: Use
16180         MethodInfo's ReturnType instead of LookupMethodByBuilder as the
16181         previous usage did only work for our methods.
16182         (Expression::ConvertImplicit): Handle decimal implicit numeric
16183         conversions as well.
16184         (Expression::InternalTypeConstructor): Used to invoke constructors
16185         on internal types for default promotions.
16186
16187         (Unary::Emit): Implement special handling for the pre/post
16188         increment/decrement for overloaded operators, as they need to have
16189         the same semantics as the other operators.
16190
16191         (Binary::ResolveOperator): ditto.
16192         (Invocation::ConversionExists): ditto.
16193         (UserImplicitCast::Resolve): ditto.
16194
16195 2001-09-26  Ravi Pratap  <ravi@ximian.com>
16196
16197         * expression.cs (Unary::Emit and Binary::Emit): If we have an overloaded
16198         operator, return after emitting body. Regression tests pass again !
16199
16200         * expression.cs (ConvertImplicit): Take TypeContainer as first argument
16201         (Unary::ForceConversion, Binary::ForceConversion): Ditto.
16202         (Invocation::OverloadResolve): Ditto.
16203         (Invocation::BetterFunction, BetterConversion, ConversionExists): Ditto.
16204
16205         * everywhere : update calls to the above methods accordingly.
16206
16207 2001-09-26  Miguel de Icaza  <miguel@ximian.com>
16208
16209         * assign.cs (Assign): Make it inherit from ExpressionStatement.
16210
16211         * expression.cs (ExpressionStatement): New base class used for
16212         expressions that can appear in statements, so that we can provide
16213         an alternate path to generate expression that do not leave a value
16214         on the stack.
16215
16216         (Expression::Emit, and all the derivatives): We no longer return
16217         whether a value is left on the stack or not.  Every expression
16218         after being emitted leaves a single value on the stack.
16219
16220         * codegen.cs (EmitContext::EmitStatementExpression): Use the
16221         facilties of ExpressionStatement if possible.
16222
16223         * cs-parser.jay: Update statement_expression.
16224
16225 2001-09-25  Miguel de Icaza  <miguel@ximian.com>
16226
16227         * driver.cs: Change the wording of message
16228
16229 2001-09-25  Ravi Pratap  <ravi@ximian.com>
16230
16231         * expression.cs (Binary::ResolveOperator): Had forgottten to set 
16232         the type of the expression to the return type of the method if
16233         we have an overloaded operator match ! The regression tests pass again !
16234         (Unary::ResolveOperator): Ditto.
16235
16236         * expression.cs (Invocation::ConversionExists): Correct the member lookup
16237         to find "op_Implicit", not "implicit" ;-)
16238         (UserImplicitCast): New class to take care of user-defined implicit conversions.
16239         (ConvertImplicit, ForceConversion): Take TypeContainer argument
16240
16241         * everywhere : Correct calls to the above accordingly.
16242
16243         * expression.cs (UserImplicitCast::Resolve, ::Emit): Implement.
16244         (ConvertImplicit): Do user-defined conversion if it exists.
16245
16246 2001-09-24  Miguel de Icaza  <miguel@ximian.com>
16247
16248         * assign.cs: track location.
16249         (Resolve): Use implicit conversions on assignment.
16250
16251         * literal.cs: Oops.  Not good, Emit of short access values should
16252         pass (Bytes) or the wrong argument will be selected.
16253
16254         * expression.cs (Unary::Emit): Emit code for -expr.
16255
16256         (Unary::ResolveOperator): Handle `Substract' for non-constants
16257         (substract from zero from the non-constants).
16258         Deal with Doubles as well. 
16259
16260         (Expression::ConvertImplicitRequired): New routine that reports an
16261         error if no implicit conversion exists. 
16262
16263         (Invocation::OverloadResolve): Store the converted implicit
16264         expressions if we make them
16265
16266 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16267
16268         * class.cs (ConstructorInitializer): Take a Location argument.
16269         (ConstructorBaseInitializer): Same here.
16270         (ConstructorThisInitializer): Same here.
16271
16272         * cs-parser.jay : Update all calls accordingly.
16273
16274         * expression.cs (Unary, Binary, New): Take location argument.
16275         Update accordingly everywhere.
16276
16277         * cs-parser.jay : Update all calls to the above to take a location
16278         argument.
16279
16280         * class.cs : Ditto.
16281
16282 2001-09-24  Ravi Pratap  <ravi@ximian.com>
16283
16284         * expression.cs (Invocation::BetterFunction): Take TypeContainer argument
16285         (Invocation::BetterConversion): Same here
16286         (Invocation::ConversionExists): Ditto.
16287
16288         (Invocation::ConversionExists): Implement.
16289
16290 2001-09-22  Ravi Pratap  <ravi@ximian.com>
16291
16292         * expression.cs (OverloadResolve): Improve some more to catch errors 1502 and 1503
16293         Also take an additional TypeContainer argument.
16294
16295         * All over : Pass in TypeContainer as argument to OverloadResolve.
16296
16297         * typemanager.cs (CSharpName): Update to check for the string type and return
16298         that too.
16299
16300         * expression.cs (Invocation::FullMethodDesc): New static method to return a string fully describing
16301         a given method.
16302
16303 2001-09-21  Ravi Pratap  <ravi@ximian.com>
16304
16305         * expression.cs (Invocation::OverloadResolve): Re-write to conform more to the spec.
16306         (Invocation::BetterFunction): Implement.
16307         (Invocation::BetterConversion): Implement.
16308         (Invocation::ConversionExists): Skeleton, no implementation yet.
16309
16310         Okay, things work fine !
16311
16312 2001-09-21  Miguel de Icaza  <miguel@ximian.com>
16313
16314         * typemanager.cs: declare and load enum_type, delegate_type and
16315         void_type. 
16316
16317         * expression.cs (Expression::Emit): Now emit returns a value that
16318         tells whether a value is left on the stack or not.  This strategy
16319         might be reveted tomorrow with a mechanism that would address
16320         multiple assignments.
16321         (Expression::report118): Utility routine to report mismatches on
16322         the ExprClass.
16323
16324         (Unary::Report23): Report impossible type/operator combination
16325         utility function.
16326
16327         (Unary::IsIncrementableNumber): Whether the type can be
16328         incremented or decremented with add.
16329         (Unary::ResolveOperator): Also allow enumerations to be bitwise
16330         complemented. 
16331         (Unary::ResolveOperator): Implement ++, !, ~,
16332
16333         (Invocation::Emit): Deal with new Emit convetion.
16334
16335         * All Expression derivatives: Updated their Emit method to return
16336         whether they leave values on the stack or not.
16337
16338         * codegen.cs (CodeGen::EmitStatement): Pop values left on the
16339         stack for expressions that are statements. 
16340
16341 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16342
16343         * expression.cs (LValue): New interface.  Must be implemented by
16344         LValue objects.
16345         (LocalVariableReference, ParameterReference, FieldExpr): Implement
16346         LValue interface.
16347
16348         * assign.cs (Assign::Emit, Assign::Resolve): Use new LValue
16349         interface for generating code, simplifies the code.
16350
16351 2001-09-20  Ravi Pratap  <ravi@ximian.com>
16352
16353         * expression.cs (everywhere): Comment out return statements in ::Resolve
16354         methods to avoid the warnings.
16355
16356 2001-09-20  Miguel de Icaza  <miguel@ximian.com>
16357
16358         * driver.cs (parse): Report error 2001 if we can not open the
16359         source file.
16360
16361         * expression.cs (SimpleName::ResolveSimpleName): Error if we can
16362         not resolve it.
16363
16364         * cs-parser.jay (QualifierIdentifier): Pass location to SimpleName
16365         object. 
16366
16367         * statement.cs (Block::EmitMeta): Reuse the count across all the variables,
16368         otherwise nested blocks end up with the same index.
16369
16370         * codegen.cs (CodeGen::EmitTopBlock): Pass initial sequence
16371
16372         * expression.cs:  Instead of having FIXMEs in the Resolve
16373         functions, throw exceptions so it is obvious that we are facing a
16374         bug. 
16375
16376         * cs-parser.jay (invocation_expression): Pass Location information.
16377
16378         * codegen.cs (CodeGen::Save, CodeGen::CodeGen, CodeGen::Basename):
16379         Use a basename for those routines because .NET does not like paths
16380         on them. 
16381
16382         * class.cs (TypeContainer::AddMethod): Do not call DefineName if the name was
16383         already defined.
16384
16385 2001-09-19  Miguel de Icaza  <miguel@ximian.com>
16386
16387         * typemanager.cs (TypeManager::CoreLookupType): A function to make sure that we
16388         are loading the correct data types (throws an exception if not).
16389         (TypeManager::InitCoreTypes): Use CoreLookupType
16390
16391         * expression.cs (Unary::ResolveOperator): return the child
16392         expression for expressions which are just +expr.
16393         (Unary::ResolveOperator): Return negative literals for -LITERAL
16394         expressions (otherwise they are Unary {Literal}).
16395         (Invocation::Badness): Take into account `Implicit constant
16396         expression conversions'.
16397
16398         * literal.cs (LongLiteral): Implement long literal class.
16399         (IntLiteral): export the `Value' of the intliteral. 
16400
16401 2001-09-19  Ravi Pratap  <ravi@ximian.com>
16402
16403         * expression.cs (Binary::Emit): Finally get the emission right ! Woo!
16404
16405         * class.cs (Operator::Define): Change the methodname prefix to 'op_' 
16406         instead of 'Operator'
16407
16408         * expression.cs (Binary::ResolveOperator): Update accordingly.
16409         (Unary::Operator): Change names to 'Add' and 'Subtract' instead 'Plus'
16410         and 'Minus'
16411
16412         * cs-parser.jay (unary_expression): Update to use the new names.
16413
16414         * gen-treedump.cs (GetUnary): Same here.
16415
16416         * expression.cs (Unary::Resolve): Implement.
16417         (Binary::ResolveOperator): Re-write bits to quietly continue if no overloaded 
16418         operators are found instead of making noise ;-)
16419         (Unary::ResolveOperator): New method to do precisely the same thing which
16420         Binary::ResolveOperator does for Binary expressions.
16421         (Unary.method, .Arguments): Add.
16422         (Unary::OperName): Implement.   
16423         (Unary::ForceConversion): Copy and Paste !
16424
16425         * class.cs (Operator::Define): Fix a small bug for the case when we have 
16426         a unary operator.
16427
16428         * expression.cs (Unary::Emit): Implement. Need to find the right Opcodes
16429         for the inbuilt operators. Only overloading works for now ;-)
16430
16431 2001-09-18  Miguel de Icaza  <miguel@ximian.com>
16432
16433         * expression.cs (CheckedExpr::Resolve, CheckedExpr::Emit,
16434         UnCheckedExpr::Resolve, UnCheckedExpr::Emit): Implement.
16435
16436         * expression.cs (This::Emit): Implement. 
16437         (This::Resolve): Implement.
16438         (TypeOf:Resolve): Implement.
16439         (Expression::ResolveSimpleName): Add an implicit this to instance
16440         field references. 
16441         (MemberAccess::Resolve): Deal with Parameters and Fields. 
16442         Bind instance variable to Field expressions.
16443         (FieldExpr::Instance): New field used to track the expression that
16444         represents the object instance.
16445         (FieldExpr::Resolve): Track potential errors from MemberLookup not
16446         binding 
16447         (FieldExpr::Emit): Implement.
16448
16449         * codegen.cs (EmitIf, EmitStatement, EmitBlock): Propagate whether
16450         the last instruction contains a return opcode to avoid generating
16451         the last `ret' instruction (this generates correct code, and it is
16452         nice to pass the peverify output).
16453
16454         * class.cs (TypeContainer::EmitFieldInitializers): Implement field
16455         initializer for static and instance variables.
16456         (Constructor::Emit): Allow initializer to be null in the case of
16457         static constructors.  Only emit initializer for instance
16458         constructors. 
16459
16460         (TypeContainer::FindMembers): Return a null array if there are no
16461         matches.
16462
16463         Also fix the code for the MemberTypes.Method branch, as it was not
16464         scanning that for operators (or tried to access null variables before).
16465
16466         * assign.cs (Assign::Emit): Handle instance and static fields. 
16467
16468         * TODO: Updated.
16469
16470         * driver.cs: Stop compilation if there are parse errors.
16471
16472         * cs-parser.jay (constructor_declaration): Provide default base
16473         initializer for non-static constructors.
16474         (constructor_declarator): Do not provide a default base
16475         initializers if none was specified.
16476         Catch the fact that constructors should not have parameters.
16477
16478         * class.cs: Do not emit parent class initializers for static
16479         constructors, that should be flagged as an error.
16480
16481 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16482
16483         * class.cs (RegisterMethodBuilder): Remove : it's unnecessary.
16484         Move back code into TypeContainer::Populate.
16485
16486 2001-09-18  Ravi Pratap  <ravi@ximian.com>
16487
16488         * class.cs (TypeContainer::AddConstructor): Fix the check to
16489         compare against Name, not Basename. 
16490         (Operator::OpType): Change Plus and Minus to Add and Subtract.
16491
16492         * cs-parser.jay : Update accordingly.
16493
16494         * class.cs (TypeContainer::FindMembers): For the case where we are searching
16495         for methods, don't forget to look into the operators too.
16496         (RegisterMethodBuilder): Helper method to take care of this for
16497         methods, constructors and operators.
16498         (Operator::Define): Completely revamp.
16499         (Operator.OperatorMethod, MethodName): New fields.
16500         (TypeContainer::Populate): Move the registering of builders into
16501         RegisterMethodBuilder.
16502         (Operator::Emit): Re-write.
16503
16504         * expression.cs (Binary::Emit): Comment out code path to emit method
16505         invocation stuff for the case when we have a user defined operator. I am
16506         just not able to get it right !
16507
16508 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16509
16510         * expression.cs (Expression::OverloadResolve): Drop TypeContainer
16511         argument. 
16512
16513         (Expression::MemberLookup): Provide a version that allows to
16514         specify the MemberTypes and BindingFlags. 
16515
16516         * statement.cs (Block::GetVariableInfo): Forgot to recurse here,
16517         so it was not fetching variable information from outer blocks.
16518
16519         * modifiers.cs: (Modifiers::TypeAttr): Invert condition on
16520         Beforefieldinit as it was buggy.
16521
16522         * rootcontext.cs (::LookupInterfaceOrClass): Removed an Error -200
16523         that Ravi put here.  
16524
16525         * class.cs (Constructor::Emit): Only emit if block is not null.
16526         (TypeContainer::EmitDefaultConstructor): Removed routine, now we
16527         deal with this by semantically definining it as if the user had
16528         done it.
16529
16530         (TypeContainer::FindMembers): Removed ad-hoc hack to deal with
16531         constructors as we now "emit" them at a higher level.
16532
16533         (TypeContainer::DefineDefaultConstructor): Used to define the
16534         default constructors if none was provided.
16535
16536         (ConstructorInitializer): Add methods Resolve and Emit. 
16537
16538         * expression.cs: Cast to ConstructorInfo instead of MethodInfo
16539
16540 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16541
16542         * class.cs (TypeContainer::EmitDefaultConstructor): Register
16543         the default constructor builder with our hashtable for methodbuilders
16544         to methodcores.
16545
16546         * expression.cs (Invocation::OverloadResolve): Add a check for pd == null
16547         and argument_count is 0 in which case we have a match.
16548         (Binary::ResolveOperator): More null checking and miscellaneous coding
16549         style cleanup.
16550
16551 2001-09-17  Ravi Pratap  <ravi@ximian.com>
16552
16553         * rootcontext.cs (IsNameSpace): Compare against null.
16554
16555         * everywhere : Correct spelling to 'Greater' and to 'Subtract'
16556
16557         * class.cs (Operator::OpType): Change names to match the ones in Binary::Operator
16558         and Unary::Operator.
16559
16560         * cs-parser.jay (operator_declaration, CheckBinaryOperator, CheckUnaryOperator): Update
16561         accordingly.
16562
16563         * expression.cs (Binary::method): New member to hold the MethodBase for the case when
16564         we have overloaded operators.
16565         (Binary::ResolveOperator): Implement the part which does the operator overload
16566         resolution.
16567
16568         * class.cs (Operator::Emit): Implement.
16569         (TypeContainer::Emit): Emit the operators we have too.
16570
16571         * expression.cs (Binary::Emit): Update to emit the appropriate code for
16572         the case when we have a user-defined operator.
16573
16574 2001-09-17  Miguel de Icaza  <miguel@ximian.com>
16575
16576         * rootcontext.cs: Fix bug: tree.Namespaces might be null.
16577
16578 2001-09-16  Ravi Pratap  <ravi@ximian.com>
16579
16580         * class.cs (EmitStaticFieldInitializers, EmitFieldInitializers): Make public.
16581         (TypeContainer::EmitConstructor): Remove and move code into Contructor::Emit.
16582         (Constructor::Emit): Implement.
16583         (EmitStaticFieldInitializers, EmitFieldInitializers): Ensure we return immediately
16584         if we have no work to do. 
16585         (TypeContainer::Emit): Pass in TypeContainer as argument to the constructor's 
16586         Emit method.
16587
16588         * interface.cs (Interface::InterfaceAttr): Re-write to be more correct and complete.
16589         (Interface::IsTopLevel): Add. Same as TypeContainer::IsTopLevel.
16590
16591         * class.cs (TypeContainer::IsTopLevel): Modify to use parent.Parent instead
16592         of parent.parent.
16593
16594 2001-09-15  Ravi Pratap  <ravi@ximian.com>
16595
16596         * tree.cs (Tree::namespaces): New hashtable to keep track of namespaces
16597         in the source.
16598         (Tree::RecordNamespace): Method to do what the name says ;-)
16599         (Tree::Namespaces): Property to get at the namespaces hashtable.
16600
16601         * cs-parser.jay (namespace_declaration): Call RecordNamespace to 
16602         keep track.
16603
16604         * rootcontext.cs (IsNamespace): Fixed it :-)
16605
16606 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16607
16608         * class.cs (TypeContainer::FindMembers): Add support for
16609         constructors. 
16610         (MethodCore): New class that encapsulates both the shared aspects
16611         of a Constructor and a Method.  
16612         (Method, Constructor): Factored pieces into MethodCore.
16613
16614         * driver.cs: Added --fatal which makes errors throw exceptions.
16615         Load System assembly as well as part of the standard library.
16616
16617         * report.cs: Allow throwing exceptions on errors for debugging.
16618
16619         * modifiers.cs: Do not use `parent', instead use the real type
16620         container to evaluate permission settings.
16621
16622         * class.cs: Put Ravi's patch back in.  He is right, and we will
16623         have to cope with the
16624
16625 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16626
16627         * modifiers.cs (TypeAttr, MethodAttr, FieldAttr): Map protected internal to
16628         FamORAssem, not FamANDAssem.
16629
16630 2001-09-14  Miguel de Icaza  <miguel@ximian.com>
16631
16632         * driver.cs: Added --parse option that only parses its input files
16633         and terminates.
16634
16635         * class.cs: Reverted last change from Ravi to IsTopLevel.  That is
16636         incorrect.  IsTopLevel is not used to tell whether an object is
16637         root_types or not (that can be achieved by testing this ==
16638         root_types).  But to see if this is a top-level *class* (not
16639         necessarly our "toplevel" container). 
16640
16641 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16642
16643         * enum.cs (Enum::Define): Modify to call the Lookup method on the
16644         parent instead of a direct call to GetType.
16645
16646 2001-09-14  Ravi Pratap  <ravi@ximian.com>
16647
16648         * class.cs (TypeContainer::TypeAttr): Remove property code and move it into
16649         Modifiers.TypeAttr. This should just be a call to that method.
16650
16651         * modifiers.cs (TypeAttr): Re-write and take an extra argument, the TypeContainer
16652         object so that we can determine if we are top-level or not.
16653
16654         * delegate.cs (Delegate::Define): Update call to TypeAttr method to pass in the 
16655         TypeContainer too.
16656
16657         * enum.cs (Enum::Define): Ditto.
16658
16659         * modifiers.cs (FieldAttr): Re-write.
16660
16661         * class.cs (TypeContainer::IsTopLevel): Change accessibility to public.
16662         (TypeContainer::HaveStaticConstructor): New property to provide access
16663         to precisely that info.
16664
16665         * modifiers.cs (MethodAttr): Re-write.
16666         (EventAttr): Remove altogether as there seems to be no ostensible use for it.
16667
16668         * class.cs (TypeContainer::IsTopLevel): Re-write. root_types doesn't seem to be the parent
16669         of top-level types as claimed.
16670
16671 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16672
16673         * expression.cs (MemberLookup): Fruitless attempt to lookup
16674         constructors.  Maybe I need to emit default constructors?  That
16675         might be it (currently .NET emits this for me automatically).
16676         (Invocation::OverloadResolve): Cope with Arguments == null.
16677         (Invocation::EmitArguments): new function, shared by the new
16678         constructor and us.
16679         (Invocation::Emit): Handle static and instance methods.  Emit
16680         proper call instruction for virtual or non-virtual invocations.
16681         (New::Emit): Implement.
16682         (New::Resolve): Implement.
16683         (MemberAccess:Resolve): Implement.
16684         (MethodGroupExpr::InstanceExpression): used conforming to the spec
16685         to track instances.
16686         (FieldExpr::Resolve): Set type.
16687
16688         * support.cs: Handle empty arguments.
16689                 
16690         * cs-parser.jay (CompositeLookup, QualifierIdentifier,
16691         SimpleLookup): Auxiliary routines to help parse a qualifier
16692         identifier.  
16693
16694         Update qualifier_identifier rule.
16695
16696         * codegen.cs: Removed debugging messages.
16697
16698         * class.cs: Make this a global thing, this acts just as a "key" to
16699         objects that we might have around.
16700
16701         (Populate): Only initialize method_builders_to_methods once.
16702
16703         * expression.cs (PropertyExpr): Initialize type from the
16704         PropertyType. 
16705
16706         * codegen.cs (EmitContext::EmitBoolExpression): Use propper
16707         Resolve pattern.  Attempt to implicitly convert value to boolean.
16708         Emit code.
16709
16710         * expression.cs: Set the type for the int32/int32 argument case.
16711         (Binary::ResolveOperator): Set the return type to boolean for
16712         comparission operators
16713
16714         * typemanager.cs: Remove debugging print code.
16715
16716         (Invocation::Resolve): resolve type.
16717
16718         * class.cs: Allocate a MemberInfo of the correct size, as the code
16719         elsewhere depends on the test to reflect the correct contents.
16720
16721         (Method::) Keep track of parameters, due to System.Reflection holes
16722
16723         (TypeContainer::Populate): Keep track of MethodBuilders to Method
16724         mapping here.
16725
16726         (TypeContainer::FindMembers): Use ArrayList and then copy an array
16727         of the exact size and return that.
16728
16729         (Class::LookupMethodByBuilder): New function that maps
16730         MethodBuilders to its methods.  Required to locate the information
16731         on methods because System.Reflection bit us again.
16732
16733         * support.cs: New file, contains an interface ParameterData and
16734         two implementations: ReflectionParameters and InternalParameters
16735         used to access Parameter information.  We will need to grow this
16736         as required.
16737
16738         * expression.cs (Invocation::GetParameterData): implement a cache
16739         and a wrapper around the ParameterData creation for methods. 
16740         (Invocation::OverloadResolve): Use new code.
16741
16742 2001-09-13  Ravi Pratap  <ravi@ximian.com>
16743
16744         * class.cs (TypeContainer::EmitField): Remove and move into 
16745         (Field::Define): here and modify accordingly.
16746         (Field.FieldBuilder): New member.
16747         (TypeContainer::Populate): Update accordingly.
16748         (TypeContainer::FindMembers): Implement.
16749
16750 2001-09-13  Miguel de Icaza  <miguel@ximian.com>
16751
16752         * statement.cs: (VariableInfo::VariableType): New field to be
16753         initialized with the full type once it is resolved. 
16754
16755 2001-09-12  Miguel de Icaza  <miguel@ximian.com>
16756
16757         * parameter.cs (GetParameterInfo): Use a type cache to compute
16758         things only once, and to reuse this information
16759
16760         * expression.cs (LocalVariableReference::Emit): Implement.
16761         (OpcodeCast::Emit): fix.
16762
16763         (ParameterReference::Resolve): Implement.
16764         (ParameterReference::Emit): Implement.
16765
16766         * cs-parser.jay: Fix bug introduced by Ravi, variable initializers
16767         that are expressions need to stay as Expressions.
16768
16769         * typemanager.cs (CSharpName): Returns the C# name of a type if
16770         possible. 
16771
16772         * expression.cs (Expression::ConvertImplicit): New function that
16773         implements implicit type conversions.
16774
16775         (Expression::ImplicitReferenceConversion): Implements implicit
16776         reference conversions.
16777
16778         (EmptyCast): New type for transparent casts.
16779
16780         (OpcodeCast): New type for casts of types that are performed with
16781         a sequence of bytecodes.
16782
16783         (BoxedCast): New type used for casting value types into reference
16784         types.  Emits a box opcode.
16785
16786         (Binary::DoNumericPromotions): Implements numeric promotions of
16787         and computation of the Binary::Type.
16788
16789         (Binary::EmitBranchable): Optimization.
16790
16791         (Binary::Emit): Implement code emission for expressions.
16792
16793         * typemanager.cs (TypeManager): Added two new core types: sbyte
16794         and byte.
16795
16796 2001-09-12  Ravi Pratap  <ravi@ximian.com>
16797
16798         * class.cs (TypeContainer::FindMembers): Method which does exactly
16799         what Type.FindMembers does, only we don't have to use reflection. No
16800         implementation yet.
16801
16802         * typemanager.cs (typecontainers): New hashtable to hold the corresponding
16803         typecontainer objects as we need to get at them.
16804         (TypeManager::AddUserType): Overload to take an extra argument, the TypeContainer.
16805
16806         * rootcontext.cs : Correspondingly modify called to AddUserType to pass the
16807         typecontainer object.
16808
16809         * expression.cs (MemberLookup): Modify signature to take a RootContext object instead
16810         of just a Report object.
16811
16812 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16813
16814         * class.cs (Event::Define): Go back to using the prefixes "add_" and
16815         "remove_"
16816         (TypeContainer::Populate): Now define the delegates of the type too.
16817         (TypeContainer.Delegates): Property to access the list of delegates defined
16818         in the type.
16819
16820         * delegates.cs (Delegate::Define): Implement partially.
16821
16822         * modifiers.cs (TypeAttr): Handle more flags.
16823
16824 2001-09-11  Ravi Pratap  <ravi@ximian.com>
16825
16826         * class.cs (Indexer::Define): Fix for loop iteration condition to be just <
16827         and not <=
16828         (Operator::Define): Re-write logic to get types by using the LookupType method
16829         instead of blindly doing a Type.GetType ! How stupid can I get ;-) ?
16830         (Indexer::Define): Ditto.
16831         (Event::Define): Ditto.
16832         (Property::Define): Ditto.
16833
16834 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16835
16836         * class.cs (TypeContainer::Populate): Now define operators too. 
16837         (TypeContainer.Operators): New property to access the list of operators
16838         in a type.
16839         (Operator.OperatorMethodBuilder): New member to hold the method builder
16840         for the operator we are defining.
16841         (Operator::Define): Implement.
16842
16843 2001-09-10  Ravi Pratap  <ravi@ximian.com>
16844
16845         * class.cs (Event::Define): Make the prefixes of the accessor methods
16846         addOn_ and removeOn_ 
16847
16848         * genericparser.cs (GenericParser::error): Overloaded method to handle the case
16849         of the location being passed in too. Ideally, this should go later since all
16850         error reporting should be done through the Report object.
16851
16852         * class.cs (TypeContainer.Indexers): New property to access the list of indexers.
16853         (Populate): Iterate thru the indexers we have and define them too.
16854         (Indexer.GetMethodBuilder, .SetMethodBuilder): New members to hold the method builders
16855         for the get and set accessors.
16856         (Indexer::Define): Implement.
16857
16858 2001-09-09  Miguel de Icaza  <miguel@ximian.com>
16859
16860         * expression.cs (Binary::Resolve): Beginning of it.  I scratched
16861         my previous implementation, did not work.
16862
16863         * typemanager.cs: Add a couple of missing types (the longs).
16864
16865         * literal.cs: Use TypeManager.bool_type instead of getting it.
16866
16867         * expression.cs (EventExpr): New kind of expressions.
16868         (Expressio::ExprClassFromMemberInfo): finish
16869
16870 2001-09-08  Miguel de Icaza  <miguel@ximian.com>
16871
16872         * assign.cs: Emit stores to static fields differently.
16873
16874 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16875
16876         * Merge in changes and adjust code to tackle conflicts. Backed out my
16877         code in Assign::Resolve ;-) 
16878
16879 2001-09-08  Ravi Pratap  <ravi@ximian.com>
16880
16881         * cs-parser.jay (CheckAttributeTarget): Modify call to error to use
16882         instead Report.Error and also pass in the location.
16883         (CSharpParser::Lexer): New readonly property to return the reference
16884         to the Tokenizer object.
16885         (declare_local_variables): Use Report.Error with location instead of plain 
16886         old error.
16887         (CheckDef): Ditto.
16888
16889         * class.cs (Operator::CheckUnaryOperator): Move into cs-parser.jay.
16890         (Operator.CheckBinaryOperator): Ditto.
16891
16892         * cs-parser.jay (operator_declarator): Update accordingly.
16893
16894         * cs-parser.jay (CheckUnaryOperator): Modify to use Report.Error
16895         (CheckBinaryOperator): Same here.
16896
16897         * rootcontext.cs (LookupType): Add an extra lookup which simply does a lookup
16898         on the name without any prefixes of namespace names etc. This is because we
16899         already might have something already fully qualified like 
16900         'System.Console.WriteLine'
16901
16902         * assign.cs (Resolve): Begin implementation. Stuck ;-)
16903
16904 2001-09-07  Ravi Pratap  <ravi@ximian.com>
16905
16906         * cs-tokenizer.cs (location): Return a string which also contains
16907         the file name.
16908
16909         * expression.cs (ElementAccess): New class for expressions of the
16910         type 'element access.'
16911         (BaseAccess): New class for expressions of the type 'base access.'
16912         (CheckedExpr, UnCheckedExpr): New classes for Checked and Unchecked expressions
16913         respectively.
16914
16915         * cs-parser.jay (element_access): Implement action.
16916         (base_access): Implement actions.
16917         (checked_expression, unchecked_expression): Implement.
16918
16919         * cs-parser.jay (local_variable_type): Correct and implement.
16920         (type_suffixes, type_suffix_list, type_suffix): Implement actions.
16921
16922         * cs-tokenizer.cs (real_type_suffix): Comment out the extra getchar.
16923
16924         * cs-parser.jay (rank_specifiers): Remove space while concatenating the type's
16925         name and the specifiers.
16926
16927         * interface.cs (InterfaceAttr): New property to return the corresponding TypeAttributes
16928
16929         * rootcontext.cs (CreateInterface): Use the InterfaceAttr property instead of 
16930         making them all public ;-)
16931
16932         * cs-parser.jay (error): Remove entirely as we have an implementation in the base
16933         class anyways.
16934
16935 2001-09-07  Miguel de Icaza  <miguel@ximian.com>
16936
16937         * expression.cs (ExprClassFromMemberInfo): Return FieldExpr and
16938         PropertyExprs.
16939         (FieldExpr, PropertyExprs): New resolved expressions.
16940         (SimpleName::MemberStaticCheck): Perform static checks for access
16941         to non-static fields on static methods. Maybe this should be
16942         generalized for MemberAccesses. 
16943         (SimpleName::ResolveSimpleName): More work on simple name
16944         resolution. 
16945
16946         * cs-parser.jay (primary_expression/qualified_identifier): track
16947         the parameter index.
16948
16949         * codegen.cs (CodeGen::Save): Catch save exception, report error.
16950         (EmitContext::EmitBoolExpression): Chain to expression generation
16951         instead of temporary hack.
16952         (::EmitStatementExpression): Put generic expression code generation.
16953
16954         * assign.cs (Assign::Emit): Implement variable assignments to
16955         local variables, parameters and fields.
16956
16957 2001-09-06  Miguel de Icaza  <miguel@ximian.com>
16958
16959         * statement.cs (Block::GetVariableInfo): New method, returns the
16960         VariableInfo for a variable name in a block.
16961         (Block::GetVariableType): Implement in terms of GetVariableInfo
16962
16963         * literal.cs (IntLiteral::Emit, FloatLiteral::Emit,
16964         DoubleLiteral::Emit, CharLiteral::Emit, BoolLiteral::Emit): Implement
16965
16966 2001-09-06  Ravi Pratap  <ravi@ximian.com>
16967
16968         * cs-parser.jay (operator_declaration): Continue on my quest : update
16969         to take attributes argument.
16970         (event_declaration): Ditto.
16971         (enum_declaration): Ditto.
16972         (indexer_declaration): Ditto.
16973
16974         * class.cs (Operator::Operator): Update constructor accordingly.
16975         (Event::Event): Ditto.
16976
16977         * delegate.cs (Delegate::Delegate): Same here.
16978
16979         * enum.cs (Enum::Enum): Same here.
16980
16981 2001-09-05  Ravi Pratap  <ravi@ximian.com>
16982
16983         * cs-parser.jay (CheckAttributeTarget): Update to use the right error number.
16984
16985         * ../tests/cs0658.cs : New file to demonstrate error 0658.
16986
16987         * attribute.cs (Attributes): New class to encapsulate all attributes which were
16988         being passed around as an arraylist.
16989         (Attributes::AddAttribute): Method to add attribute sections.
16990
16991         * cs-parser.jay (opt_attributes): Modify actions to use the new Attributes class.
16992         (struct_declaration): Update accordingly.
16993         (constant_declaration): Update.
16994         (field_declaration): Update.
16995         (method_header): Update.
16996         (fixed_parameter): Update.
16997         (parameter_array): Ditto.
16998         (property_declaration): Ditto.
16999         (destructor_declaration): Ditto.
17000
17001         * class.cs (Struct::Struct): Update constructors accordingly.
17002         (Class::Class): Ditto.
17003         (Field::Field): Ditto.
17004         (Method::Method): Ditto.
17005         (Property::Property): Ditto.
17006         (TypeContainer::OptAttribute): update property's return type.
17007
17008         * interface.cs (Interface.opt_attributes): New member.
17009         (Interface::Interface): Update to take the extra Attributes argument.
17010
17011         * parameter.cs (Parameter::Parameter): Ditto.
17012
17013         * constant.cs (Constant::Constant): Ditto.
17014
17015         * interface.cs (InterfaceMemberBase): New OptAttributes field.
17016         (InterfaceMemberBase::InterfaceMemberBase): Update constructor to take 
17017         the attributes as a parameter.
17018         (InterfaceProperty): Update constructor call.
17019         (InterfaceEvent): Ditto.
17020         (InterfaceMethod): Ditto.
17021         (InterfaceIndexer): Ditto.
17022
17023         * cs-parser.jay (interface_indexer_declaration): Update call to constructor to 
17024         pass the attributes too.
17025         (interface_event_declaration): Ditto.
17026         (interface_property_declaration): Ditto.
17027         (interface_method_declaration): Ditto.
17028         (interface_declaration): Ditto.
17029
17030 2001-09-05  Miguel de Icaza  <miguel@ximian.com>
17031
17032         * class.cs (Method::Define): Track the "static Main" definition to
17033         create an entry point. 
17034
17035         * rootcontext.cs (RootContext::EntryPoint): MethodInfo that holds the
17036         EntryPoint if we find it. 
17037
17038         * codegen.cs (EmitContext::EmitInvocation): Emit invocations.
17039         (EmitContext::ig): Make this variable public.
17040
17041         * driver.cs: Make the default output file be the first file name
17042         with the .exe extension.  
17043
17044         Detect empty compilations
17045
17046         Handle various kinds of output targets.  Handle --target and
17047         rename -t to --dumper.
17048
17049         * expression.cs, literal.cs, assign.cs, constant.cs: All `Resolve'
17050         methods inherited from Expression return now an Expression.  This
17051         will is used during the tree rewriting as we resolve them during
17052         semantic analysis.
17053
17054         (Expression::MemberLookup): Implements the MemberLookup (7.3) from
17055         the spec.  Missing entirely is the information about
17056         accessability of elements of it.
17057
17058         (Expression::ExprClassFromMemberInfo): New constructor for
17059         Expressions that creates a fully initialized Expression based on
17060         a MemberInfo that is one of Eventinfo, FieldINfo, PropertyInfo or
17061         a Type.
17062
17063         (Invocation::Resolve): Begin implementing resolution of invocations.
17064
17065         * literal.cs (StringLiteral):  Implement Emit.
17066
17067 2001-09-05  Ravi Pratap  <ravi@ximian.com>
17068
17069         * cs-parser.jay (error): Add new modifier because we are hiding an inherited
17070         member.
17071
17072 2001-09-04  Ravi Pratap  <ravi@ximian.com>
17073
17074         * cs-parser.jay (attribute_arguments): Implement actions.
17075         (attribute): Fix bug in production. Implement action.
17076         (attribute_list): Implement.
17077         (attribute_target): Implement.
17078         (attribute_target_specifier, opt_target_specifier): Implement
17079         (CheckAttributeTarget): New method to check if the attribute target
17080         is valid.
17081         (attribute_section): Implement.
17082         (opt_attributes): Implement.
17083
17084         * attribute.cs : New file to handle attributes.
17085         (Attribute): Class to hold attribute info.
17086
17087         * cs-parser.jay (opt_attribute_target_specifier): Remove production
17088         (attribute_section): Modify production to use 2 different rules to 
17089         achieve the same thing. 1 s/r conflict down !
17090         Clean out commented, useless, non-reducing dimension_separator rules.
17091
17092         * class.cs (TypeContainer.attributes): New member to hold list
17093         of attributes for a type.
17094         (Struct::Struct): Modify to take one more argument, the attribute list.
17095         (Class::Class): Ditto.
17096         (Field::Field): Ditto.
17097         (Method::Method): Ditto.
17098         (Property::Property): Ditto.
17099
17100         * cs-parser.jay (struct_declaration): Update constructor call to
17101         pass in the attributes too.
17102         (class_declaration): Ditto.
17103         (constant_declaration): Ditto.
17104         (field_declaration): Ditto.
17105         (method_header): Ditto.
17106         (fixed_parameter): Ditto.
17107         (parameter_array): Ditto.
17108         (property_declaration): Ditto.
17109
17110         * constant.cs (Constant::Constant): Update constructor similarly.
17111         Use System.Collections.
17112
17113         * parameter.cs (Parameter::Parameter): Update as above.
17114
17115 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17116
17117         * class.cs (TypeContainer::AddDelegate): New method to add a delegate.
17118         (TypeContainer.delegates): New member to hold list of delegates.
17119
17120         * cs-parser.jay (delegate_declaration): Implement the action correctly 
17121         this time as I seem to be on crack ;-)
17122
17123 2001-09-02  Miguel de Icaza  <miguel@ximian.com>
17124
17125         * rootcontext.cs (RootContext::IsNamespace): new function, used to
17126         tell whether an identifier represents a namespace.
17127
17128         * expression.cs (NamespaceExpr): A namespace expression, used only
17129         temporarly during expression resolution.
17130         (Expression::ResolveSimpleName, ::ResolvePrimary, ::ResolveName):
17131         utility functions to resolve names on expressions.
17132
17133 2001-09-01  Miguel de Icaza  <miguel@ximian.com>
17134
17135         * codegen.cs: Add hook for StatementExpressions. 
17136
17137         * class.cs: Fix inverted test for static flag in methods.
17138
17139 2001-09-02  Ravi Pratap  <ravi@ximian.com>
17140
17141         * class.cs (Operator::CheckUnaryOperator): Correct error number used
17142         to make it coincide with MS' number.
17143         (Operator::CheckBinaryOperator): Ditto.
17144
17145         * ../errors/errors.txt : Remove error numbers added earlier.
17146
17147         * ../errors/cs1019.cs : Test case for error # 1019
17148
17149         * ../errros/cs1020.cs : Test case for error # 1020
17150
17151         * cs-parser.jay : Clean out commented cruft.
17152         (dimension_separators, dimension_separator): Comment out. Ostensibly not
17153         used anywhere - non-reducing rule.
17154         (namespace_declarations): Non-reducing rule - comment out.
17155
17156         * enum.cs (Enum::AddEnum): Rename to AddEnumMember as I was getting confused
17157         with TypeContainer::AddEnum.
17158
17159         * delegate.cs : New file for delegate handling classes.
17160         (Delegate): Class for declaring delegates.
17161
17162         * makefile : Update.
17163
17164         * cs-parser.jay (delegate_declaration): Implement.
17165
17166 2001-09-01  Ravi Pratap  <ravi@che.iitm.ac.in>
17167
17168         * class.cs (Event::Define): Implement.
17169         (Event.EventBuilder): New member.
17170
17171         * class.cs (TypeContainer::Populate): Update to define all enums and events
17172         we have.
17173         (Events): New property for the events arraylist we hold. Shouldn't we move to using
17174         readonly fields for all these cases ?
17175
17176 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17177
17178         * class.cs (Property): Revamp to use the convention of making fields readonly.
17179         Accordingly modify code elsewhere.
17180
17181         * class.cs : Apply patch from Mr. Mandar <go_mono@hotmail.com> for implementing
17182         the Define method of the Property class.
17183
17184         * class.cs : Clean up applied patch and update references to variables etc. Fix 
17185         trivial bug.
17186         (TypeContainer::Populate): Update to define all the properties we have. Also
17187         define all enumerations.
17188
17189         * enum.cs (Define): Implement.
17190
17191 2001-08-31  Ravi Pratap  <ravi@che.iitm.ac.in>
17192
17193         * cs-parser.jay (overloadable_operator): The semantic value is an
17194         enum of the Operator class.
17195         (operator_declarator): Implement actions.
17196         (operator_declaration): Implement.
17197
17198         * class.cs (Operator::CheckUnaryOperator): New static method to help in checking
17199         validity of definitions.
17200         (Operator::CheckBinaryOperator): Static method to check for binary operators
17201         (TypeContainer::AddOperator): New method to add an operator to a type.
17202
17203         * cs-parser.jay (indexer_declaration): Added line to actually call the
17204         AddIndexer method so it gets added ;-)
17205
17206         * ../errors/errors.txt : Update to include new error numbers. Are these numbers 
17207         already taken care of by the MS compiler ?  
17208
17209 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17210
17211         * class.cs (Operator): New class for operator declarations.
17212         (Operator::OpType): Enum for the various operators.
17213
17214 2001-08-29  Ravi Pratap  <ravi@che.iitm.ac.in>
17215
17216         * class.cs (TypeContainer::AddIndexer): Remove FIXME comment. We
17217         ostensibly handle this in semantic analysis.
17218
17219         * cs-parser.jay (general_catch_clause): Comment out
17220         (specific_catch_clauses, specific_catch_clause): Ditto.
17221         (opt_general_catch_clause, opt_specific_catch_clauses): Ditto
17222         (catch_args, opt_catch_args): New productions.
17223         (catch_clause): Rewrite to use the new productions above
17224         (catch_clauses): Modify accordingly.
17225         (opt_catch_clauses): New production to use in try_statement
17226         (try_statement): Revamp. Basically, we get rid of one unnecessary rule
17227         and re-write the code in the actions to extract the specific and
17228         general catch clauses by being a little smart ;-)
17229
17230         * ../tests/try.cs : Fix. It's not 'finalize' my friend, it's 'finally' !
17231         Hooray, try and catch statements parse fine !
17232
17233 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17234
17235         * statement.cs (Block::GetVariableType): Fix logic to extract the type
17236         string from the hashtable of variables.
17237
17238         * cs-parser.jay (event_accessor_declarations): Trivial fix. Man, how did
17239         I end up making that mistake ;-)
17240         (catch_clauses): Fixed gross error which made Key and Value of the 
17241         DictionaryEntry the same : $1 !!
17242
17243 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17244
17245         * cs-tokenizer.cs (initTokens): Add keywords 'add' and 'remove'
17246
17247         * cs-parser.jay (event_declaration): Correct to remove the semicolon
17248         when the add and remove accessors are specified. 
17249
17250 2001-08-28  Ravi Pratap  <ravi@che.iitm.ac.in>
17251
17252         * cs-parser.jay (IndexerDeclaration): New helper class to hold
17253         information about indexer_declarator.
17254         (indexer_declarator): Implement actions.
17255         (parsing_indexer): New local boolean used to keep track of whether
17256         we are parsing indexers or properties. This is necessary because 
17257         implicit_parameters come into picture even for the get accessor in the 
17258         case of an indexer.
17259         (get_accessor_declaration, set_accessor_declaration): Correspondingly modified.
17260
17261         * class.cs (Indexer): New class for indexer declarations.
17262         (TypeContainer::AddIndexer): New method to add an indexer to a type.
17263         (TypeContainer::indexers): New member to hold list of indexers for the
17264         type.
17265
17266 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17267
17268         * cs-parser.jay (add_accessor_declaration): Implement action.
17269         (remove_accessor_declaration): Implement action.
17270         (event_accessors_declaration): Implement
17271         (variable_declarators): swap statements for first rule - trivial.
17272
17273         * class.cs (Event): New class to hold information about event
17274         declarations.
17275         (TypeContainer::AddEvent): New method to add an event to a type
17276         (TypeContainer::events): New member to hold list of events.
17277
17278         * cs-parser.jay (event_declaration): Implement actions.
17279
17280 2001-08-27  Ravi Pratap  <ravi@che.iitm.ac.in>
17281
17282         * cs-parser.jay (dim_separators): Implement. Make it a string
17283         concatenating all the commas together, just as they appear.
17284         (opt_dim_separators): Modify accordingly
17285         (rank_specifiers): Update accordingly. Basically do the same
17286         thing - instead, collect the brackets here.
17287         (opt_rank_sepcifiers): Modify accordingly.
17288         (array_type): Modify to actually return the complete type string
17289         instead of ignoring the rank_specifiers.
17290         (expression_list): Implement to collect the expressions
17291         (variable_initializer): Implement. We make it a list of expressions
17292         essentially so that we can handle the array_initializer case neatly too.
17293         (variable_initializer_list): Implement.
17294         (array_initializer): Make it a list of variable_initializers
17295         (opt_array_initializer): Modify accordingly.
17296
17297         * expression.cs (New::NType): Add enumeration to help us
17298         keep track of whether we have an object/delegate creation
17299         or an array creation.
17300         (New:NewType, New::Rank, New::Indices, New::Initializers): New
17301         members to hold data about array creation.
17302         (New:New): Modify to update NewType
17303         (New:New): New Overloaded contructor for the array creation
17304         case.
17305
17306         * cs-parser.jay (array_creation_expression): Implement to call
17307         the overloaded New constructor.
17308
17309 2001-08-26  Ravi Pratap  <ravi@che.iitm.ac.in>
17310
17311         * class.cs (TypeContainer::Constructors): Return member
17312         constructors instead of returning null.
17313
17314 2001-08-26  Miguel de Icaza  <miguel@ximian.com>
17315
17316         * typemanager.cs (InitCoreTypes): Initialize the various core
17317         types after we have populated the type manager with the user
17318         defined types (this distinction will be important later while
17319         compiling corlib.dll)
17320
17321         * expression.cs, literal.cs, assign.cs, constant.cs: Started work
17322         on Expression Classification.  Now all expressions have a method
17323         `Resolve' and a method `Emit'.
17324
17325         * codegen.cs, cs-parser.jay: Fixed the bug that stopped code
17326         generation from working.     Also add some temporary debugging
17327         code. 
17328
17329 2001-08-24  Miguel de Icaza  <miguel@ximian.com>
17330
17331         * codegen.cs: Lots of code generation pieces.  This is only the
17332         beginning, will continue tomorrow with more touches of polish.  We
17333         handle the fundamentals of if, while, do, for, return.  Others are
17334         trickier and I need to start working on invocations soon.
17335
17336         * gen-treedump.cs: Bug fix, use s.Increment here instead of
17337         s.InitStatement. 
17338
17339         * codegen.cs (EmitContext): New struct, used during code
17340         emission to keep a context.   Most of the code generation will be
17341         here. 
17342
17343         * cs-parser.jay: Add embedded blocks to the list of statements of
17344         this block.  So code generation proceeds in a top down fashion.
17345
17346 2001-08-23  Miguel de Icaza  <miguel@ximian.com>
17347
17348         * statement.cs: Add support for multiple child blocks.
17349
17350 2001-08-22  Miguel de Icaza  <miguel@ximian.com>
17351
17352         * codegen.cs (EmitCode): New function, will emit the code for a
17353         Block of code given a TypeContainer and its ILGenerator. 
17354
17355         * statement.cs (Block): Standard public readonly optimization.
17356         (Block::Block constructors): Link children. 
17357         (Block::Child): Child Linker.
17358         (Block::EmitVariables): Emits IL variable declarations.
17359
17360         * class.cs: Drop support for MethodGroups here, delay until
17361         Semantic Analysis.
17362         (Method::): Applied the same simplification that I did before, and
17363         move from Properties to public readonly fields.
17364         (Method::ParameterTypes): Returns the parameter types for the
17365         function, and implements a cache that will be useful later when I
17366         do error checking and the semantic analysis on the methods is
17367         performed.
17368         (Constructor::GetCallingConvention): Renamed from CallingConvetion
17369         and made a method, optional argument tells whether this is a class
17370         or a structure to apply the `has-this' bit.
17371         (Method::GetCallingConvention): Implement, returns the calling
17372         convention. 
17373         (Method::Define): Defines the type, a second pass is performed
17374         later to populate the methods.
17375
17376         (Constructor::ParameterTypes): implement a cache similar to the
17377         one on Method::ParameterTypes, useful later when we do semantic
17378         analysis. 
17379
17380         (TypeContainer::EmitMethod):  New method.  Emits methods.
17381
17382         * expression.cs: Removed MethodGroup class from here.
17383
17384         * parameter.cs (Parameters::GetCallingConvention): new method.
17385
17386 2001-08-21  Miguel de Icaza  <miguel@ximian.com>
17387
17388         * class.cs (TypeContainer::Populate): Drop RootContext from the
17389         argument. 
17390
17391         (Constructor::CallingConvention): Returns the calling convention.
17392         (Constructor::ParameterTypes): Returns the constructor parameter
17393         types. 
17394
17395         (TypeContainer::AddConstructor): Keep track of default constructor
17396         and the default static constructor.
17397
17398         (Constructor::) Another class that starts using `public readonly'
17399         instead of properties. 
17400
17401         (Constructor::IsDefault): Whether this is a default constructor. 
17402
17403         (Field::) use readonly public fields instead of properties also.
17404
17405         (TypeContainer::TypeAttr, TypeContainer::AddConstructor): Keep
17406         track of static constructors;  If none is used, turn on
17407         BeforeFieldInit in the TypeAttributes. 
17408
17409         * cs-parser.jay (opt_argument_list): now the return can be null
17410         for the cases where there are no arguments. 
17411
17412         (constructor_declarator): If there is no implicit `base' or
17413         `this', then invoke the default parent constructor. 
17414
17415         * modifiers.cs (MethodAttr): New static function maps a set of
17416         modifiers flags into a MethodAttributes enum
17417         (FieldAttr): renamed from `Map'.  So now we have FieldAttr,
17418         MethodAttr, TypeAttr to represent the various mappings where the
17419         modifiers are used.
17420         (FieldAttr): Map also `readonly' to `FieldAttributes.InitOnly'  
17421
17422 2001-08-19  Miguel de Icaza  <miguel@ximian.com>
17423
17424         * parameter.cs (GetParameterInfo): Fix bug where there would be no
17425         method arguments.
17426
17427         * interface.cs (PopulateIndexer): Implemented the code generator
17428         for interface indexers.
17429
17430 2001-08-17  Miguel de Icaza  <miguel@ximian.com>
17431
17432         * interface.cs (InterfaceMemberBase): Now we track the new status
17433         here.  
17434
17435         (PopulateProperty): Implement property population.  Woohoo!  Got
17436         Methods and Properties going today. 
17437
17438         Removed all the properties for interfaces, and replaced them with
17439         `public readonly' fields. 
17440
17441 2001-08-16  Miguel de Icaza  <miguel@ximian.com>
17442
17443         * interface.cs (AddEvent, AddMethod, AddIndexer, AddProperty):
17444         initialize their hashtables/arraylists only when they are needed
17445         instead of doing this always.
17446
17447         * parameter.cs: Handle refs and out parameters.
17448
17449         * cs-parser.jay: Use an ArrayList to construct the arguments
17450         instead of the ParameterCollection, and then cast that to a
17451         Parameter[] array.
17452
17453         * parameter.cs: Drop the use of ParameterCollection and use
17454         instead arrays of Parameters.
17455
17456         (GetParameterInfo): Use the Type, not the Name when resolving
17457         types. 
17458
17459 2001-08-13  Miguel de Icaza  <miguel@ximian.com>
17460
17461         * parameter.cs: Eliminate the properties Name, Type and ModFlags,
17462         and instead use public readonly fields.
17463
17464         * class.cs: Put back walking code for type containers.
17465
17466 2001-08-11  Miguel de Icaza  <miguel@ximian.com>
17467
17468         * class.cs (MakeConstant): Code to define constants.
17469
17470         * rootcontext.cs (LookupType): New function.  Used to locate types 
17471
17472
17473 2001-08-08  Miguel de Icaza  <miguel@ximian.com>
17474
17475         * rootcontext.cs: OH MY!  My trick works!   It is amazing how nice
17476         this System.Reflection code is.  Kudos to Microsoft
17477
17478         * typemanager.cs: Implement a type cache and avoid loading all
17479         types at boot time.  Wrap in LookupType the internals.  This made
17480         the compiler so much faster.  Wow.  I rule!
17481
17482         * driver.cs: Make sure we always load mscorlib first (for
17483         debugging purposes, nothing really important).
17484
17485         * Renamespaced things that were on `CSC' to `CIR'.  Maybe I should
17486         have moved to `CSC' rather than `CIR'.  Oh man!  The confussion!  
17487
17488         * rootcontext.cs: Lookup types on their namespace;  Lookup types
17489         on namespaces that have been imported using the `using' keyword.
17490
17491         * class.cs (TypeContainer::TypeAttr): Virtualize.
17492         (Class::TypeAttr): Return attributes suitable for this bad boy.
17493         (Struct::TypeAttr): ditto.
17494         Handle nested classes.
17495         (TypeContainer::) Remove all the type visiting code, it is now
17496         replaced with the rootcontext.cs code
17497
17498         * rootcontext.cs (GetClassBases): Added support for structs. 
17499
17500 2001-08-06  Miguel de Icaza  <miguel@ximian.com>
17501
17502         * interface.cs, statement.cs, class.cs, parameter.cs,
17503         rootcontext.cs, gen-treedump.cs, enum.cs, cs-parse.jay:
17504         Drop use of TypeRefs, and use strings instead.
17505
17506 2001-08-04  Miguel de Icaza  <miguel@ximian.com>
17507
17508         * rootcontext.cs: 
17509
17510         * class.cs (Struct::Struct): set the SEALED flags after
17511         checking the modifiers.
17512         (TypeContainer::TypeAttr): new property, returns the
17513         TypeAttributes for a class.  
17514
17515         * cs-parser.jay (type_list): Oops, list production was creating a
17516         new list of base types.
17517
17518         * rootcontext.cs (StdLib): New property.
17519         (GetInterfaceTypeByName): returns an interface by type name, and
17520         encapsulates error handling here.
17521         (GetInterfaces): simplified.
17522         (ResolveTree): Encapsulated all the tree resolution here.
17523         (CreateClass, GetClassBases, GetInterfaceOrClass): Create class
17524         types. 
17525
17526         * driver.cs: Add support for --nostdlib, to avoid loading the
17527         default assemblies.
17528         (Main): Do not put tree resolution here. 
17529
17530         * rootcontext.cs: Beginning of the class resolution.
17531
17532 2001-08-03  Miguel de Icaza  <miguel@ximian.com>
17533
17534         * rootcontext.cs: Provide better error reporting. 
17535
17536         * cs-parser.jay (interface_base): set our $$ to be interfaces.
17537
17538         * rootcontext.cs (CreateInterface): Handle the case where there
17539         are no parent interfaces.
17540
17541         (CloseTypes): Routine to flush types at the end.
17542         (CreateInterface): Track types.
17543         (GetInterfaces): Returns an array of Types from the list of
17544         defined interfaces.
17545
17546         * typemanager.c (AddUserType): Mechanism to track user types (puts
17547         the type on the global type hash, and allows us to close it at the
17548         end). 
17549
17550 2001-08-02  Miguel de Icaza  <miguel@ximian.com>
17551
17552         * tree.cs: Removed RecordType, added RecordClass, RecordStruct and
17553         RecordInterface instead.
17554
17555         * cs-parser.jay: Updated to reflect changes above.
17556
17557         * decl.cs (Definition): Keep track of the TypeBuilder type that
17558         represents this type here.  Not sure we will use it in the long
17559         run, but wont hurt for now.
17560
17561         * driver.cs: Smaller changes to accomodate the new code.
17562
17563         Call ResolveInterfaceBases, Call ResolveClassBases, Save assembly
17564         when done. 
17565
17566         * rootcontext.cs (CreateInterface):  New method, used to create
17567         the System.TypeBuilder type for interfaces.
17568         (ResolveInterfaces): new entry point to resolve the interface
17569         hierarchy. 
17570         (CodeGen): Property, used to keep track of the code generator.
17571
17572 2001-07-26  Miguel de Icaza  <miguel@ximian.com>
17573
17574         * cs-parser.jay: Add a second production for delegate_declaration
17575         with `VOID'.
17576
17577         (enum_body): Put an opt_comma here instead of putting it on
17578         enum_body or enum_member_declarations so we can handle trailing
17579         commas on enumeration members.  Gets rid of a shift/reduce.
17580
17581         (type_list): Need a COMMA in the middle.
17582
17583         (indexer_declaration): Tell tokenizer to recognize get/set
17584
17585         * Remove old targets.
17586
17587         * Re-add the parser target.
17588
17589 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17590
17591         * cs-parser.jay: Add precendence rules for a number of operators
17592         ot reduce the number of shift/reduce conflicts in the grammar.
17593
17594 2001-07-17  Miguel de Icaza  <miguel@ximian.com>
17595
17596         * tree.cs: moved IGenerator interface and renamed it to ITreeDump
17597         and put it here.
17598
17599         Get rid of old crufty code.
17600
17601         * rootcontext.cs: Use this to keep track of the parsed
17602         representation and the defined types available to the program. 
17603
17604         * gen-treedump.cs: adjust for new convention.
17605
17606         * type.cs: Split out the type manager, and the assembly builder
17607         from here. 
17608
17609         * typemanager.cs: the type manager will live here now.
17610
17611         * cil-codegen.cs: And the code generator here. 
17612
17613 2001-07-14  Sean MacIsaac  <macisaac@ximian.com>
17614
17615         * makefile: Fixed up for easy making.
17616
17617 2001-07-13  Simon Cozens <simon@simon-cozens.org>
17618
17619         * cs-parser.jay (rank_specifier): Remove a conflict by reordering
17620         the 
17621
17622         (unary_expression): Expand pre_increment_expression and
17623         post_decrement_expression to reduce a shift/reduce.
17624
17625 2001-07-11  Simon Cozens
17626
17627         * cs-tokenizer.cs: Hex numbers should begin with a 0.
17628
17629         Improve allow_keyword_as_indent name.
17630
17631 2001-06-19  Miguel de Icaza  <miguel@ximian.com>
17632
17633         * Adjustments for Beta2. 
17634
17635 2001-06-13  Miguel de Icaza  <miguel@ximian.com>
17636
17637         * decl.cs: Added `Define' abstract method.
17638         (InTransit): new property, used to catch recursive definitions. 
17639
17640         * interface.cs: Implement `Define'. 
17641
17642         * modifiers.cs: Map Modifiers.constants to
17643         System.Reflection.TypeAttribute flags.
17644
17645         * class.cs: Keep track of types and user-defined types.
17646         (BuilderInit): New method for creating an assembly
17647         (ResolveType): New function to launch the resolution process, only
17648         used by interfaces for now.
17649
17650         * cs-parser.jay: Keep track of Classes, Structs and Interfaces
17651         that are inserted into the name space. 
17652
17653 2001-06-08  Miguel de Icaza  <miguel@ximian.com>
17654
17655         * ARGH.  I have screwed up my tree so many times due to the use of
17656         rsync rather than using CVS.  Going to fix this at once. 
17657
17658         * driver.cs: Objetify driver.  Load assemblies, use assemblies to
17659         load types.
17660
17661 2001-06-07  Miguel de Icaza  <miguel@ximian.com>
17662
17663         * Experiment successful: Use System.Type rather that our own
17664         version of Type.  
17665
17666 2001-05-25  Miguel de Icaza  <miguel@ximian.com>
17667
17668         * cs-parser.jay: Removed nsAliases from here.
17669
17670         Use new namespaces, handle `using XXX;' 
17671
17672         * namespace.cs: Reimplemented namespace handling, use a recursive
17673         definition of the class.  Now we can keep track of using clauses
17674         and catch invalid using clauses.
17675
17676 2001-05-24  Miguel de Icaza  <miguel@ximian.com>
17677
17678         * gen-treedump.cs: Adapted for all the renaming.
17679
17680         * expression.cs (Expression): this class now has a Type property
17681         which returns an expression Type.
17682
17683         (Probe::, New::, TypeOf::, SizeOf::, Constant::): renamed from
17684         `Type', as this has a different meaning now in the base
17685
17686 2001-05-22  Miguel de Icaza  <miguel@ximian.com>
17687
17688         * interface.cs, class.cs: Removed from all the sources the
17689         references to signature computation, as we can not do method
17690         signature computation during the parsing time, as we are not
17691         trying to solve at that point distinguishing:
17692
17693         class X {
17694                 void a (Blah x) {}
17695                 void a (NS.Blah x) {}
17696         }
17697
17698         Which depending on the context might be valid or not, as we do not
17699         know if Blah is the same thing as NS.Blah at that point.
17700
17701         * Redid everything so the code uses TypeRefs now instead of
17702         Types.  TypeRefs are just temporary type placeholders, that need
17703         to be resolved.  They initially have a pointer to a string and the
17704         current scope in which they are used.  This is used later by the
17705         compiler to resolve the reference to an actual Type. 
17706
17707         * DeclSpace is no longer a CIR.Type, and neither are
17708         TypeContainers (Class and Struct) nor Interfaces nor Enums.  They
17709         are all DeclSpaces, but no Types. 
17710
17711         * type.cs (TypeRefManager): This implements the TypeRef manager,
17712         which keeps track of all the types that need to be resolved after
17713         the parsing has finished. 
17714
17715 2001-05-13  Miguel de Icaza  <miguel@ximian.com>
17716
17717         * ARGH.  We are going to have to store `foreach' as a class rather
17718         than resolving it, as we need to verify error 1579 after name
17719         resolution.   *OR* we could keep a flag that says `This request to
17720         IEnumerator comes from a foreach statement' which we can then use
17721         to generate the error.
17722
17723 2001-05-10  Miguel de Icaza  <miguel@ximian.com>
17724
17725         * class.cs (TypeContainer.AddMethod): we now add methods to the
17726         MethodGroup instead of the method hashtable.  
17727
17728         * expression.cs: Add MethodGroup abstraction, which gets us one
17729         step closer to the specification in the way we handle method
17730         declarations.  
17731
17732         * cs-parser.jay (primary_expression): qualified_identifier now
17733         tried to match up an identifier to a local variable reference or
17734         to a parameter reference.
17735
17736         current_local_parameters is now a parser global variable that
17737         points to the current parameters for the block, used during name
17738         lookup.
17739
17740         (property_declaration): Now creates an implicit `value' argument to
17741         the set accessor.
17742
17743 2001-05-09  Miguel de Icaza  <miguel@ximian.com>
17744
17745         * parameter.cs: Do not use `param' arguments as part of the
17746         signature, per the spec.
17747
17748 2001-05-08  Miguel de Icaza  <miguel@ximian.com>
17749
17750         * decl.cs: Base class for classes, structs and interfaces.  This
17751         is the "Declaration Space" 
17752
17753         * cs-parser.jay: Use CheckDef for checking declaration errors
17754         instead of having one on each function.
17755
17756         * class.cs: Factor out some code for handling error handling in
17757         accordance to the "Declarations" section in the "Basic Concepts"
17758         chapter in the ECMA C# spec.
17759
17760         * interface.cs: Make all interface member classes derive from
17761         InterfaceMemberBase.
17762
17763 2001-05-07  Miguel de Icaza  <miguel@ximian.com>
17764
17765         * Many things: all interfaces are parsed and generated in
17766         gen-treedump.  Support for member variables, constructors,
17767         destructors, properties, constants is there.
17768
17769         Beginning of the IL backend, but very little done, just there for
17770         testing purposes. 
17771
17772 2001-04-29  Miguel de Icaza  <miguel@ximian.com>
17773
17774         * cs-parser.jay: Fix labeled statement.
17775
17776         * cs-tokenizer.cs (escape): Escape " and ' always.
17777         ref_line, ref_name: keep track of the line/filename as instructed
17778         by #line by the compiler.
17779         Parse #line.
17780
17781 2001-04-27  Miguel de Icaza  <miguel@ximian.com>
17782
17783         * System.CodeDOM/CodeBinaryOperatorExpression.cs: Rearrange enum
17784         to match the values in System.CodeDOM.
17785
17786         Divid renamed to Divide.
17787
17788         * System.CodeDOM/CodeForLoopStatement.cs: Always have valid
17789         statements. 
17790         (Statements.set): remove.
17791
17792         * System.CodeDOM/CodeCatchClause.cs: always have a valid
17793         statements. 
17794
17795         * System.CodeDOM/CodeIfStatement.cs: trueStatements and
17796         falseStatements always have valid values. 
17797
17798         * cs-parser.jay: Use System.CodeDOM now.
17799